agentbbs/deploy/mailu/README.md
Anthony Ettinger cb09300357 Self-host Mailu mail stack at mail.profullstack.com
Members get a real <name>@mail.profullstack.com mailbox, served by a
co-located Mailu (Postfix+Dovecot+Roundcube+rspamd) Docker stack. Coexists
with the host Caddy: Mailu owns the mail ports; Caddy fronts the loopback
webmail and supplies the TLS cert (TLS_FLAVOR=mail), the same cert-copy
pattern as the Ergo/IRC and NNTP services.

- deploy/mailu/: docker-compose.yml, mailu.env.example, refresh-certs.sh
  (copy Caddy's mail cert into Mailu on renewal), provision-mailbox.sh
  (member mailbox + Dovecot gateway master user), README.
- setup.sh: MAIL flag + mail.${DOMAIN#*.} Caddy site + §9e (cert timer,
  mail-port firewall, conditional compose bring-up, AGENTBBS_MAIL_* env).
- docs/mail.md: architecture, DNS (MX/SPF/DKIM/DMARC/PTR), gateway
  master-user setup, env, provisioning, webmail-only policy.

Apex profullstack.com stays corporate; member mail is only on mail.*.
Infra is inspection-verified (bash -n, YAML lint); deploy pending.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-14 16:33:25 +00:00

1.7 KiB

deploy/mailu — self-hosted mail for mail.profullstack.com

Mailu (Postfix + Dovecot + Roundcube + rspamd) as a Docker Compose stack, fronted by the host Caddy. Full setup, DNS, and architecture: docs/mail.md.

Files

File Purpose
docker-compose.yml the Mailu services (mail ports on host, HTTP on loopback)
mailu.env.example config template → copy to mailu.env and fill secrets
refresh-certs.sh copy Caddy's mail.$DOMAIN cert into Mailu, reload (timer)
provision-mailbox.sh create a member mailbox / the gateway master user

mailu.env, certs/, and data/ are gitignored (secrets + state).

Gateway master user

The agentbbs gateway opens any member's mailbox over IMAP with a single secret, using Dovecot's master user feature (login <name>*<master>). Enable it with a Dovecot override so Mailu accepts the * separator:

data/overrides/dovecot/auth-master.conf:

auth_master_user_separator = *
passdb {
  driver = static
  args = nopassword=y
  master = yes
  result_success = continue
}

Then create the master account and point agentbbs at it:

./provision-mailbox.sh --master "$(openssl rand -hex 16)"
# AGENTBBS_MAIL_MASTER_USER=gateway, AGENTBBS_MAIL_MASTER_PASS=<that secret>

The exact master-passdb wiring varies by Mailu version; verify against your pinned image before relying on it in production. SMTP submission from the gateway uses the trusted local relay (127.0.0.1:25), not the master user.

Ops

docker compose up -d            # start
docker compose logs -f smtp     # tail Postfix
docker compose exec admin flask mailu config-export   # DKIM keys, etc.
docker compose down             # stop