Fly
fly launch --image ghcr.io/pwnera/artbucket:1 --no-deploy --name acme-assetsDatabase
Section titled “Database”Any Postgres 16 or later works: Fly’s Managed Postgres, Neon, Supabase. Make one, then hand the app its connection string:
fly secrets set DATABASE_URL=postgres://...Storage
Section titled “Storage”Tigris is S3-compatible and built into Fly:
fly storage create # sets AWS_* and BUCKET_NAMEArtbucket reads S3_*, so copy them over:
fly secrets set \ S3_ENDPOINT=https://fly.storage.tigris.dev \ S3_REGION=auto \ S3_BUCKET=<BUCKET_NAME> \ S3_ACCESS_KEY_ID=<AWS_ACCESS_KEY_ID> \ S3_SECRET_ACCESS_KEY=<AWS_SECRET_ACCESS_KEY> \ S3_FORCE_PATH_STYLE=falseThe rest
Section titled “The rest”fly secrets set \ APP_URL=https://acme-assets.fly.dev \ BETTER_AUTH_SECRET="$(openssl rand -base64 32)" \ TRUSTED_PROXIES=privatefly deployIn fly.toml, the app listens on 3000:
[http_service] internal_port = 3000 force_https = true auto_stop_machines = "stop" auto_start_machines = true min_machines_running = 1Keep one machine running: the sweeper runs inside the app, every six hours.