email-amazon/DMS/update_dms_config.sh

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!"