Docker
LaunchFast ships with a production-ready Dockerfile. The container runs a Node.js application with SQLite, LiteFS replication, and all dependencies pre-built.
Dockerfile overview
The Dockerfile lives at other/Dockerfile and uses a multi-stage build:
- Base stage — sets up the Node.js runtime environment
- Dependencies stage — installs production npm packages
- Build stage — compiles the Remix application and generates the Prisma client
- Production stage — copies only what is needed to run, installs LiteFS and SQLite tooling
Building locally
docker build -t my-app -f other/Dockerfile .Running locally
docker run -p 3000:3000 \
-e SESSION_SECRET="your-secret" \
-e HONEYPOT_SECRET="your-honeypot-secret" \
my-appWhen running outside of Fly.io, LiteFS automatically becomes a no-op and SQLite runs from the local filesystem. No code changes are required.
Environment variables
Pass environment variables at runtime via -e flags or a .env file. Required variables:
SESSION_SECRETHONEYPOT_SECRET
See the Fly.io deployment guide for the full list of secrets used in production.
Volumes
In production on Fly.io, a persistent volume is mounted at /data for the SQLite database. When running Docker locally, you can mount a volume to persist data across container restarts:
docker run -p 3000:3000 \
-v my-app-data:/data \
-e SESSION_SECRET="your-secret" \
my-appBuild-time secrets
Some integrations (like Sentry) need secrets at build time. The Dockerfile includes examples of how to pass build-time secrets using Docker build arguments. These are used in the GitHub Actions CI workflow for production deployments.