version: '3.8' services: bct-app: image: bct-whitelabel:latest container_name: bct-astro-prod ports: - "3000:3000" labels: - "com.blackcanyon.role=astro-app" - "com.blackcanyon.env=production" - "maintainer=tyler@crispygoat.com" environment: - NODE_ENV=production - HOST=0.0.0.0 - PORT=3000 # Supabase - PUBLIC_SUPABASE_URL=${PUBLIC_SUPABASE_URL} - PUBLIC_SUPABASE_ANON_KEY=${PUBLIC_SUPABASE_ANON_KEY} - SUPABASE_SERVICE_ROLE_KEY=${SUPABASE_SERVICE_ROLE_KEY} # Stripe - STRIPE_PUBLISHABLE_KEY=${STRIPE_PUBLISHABLE_KEY} - STRIPE_SECRET_KEY=${STRIPE_SECRET_KEY} - STRIPE_WEBHOOK_SECRET=${STRIPE_WEBHOOK_SECRET} # Email - RESEND_API_KEY=${RESEND_API_KEY} # Monitoring - SENTRY_DSN=${SENTRY_DSN} - SENTRY_RELEASE=${SENTRY_RELEASE} env_file: - .env volumes: - ./logs:/app/logs - /etc/localtime:/etc/localtime:ro restart: unless-stopped healthcheck: test: ["CMD", "node", "-e", "const http=require('http');const options={hostname:'localhost',port:3000,path:'/api/health',timeout:2000};const req=http.request(options,(res)=>{process.exit(res.statusCode===200?0:1)});req.on('error',()=>{process.exit(1)});req.end();"] interval: 30s timeout: 5s retries: 5 start_period: 60s networks: - bct-network logging: driver: "json-file" options: max-size: "10m" max-file: "3" deploy: resources: limits: memory: 1G cpus: '1.0' reservations: memory: 512M cpus: '0.5' networks: default: external: name: bct-network