.github | ||
img | ||
src | ||
.dockerignore | ||
.env | ||
.gitignore | ||
Cargo.lock | ||
Cargo.toml | ||
CHANGELOG.md | ||
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
Features
- File upload & URL shortening
- 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
- supports one shot links (can only be viewed once)
- guesses MIME types
- supports overriding and blacklisting
- Single binary
- 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
Binary releases
See the available binaries on releases page.
Build from source
git clone https://github.com/orhun/rustypaste.git
cd rustypaste/
cargo build --release
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>"
Cleaning Up Expired Files
$ find upload/ -maxdepth 2 -type f -iname "*.[0-9]*" -exec rm -v {} \;
URL Shortening
$ curl -F "url=https://example.com/some/long/url" "<server_address>"
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;
}
Roadmap
- Support uploading files from given URL
Contributing
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/