nsswitch.conf -> systemd bei passwd group und shadow raus
Mailux ist ein simples Web-UI + Backend, um Mails auf einem eigenen Server zu verwalten (Postfächer anlegen/löschen, Inbox/Sent lesen, Mails senden, Ordner verwalten).
Als Mailserver setzt Mailux standardmäßig auf Postfix (SMTP) + Dovecot (IMAP/LMTP) und kann (optional, aber empfohlen) mit SPF/DKIM/DMARC betrieben werden.
Diese README ist bewusst „step-by-step“ für Ubuntu/Debian geschrieben (ohne Mailcow/Mailu), passend zu einem klassischen Postfix+Dovecot Setu.
- Architektur
- Ports
- DNS
- Installation: Postfix + Dovecot
- Konfiguration: Postfix
- Konfiguration: Dovecot
- TLS/SSL
- DKIM (OpenDKIM) + SPF + DMARC
- Mail-User anlegen (ohne SSH-Login)
- Start/Restart/Logs
- Mailux App Deployment
- Troubleshooting
- Security Checklist
- Postfix: SMTP Empfang (Port 25), Submission (Port 587)
- Dovecot: IMAP Zugriff (Port 993) + LMTP Zustellung von Postfix in Maildir
- Maildir pro User:
/home/<user>/Maildir/(cur/new/tmp) - Mailux Backend: Node/Express API (standardmäßig Port
5000) - Mailux Frontend: Web UI (typisch via Nginx/Container)
- Optional: NGINX Proxy Manager als Reverse Proxy + TLS für die Web-App
Minimal (öffentlich):
25/tcpSMTP eingehend (Postfix)587/tcpSubmission (Postfix) – für Clients zum Senden993/tcpIMAPS (Dovecot)
Optional:
80/tcp+443/tcpfür Web UI / Reverse Proxy (z.B. Nginx Proxy Manager)- Backend Port 5000: nicht öffentlich machen → nur
127.0.0.1:5000+ Reverse Proxy
Für jadenk.de sieht ein typisches Setup so aus (Beispiel):
ARecord:mail.jadenk.de -> <SERVER_IP>MXRecord:jadenk.de -> mail.jadenk.de (prio 10)TXTSPF:v=spf1 ip4:<SERVER_IP> mx a -allTXTDMARC:_dmarcz.B.v=DMARC1; p=none; rua=mailto:postmaster@jadenk.deTXTDKIM:selector._domainkeymit deinem Public Key
Wichtig: Reverse DNS (PTR) ist für Zustellbarkeit ebenfalls wichtig (bei deinem Hoster setzen).
Alle Befehle als
rootoder viasudo.
apt update
apt install -y postfix postfix-pcre \
dovecot-imapd dovecot-lmtpd dovecot-core \
opensslWährend der Postfix-Installation:
- „Internet Site“
- System mail name:
mail.jadenk.de(oder dein Hostname)
Öffnen:
nano /etc/postfix/main.cfSetze/prüfe diese Kernwerte (anpassen an deine Domain/Hostname):
myhostname = mail.jadenk.de
mydomain = jadenk.de
myorigin = $mydomain
inet_interfaces = all
inet_protocols = all
mydestination = $myhostname, $mydomain, localhost.localdomain, localhost
Wichtig: Wenn Postfix in chroot läuft, nutze den relativen Socket-Pfad:
mailbox_transport = lmtp:unix:private/dovecot-lmtp
local_transport = lmtp:unix:private/dovecot-lmtp
virtual_transport = lmtp:unix:private/dovecot-lmtp
Dadurch liefert Postfix lokal sauber in Dovecot/Maildir aus (statt Mbox oder Queue-Stau).
Öffne:
nano /etc/postfix/master.cfSuche die submission Sektion und aktiviere sie (Kommentarzeichen entfernen). Typisch:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_client_restrictions=permit_sasl_authenticated,reject
-o smtpd_sender_restrictions=permit_sasl_authenticated,reject
-o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
In /etc/postfix/main.cf ergänzen:
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
Datei:
nano /etc/dovecot/dovecot.confprotocols = imap lmtpDatei:
nano /etc/dovecot/conf.d/10-mail.confSetze:
mail_location = maildir:~/MaildirDie Standard-Auth für System-User reicht oft (PAM). In vielen Setups ist das Default. Falls du es explizit prüfen willst:
grep -n "disable_plaintext_auth" /etc/dovecot/conf.d/10-auth.confBei TLS (IMAPS) kann disable_plaintext_auth = yes bleiben.
Datei:
nano /etc/dovecot/conf.d/10-master.confIm service auth Block:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0660
user = postfix
group = postfix
}
}Datei:
nano /etc/dovecot/conf.d/10-ssl.confssl = required
ssl_cert = </etc/letsencrypt/live/mail.jadenk.de/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.jadenk.de/privkey.pemIn /etc/postfix/main.cf:
smtpd_tls_cert_file=/etc/letsencrypt/live/mail.jadenk.de/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/mail.jadenk.de/privkey.pem
smtpd_tls_security_level=may
smtp_tls_security_level=may
smtp_tls_loglevel = 1
Für Let’s Encrypt:
certbotinstallieren und Zertifikat holen (Webserver oder DNS-Challenge).
apt install -y opendkim opendkim-toolsmkdir -p /etc/opendkim/keys/jadenk.de
cd /etc/opendkim/keys/jadenk.de
opendkim-genkey -s 2020 -d jadenk.de
chown opendkim:opendkim 2020.private
chmod 600 2020.privateTypische Dateien (je nach Setup):
/etc/opendkim.conf/etc/opendkim/KeyTable/etc/opendkim/SigningTable/etc/opendkim/TrustedHosts
Minimal-Beispiel:
/etc/opendkim/KeyTable
2020._domainkey.jadenk.de jadenk.de:2020:/etc/opendkim/keys/jadenk.de/2020.private/etc/opendkim/SigningTable
*@jadenk.de 2020._domainkey.jadenk.de/etc/opendkim/TrustedHosts
127.0.0.1
localhost
mail.jadenk.de
jadenk.deDann Postfix an OpenDKIM „milter“ hängen (in /etc/postfix/main.cf):
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:/opendkim/opendkim.sock
non_smtpd_milters = $smtpd_milters
Wo der Socket liegt hängt von deiner OpenDKIM Config ab. Auf Debian/Ubuntu ist das oft
/run/opendkim/opendkim.sockoder ein Socket unter/var/spool/postfix/…. PrüfeSocketin/etc/opendkim.conf.
Den Public Key bekommst du aus:
cat /etc/opendkim/keys/jadenk.de/2020.txtSPF/DMARC setzt du im DNS wie oben beschrieben.
Ein Mail-User ist bei diesem Setup meist ein Linux-User mit Maildir.
useradd -m -s /usr/sbin/nologin info
passwd infoMaildir (wenn nicht automatisch vorhanden):
sudo -u info maildirmake.dovecot /home/info/MaildirWichtig: Keine SSH-Logins für Mailuser → nologin verhindert interaktive Logins.
systemctl restart postfix
systemctl restart dovecot
systemctl restart opendkimStatus:
systemctl status postfix --no-pager
systemctl status dovecot --no-pagerLogs:
tail -f /var/log/mail.log
journalctl -u dovecot -f
journalctl -u postfix -fQueue prüfen/flushen:
postqueue -p
postqueue -fDer Repo besteht aus
frontend/undbackend/(TypeScript).
cd /home/mailserver
git clone https://github.com/JadnK/Mailux.git
cd MailuxTypisch:
cd backend
npm install
npm run buildStart (empfohlen via systemd statt screen):
Erstelle /etc/systemd/system/mailux-backend.service:
[Unit]
Description=Mailux Backend
After=network.target
[Service]
Type=simple
WorkingDirectory=/home/mailserver/Mailux/backend
Environment=NODE_ENV=production
# Optional: EnvironmentFile=/home/mailserver/Mailux/backend/.env
ExecStart=/usr/bin/node dist/index.js
Restart=always
RestartSec=3
User=root
[Install]
WantedBy=multi-user.targetAktivieren:
systemctl daemon-reload
systemctl enable --now mailux-backendIm einfachsten Fall baust du das Frontend und servest es über Nginx/Container.
Wenn du Docker Compose nutzt, starte es über:
docker compose up -dEmpfohlen: Reverse Proxy (z.B. Nginx Proxy Manager):
frontendals Ziel (HTTP)backendals Ziel (HTTP 127.0.0.1:5000)- TLS Termination am Proxy (Let’s Encrypt), „Force SSL“ aktiv
- Prüfe ob Dovecot User
infovsinfo@domainerwartet. - Test:
doveadm auth test info 'PASSWORT'
- Prüfe Postfix Queue:
postqueue -p
- Prüfe ob LMTP socket existiert:
ls -la /var/spool/postfix/private | grep dovecot-lmtp - Postfix LMTP Pfad muss oft relativ sein:
lmtp:unix:private/dovecot-lmtp
- Stelle sicher, dass Postfix/Dovecot auf echte LE-Zertifikate zeigen
- Test:
openssl s_client -starttls smtp -connect mail.jadenk.de:587 -servername mail.jadenk.de openssl s_client -connect mail.jadenk.de:993 -servername mail.jadenk.de
- Häufig Fail2Ban Ban.
- Status:
fail2ban-client status sshd
- Entbannen:
fail2ban-client set sshd unbanip <IP>
- SSH nur mit Keys, Passwortlogin aus
- Fail2Ban für
sshd,postfix,dovecot - Port
5000nicht öffentlich (nur localhost + Reverse Proxy) - SPF/DKIM/DMARC korrekt gesetzt
- PTR (Reverse DNS) setzen lassen
- Regelmäßige Updates (
unattended-upgrades)
sudo mkdir -p /mailuser sudo chmod 755 /mailuser
ORDENR ERSTELLEn