A simple, light and standalone pastebin, URL shortener and file-sharing service
Go to file
Raphaël Thériault 5855965e24 Switch to BLAKE3, slightly better security, simplify with globals 2020-01-15 23:47:38 -05:00
.github/workflows Use caching in actions workflow 2020-01-15 00:20:55 -05:00
migrations Backend support for code highlighting 2020-01-15 01:50:54 -05:00
resources Always use multipart for files 2020-01-15 22:35:10 -05:00
src Switch to BLAKE3, slightly better security, simplify with globals 2020-01-15 23:47:38 -05:00
.env.example Always use multipart for files 2020-01-15 22:35:10 -05:00
.gitignore Custom static files path in cdebug builds 2019-10-07 21:18:34 -04:00
Cargo.lock Switch to BLAKE3, slightly better security, simplify with globals 2020-01-15 23:47:38 -05:00
Cargo.toml Switch to BLAKE3, slightly better security, simplify with globals 2020-01-15 23:47:38 -05:00
LICENSE Added license 2019-10-15 09:09:39 -04:00
README.md Always use multipart for files 2020-01-15 22:35:10 -05:00
build.rs Switch to BLAKE3, slightly better security, simplify with globals 2020-01-15 23:47:38 -05:00
diesel.toml Initial commit 2019-10-07 17:44:59 -04:00

README.md

filite

A simple, light and standalone pastebin, URL shortener and file-sharing service that hosts files, redirects links and stores texts.

GitHub Actions Crates.io

Features

What it is

  • Easy to use. Installation and set-up take less than a minute and a built-in web UI is provided.
  • Standalone. No external dependencies required, everything that is needed is packed into the binary.
  • Light and fast. The Rust web framework Actix is used under the hood, providing great speed with a minimal footprint.

What it is not

  • A tracking tool. No stats are stored to increase speed and reduce resource usage, if this is what you are looking for this tool is not for you.

Installation

  1. Get the binary either from the releases page or using Cargo
  2. Run it a first time and follow the instructions
  3. Edit your config file, check the dedicated section for details
  4. Run the binary again and you're good to go, just browse to http://localhost:8080 (don't forget to replace 8080 with the port specified in your config)
  5. Optionally, set up a reverse proxy

Usage

When asked for a login, use whatever username you want and the password you provided during setup. Usage is pretty straightforward using the web UI, but here are some tips.

  • On successful submission, the URL will be copied to clipboard. If copying to clipboard fails, it will be displayed as an alert.
  • Press space in the URL input to generate a random one
  • If the entered URL is already in use, the input will have a yellow outline

Details for programmatic usage are provided in the dedicated section.

Planned features

  • Decent test suite
  • TLS support
  • Simple admin page
  • systemd service generation

Config

The config follows the following format. Most of the time, the defaults are reasonable.

# Port to listen on
port = 8080
# SQLite database URL
database_url = "database.db"
# Database connection pool size
pool_size = 4
# Path to the directory where files will be stored, relative or absolute
files_dir = "files"

# Highlight.js configuration
[highlight]
# Theme to use
theme = "github"
# Additional languages to import
languages = ["rust"]

Client tools

ShareX

To get the value of AUTORIZATION convert <USERNAME>:<PASSWORD> to base64. Don't forget to replace http://example.com with your own address.

File

{
  "Version": "13.0.1",
  "Name": "filite (file)",
  "DestinationType": "ImageUploader, FileUploader",
  "RequestMethod": "POST",
  "RequestURL": "http://example.com/f",
  "Headers": {
    "Authorization": "Basic <AUTORIZATION>"
  },
  "Body": "MultipartFormData",
  "FileFormName": "file",
  "URL": "http://example.com/f/$response$"
}
{
  "Version": "13.0.1",
  "Name": "filite (link)",
  "DestinationType": "URLShortener",
  "RequestMethod": "POST",
  "RequestURL": "http://example.com/l",
  "Headers": {
    "Authorization": "Basic <AUTORIZATION>"
  },
  "Body": "JSON",
  "Data": "{\"forward\":\"$input$\"}",
  "URL": "http://example.com/l/$response$"
}

Text

You can remove the prompt and always enable syntax highlighting by replacing $prompt:Highlight|false$ with true or false.

{
  "Version": "13.0.1",
  "Name": "filite (text)",
  "DestinationType": "TextUploader",
  "RequestMethod": "POST",
  "RequestURL": "http://example.com/t",
  "Headers": {
    "Authorization": "Basic <AUTORIZATION>"
  },
  "Body": "JSON",
  "Data": "{\"contents\":\"$input$\",\"highlight\":$prompt:Highlight|false$}",
  "URL": "http://example.com/t/$response$"
}

Reverse proxy

NGINX

Don't forget to replace 8080 with the port specified in your config and example.com with your own domain.

server {
    listen 80;
    listen [::]:80;

    server_name example.com;

    location / {
        proxy_pass http://localhost:8080;
        
        location /f {
            client_max_body_size 10M;
        }
    }
}

Programmatic usage

Posting new elements

Send a PUT request with a JSON body following the following schemes. Don't forget to set the Content-Type header to application/json and the Authorization header to a valid value (username isn't important).

File

PUT /f/id

{
    "base64": "Base64-encoded file",
    "filename": "Filename"
}

PUT /l/id

{
    "forward": "URL to forward to"
}

Text

PUT /t/id

{
    "contents": "Text contents"
}

Getting existing elements

The response will be a JSON array following the following schemes

Files

GET /f

[
    {
        "id": "ID (URL) as an integer",
        "filepath": "Absolute path to the stored file",
        "created": "Creation timestamp"
    }
]

GET /l

[
    {
        "id": "ID (URL) as an integer",
        "forward": "URL to forward to",
        "created": "Creation timestamp"
    }
]

Texts

GET /t

[
    {
        "id": "ID (URL) as an integer",
        "contents": "Text contents",
        "created": "Creation timestamp"
    }
]

Contributing

The project is open to contributions! Before submitting a PR, make sure your changes work both with and without the dev feature enabled.

Requirements

  • The Rust toolchain
  • diesel_cli with the sqlite feature enabled

Setup

  1. Copy .env.example to .env and set the variables to your liking
  2. Run diesel database setup
  3. Build or run with the dev feature enabled

License

filite is licensed under the MIT License.