# Production stack: built images (no bind mounts), nginx serves the built # frontend + reverse-proxies Socket.IO, Postgres is internal-only. # # Usage: # cp .env.example .env # fill in real secrets # docker compose -f docker-compose.prod.yaml up -d --build services: db: image: postgres:18-alpine environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - pgdata:/var/lib/postgresql restart: always backend: build: . environment: DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB} CORS_ALLOWED_ORIGINS: ${CORS_ALLOWED_ORIGINS} ADMIN_TOKEN: ${ADMIN_TOKEN} ENCRYPTION_KEY: ${ENCRYPTION_KEY} GEOIP_DB_PATH: /app/geoip/GeoLite2-Country.mmdb volumes: - /home/tim/docker_volumes/bridzik/:/app/geoip:ro restart: always depends_on: - db frontend: build: ./frontend environment: BACKEND_UPSTREAM: backend:5000 restart: always depends_on: - backend volumes: pgdata: