80 lines
3.1 KiB
Markdown
80 lines
3.1 KiB
Markdown
# share
|
||
|
||
Minimalist no-signup file/video drop. Upload a file, get a private UUID link, share it. Files self-destruct after a configurable TTL.
|
||
|
||
- No accounts, no DB. Metadata is a tiny JSON sidecar per upload.
|
||
- Streamed uploads (no in-memory buffering).
|
||
- HTTP `Range` requests so HTML5 video can seek.
|
||
- Background sweeper deletes expired files every 5 min.
|
||
- Per-upload `deleteToken` lets the uploader revoke early.
|
||
|
||
## Local dev
|
||
|
||
```bash
|
||
npm install
|
||
npm run dev
|
||
# http://127.0.0.1:3000
|
||
```
|
||
|
||
Files land in `./data/uploads`.
|
||
|
||
## Configuration
|
||
|
||
| Env | Default | Notes |
|
||
|---|---|---|
|
||
| `PORT` | `3000` | HTTP port |
|
||
| `HOST` | `0.0.0.0` | Bind host |
|
||
| `DATA_DIR` | `/data/uploads` | Persisted directory (mount a volume here) |
|
||
| `MAX_FILE_SIZE` | `524288000` | 500 MB. Bytes. |
|
||
| `LOG_LEVEL` | `info` | Fastify logger level |
|
||
|
||
TTL options exposed in the UI: 30m / 1h / 6h / 24h. Edit `TTL_OPTIONS` in `src/server.js` to change.
|
||
|
||
## Deploy on Coolify (montlab.dev)
|
||
|
||
Two ways. Pick one.
|
||
|
||
### Option A — Dockerfile build pack (matches existing apps)
|
||
|
||
1. Push this repo to Gitea: `git.montlab.dev/JosLe/video-share`.
|
||
2. In Coolify, create a new app:
|
||
- Build pack: **Dockerfile**
|
||
- Source: Public Repository → `https://git.montlab.dev/JosLe/video-share.git`
|
||
- Branch: `main`
|
||
- Port: `3000`
|
||
- Domain: `share.montlab.dev` (Caddy + Let's Encrypt is automatic)
|
||
3. **Persistent storage** → add a volume:
|
||
- Source: `share_data` (named volume, or a host path you prefer)
|
||
- Destination: `/data`
|
||
4. **Environment variables** (optional override):
|
||
- `MAX_FILE_SIZE=524288000`
|
||
5. Set up the Gitea webhook exactly like the other apps in `INFRASTRUCTURE.md`.
|
||
6. Deploy. First time may need "Force redeploy without cache".
|
||
|
||
### Option B — Docker Compose build pack
|
||
|
||
Use the bundled `docker-compose.yaml`. Pick build pack **Docker Compose** in Coolify, point at this repo, set the domain on the `app` service to `share.montlab.dev`, port `3000`. The named volume `share_data` is declared in the compose file.
|
||
|
||
## Caddy / proxy notes
|
||
|
||
Coolify's Caddy fronts the app, so HTTPS, HTTP/2 and request body limits are handled there. caddy-docker-proxy v2.9 does **not** cap upload size by default for HTTP/2, but if a future config sets `request_body { max_size ... }`, bump it above `MAX_FILE_SIZE`.
|
||
|
||
## Endpoints
|
||
|
||
| Method | Path | Purpose |
|
||
|---|---|---|
|
||
| `GET` | `/` | Upload page |
|
||
| `POST` | `/upload` | multipart form: `file` + `ttl` (`30m`/`1h`/`6h`/`24h`) |
|
||
| `GET` | `/v/:id` | Viewer (HTML, video player) |
|
||
| `GET` | `/f/:id` | Raw file stream, supports `Range` |
|
||
| `GET` | `/f/:id?dl=1` | Force download |
|
||
| `GET` | `/api/info/:id` | JSON metadata |
|
||
| `DELETE` | `/api/:id?token=...` | Revoke with the delete token |
|
||
| `GET` | `/healthz` | Liveness |
|
||
|
||
Links use UUID v4. They are unguessable but **not authenticated** — anyone with the link can view. Send the link over a private channel.
|
||
|
||
## Disk usage
|
||
|
||
A 500 MB upload at 1 h TTL uses ~500 MB until the sweep cycle picks it up (≤5 min after expiry). For peak sizing assume `users × max_concurrent_uploads × MAX_FILE_SIZE × longest_TTL/sweep_interval`. Coolify's CX22 has 40 GB SSD — keep an eye on it or lower `MAX_FILE_SIZE`.
|