Dies ist eine alte Version des Dokuments!
# Projekt: Mailserver fĂĽr nctl.de (Docker + Traefik + Mailu)
## Verzeichnisstruktur (empfohlen unter /opt/stacks/mailu)
mailu/
├── .env
├── docker-compose.yml
├── mailu.env
└── data/
├── mail/ # Mailspeicher
├── certs/ # Zertifikate
└── db/ # MariaDB
—
### Datei: `.env`
```env DOMAIN=nctl.de HOSTNAME=mail TZ=Europe/Berlin POSTMASTER=admin@nctl.de SECRET=5e8572e2e08a4dd5a44b20d1e4d8cfa6 # Beispiel, mit `openssl rand -hex 16` erzeugen ```
—
### Datei: `mailu.env`
```env # Mailu core config ROOT=/ ADMIN=enabled WEBMAIL=snappymail TLS_FLAVOR=mail HOSTNAMES=imap.nctl.de,smtp.nctl.de,webmail.nctl.de
# Mail settings POSTMASTER=admin@nctl.de DOMAIN=nctl.de
# Authentication AUTH_RATELIMIT=10/minute;1000/day PASSWORD_SCHEME=SHA512-CRYPT
# Database DB_FLAVOR=mysql DB_HOST=db DB_USER=mailu DB_PASSWORD=secretpassword DB_NAME=mailu
# Proxies TRUSTED_PROXIES=172.0.0.0/8 ```
—
### Datei: `docker-compose.yml`
```yaml services:
redis:
image: redis:alpine
restart: always
volumes:
- "/mailu/redis:/data"
depends_on:
- resolver
dns:
- 192.168.203.254
networks:
- docker_backend
front:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}nginx:${MAILU_VERSION:-2024.06}
restart: always
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-front
networks:
- docker_backend
volumes:
- "/mailu/certs:/certs"
- "/mailu/overrides/nginx:/overrides:ro"
depends_on:
- resolver
dns:
- 192.168.203.254
labels:
- "traefik.enable=true"
- "traefik.http.routers.mail.rule=Host(`mail.nctl.de`)"
- "traefik.http.routers.mail.entrypoints=websecure"
- "traefik.http.routers.mail.tls.certresolver=letsencrypt"
resolver:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}unbound:${MAILU_VERSION:-2024.06}
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-resolver
restart: always
networks:
docker_backend:
ipv4_address: 192.168.203.254
admin:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}admin:${MAILU_VERSION:-2024.06}
restart: always
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-admin
volumes:
- "/mailu/data:/data"
- "/mailu/dkim:/dkim"
depends_on:
- redis
- resolver
dns:
- 192.168.203.254
networks:
- docker_backend
labels:
- "traefik.enable=true"
- "traefik.http.routers.admin.rule=Host(`admin.nctl.de`)"
- "traefik.http.routers.admin.entrypoints=websecure"
- "traefik.http.routers.admin.tls.certresolver=letsencrypt"
imap:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}dovecot:${MAILU_VERSION:-2024.06}
restart: always
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-imap
volumes:
- "/mailu/mail:/mail"
- "/mailu/overrides/dovecot:/overrides:ro"
networks:
- docker_backend
depends_on:
- front
- resolver
dns:
- 192.168.203.254
smtp:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}postfix:${MAILU_VERSION:-2024.06}
restart: always
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-smtp
volumes:
- "/mailu/mailqueue:/queue"
- "/mailu/overrides/postfix:/overrides:ro"
depends_on:
- front
- resolver
dns:
- 192.168.203.254
networks:
- docker_backend
oletools:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}oletools:${MAILU_VERSION:-2024.06}
hostname: oletools
logging:
driver: journald
options:
tag: mailu-oletools
restart: always
networks:
- docker_backend
depends_on:
- resolver
dns:
- 192.168.203.254
antispam:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}rspamd:${MAILU_VERSION:-2024.06}
hostname: antispam
restart: always
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-antispam
networks:
- docker_backend
volumes:
- "/mailu/filter:/var/lib/rspamd"
- "/mailu/overrides/rspamd:/overrides:ro"
depends_on:
- front
- redis
- oletools
- antivirus
- resolver
dns:
- 192.168.203.254
antivirus:
image: clamav/clamav-debian:1.4
restart: always
logging:
driver: journald
options:
tag: mailu-antivirus
networks:
- docker_backend
volumes:
- "/mailu/clamav:/var/lib/clamav"
healthcheck:
test: ["CMD-SHELL", "kill -0 `cat /tmp/clamd.pid` && kill -0 `cat /tmp/freshclam.pid`"]
interval: 10s
timeout: 5s
retries: 3
start_period: 10s
fetchmail:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}fetchmail:${MAILU_VERSION:-2024.06}
restart: always
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-fetchmail
volumes:
- "/mailu/data/fetchmail:/data"
depends_on:
- admin
- smtp
- imap
- resolver
dns:
- 192.168.203.254
networks:
- docker_backend
webmail:
image: ${DOCKER_ORG:-ghcr.io/mailu}/${DOCKER_PREFIX:-}webmail:${MAILU_VERSION:-2024.06}
restart: always
env_file: mailu.env
logging:
driver: journald
options:
tag: mailu-webmail
volumes:
- "/mailu/webmail:/data"
- "/mailu/overrides/roundcube:/overrides:ro"
networks:
- docker_backend
depends_on:
- front
labels:
- "traefik.enable=true"
- "traefik.http.routers.webmail.rule=Host(`webmail.nctl.de`)"
- "traefik.http.routers.webmail.entrypoints=websecure"
- "traefik.http.routers.webmail.tls.certresolver=letsencrypt"
networks:
docker_backend: external: true
```
—
## Wichtige DNS-Einträge:
| Typ | Name | Ziel/IP |
| —– | ——————- | —————————– |
| A | smtp.nctl.de | <Server-IP> |
| A | imap.nctl.de | <Server-IP> |
| A | webmail.nctl.de | <Server-IP> |
| A | admin.nctl.de | <Server-IP> |
| MX | @ | smtp.nctl.de (Priorität 10) |
| TXT | @ (SPF) | v=spf1 mx ~all |
| TXT | _dmarc | v=DMARC1; p=none |
Optional: DKIM wird von Mailu automatisch erzeugt, ĂĽber WebGUI exportierbar.
—
Fertig! Du kannst den Stack nun mit folgendem Befehl starten:
```bash cd /opt/stacks/mailu docker compose up -d ```
Die WebGUI ist danach erreichbar unter: - https://webmail.nctl.de (Webmail) - https://admin.nctl.de (Benutzerverwaltung)