Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/matze/wastebin
wastebin is a pastebin 📝
https://github.com/matze/wastebin
axum pastebin rust self-hosted sqlite
Last synced: 10 days ago
JSON representation
wastebin is a pastebin 📝
- Host: GitHub
- URL: https://github.com/matze/wastebin
- Owner: matze
- License: mit
- Created: 2022-05-29T23:02:01.000Z (over 2 years ago)
- Default Branch: master
- Last Pushed: 2024-08-28T21:41:56.000Z (2 months ago)
- Last Synced: 2024-08-28T22:56:02.751Z (2 months ago)
- Topics: axum, pastebin, rust, self-hosted, sqlite
- Language: Rust
- Homepage: https://bin.bloerg.net
- Size: 1.18 MB
- Stars: 281
- Watchers: 3
- Forks: 25
- Open Issues: 15
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
- awesome-starred - matze/wastebin - wastebin is a pastebin (self-hosted)
README
# wastebin
[![Rust](https://github.com/matze/wastebin/actions/workflows/rust.yml/badge.svg)](https://github.com/matze/wastebin/actions/workflows/rust.yml)
A minimal pastebin with a design shamelessly copied from
[bin](https://github.com/WantGuns/bin).DEMO (resets every day)
## Features
* axum and sqlite3 backend storing compressed paste data
* single binary with low memory footprint
* drag 'n' drop upload
* deletion after expiration, reading or by owners
* light/dark mode according to browser settings
* highlightable line numbers
* QR code to browse a paste's URL on mobile devices
* optional encryption with argon2 hashing and ChaCha20Poly1305 encryption## Installation
### Build from source
Install a Rust 2021 toolchain containing Rust 1.70 with
[rustup](https://rustup.rs) and run the server binary with$ cargo run --release
### Run pre-built binaries
You can also download pre-built, statically compiled [Linux
binaries](https://github.com/matze/wastebin/releases). After extraction run the
contained `wastebin` binary.### Build a container image
It's possible to build a container image using Docker or Podman. Assuming you're in the root directory of repository run
```bash
$ sudo docker build -t wastebin:v2.4.3 -f Dockerfile .
```
for Docker or
```bash
$ podman build -t wastebin:v2.4.3 -f Dockerfile
```
for Podman.To cross-compile, make sure that your container engine of choice supports it,
e.g. Docker:```bash
$ sudo docker buildx ls
NAME/NODE DRIVER/ENDPOINT STATUS BUILDKIT PLATFORMS
default* docker
\_ default \_ default running v0.14.1 linux/amd64, linux/amd64/v2, linux/386, linux/arm64, linux/riscv64, linux/ppc64, linux/ppc64le, linux/s390x, linux/mips64le, linux/mips64, linux/loong64, linux/arm/v7, linux/arm/v6
```To build an arm64 image on an x86_64 host run
```bash
$ sudo docker build --platform linux/arm64 -t wastebin:v2.4.3-arm64 -f Dockerfile.arm .
```
or
```bash
$ podman build --arch=arm64 -t wastebin:v2.4.3-arm64 -f Dockerfile.arm
```### Run a Docker image
Alternatively, you can run a pre-built Docker image pushed to `quxfoo/wastebin`.
Here is how to persist the database as `state.db` via the
`WASTEBIN_DATABASE_PATH` environment variable and a bind mount to
`/path/for/storage`:$ docker run -e WASTEBIN_DATABASE_PATH=/data/state.db -v /path/for/storage:/data quxfoo/wastebin:latest
**NOTE**: The image is based on scratch which means it neither comes with a
shell nor with `TMPDIR` being set. If database migrations fail with an extended
sqlite error code 6410, pass `TMPDIR` pointing to a location, sqlite can write
to.### Run with docker-compose
```
version: '3.3'
services:
wastebin:
environment:
- WASTEBIN_DATABASE_PATH=/data/state.db
ports:
- "8088:8088"
volumes:
- './data:/data'
image: 'quxfoo/wastebin:latest'
```
Make sure the `./data` folder is writable by the user 10001.### Run with Nix
For Nix users, a `flake.nix` is also provided. Build and execute it directly
with:```bash
nix run 'github:matze/wastebin#wastebin'
```Or install the provided `wastebin` package like you normally would.
## Usage
### Browser interface
When viewing a paste, you can use
* r to view the raw paste,
* n to go the index page,
* y to copy the current URL to the clipboard,
* q to display the current URL as a QR code and
* p to view the formatted paste,
* ? to view the list of keybindings.To paste some text you can also use the ctrl+s key
combination.### Configuration
The following environment variables can be set to configure the server and
run-time behavior:* `WASTEBIN_ADDRESS_PORT` string that determines which address and port to bind
a. If not set, it binds by default to `0.0.0.0:8088`.
* `WASTEBIN_BASE_URL` string that determines the base URL for the QR code
display. If not set, the user agent's `Host` header field is used as an
approximation.
* `WASTEBIN_CACHE_SIZE` number of rendered syntax highlight items to cache.
Defaults to 128 and can be disabled by setting to 0.
* `WASTEBIN_DATABASE_PATH` path to the sqlite3 database file. If not set, an
in-memory database is used.
* `WASTEBIN_HTTP_TIMEOUT` maximum number of seconds a request can be processed
until wastebin responds with 408, by default it is set to 5 seconds.
* `WASTEBIN_MAX_BODY_SIZE` number of bytes to accept for POST requests. Defaults
to 1 MB.
* `WASTEBIN_MAX_PASTE_EXPIRATION` maximum allowed lifetime of a paste in
seconds. Defaults to 0 meaning unlimited.
* `WASTEBIN_PASSWORD_SALT` salt used to hash user passwords used for encrypting
pastes.
* `WASTEBIN_SIGNING_KEY` sets the key to sign cookies. If not set, a random key
will be generated which means cookies will become invalid after restarts and
paste creators will not be able to delete their pastes anymore.
* `WASTEBIN_TITLE` overrides the HTML page title. Defaults to `wastebin`.
* `RUST_LOG` influences logging. Besides the typical `trace`, `debug`, `info`
etc. keys, you can also set the `tower_http` key to some log level to get
additional information request and response logs.### API endpoints
POST a new paste to the `/` endpoint with the following JSON payload:
```
{
"text": "",
"extension": "",
"expires": ,
"burn_after_reading":
}
```After successful insertion, you will receive a JSON response with the path to
the newly created paste:```
{"path":"/Ibv9Fa.rs"}
```To retrieve the raw content, make a GET request on the `/:id` route and an
accept header value that does not include `text/html`. If you use a client that
is able to handle cookies you can delete the paste once again using the cookie
in the `Set-Cookie` header set during redirect after creation.In case the paste was encrypted, pass the password via the `Wastebin-Password`
header.### Paste from neovim
Use the [wastebin.nvim](https://github.com/matze/wastebin.nvim) plugin and paste
the current buffer or selection with `:WastePaste`.### Paste from clipboard
We can use the API POST endpoint to paste clipboard data easily from the command
line using `xclip`, `curl` and `jq`. Define the following function in your
`.bashrc` and you are good to go:```bash
function paste_from_clipboard() {
local URL=$(\
jq -n --arg t "$(xclip -selection clipboard -o)" '{text: $t}' | \
curl -s -H 'Content-Type: application/json' --data-binary @- https://wastebin.tld | \
jq -r '. | "https://wastebin.tld\(.path)"')xdg-open $URL
}
```### Paste from stdin
To paste from stdin use the following function in your `.bashrc`:
```bash
function paste_from_stdin() {
jq -Rns '{text: inputs}' | \
curl -s -H 'Content-Type: application/json' --data-binary @- https://wastebin.tld | \
jq -r '. | "wastebin.tld\(.path)"'
}
```It can be handy for creating pastes from logs or the output of commands, e.g.
`cat file.log | paste_from_stdin`.## License
[MIT](./LICENSE)