All media (chunks, assembled tracks, exports) lives on local disk under data/, rooted in server/src/lib/storage.ts (TRIBUTARY_DATA_DIR). That's perfect for single-machine self-hosting but caps scale-out and makes backups manual.
Proposal
- Extract a storage interface (put/get/stream/delete/list) around the current disk paths — worth landing as its own PR.
- Add an S3-compatible driver (S3/R2/MinIO) selected via env, e.g.
STORAGE=s3 + the usual S3_* vars.
Notes
- The ffmpeg jobs (
server/src/jobs/) read/write files directly; they'll need local scratch space with upload/download at job boundaries.
- Chunk upload is idempotent by (track, chunk index) — the driver must preserve that.
Done when: with STORAGE=s3 against MinIO, a full session (record → upload → process → download) round-trips with no local data/ growth beyond scratch.
All media (chunks, assembled tracks, exports) lives on local disk under
data/, rooted inserver/src/lib/storage.ts(TRIBUTARY_DATA_DIR). That's perfect for single-machine self-hosting but caps scale-out and makes backups manual.Proposal
STORAGE=s3+ the usualS3_*vars.Notes
server/src/jobs/) read/write files directly; they'll need local scratch space with upload/download at job boundaries.Done when: with
STORAGE=s3against MinIO, a full session (record → upload → process → download) round-trips with no localdata/growth beyond scratch.