services: db: image: ${POSTGRES_IMAGE:-docker.m.daocloud.io/pgvector/pgvector:pg16} container_name: fquiz-db environment: POSTGRES_DB: ${POSTGRES_DB:-fquiz} POSTGRES_USER: ${POSTGRES_USER:-fquiz} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-fquiz} ports: - "${POSTGRES_PORT:-5433}:5432" volumes: - fquiz_db_data:/var/lib/postgresql/data healthcheck: test: [ "CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-fquiz} -d ${POSTGRES_DB:-fquiz}", ] interval: 10s timeout: 5s retries: 8 start_period: 10s restart: unless-stopped api: build: context: ./api dockerfile: Dockerfile args: PYTHON_BASE_IMAGE: ${PYTHON_BASE_IMAGE:-docker.m.daocloud.io/library/python:3.11-slim} PIP_INDEX_URL: ${PIP_INDEX_URL:-https://pypi.org/simple} PIP_DEFAULT_TIMEOUT: ${PIP_DEFAULT_TIMEOUT:-300} PIP_RETRIES: ${PIP_RETRIES:-20} container_name: fquiz-api depends_on: db: condition: service_healthy environment: API_HOST: ${API_HOST:-0.0.0.0} API_PORT: ${API_PORT:-8000} API_CORS_ORIGINS: ${API_CORS_ORIGINS:-http://localhost:3000,http://127.0.0.1:3000} DATABASE_URL: ${DATABASE_URL:-postgresql+psycopg://fquiz:fquiz@db:5432/fquiz} JWT_SECRET_KEY: ${JWT_SECRET_KEY:-change-this-in-production} ACCESS_TOKEN_EXPIRE_MINUTES: ${ACCESS_TOKEN_EXPIRE_MINUTES:-15} REFRESH_TOKEN_EXPIRE_DAYS: ${REFRESH_TOKEN_EXPIRE_DAYS:-30} REFRESH_COOKIE_SECURE: ${REFRESH_COOKIE_SECURE:-false} REFRESH_COOKIE_SAMESITE: ${REFRESH_COOKIE_SAMESITE:-lax} INITIAL_ADMIN_EMAIL: ${INITIAL_ADMIN_EMAIL:-admin@example.com} INITIAL_ADMIN_USERNAME: ${INITIAL_ADMIN_USERNAME:-admin} INITIAL_ADMIN_PASSWORD: ${INITIAL_ADMIN_PASSWORD:-change-me-strong-password} ports: - "${API_PORT:-8000}:8000" healthcheck: test: [ "CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://127.0.0.1:8000/health', timeout=2).read()", ] interval: 10s timeout: 3s retries: 5 start_period: 10s restart: unless-stopped web: build: context: ./web dockerfile: Dockerfile args: NODE_BASE_IMAGE: ${NODE_BASE_IMAGE:-docker.m.daocloud.io/library/node:22-alpine} NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-http://localhost:8000} container_name: fquiz-web depends_on: api: condition: service_healthy environment: NEXT_PUBLIC_API_BASE_URL: ${NEXT_PUBLIC_API_BASE_URL:-http://localhost:8000} NODE_ENV: production ports: - "3000:3000" restart: unless-stopped volumes: fquiz_db_data: