Skip to content
luo980Public
forked from matze/wastebin

About

wastebin is a pastebin πŸ“

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Β 
Β 

Latest commit

Β 

History

645 Commits

Folders and files

Repository files navigation

wastebin

Rust

A minimal pastebin with a design shamelessly copied from bin.

DEMO (resets every day)

Features

  • axum and sqlite3 backend
  • comes as a single binary with low memory footprint
  • compresses pastes using zstd
  • syntax highlighting for > 170 languages with syntect
  • comes with eight color themes in light and dark mode
  • encrypts entries using ChaCha20Poly1305 and argon2 hashed passwords
  • allows deletion after expiration, after reading or by anonymous owners
  • shows QR code to browse a paste's URL on mobile devices

Non-features

  • user authentication and admin functionality
  • arbitrary file uploads
  • mitigations for all kinds of DoS attack vectors

Caution

Due to lack of authentication and further DoS mitigations, it is not advised to run wastebin facing the internet as is. If you plan to do so, you are strongly advised to rate limit inbound requests via iptables rules or a properly configured reverse proxy of your choice.

Installation

Run pre-built binaries

You can download pre-built, statically compiled Linux and MacOS binaries. After extraction, you can run the wastebin binary directly.

Basic usage

Start the server with default settings (listens on 0.0.0.0:8088):

./wastebin

Configure with environment variables

Start the server with custom configuration:

# Custom port and address
WASTEBIN_ADDRESS_PORT=127.0.0.1:3000 ./wastebin

# Custom port, database path, and theme
WASTEBIN_ADDRESS_PORT=0.0.0.0:8080 \
WASTEBIN_DATABASE_PATH=/path/to/wastebin.db \
WASTEBIN_THEME=gruvbox \
./wastebin

# Full example with common options
WASTEBIN_ADDRESS_PORT=0.0.0.0:8080 \
WASTEBIN_DATABASE_PATH=./data/wastebin.db \
WASTEBIN_BASE_URL=https://paste.example.com \
WASTEBIN_TITLE="My Pastebin" \
WASTEBIN_THEME=monokai \
WASTEBIN_CACHE_SIZE=256 \
WASTEBIN_MAX_BODY_SIZE=5242880 \
RUST_LOG=info \
./wastebin

Common configuration options:

  • WASTEBIN_ADDRESS_PORT: Address and port (e.g., 0.0.0.0:8080 or 127.0.0.1:3000)
  • WASTEBIN_DATABASE_PATH: Path to SQLite database file (default: in-memory)
  • WASTEBIN_BASE_URL: Base URL for QR codes and links
  • WASTEBIN_TITLE: HTML page title
  • WASTEBIN_THEME: Color theme (ayu, gruvbox, monokai, etc.)
  • WASTEBIN_CACHE_SIZE: Number of cached items (default: 128)
  • WASTEBIN_MAX_BODY_SIZE: Maximum POST body size in bytes (default: 1MB)
  • RUST_LOG: Log level (trace, debug, info, warn, error)

Run a Docker image

Alternatively, you can run a pre-built Docker image pushed to quxfoo/wastebin:<VERSION> and quxfoo/wastebin:latest respectively. To persist the database as state.db via the WASTEBIN_DATABASE_PATH environment variable use a bind mount to /path/for/storage like this

docker run \
    -e WASTEBIN_DATABASE_PATH=/data/state.db \
    -v /path/for/storage:/data \
    -u $(id -u):$(id -g) \
    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

services:
  wastebin:
    restart: always
    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:

nix run 'github:matze/wastebin#wastebin'

Or install the provided wastebin package like you normally would.

Build from source

Install a Rust 2024 toolchain containing Rust 1.85 with rustup and run the server binary with

cargo run --release

Build a container image

It is possible to build a container image using Docker or Podman. The Dockerfile is designed to be run on an x86_64 host but capable of building images for both x86_64 and aarch64 via the --target flag:

# Docker
docker build -t wastebin:v3.0.0 -f Dockerfile --target amd64 .
docker build -t wastebin:v3.0.0 -f Dockerfile --target arm64 .

# Podman
podman build -t wastebin:v3.0.0 -f Dockerfile --target amd64
podman build -t wastebin:v3.0.0 -f Dockerfile --target arm64

Note that you cannot build aarch64 images on aarch64 hosts with it.

To interact with a running wastebin instance the bundled wastebin-ctl tool can be used, e.g.:

podman exec -e RUST_LOG=debug -it wastebin /app/wastebin-ctl

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,
  • c to copy the content to the clipboard,
  • q to display the current URL as a QR code,
  • p to view the formatted paste and
  • w to toggle line wrapping on and off (off by default)
  • ? to view the list of keybindings.

To paste some text you can also use the ctrl+s key combination.

Configuration

All configuration is done via environment variables. The following table lists all available options:

Variable Description Default
WASTEBIN_ADDRESS_PORT Address and port to bind the server to (e.g., 0.0.0.0:8080). 0.0.0.0:8088
WASTEBIN_BASE_URL Base URL for QR codes and links (e.g., https://paste.example.com). Auto-detected from hostname
WASTEBIN_CACHE_SIZE Number of rendered items to cache. Set to 0 to disable. 128
WASTEBIN_DATABASE_PATH Path to SQLite database file. Use :memory: for in-memory. :memory: (in-memory)
WASTEBIN_HTTP_TIMEOUT Request timeout in seconds before responding with 408. 5
WASTEBIN_MAX_BODY_SIZE Maximum POST body size in bytes. 1048576 (1 MB)
WASTEBIN_PASSWORD_SALT Salt for hashing encryption passwords. somesalt
WASTEBIN_ADMIN_PASSWORD Admin password for /list-luo980 list & edit management UI. If unset, the list page is accessible without a password. (not set)
WASTEBIN_PASTE_EXPIRATIONS Comma-separated expiration options with duration units (s, m, h, d, M, y). Append =d to set default. 0=d,10m,1h,1d,1w,1M,1y
WASTEBIN_SIGNING_KEY Cookie signing key (must be at least 64 bytes). Random (resets on restart)
WASTEBIN_THEME Color theme: ayu, base16ocean, catppuccin, coldark, gruvbox, monokai, onehalf, solarized. ayu
WASTEBIN_TITLE HTML page title. wastebin
WASTEBIN_UNIX_SOCKET_PATH Path to Unix socket (alternative to TCP). (not set)
RUST_LOG Log level: trace, debug, info, warn, error. Set tower_http=debug for HTTP logs. (not set)

Note

WASTEBIN_ADDRESS_PORT and WASTEBIN_UNIX_SOCKET_PATH are mutually exclusive. If neither is set, the server defaults to 0.0.0.0:8088.

API endpoints

POST a new paste to the / endpoint with the following JSON payload:

{
  "text": "<paste content>",
  "extension": "<file extension, optional>",
  "title": "<paste title, optional>",
  "expires": <number of seconds from now, optional>,
  "burn_after_reading": <true/false, optional>,
  "password": <password for encryption optional>,
}

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 /raw/:id route. In case the paste was encrypted, pass the password via the wastebin-password header.

To delete a paste, make a DELETE request on the /:id route with the uid cookie set that was sent back in the Set-Cookie header of the redirect response after creation.

Admin list & edit UI

  • List page: open /list-luo980. If WASTEBIN_ADMIN_PASSWORD is set, you must log in with that password.
  • Editing: after login, the UI will keep a token in the URL query (e.g. ?token=...). Keep that token in the URL when navigating, and you can edit any paste via /edit/{id}.

wastebin-ctl command line tool

wastebin-ctl is a command line tool to interact directly with the wastebin database. It can be used to list all entries, purge entries which have expired or delete specific entries. To specify the database either use the --database option or set the WASTEBIN_DATABASE_PATH environment variable as usual.

Paste from neovim

Use the wastebin.nvim plugin and paste the current buffer or selection with :WastePaste.

Paste from clipboard

To paste clipboard data from the command line you can use the aforementioned API calls together with xclip, curl and jq. Define the following function in your .bashrc and you are good to go:

function paste_from_clipboard() {
    local API_URL="https://wastebin.tld"
    local URL=$(\
        jq -n --arg t "$(xclip -selection clipboard -o)" '{text: $t}' | \
            curl -s -H 'Content-Type: application/json' --data-binary @- ${API_URL}/ | \
            jq -r '. | "'${API_URL}'\(.path)"' )

    xdg-open $URL
}

For wayland users, consider replace the xclip ... with wl-paste from wl-clipboard.

Paste from stdin

To paste from stdin use the following function in your .bashrc:

function paste_from_stdin() {
    local API_URL="https://wastebin.tld"
    jq -Rns '{text: inputs}' | \
        curl  -s -H 'Content-Type: application/json' --data-binary @- ${API_URL}/ | \
        jq -r '. | "'${API_URL}'\(.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

About

wastebin is a pastebin πŸ“

Resources

Contributing

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages