122 lines
4.1 KiB
Bash
122 lines
4.1 KiB
Bash
#!/bin/bash
|
|
# setup-dms-tls.sh
|
|
# Generiert SNI-Konfigurationen für Dovecot und Postfix anhand der DMS-Accounts.
|
|
#
|
|
# Vorbereitung:
|
|
# Stelle sicher, dass dieses Skript ausführbar ist: chmod +x setup-dms-tls.sh
|
|
|
|
set -e
|
|
|
|
DMS_CONTAINER=${DMS_CONTAINER:-"mailserver"}
|
|
CONFIG_DIR="./docker-data/dms/config"
|
|
NODE_HOSTNAME=${NODE_HOSTNAME:-"node1.email-srvr.com"}
|
|
|
|
# Zieldateien im Config-Verzeichnis (werden in den Container gemountet)
|
|
DOVECOT_SNI_FILE="$CONFIG_DIR/dovecot-sni.cf"
|
|
POSTFIX_MAIN_FILE="$CONFIG_DIR/postfix-main.cf"
|
|
POSTFIX_SNI_FILE="$CONFIG_DIR/postfix-sni.map"
|
|
|
|
echo "============================================================"
|
|
echo " 🔐 DMS SNI-Config Generator (Postfix & Dovecot)"
|
|
echo " DMS Container: $DMS_CONTAINER"
|
|
echo " Node Hostname: $NODE_HOSTNAME"
|
|
echo "============================================================"
|
|
|
|
# Sicherstellen, dass das Config-Verzeichnis existiert
|
|
mkdir -p "$CONFIG_DIR"
|
|
|
|
# --- Domains aus DMS lesen ---
|
|
echo "📋 Lese Domains aus DMS..."
|
|
DOMAINS=$(docker exec "$DMS_CONTAINER" setup email list 2>/dev/null \
|
|
| grep -oP '(?<=@)[^\s]+' \
|
|
| sort -u)
|
|
|
|
if [ -z "$DOMAINS" ]; then
|
|
echo "⚠️ Keine DMS-Accounts gefunden."
|
|
# Wir erstellen trotzdem leere/Basis-Dateien, damit Postfix nicht abstürzt
|
|
fi
|
|
|
|
# ==========================================
|
|
# 1. Postfix Main Config (postfix-main.cf)
|
|
# ==========================================
|
|
echo "📝 Erstelle $POSTFIX_MAIN_FILE ..."
|
|
cat <<EOF > "$POSTFIX_MAIN_FILE"
|
|
# postfix-main.cf - Automatisch generiert von setup-dms-tls.sh
|
|
#
|
|
# 1. Fallback-Zertifikat (Wird genutzt, wenn kein SNI-Match gefunden wird)
|
|
smtpd_tls_chain_files = /etc/mail/certs/${NODE_HOSTNAME}/${NODE_HOSTNAME}.key, /etc/mail/certs/${NODE_HOSTNAME}/${NODE_HOSTNAME}.crt
|
|
|
|
# 2. SNI-Mapping aktivieren
|
|
# Wir nutzen 'texthash', damit Postfix die Klartext-Map direkt lesen kann,
|
|
# ohne dass 'postmap' im Container ausgeführt werden muss!
|
|
tls_server_sni_maps = texthash:/tmp/docker-mailserver/postfix-sni.map
|
|
EOF
|
|
|
|
# ==========================================
|
|
# 2. Dovecot & Postfix SNI Maps initialisieren
|
|
# ==========================================
|
|
echo "📝 Initialisiere Map-Dateien..."
|
|
echo "# dovecot-sni.cf - Automatisch generiert" > "$DOVECOT_SNI_FILE"
|
|
echo "# postfix-sni.map - Automatisch generiert (Format: domain key_pfad cert_pfad)" > "$POSTFIX_SNI_FILE"
|
|
|
|
# ==========================================
|
|
# 3. Schleife über alle Kundendomains
|
|
# ==========================================
|
|
for domain in $DOMAINS; do
|
|
echo " -> Füge SNI-Regeln für $domain hinzu..."
|
|
|
|
# Pfade, wie Caddy sie für Wildcards anlegt (wildcard_.domain.tld)
|
|
CERT_DIR="wildcard_.${domain}"
|
|
CERT_KEY="/etc/mail/certs/${CERT_DIR}/${CERT_DIR}.key"
|
|
CERT_CRT="/etc/mail/certs/${CERT_DIR}/${CERT_DIR}.crt"
|
|
|
|
# --- Dovecot Block ---
|
|
cat <<EOF >> "$DOVECOT_SNI_FILE"
|
|
|
|
# --- $domain ---
|
|
local_name mail.${domain} {
|
|
ssl_cert = <${CERT_CRT}
|
|
ssl_key = <${CERT_KEY}
|
|
}
|
|
local_name imap.${domain} {
|
|
ssl_cert = <${CERT_CRT}
|
|
ssl_key = <${CERT_KEY}
|
|
}
|
|
local_name smtp.${domain} {
|
|
ssl_cert = <${CERT_CRT}
|
|
ssl_key = <${CERT_KEY}
|
|
}
|
|
local_name pop.${domain} {
|
|
ssl_cert = <${CERT_CRT}
|
|
ssl_key = <${CERT_KEY}
|
|
}
|
|
local_name ${domain} {
|
|
ssl_cert = <${CERT_CRT}
|
|
ssl_key = <${CERT_KEY}
|
|
}
|
|
EOF
|
|
|
|
# --- Postfix Map Einträge ---
|
|
# Bei Postfix SNI Maps müssen Key und Cert in einer Zeile hinter dem Hostnamen stehen
|
|
cat <<EOF >> "$POSTFIX_SNI_FILE"
|
|
mail.${domain} ${CERT_KEY} ${CERT_CRT}
|
|
smtp.${domain} ${CERT_KEY} ${CERT_CRT}
|
|
imap.${domain} ${CERT_KEY} ${CERT_CRT}
|
|
pop.${domain} ${CERT_KEY} ${CERT_CRT}
|
|
${domain} ${CERT_KEY} ${CERT_CRT}
|
|
EOF
|
|
|
|
done
|
|
|
|
echo ""
|
|
echo "✅ Alle Konfigurationsdateien erfolgreich generiert!"
|
|
|
|
# ==========================================
|
|
# 4. Dienste im Container neu laden
|
|
# ==========================================
|
|
echo "🔄 Lade Postfix und Dovecot neu (ohne Downtime)..."
|
|
docker exec "$DMS_CONTAINER" postfix reload || echo "⚠️ Postfix Reload fehlgeschlagen (Container läuft nicht?)"
|
|
docker exec "$DMS_CONTAINER" dovecot reload || echo "⚠️ Dovecot Reload fehlgeschlagen"
|
|
|
|
echo "============================================================"
|
|
echo "🎉 Fertig!" |