A Simple self-hostable File Sharing Service written in C#. Supports displaying media (image, video, audio), ShareX config generation, rustgrab support, and stores files with pretty much any S3-compatible service.
- User Management
- User Registration
- 2FA
- Config Generator for ShareX and rustgrab
- Compatible with AWS S3 and S3-Compatible Services (like Cloudflare R2, MinIO, and Wasabi1)
- Web File Upload
- Audit Logging
- Per-user storage quota & file size limits
- Public & Private uploads
- Image Preview Generation (including image info like file type, compression, interlacing, and dimensions)
- Text File Preview
- Link Shortener
It is recommended to use Docker to make updating very easy. The following docker compose file is the recommended setup, along with copying config.example.xml
to config.xml
and change the settings in there so it fits your needs.
services:
db:
image: postgres:17-alpine
environment:
POSTGRES_PASSWORD: changeme123
POSTGRES_USER: kasta
POSTGRES_DB: kasta
logging:
driver: "none"
restart: unless-stopped
volumes:
- local_pgdata:/var/lib/postgresql/data
web:
image: ghcr.io/ktwrd/kasta:latest
environment:
# optional setting
SentryDsn: https://xxxx@sentry.example.com/1
ports:
- "127.0.0.1:8080:8080" # will only forward ports to localhost for security reasons.
volumes:
# Configuration file defaults to /config/kasta.xml
- ./kasta-config/:/config
depends_on:
- db
volumes:
local_pgdata:
The first user that is created will be given the "Administrator" role, so make sure that your deployment is only accessible locally at first. By default, anyone can register for an account, so secure your deployment in the "System" tab when you first log in.
When trying to do database migrations for development, make sure that the CONFIG_LOCATION
environment variable is set to where your config.xml
file is located so the Database Context can successfully create a connection string.
This occurs because the response header is >8kb. This can be fixed by disabling HTTP/2 support (/speed/optimization/protocol
), and setting the following value in your NGINX config;
server {
...
large_client_header_buffers 4 32k;
...
}
The following is the recommended NGINX site configuration for proxy_pass
(only subdomain proxy is officially supported)
server {
listen 443 ssl;
# Make sure that your SSL parameters are set here!!
server_name kasta.example.com;
access_log /var/log/nginx/access.log;
client_max_body_size 500M;
# Fix for 520 Cloudflare errorr (see section above)
large_client_header_buffers 4 32k;
location / {
# Make sure that the port is correct!
proxy_pass http://127.0.0.1:5280/;
proxy_buffer_size 32k;
proxy_buffers 8 32k;
proxy_busy_buffers_size 64k;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}
server {
server_name kasta.example.com;
listen 80;
return 301 https://$http_host$request_uri;
}
Footnotes
-
Kasta has only been tested with AWS S3 and MinIO (LAN Deployment). When using an S3 Compatible Service (that isn't AWS S3), then make sure that the
ForcePathStyle
element in your S3 configuration is set totrue
(which is nested in theS3
element inconfig.example.xml
). ↩