name: jovemail services: app: image: ${JOVEMAIL_IMAGE:-ghcr.io/jovemail/jovemail:latest} build: context: . args: GOPROXY: "${GOPROXY:-https://proxy.golang.org|https://goproxy.cn|direct}" NPM_CONFIG_REGISTRY: "${NPM_CONFIG_REGISTRY:-https://registry.npmjs.org/}" ports: - "${HTTP_PORT:-3000}:3000" - "${SMTP_PORT:-2525}:2525" environment: HTTP_ADDR: ":3000" SMTP_ADDR: ":2525" JOVEMAIL_DEPLOYMENT: "docker" JOVEMAIL_CONFIG_LOCKED: "true" PUBLIC_BASE_URL: "${PUBLIC_BASE_URL:-http://localhost:3000}" PUBLIC_INDEXING: "${PUBLIC_INDEXING:-landing}" MAIL_HOSTNAME: "${MAIL_HOSTNAME:-mail.example.com}" EXPECTED_MX: "${EXPECTED_MX:-mail.example.com}" MX_STRICT: "${MX_STRICT:-false}" DATABASE_DRIVER: "postgres" DATABASE_URL: "${JOVEMAIL_DATABASE_URL:-postgres://${POSTGRES_USER:-jovemail}:${POSTGRES_PASSWORD:-local-dev-only-change-me}@postgres:5432/${POSTGRES_DB:-jovemail}?sslmode=disable}" DB_MAX_OPEN_CONNS: "${DB_MAX_OPEN_CONNS:-25}" DB_MAX_IDLE_CONNS: "${DB_MAX_IDLE_CONNS:-5}" FRONTEND_DIST: "${JOVEMAIL_FRONTEND_DIST:-}" MESSAGE_RETENTION_HOURS: "${MESSAGE_RETENTION_HOURS:-24}" AUDIT_LOG_RETENTION_DAYS: "${AUDIT_LOG_RETENTION_DAYS:-180}" AUDIT_ACTIVITY_RETENTION_DAYS: "${AUDIT_ACTIVITY_RETENTION_DAYS:-30}" INBOUND_SPOOL_RETENTION_DAYS: "${INBOUND_SPOOL_RETENTION_DAYS:-30}" METRICS_ENABLED: "${METRICS_ENABLED:-false}" WEBHOOKS_ENABLED: "${WEBHOOKS_ENABLED:-true}" DISABLE_PENDING_DOMAIN_DATA_PROTECTION: "${DISABLE_PENDING_DOMAIN_DATA_PROTECTION:-false}" MAX_MESSAGE_BYTES: "${MAX_MESSAGE_BYTES:-10485760}" MAX_ATTACHMENT_BYTES: "${MAX_ATTACHMENT_BYTES:-10485760}" DEV_MODE: "${DEV_MODE:-false}" INBOX_TOKEN_SECRET: "${INBOX_TOKEN_SECRET:-}" SESSION_SECRET: "${SESSION_SECRET:-}" API_KEY_DEFAULT_DAILY_LIMIT: "${API_KEY_DEFAULT_DAILY_LIMIT:-200000}" ALLOW_API_KEY_QUERY_PARAM: "${ALLOW_API_KEY_QUERY_PARAM:-false}" GITHUB_OAUTH_CLIENT_ID: "${GITHUB_OAUTH_CLIENT_ID:-}" GITHUB_OAUTH_CLIENT_SECRET: "${GITHUB_OAUTH_CLIENT_SECRET:-}" GITHUB_OAUTH_REDIRECT_URL: "${GITHUB_OAUTH_REDIRECT_URL:-}" GITHUB_OAUTH_ENABLED: "${GITHUB_OAUTH_ENABLED:-false}" LINUXDO_OAUTH_CLIENT_ID: "${LINUXDO_OAUTH_CLIENT_ID:-}" LINUXDO_OAUTH_CLIENT_SECRET: "${LINUXDO_OAUTH_CLIENT_SECRET:-}" LINUXDO_OAUTH_REDIRECT_URL: "${LINUXDO_OAUTH_REDIRECT_URL:-}" LINUXDO_OAUTH_ENABLED: "${LINUXDO_OAUTH_ENABLED:-false}" CONFIG_ENV_PATH: "/app/storage/.env" volumes: - app-storage:/app/storage depends_on: postgres: condition: service_healthy healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:3000/api/health"] interval: 30s timeout: 5s start_period: 15s retries: 3 restart: unless-stopped postgres: image: postgres:16-alpine entrypoint: ["sh", "-ec", "if [ -z \"$$POSTGRES_PASSWORD\" ] || [ \"$$POSTGRES_PASSWORD\" = \"local-dev-only-change-me\" ]; then echo 'POSTGRES_PASSWORD must be set in .env for docker compose deployments.' >&2; exit 1; fi; exec docker-entrypoint.sh postgres"] environment: POSTGRES_DB: "${POSTGRES_DB:-jovemail}" POSTGRES_USER: "${POSTGRES_USER:-jovemail}" POSTGRES_PASSWORD: "${POSTGRES_PASSWORD:-local-dev-only-change-me}" volumes: - postgres-data:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U \"$${POSTGRES_USER}\" -d \"$${POSTGRES_DB}\""] interval: 5s timeout: 3s retries: 20 restart: unless-stopped redis: image: redis:7-alpine profiles: ["optional"] restart: unless-stopped volumes: app-storage: postgres-data: