Rustypaste is a minimal file upload/pastebin service.
$ echo "some text" > awesome.txt
$ curl -F "[email protected]" https://paste.site.com
https://paste.site.com/safe-toad.txt
$ curl https://paste.site.com/safe-toad.txt
some text
- 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-deletion of expired files (optional)
- supports one shot links (can only be viewed once)
- guesses MIME types
- supports overriding and blacklisting
- 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!
cargo install rustypaste
pacman -S rustypaste
See the available binaries on releases page.
git clone https://github.com/orhun/rustypaste.git
cd rustypaste/
cargo build --release
# run unit tests
cargo test -- --test-threads 1
The standalone command line tool (rpaste
) is available here.
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 -
$ curl -F "[email protected]" -H "expire:10min" "<server_address>"
(supported units: ns
, us
, ms
, sec
, min
, hours
, days
, weeks
, months
, years
)
$ curl -F "[email protected]" "<server_address>"
$ curl -F "url=https://example.com/some/long/url" "<server_address>"
$ curl -F "remote=https://example.com/file.png" "<server_address>"
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
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.
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)
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;
}
Nothing here yet! 🎉
Pull requests are welcome!
Consider submitting your ideas via issues first. Also, see the roadmap and/or run the following command to see what is needed to be done:
$ grep -nr "TODO:" src/