Files & object storage
Choose S3-compatible object storage or PostgreSQL-backed files. Vercel Blob and UploadThing are not required for the default upload path.
S3-compatible storage
Set NEXT_PUBLIC_STORAGE_PROVIDER=s3 and all five S3 settings. Compose configures SeaweedFS automatically. For another object store, supply its endpoint, region, access key, secret, and bucket, and ensure browser-facing object URLs are reachable.
NEXT_PUBLIC_STORAGE_PROVIDER=s3
NEXT_PUBLIC_S3_ENDPOINT=https://objects.example.com
S3_REGION=us-east-1
S3_ACCESS_KEY=replace-with-storage-access-key
S3_SECRET_KEY=replace-with-storage-secret
S3_BUCKET_NAME=launchstackThe base Compose stack pins its endpoint to SeaweedFS. Override app and worker environment entries when changing stores; editing .env alone will not replace those fixed values. Never put storage secrets in NEXT_PUBLIC_* variables.
PostgreSQL-backed files
Set NEXT_PUBLIC_STORAGE_PROVIDER=database to store file content in PostgreSQL. This is the fallback when no complete S3 configuration exists. It is database storage, not a local disk directory.
NEXT_PUBLIC_STORAGE_PROVIDER=database
FILE_ACCESS_TOKEN_SECRET=replace-with-an-independent-random-secret
APP_PUBLIC_URL=https://workspace.example.comThe app and worker must share FILE_ACCESS_TOKEN_SECRET. Conversion services must be able to reach APP_PUBLIC_URL and allow it as a fetch origin, because they read short-lived signed /api/files URLs.
Existing Blob and UploadThing deployments
BLOB_READ_WRITE_TOKEN and UPLOADTHING_TOKEN remain relevant to compatible legacy paths and existing files. Keep credentials needed to read those objects during a migration. New standard uploads can use S3 or PostgreSQL without either service.
Back up the database and object store together. Changing the backend does not automatically move previously uploaded objects.