name: cartoon x-backend: &backend build: context: ./backend image: cartoon-backend:local environment: &backend-environment CARTOON_DATABASE_URL: postgresql+asyncpg://${POSTGRES_USER:-cartoon}:${POSTGRES_PASSWORD:-cartoon}@db:${POSTGRES_PORT:-55432}/${POSTGRES_DB:-cartoon} CARTOON_ENVIRONMENT: development CARTOON_SQL_ECHO: "false" CARTOON_DEMO_AUTH_ENABLED: "true" CARTOON_API_PORT: ${CARTOON_API_PORT:-18080} services: db: image: postgres:17-alpine command: ["postgres", "-p", "${POSTGRES_PORT:-55432}"] environment: POSTGRES_DB: ${POSTGRES_DB:-cartoon} POSTGRES_USER: ${POSTGRES_USER:-cartoon} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-cartoon} PGPORT: ${POSTGRES_PORT:-55432} healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-cartoon} -d ${POSTGRES_DB:-cartoon} -p ${POSTGRES_PORT:-55432}"] interval: 5s timeout: 3s retries: 10 ports: - "${CARTOON_BIND_HOST:-0.0.0.0}:${POSTGRES_PORT:-55432}:${POSTGRES_PORT:-55432}" volumes: - postgres-data:/var/lib/postgresql/data migrate: <<: *backend command: ["alembic", "upgrade", "head"] depends_on: db: condition: service_healthy restart: "no" seed: <<: *backend command: ["python", "-m", "app.seed"] depends_on: migrate: condition: service_completed_successfully restart: "no" api: <<: *backend depends_on: seed: condition: service_completed_successfully healthcheck: test: - CMD - python - -c - import urllib.request; urllib.request.urlopen('http://localhost:${CARTOON_API_PORT:-18080}/health/ready') interval: 5s timeout: 3s retries: 10 start_period: 5s ports: - "${CARTOON_BIND_HOST:-0.0.0.0}:${CARTOON_API_PORT:-18080}:${CARTOON_API_PORT:-18080}" restart: unless-stopped worker: <<: *backend command: ["python", "-m", "app.worker"] depends_on: seed: condition: service_completed_successfully restart: unless-stopped web: build: context: ./frontend environment: HOST: 0.0.0.0 PORT: ${NUXT_PORT:-13000} NUXT_API_BASE_URL: http://api:${CARTOON_API_PORT:-18080}/api/v1 NUXT_PUBLIC_API_BASE: /api/v1 NUXT_PUBLIC_ACTOR_ID: 11111111-1111-4111-8111-111111111111 NUXT_PUBLIC_ACTOR_ROLE: USER NUXT_PUBLIC_REVIEWER_ACTOR_ID: 22222222-2222-4222-8222-222222222222 NUXT_PUBLIC_ADMIN_ACTOR_ID: 33333333-3333-4333-8333-333333333333 depends_on: api: condition: service_healthy ports: - "${CARTOON_BIND_HOST:-0.0.0.0}:${NUXT_PORT:-13000}:${NUXT_PORT:-13000}" restart: unless-stopped volumes: postgres-data: