services: postgres: image: postgres:16-alpine environment: POSTGRES_DB: deckforge POSTGRES_USER: deckforge POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-deckforge} ports: - "5432:5432" volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U deckforge"] interval: 5s timeout: 5s retries: 5 redis: image: redis:7-alpine ports: - "6379:6379" volumes: - redis_data:/data healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 5s retries: 5 api: build: context: ./backend dockerfile: Dockerfile ports: - "8000:8000" env_file: .env environment: DATABASE_URL: postgresql+asyncpg://deckforge:${POSTGRES_PASSWORD:-deckforge}@postgres:5432/deckforge REDIS_URL: redis://redis:6379/0 APP_DATA_DIRECTORY: /app_data TEMP_DIRECTORY: /tmp/deckforge NEXT_INTERNAL_URL: "http://web:3000" volumes: - app_data:/app_data depends_on: postgres: condition: service_healthy redis: condition: service_healthy worker: build: context: ./backend dockerfile: Dockerfile command: ["python", "-m", "arq", "workers.main.WorkerSettings"] env_file: .env environment: DATABASE_URL: postgresql+asyncpg://deckforge:${POSTGRES_PASSWORD:-deckforge}@postgres:5432/deckforge REDIS_URL: redis://redis:6379/0 APP_DATA_DIRECTORY: /app_data TEMP_DIRECTORY: /tmp/deckforge PYTHONUNBUFFERED: "1" volumes: - app_data:/app_data depends_on: postgres: condition: service_healthy redis: condition: service_healthy web: build: context: ./frontend dockerfile: Dockerfile args: AZURE_AD_TENANT_ID: ${AZURE_AD_TENANT_ID:-e519c2e6-bc6d-4fdf-8d9c-923c2f002385} AZURE_AD_CLIENT_ID: ${AZURE_AD_CLIENT_ID:-9079054c-9620-4757-a256-23413042f1ef} ports: - "3000:3000" environment: CAN_CHANGE_KEYS: "false" API_INTERNAL_URL: "http://api:8000" APP_DATA_DIRECTORY: /app_data TEMP_DIRECTORY: /tmp/deckforge volumes: - app_data:/app_data depends_on: - api nginx: image: nginx:alpine ports: - "80:80" volumes: - ./nginx.conf:/etc/nginx/nginx.conf:ro - app_data:/app_data:ro depends_on: - web - api volumes: postgres_data: redis_data: app_data: