Files
cloudy/swarm/mailserver/README.md
T

63 lines
1.9 KiB
Markdown

# Self-hosted Mail Server (Docker Swarm)
This stack uses Docker Mailserver and can reuse the certificate issued by Traefik.
## 1) Configure mail domain
Edit [swarm/mailserver/docker-mailserver.env](swarm/mailserver/docker-mailserver.env):
- OVERRIDE_HOSTNAME: mail host FQDN (example: mail.example.com)
- OVERRIDE_DOMAINNAME: root mail domain (example: example.com)
- POSTMASTER_ADDRESS: postmaster mailbox
## 2) Sync Traefik cert for mailserver
Traefik stores certificates in `/var/data/config/traefik/acme.json`.
Mailserver needs cert files (`fullchain.pem` and `privkey.pem`).
Run:
`./scripts/mailserver-sync-traefik-cert.sh /var/data/config/traefik/acme.json mail.example.com`
This writes:
- `/var/data/docker-mailserver/ssl/fullchain.pem`
- `/var/data/docker-mailserver/ssl/privkey.pem`
## 3) DNS records (required)
Create these DNS records for your mail domain:
- A: mail.example.com -> your public IP
- MX: example.com -> mail.example.com (priority 10)
- SPF TXT: v=spf1 mx a:mail.example.com -all
- DKIM TXT: mail._domainkey.example.com -> generated DKIM key
- DMARC TXT: _dmarc.example.com -> v=DMARC1; p=quarantine; rua=mailto:postmaster@example.com
## 4) Open ports
Ensure inbound TCP is open to your Traefik manager node for:
- 25 (SMTP)
- 587 (Submission)
- 993 (IMAPS)
- 995 (POP3S)
Mail ports are exposed by [swarm/core.yml](swarm/core.yml) and routed to [swarm/mailserver.yml](swarm/mailserver.yml) via TCP labels.
## 5) Deploy
`make deploy-mailserver`
## 6) Create mailbox accounts
`docker exec -it $(docker ps --filter name=mailserver_mail --format '{{.ID}}' | head -n 1) setup email add user@example.com 'StrongPasswordHere'`
`docker exec -it $(docker ps --filter name=mailserver_mail --format '{{.ID}}' | head -n 1) setup alias add postmaster@example.com user@example.com`
## 7) Verify
- Check service status: `docker service ls | grep mailserver`
- Check logs: `docker service logs -f mailserver_mail`