services: redis: image: redis:7-alpine restart: unless-stopped networks: - trivia-network volumes: - redis-data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 5 backend: build: context: . dockerfile: Dockerfile restart: unless-stopped ports: - "${PORT:-5001}:5001" environment: - FLASK_APP=backend.app:create_app - FLASK_ENV=production - SECRET_KEY=${SECRET_KEY} - PORT=5001 - DATABASE_URI=sqlite:////app/backend/instance/trivia.db - CORS_ORIGINS=${CORS_ORIGINS:-*} - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 # OIDC/Authelia configuration - OIDC_ISSUER=${OIDC_ISSUER:-} - OIDC_CLIENT_ID=${OIDC_CLIENT_ID:-trivia-app} - OIDC_CLIENT_SECRET=${OIDC_CLIENT_SECRET:-} - OIDC_REDIRECT_URI=${OIDC_REDIRECT_URI:-} - FRONTEND_URL=${FRONTEND_URL:-} - SESSION_COOKIE_SECURE=${SESSION_COOKIE_SECURE:-true} volumes: # Persist database - trivia-db:/app/backend/instance # Persist uploaded images - trivia-images:/app/backend/static/images # Persist audio files - trivia-audio:/app/backend/static/audio depends_on: redis: condition: service_healthy networks: - trivia-network healthcheck: test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:5001/api/health')"] interval: 30s timeout: 5s retries: 3 start_period: 10s celery-worker: build: context: . dockerfile: Dockerfile command: uv run celery -A backend.celery_app worker --loglevel=info restart: unless-stopped environment: - FLASK_APP=backend.app:create_app - FLASK_ENV=production - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 - DATABASE_URI=sqlite:////app/backend/instance/trivia.db volumes: - trivia-db:/app/backend/instance - trivia-audio:/app/backend/static/audio depends_on: redis: condition: service_healthy networks: - trivia-network celery-flower: build: context: . dockerfile: Dockerfile command: uv run celery -A backend.celery_app flower --port=5555 restart: unless-stopped ports: - "5555:5555" environment: - CELERY_BROKER_URL=redis://redis:6379/0 - CELERY_RESULT_BACKEND=redis://redis:6379/0 depends_on: - redis - celery-worker networks: - trivia-network networks: trivia-network: driver: bridge volumes: redis-data: trivia-db: trivia-images: trivia-audio: