.github | ||
extra/systemd | ||
fixtures | ||
img | ||
shuttle | ||
src | ||
.dockerignore | ||
.env | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
CHANGELOG.md | ||
codecov.yml | ||
config.toml | ||
docker-compose.yml | ||
Dockerfile | ||
LICENSE | ||
README.md |
Rustypaste is a minimal file upload/pastebin service.
$ echo "some text" > awesome.txt
$ curl -F "file=@awesome.txt" https://paste.site.com
https://paste.site.com/safe-toad.txt
$ curl https://paste.site.com/safe-toad.txt
some text
The public instance is available at https://rustypaste.shuttleapp.rs 🚀
Features
- File upload & URL shortening & upload from URL
- supports basic HTTP authentication
- random file names (optional)
- pet name (e.g.
capital-mosquito.txt
) - alphanumeric string (e.g.
yB84D2Dv.txt
)
- pet name (e.g.
- supports expiring links
- auto-expiration of files (optional)
- auto-deletion of expired files (optional)
- supports one shot links (can only be viewed once)
- guesses MIME types
- supports overriding and blacklisting
- supports forcing to download via
?download=true
- no duplicate uploads (optional)
- Single binary
- Simple configuration
- supports hot reloading
- Easy to deploy
- No database
- filesystem is used
- Self-hosted
- centralization is bad!
- Written in Rust
- blazingly fast!
Installation
From crates.io
cargo install rustypaste
Arch Linux
pacman -S rustypaste
Alpine Linux
rustypaste
is available for Alpine Edge. It can be installed via apk after enabling the testing repository.
apk add rustypaste
Binary releases
See the available binaries on the releases page.
Build from source
git clone https://github.com/orhun/rustypaste.git
cd rustypaste/
cargo build --release
Testing
Unit tests
cargo test -- --test-threads 1
Test Fixtures
./fixtures/test-fixtures.sh
Usage
The standalone command line tool (rpaste
) is available here.
CLI
function rpaste() {
curl -F "file=@$1" -H "Authorization: <auth_token>" "<server_address>"
}
* consider reading authorization headers from a file. (e.g. -H @rpaste_auth
)
# upload a file
$ rpaste x.txt
# paste from stdin
$ rpaste -
Expiration
$ curl -F "file=@x.txt" -H "expire:10min" "<server_address>"
(supported units: ns
, us
, ms
, sec
, min
, hours
, days
, weeks
, months
, years
)
One shot
$ curl -F "oneshot=@x.txt" "<server_address>"
URL shortening
$ curl -F "url=https://example.com/some/long/url" "<server_address>"
Paste file from remote URL
$ curl -F "remote=https://example.com/file.png" "<server_address>"
Cleaning up expired files
Configure delete_expired_files
to set an interval for deleting the expired files automatically.
On the other hand, following script can be used as cron for cleaning up the expired files manually:
#!/bin/env sh
now=$(date +%s)
find upload/ -maxdepth 2 -type f -iname "*.[0-9]*" |
while read -r filename; do
[ "$(( ${filename##*.} / 1000 - "${now}" ))" -lt 0 ] && rm -v "${filename}"
done
Server
To start the server:
$ rustypaste
If the configuration file is not found in the current directory, specify it via CONFIG
environment variable:
$ CONFIG="$HOME/.rustypaste.toml" rustypaste
To enable basic HTTP auth, set the AUTH_TOKEN
environment variable (via .env
):
$ echo "AUTH_TOKEN=$(openssl rand -base64 16)" > .env
$ rustypaste
See config.toml for configuration options.
Docker
Following command can be used to run a container which is built from the Dockerfile in this repository:
$ docker run --rm -d \
-v "$(pwd)/upload/":/app/upload \
-v "$(pwd)/config.toml":/app/config.toml \
--env-file "$(pwd)/.env" \
-e "RUST_LOG=debug" \
-p 8000:8000 \
--name rustypaste \
orhunp/rustypaste
- uploaded files go into
./upload
(on the host machine) - set the
AUTH_TOKEN
via-e
or--env-file
to enable auth
You can build this image using docker build -t rustypaste .
command.
If you want to run the image using docker compose, simply run docker-compose up -d
. (see docker-compose.yml)
Nginx
Example server configuration with reverse proxy:
server {
listen 80;
location / {
proxy_pass http://localhost:8000/;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options "sameorigin";
add_header X-Content-Type-Options "nosniff";
}
}
If you get a 413 Request Entity Too Large
error during upload, set the max body size in nginx.conf
:
http {
# ...
client_max_body_size 100M;
}
Contributing
Pull requests are welcome!
Consider submitting your ideas via issues first and check out the existing issues.