services: db: image: postgis/postgis:15-3.4 container_name: teeoff_db environment: POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB} volumes: - teeoff_db_data:/var/lib/postgresql/data restart: unless-stopped api: build: ./backend container_name: teeoff_api environment: DATABASE_URL: ${DATABASE_URL} JWT_SECRET: ${JWT_SECRET} GOOGLE_CLIENT_ID: ${GOOGLE_CLIENT_ID} GOOGLE_CLIENT_SECRET: ${GOOGLE_CLIENT_SECRET} PUBLIC_BASE_URL: ${PUBLIC_BASE_URL} PUBLIC_SESSION_SECRET: ${PUBLIC_SESSION_SECRET} PUBLIC_COMMENT_DEFAULT_STATUS: ${PUBLIC_COMMENT_DEFAULT_STATUS} SMTP_SERVER: ${SMTP_SERVER} SMTP_PORT: ${SMTP_PORT} SMTP_USER: ${SMTP_USER} SMTP_PASS: ${SMTP_PASS} PUBLIC_FROM_EMAIL: ${PUBLIC_FROM_EMAIL} PUBLIC_MAGIC_LINK_MAX_AGE_MINUTES: ${PUBLIC_MAGIC_LINK_MAX_AGE_MINUTES} INDEXNOW_KEY: ${INDEXNOW_KEY} volumes: - ./backend:/app - ./frontend/src/content:/shared/frontend-content:ro - ./frontend/public/media:/app/public/media depends_on: - db restart: unless-stopped expose: - "8000" worker: build: ./backend container_name: teeoff_worker command: python worker.py environment: DATABASE_URL: ${DATABASE_URL} GEMINI_API_KEY: ${GEMINI_API_KEY} SMTP_SERVER: ${SMTP_SERVER} SMTP_PORT: ${SMTP_PORT} SMTP_USER: ${SMTP_USER} SMTP_PASS: ${SMTP_PASS} EMAIL_TO: ${EMAIL_TO} volumes: - ./backend:/app depends_on: - db restart: unless-stopped frontend: build: context: ./frontend args: NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL} container_name: teeoff_frontend command: npm start environment: NEXT_PUBLIC_SITE_URL: ${NEXT_PUBLIC_SITE_URL} PUBLIC_SESSION_SECRET: ${PUBLIC_SESSION_SECRET} volumes: - ./frontend/public:/app/public depends_on: - api restart: unless-stopped expose: - "3000" caddy: image: caddy:2 container_name: teeoff_caddy ports: - "80:80" - "443:443" environment: ACME_EMAIL: ${ACME_EMAIL} volumes: - ./deploy/Caddyfile:/etc/caddy/Caddyfile:ro - caddy_data:/data - caddy_config:/config depends_on: - frontend - api restart: unless-stopped volumes: teeoff_db_data: caddy_data: caddy_config: