Work in progress file uploader using Crystal. Ready to use but unknown bugs may appear.
Find a file
2024-08-18 21:47:57 -04:00
config 0.8.8: Rate limit completed, fix delete_key 2024-08-18 21:47:57 -04:00
public 0.8.1: Option to disable thumbnail generation, OpenGraph implementation 2024-08-10 00:58:31 -04:00
spec 0.3.0: Added DB + Deletion support 2024-08-01 03:10:27 -04:00
src 0.8.8: Rate limit completed, fix delete_key 2024-08-18 21:47:57 -04:00
.gitignore 0.8.2: Tor exit node blocking. 2024-08-10 21:13:37 -04:00
LICENSE 0.2.0 2024-07-31 18:25:30 -04:00
README.md 0.8.8: Rate limit completed, fix delete_key 2024-08-18 21:47:57 -04:00
shard.lock 0.1.0 2024-07-03 01:41:18 -04:00
shard.yml 0.8.7: WIP built-in IP address rate limit 2024-08-16 02:03:38 -04:00

file-uploader

Simple file uploader made on Crystal. I'm making this to replace my current File uploader hosted on https://ayaya.beauty which uses https://github.com/nokonoko/uguu Already replaced lol.

Features

  • Temporary file uploads like Uguu
  • File deletion link (not available in frontend for now)
  • Chatterino and ShareX support
  • Video Thumbnails for Chatterino and FrankerFaceZ (Requires ffmpeg to be installed, can be disabled.)
  • Rate Limiting
  • Small Admin API that allows you to delete files, reset rate limits and more (Needs to be enabled in the configuration)
  • Unix socket support if you don't want to deal with all the TCP overhead
  • Automatic protocol detection (HTTPS or HTTP)
  • Low memory usage: Between 6MB at idle and 25MB if a file is being uploaded or retrieved. It will depend of your traffic.

Usage

  • Clone this repository, compile it using shards build --release and execute the server using ./bin/file-uploader.
  • Change the settings file ./config/config.yml acording to what you need.

NGINX Server block

Assuming you are already using NGINX and you know how to use it, you can use this example server block.

server {
    # You can keep the domain prefixed with `~.` if you want
    # to allow users to use any domain to upload and retrieve
    # files. Like xdxd.example.com or lolol.example.com .
    # This will only work if you have a wildcard domain.
	server_name ~.example.com example.com;

	location / {
        proxy_pass http://127.0.0.1:8080;
        # This if you want to use a UNIX socket instead
		#proxy_pass http://unix:/tmp/file-uploader.sock;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
		proxy_pass_request_headers      on;
	}

    # This should be the size_limit value (from config.yml)
	client_max_body_size 512M;

	listen 443 ssl;
	http2 on;
}

Systemd user service example

[Unit]
Description=file-uploader-crystal
After=network.target

[Service]
Type=simple
Restart=always
RestartSec=2
LimitNOFILE=4096
Environment="KEMAL_ENV=production"
ExecStart=%h/file-uploader-crystal/bin/file-uploader
WorkingDirectory=%h/file-uploader-crystal/

[Install]
WantedBy=default.target

TODO

  • Add file size limit ADDED
  • Fix error when accessing http://127.0.0.1:8080 with an empty DB. Fixed somehow.
  • Better frontend...
  • Disable file deletion if deleteFilesCheck or deleteFilesAfter is set to 0 DONE
  • Disable delete key if deleteKeyLength is 0 DONE (But I think there is a better way to do it)
  • Exit if fileameLength is 0 DONE
  • Disable file limit if size_limit is 0 DONE
  • Prevent files from being overwritten in the event of a name collision DONE
  • Dockerfile and Docker image (Crystal doesn't has dependency hell like other languages so is not really necessary to do, but useful for people that want instant deploy)
  • Custom file expiration using headers (Like rustypaste)
  • Small CLI to upload files (like rpaste from rustypaste)
  • Add more endpoints to Admin API