Starting the stack
From the root of your product directory (e.g.products/basic/ or products/pro/), run:
Dockerfiles, and starts all services in the background. Once the command returns, the following services are running:
The backend waits for PostgreSQL and Redis to pass their health checks before it starts, so all services are ready by the time
docker-compose up -d returns.
Viewing logs
To follow the combined log output of all services:frontend, db, redis) to isolate its output. Press Ctrl+C to stop following without stopping the containers.
Stopping the stack
To stop all containers while preserving your database volume:-v flag removes the named postgres_data volume, so your database is wiped. Use this when you want a clean slate or need to re-run migrations from scratch.
Production Docker Compose
The repository also includesdocker-compose.prod.yml for production deployments on a single server (e.g. a DigitalOcean Droplet or EC2 instance). It differs from the development file in several important ways:
- No hot-reload. The backend runs Gunicorn with multiple Uvicorn workers instead of
uvicorn --reload, and the frontend is served as a pre-built static bundle. - Pre-built images. Services reference tagged Docker images (e.g.
ghcr.io/Shipfastai/backend:latest) rather than building from local source. - Production environment variables.
APP_ENV=production,DEBUG=false, andLOG_FORMAT=jsonare set explicitly. - Nginx reverse proxy. An Nginx container handles TLS termination and routes traffic to the backend (port 8000) and frontend (port 3000) services.
- Persistent Redis volume. Redis data is written to a named volume so it survives container restarts.
Rebuilding after changes
When you modify theDockerfile or install new Python/Node dependencies, rebuild the affected image before restarting: