Skip to main content
Docker Compose is the supported single-host deployment path. The root compose.yaml runs the web server, mail control service, MongoDB, Redis, WildDuck, Haraka, Rspamd, and ZoneMTA on the external agentteam-email-network Compose network. Only the web server port is published. Complete the Self-Host Setup Guide before starting the stack.

Create the environment file

Copy the Compose example into a local .env file:
Populate every uncommented value. Commented entries in the example are defaulted or optional overrides; leave them unset unless you are intentionally changing the default Compose topology or enabling an optional integration. Use the Environment Variables reference for the full variable contract. The required groups for the default compose.yaml stack are:
  • public hostname and web app secrets
  • Cloudflare OAuth client ID
  • service-level Cloudflare Worker values
  • admin R2 archive bucket values
  • AT_EMAIL_ADMIN_CONTROL_TO_WEB_API_TOKEN
  • WildDuck admin and access-control secrets
  • mail runtime secrets
compose.yaml defaults MongoDB, Redis, WildDuck, Haraka, ZoneMTA, and the internal control URLs to services on the Compose network. The bundled MongoDB runs as a single-node replica set named rs0, matching the Helm chart runtime and supporting MongoDB transactions and oplog-based logical backups.

Start the stack

Create the external Compose network, or let your deployment platform provide it:
Run Compose from the repository root:
Wait for atemail-web-server and atemail-mail-control-service to report healthy before signing in.

Published service

Compose publishes the web app on AT_EMAIL_ADMIN_FRONTEND_PORT, which defaults to 23100:
Route your public hostname to that web server listener. Do not publish internal service ports.

Container images

First-party images are published in GHCR:
Pin the image tag with:
Control pull behavior with:
To build the first-party images from the checked-out repository instead of pulling GHCR images, overlay compose.build.yaml:

Persistent volumes

The default Compose stack creates named volumes for runtime data: Back up these volumes before upgrades. Data remains across docker compose down unless you pass --volumes.
Never commit .env. It contains secrets, credentials, and API tokens.