| name | static-files |
| description | Host static files on subdomains with optional authentication. Use when you need to serve HTML, images, CSS, JS, or any static content on a dedicated subdomain. Supports file upload, basic auth, quota management, and automatic SSL via Caddy. Commands include sf sites (create/list/delete), sf upload (files/directories), sf files (list/delete).
|
Static Files Hosting
Host static content on *.{domain} subdomains with automatic SSL.
Quick Reference
sf sites create mysite
sf upload ./index.html mysite
sf upload ./dist mysite
sf sites auth mysite admin:secretpass123
sf files mysite
sf files mysite delete path/to/file.txt
sf sites delete mysite
Environment Setup
export SF_API_URL=http://localhost:3000
export SF_API_KEY=sk_xxxxx
Workflows
Deploy a Static Website
sf sites create docs
sf upload ./build docs
curl -I https://docs.498as.com
Protected File Sharing
sf sites create private
sf sites auth private user:strongpassword
sf upload ./reports private
Update Existing Files
sf upload ./new-version.pdf mysite --overwrite
sf files mysite delete old-file.pdf
sf upload ./new-file.pdf mysite
CLI Commands
sites
| Command | Description |
|---|
sf sites list | List all sites |
sf sites create <name> | Create new site |
sf sites delete <name> | Delete site and all files |
sf sites auth <name> <user:pass> | Set basic auth |
sf sites auth <name> --remove | Remove auth |
upload
sf upload <path> <site> [subdir] [--overwrite] [--json]
path: File or directory to upload
site: Target site name
subdir: Optional subdirectory
--overwrite: Replace existing files
--json: Output JSON
files
| Command | Description |
|---|
sf files <site> | List all files |
sf files <site> delete <path> | Delete specific file |
stats
sf stats
sf stats <site>
API Endpoints
Base: $SF_API_URL with Authorization: Bearer $SF_API_KEY
| Method | Path | Description |
|---|
| GET | /sites | List sites |
| POST | /sites | Create site |
| DELETE | /sites/{name} | Delete site |
| PATCH | /sites/{name} | Update auth |
| GET | /sites/{name}/files | List files |
| POST | /sites/{name}/files | Upload file |
| DELETE | /sites/{name}/files/{path} | Delete file |
| GET | /stats | Global stats |
| GET | /stats/{name} | Site stats |
| GET | /health | Health check |
Constraints
- Site names: lowercase, alphanumeric, hyphens only (max 63 chars)
- File size: 50MB default (configurable)
- Quota: 100MB per site default
- Rate limit: 100 requests/minute per API key
Troubleshooting
"Cannot connect to API"
systemctl status kleo-static-files
curl http://localhost:3000/health
"Invalid API key"
echo $SF_API_KEY
bun run /opt/kleo-static-files/scripts/create-key.ts "new-key"
"Quota exceeded"
sf stats mysite
sf files mysite delete large-file.zip
Site not accessible via HTTPS
dig mysite.498as.com
cat /etc/caddy/sites.d/static-files.caddy
bun run /opt/kleo-static-files/scripts/sync-caddy.ts --reload
Installation
Server Installation (run once on host)
curl -fsSL https://raw.githubusercontent.com/498AS/kleo-static-files/main/install.sh | sudo bash
The installer outputs JSON with connection details between KLEO_SF_CONFIG_BEGIN and KLEO_SF_CONFIG_END markers. Parse this to get api_url and api_key.
After Installation
export SF_API_URL=http://localhost:3000
export SF_API_KEY=sk_xxxxx
Check Status
sudo /opt/kleo-static-files/install.sh --status
See references/install.md for manual installation.