- Makefile 100%
| docs | ||
| nginx/snippets | ||
| .env.example | ||
| .gitignore | ||
| compose.yml | ||
| Makefile | ||
| nginx.conf | ||
| README.md | ||
Mailpit
SMTP capture + web UI for the Arcane Demesne homelab. Apps on gateway-hub send mail to mailpit:1025; messages appear in the dashboard at mail.arcanedemesne.com (or http://localhost:8085).
Production apps should use a real SMTP relay (Cloudflare Email Service, SES, etc.) — not Mailpit relay-all. See docs/consumers.md.
Bootstrap
cp .env.example .env
podman network create gateway-hub # once, if missing
make up
Reload hub after first start:
make proxy-reload
Ports
| Surface | Host | Container |
|---|---|---|
| Edge nginx | 8085 | mailpit-proxy:80 |
| Web UI | — | mailpit:8025 |
| SMTP | (not published) | mailpit:1025 |
Public hostname: mail.arcanedemesne.com → Gateway → mailpit-proxy.
Tunnel: add DNS + Cloudflare ingress for mail.arcanedemesne.com → http://127.0.0.1:8080.
UI auth
Before exposing the UI on the tunnel, set MP_UI_AUTH (htpasswd user:hash) or MP_UI_AUTH_FILE in .env. Cloudflare Access is an alternative.
Generate htpasswd:
htpasswd -nbB admin 'your-password'
Consumer env (homelab)
Shared convention on gateway-hub:
SMTP_HOST=mailpit
SMTP_PORT=1025
SMTP_USE_TLS=false
SMTP_FROM=[email protected]
Authentik uses AUTHENTIK_EMAIL__* — see docs/consumers.md.
Health
Mailpit exposes GET /livez — used as HomeLab Infrastructure tile health URI.
Optional dev overlay
To hit Mailpit from host processes (split-port dev), publish SMTP/UI in a local override compose file (1025:1025, 8025:8025). Default stack keeps SMTP internal only.
Makefile
| Target | Action |
|---|---|
make up |
Start stack |
make down |
Stop stack |
make proxy-reload |
Reload mailpit-proxy + gateway-proxy nginx |