version: '3.8' services: app: build: context: . target: production ports: - "5000:5000" environment: - NODE_ENV=production - DATABASE_URL=${DATABASE_URL} - SESSION_SECRET=${SESSION_SECRET} - REPLIT_DOMAINS=${REPLIT_DOMAINS} - REPL_ID=${REPL_ID} - ISSUER_URL=${ISSUER_URL:-https://replit.com/oidc} depends_on: db: condition: service_healthy volumes: - uploads_data:/app/uploads restart: unless-stopped healthcheck: test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:5000/"] interval: 30s timeout: 10s retries: 3 start_period: 40s db: image: postgres:15-alpine environment: - POSTGRES_DB=${PGDATABASE:-dj_management} - POSTGRES_USER=${PGUSER:-postgres} - POSTGRES_PASSWORD=${PGPASSWORD} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data - ./init.sql:/docker-entrypoint-initdb.d/init.sql restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U ${PGUSER:-postgres} -d ${PGDATABASE:-dj_management}"] interval: 10s timeout: 5s retries: 5 # Optional: Redis for session storage (alternative to PostgreSQL sessions) redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data restart: unless-stopped healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 3s retries: 5 # Optional: Nginx reverse proxy nginx: image: nginx:alpine ports: - "80:80" - "443:443" volumes: - ./nginx.conf:/etc/nginx/nginx.conf - ./ssl:/etc/nginx/ssl depends_on: - app restart: unless-stopped volumes: postgres_data: redis_data: uploads_data: