Complete Docker setup for Marionette with Docker Compose.
# Start all services
docker-compose up -d
# View logs
docker-compose logs -f
# Stop all services
docker-compose down- Container:
marionette-backend - Port: 8787
- Health Check:
http://localhost:8787/health - Database: SQLite at
./db/marionette.db
- Container:
marionette-frontend - Port: 5173 (mapped to port 80 in container)
- Server: nginx
- API Proxy: Requests to
/apiare proxied to backend
- Docker 20.10+
- Docker Compose 2.0+
Backend (docker-compose.yml):
environment:
- NODE_ENV=production
- PORT=8787
- DATABASE_URL=sqlite:/app/db/marionette.dbFrontend (docker-compose.yml):
environment:
- VITE_API_URL=http://localhost:8787
- VITE_WS_URL=ws://localhost:8787- Frontend: http://localhost:5173
- Backend API: http://localhost:8787
- WebSocket: ws://localhost:8787/stream
The SQLite database is stored in ./db/marionette.db and is mounted as a volume, so data persists across container restarts.
The database will be created automatically on first run. If you need to reset it:
# Stop services
docker-compose down
# Remove database
rm db/marionette.db
# Recreate database
sqlite3 db/marionette.db < db/schema.sql
# Start services
docker-compose up -d# Build and start in detached mode
docker-compose up -d --build
# Build without starting
docker-compose build
# Start without building
docker-compose up -d# All services
docker-compose logs -f
# Specific service
docker-compose logs -f backend
docker-compose logs -f frontend
# Last 100 lines
docker-compose logs --tail=100# Stop services
docker-compose stop
# Stop and remove containers
docker-compose down
# Stop, remove containers, and volumes
docker-compose down -v# Restart all
docker-compose restart
# Restart specific service
docker-compose restart backend
docker-compose restart frontend# Backend shell
docker-compose exec backend sh
# Frontend shell
docker-compose exec frontend sh
# Run command in backend
docker-compose exec backend node dist/migrate.jsFor local development, use pnpm dev instead of Docker:
pnpm dev # Starts backend + frontend with hot reloadUse Docker Compose for production deployments:
docker-compose up -d --build# Check logs
docker-compose logs backend
# Check if database directory exists
ls -la db/
# Recreate containers
docker-compose down
docker-compose up -d --build# Check if backend is healthy
curl http://localhost:8787/health
# Check network connectivity
docker-compose exec frontend wget -O- http://backend:8787/health# Find process using port 8787
lsof -ti:8787
# Kill process
lsof -ti:8787 | xargs kill -9
# Or change port in docker-compose.yml
ports:
- "8788:8787" # Use different host port# Fix permissions
chmod 755 db/
chmod 644 db/marionette.db
# Restart
docker-compose restart backendBackend health check runs every 30 seconds:
# Manual health check
curl http://localhost:8787/health
# Check container health status
docker-compose psExpected response:
{"status":"ok","timestamp":"2026-02-20T..."}Services communicate via the marionette-network bridge network:
- Frontend → Backend:
http://backend:8787 - Host → Frontend:
http://localhost:5173 - Host → Backend:
http://localhost:8787
./db:/app/db- Database persistencedb-data- Named volume for additional data (optional)
# Build backend
docker build -t marionette-backend:latest -f apps/server/Dockerfile .
# Build frontend
docker build -t marionette-frontend:latest -f apps/web/Dockerfile .
# Run manually
docker run -d -p 8787:8787 --name backend marionette-backend:latest
docker run -d -p 5173:80 --name frontend marionette-frontend:latestAdd to docker-compose.yml if needed:
services:
backend:
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256MBoth Dockerfiles use multi-stage builds to minimize image size:
- Builder stage: Compiles TypeScript
- Production stage: Only includes compiled code
- Non-root user: Consider adding non-root user in Dockerfiles
- Secrets: Never commit
.envfiles with secrets - Network isolation: Use Docker networks for service communication
- Image scanning: Run
docker scanto check for vulnerabilities
name: Docker Build
on:
push:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Build and test
run: docker-compose up -d --build
- name: Run tests
run: docker-compose exec backend pnpm test# Create backup
docker-compose exec backend sh -c 'sqlite3 /app/db/marionette.db .dump' > backup.sql
# Or copy file
cp db/marionette.db db/marionette.db.backup# Stop backend
docker-compose stop backend
# Restore from SQL dump
sqlite3 db/marionette.db < backup.sql
# Or restore file
cp db/marionette.db.backup db/marionette.db
# Start backend
docker-compose start backend- Configure environment variables for your deployment
- Set up reverse proxy (nginx/Caddy) for SSL/TLS
- Configure automated backups
- Set up monitoring (Prometheus + Grafana)
- Enable log aggregation (ELK stack or similar)
For issues or questions:
- Check logs:
docker-compose logs - Review README.md
- Open issue on GitHub