x-app-environment: &app-environment DATABASE_URL: postgresql+psycopg2://${POSTGRES_USER:-ticketmaster}:${POSTGRES_PASSWORD:-ticketmaster}@db:5432/${POSTGRES_DB:-ticketmaster} APP_SECRET: ${APP_SECRET:-dev-ticketmaster-secret-change-me} APP_BASE_URL: ${APP_BASE_URL:-http://localhost:3006} TICKETMASTER_DEV_PASSWORD: ${TICKETMASTER_DEV_PASSWORD:-ChangeMe123!} SMTP_HOST: ${SMTP_HOST:-mailpit} SMTP_PORT: ${SMTP_PORT:-1025} SMTP_USERNAME: ${SMTP_USERNAME:-} SMTP_PASSWORD: ${SMTP_PASSWORD:-} SMTP_FROM: ${SMTP_FROM:-ticketmaster@example.test} SMTP_TLS: ${SMTP_TLS:-false} MAIL_SUPPRESS_SEND: ${MAIL_SUPPRESS_SEND:-false} GITLAB_BASE_URL: ${GITLAB_BASE_URL:-https://gitlab.teskalabs.int} GITLAB_PROJECT_ID: ${GITLAB_PROJECT_ID:-503} GITLAB_DELIVERY_PROJECT_ID: ${GITLAB_DELIVERY_PROJECT_ID:-503} GITLAB_TARGET_PROJECTS: ${GITLAB_TARGET_PROJECTS:-} GITLAB_SYNC_INTERVAL_SECONDS: ${GITLAB_SYNC_INTERVAL_SECONDS:-300} GITLAB_TOKEN: ${GITLAB_TOKEN:-} GITLAB_DRY_RUN: ${GITLAB_DRY_RUN:-false} GITLAB_WEBHOOK_SECRET: ${GITLAB_WEBHOOK_SECRET:-} UPLOAD_DIR: /app/uploads CORS_ORIGINS: ${CORS_ORIGINS:-*} TRUSTED_HOSTS: ${TRUSTED_HOSTS:-*} REDIS_URL: ${REDIS_URL:-redis://redis:6379/0} REDIS_SOCKET_TIMEOUT_SECONDS: ${REDIS_SOCKET_TIMEOUT_SECONDS:-2} LOGIN_RATE_LIMIT_ATTEMPTS: ${LOGIN_RATE_LIMIT_ATTEMPTS:-10} LOGIN_RATE_LIMIT_WINDOW_SECONDS: ${LOGIN_RATE_LIMIT_WINDOW_SECONDS:-300} AUTH_RATE_LIMIT_ATTEMPTS: ${AUTH_RATE_LIMIT_ATTEMPTS:-10} AUTH_RATE_LIMIT_WINDOW_SECONDS: ${AUTH_RATE_LIMIT_WINDOW_SECONDS:-300} APP_DEBUG: ${APP_DEBUG:-false} ALLOW_SEED_DEV: ${ALLOW_SEED_DEV:-} ALLOW_DEV_SSO: ${ALLOW_DEV_SSO:-false} TICKET_PAGE_DEFAULT_LIMIT: ${TICKET_PAGE_DEFAULT_LIMIT:-50} TICKET_PAGE_MAX_LIMIT: ${TICKET_PAGE_MAX_LIMIT:-200} WEB_CONCURRENCY: ${WEB_CONCURRENCY:-2} services: db: image: postgres:16-alpine restart: unless-stopped environment: POSTGRES_DB: ${POSTGRES_DB:-ticketmaster} POSTGRES_USER: ${POSTGRES_USER:-ticketmaster} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-ticketmaster} volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-ticketmaster} -d ${POSTGRES_DB:-ticketmaster}"] interval: 5s timeout: 5s retries: 20 mailpit: image: axllent/mailpit:v1.21 restart: unless-stopped expose: - "8025" - "1025" redis: image: redis:7-alpine restart: unless-stopped command: ["redis-server", "--save", "", "--appendonly", "no"] expose: - "6379" healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 10 api: image: ghcr.io/cermofi/ticketmaster-api:${IMAGE_TAG:-main-latest} build: context: ./backend environment: *app-environment depends_on: db: condition: service_healthy mailpit: condition: service_started redis: condition: service_healthy restart: unless-stopped expose: - "8000" volumes: - uploads:/app/uploads - api_logs:/app/logs healthcheck: test: - CMD-SHELL - | if [ "$${TRUSTED_HOSTS:-*}" = "*" ]; then curl -fsS http://127.0.0.1:8000/api/ready >/dev/null else host=$$(echo "$${TRUSTED_HOSTS}" | cut -d, -f1) curl -fsS -H "Host: $${host}" http://127.0.0.1:8000/api/ready >/dev/null fi interval: 10s timeout: 5s retries: 12 docs: image: ghcr.io/cermofi/ticketmaster-docs:${IMAGE_TAG:-main-latest} build: context: ./docs-site restart: unless-stopped expose: - "3000" healthcheck: test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1:3000/docs"] interval: 10s timeout: 5s retries: 12 frontend: image: ghcr.io/cermofi/ticketmaster-frontend:${IMAGE_TAG:-main-latest} build: context: ./frontend dockerfile: Dockerfile args: APP_VERSION: ${IMAGE_TAG:-main-latest} depends_on: api: condition: service_healthy docs: condition: service_healthy restart: unless-stopped ports: - "127.0.0.1:3006:80" healthcheck: test: ["CMD-SHELL", "wget -q -O /dev/null http://127.0.0.1/"] interval: 10s timeout: 5s retries: 12 volumes: postgres_data: uploads: api_logs: