#!/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 < "$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 <> "$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 <> "$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!"