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-app

When 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_SECRET
  • HONEYPOT_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-app

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