name: mulliganmates services: # ── Application ──────────────────────────────────────────── app: build: context: . dockerfile: Dockerfile restart: unless-stopped environment: DATABASE_URL: postgresql://postgres:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB:-postgres} BETTER_AUTH_SECRET: ${BETTER_AUTH_SECRET} BETTER_AUTH_URL: ${SITE_URL} SITE_URL: ${SITE_URL} ADMIN_EMAIL: ${ADMIN_EMAIL} SMTP_HOST: ${SMTP_HOST} SMTP_PORT: ${SMTP_PORT:-1025} SMTP_USER: ${SMTP_USER:-} SMTP_PASS: ${SMTP_PASS:-} SMTP_SENDER_NAME: ${SMTP_SENDER_NAME:-MulliganMates} labels: - "traefik.enable=true" - "traefik.http.routers.mulliganmates.rule=Host(`${APP_DOMAIN}`)" - "traefik.http.routers.mulliganmates.entrypoints=websecure" - "traefik.http.routers.mulliganmates.tls.certresolver=letsencrypt" - "traefik.http.services.mulliganmates.loadbalancer.server.port=3000" networks: - traefik - internal depends_on: db: condition: service_healthy # ── Database ─────────────────────────────────────────────── db: image: postgres:17-alpine restart: unless-stopped healthcheck: test: ["CMD-SHELL", "pg_isready -U postgres -d ${POSTGRES_DB:-postgres}"] interval: 5s timeout: 5s retries: 10 environment: POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} POSTGRES_DB: ${POSTGRES_DB:-postgres} volumes: - db_data:/var/lib/postgresql/data networks: - internal # ── Email: Mailpit (dev only) ────────────────────────────── mailpit: image: axllent/mailpit:latest restart: unless-stopped profiles: ["dev"] labels: - "traefik.enable=true" - "traefik.http.routers.mailpit.rule=Host(`${MAILPIT_DOMAIN}`)" - "traefik.http.routers.mailpit.entrypoints=websecure" - "traefik.http.routers.mailpit.tls.certresolver=letsencrypt" - "traefik.http.services.mailpit.loadbalancer.server.port=8025" networks: - traefik - internal volumes: db_data: networks: traefik: external: true internal: driver: bridge