Skip to guide
Deployment/Configure
Self-hosting reference

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.

.env
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=launchstack

The 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.

.env
NEXT_PUBLIC_STORAGE_PROVIDER=database
FILE_ACCESS_TOKEN_SECRET=replace-with-an-independent-random-secret
APP_PUBLIC_URL=https://workspace.example.com

The 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.

Deployment Guide — Self-Host Launchstack | Launchstack