services: postgres: image: postgres:17-alpine container_name: dinner-ticket-postgres restart: unless-stopped environment: POSTGRES_DB: dinner_ticket_system POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres volumes: - postgres_data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d dinner_ticket_system"] interval: 5s timeout: 5s retries: 20 start_period: 5s redis: image: redis:7-alpine container_name: dinner-ticket-redis restart: unless-stopped volumes: - redis_data:/data command: ["redis-server", "--appendonly", "yes"] healthcheck: test: ["CMD", "redis-cli", "ping"] interval: 5s timeout: 3s retries: 20 start_period: 5s app: build: context: . dockerfile: Dockerfile container_name: dinner-ticket-app restart: unless-stopped depends_on: postgres: condition: service_healthy redis: condition: service_healthy environment: NODE_ENV: production NITRO_HOST: 0.0.0.0 PORT: 20013 NUXT_DATABASE_URL: postgresql://postgres:postgres@postgres:5432/dinner_ticket_system NUXT_REDIS_URL: redis://redis:6379 NUXT_SESSION_COOKIE_NAME: dinner_ticket_session NUXT_PUBLIC_APP_URL: ${NUXT_PUBLIC_APP_URL:-http://localhost:20013} NUXT_PUBLIC_RP_NAME: ${NUXT_PUBLIC_RP_NAME:-Dinner Ticket System} ports: - "20013:20013" healthcheck: test: ["CMD", "node", "-e", "fetch('http://127.0.0.1:20013/api/health').then((response) => process.exit(response.ok ? 0 : 1)).catch(() => process.exit(1))"] interval: 10s timeout: 5s retries: 12 start_period: 20s volumes: postgres_data: redis_data: