From 98c78d8dcec5dd50d74f6c4f4981e5a82c3a55a6 Mon Sep 17 00:00:00 2001 From: Andreas Knuth Date: Mon, 23 Feb 2026 09:51:46 -0600 Subject: [PATCH] dfgdfg --- DMS/docker-compose.yml | 4 +- DMS/update_dms_config.sh | 193 +++++++++++++++++++++++---------------- 2 files changed, 114 insertions(+), 83 deletions(-) diff --git a/DMS/docker-compose.yml b/DMS/docker-compose.yml index 05f8a4c..3d10200 100644 --- a/DMS/docker-compose.yml +++ b/DMS/docker-compose.yml @@ -138,8 +138,8 @@ services: - ROUNDCUBEMAIL_DEFAULT_HOST=ssl://node1.email-srvr.com - ROUNDCUBEMAIL_DEFAULT_PORT=993 # Interner Traffic ohne TLS - - ROUNDCUBEMAIL_SMTP_SERVER=mailserver - - ROUNDCUBEMAIL_SMTP_PORT=25 + - ROUNDCUBEMAIL_SMTP_SERVER=tls://node1.email-srvr.com + - ROUNDCUBEMAIL_SMTP_PORT=587 # WICHTIG: Variablen LEER lassen, damit Roundcube keine Authentifizierung versucht! - ROUNDCUBEMAIL_SMTP_USER= diff --git a/DMS/update_dms_config.sh b/DMS/update_dms_config.sh index 3fb73bf..5be8c50 100644 --- a/DMS/update_dms_config.sh +++ b/DMS/update_dms_config.sh @@ -1,91 +1,122 @@ #!/bin/bash -# update_dms_config.sh -# Fügt eine neue Domain zur lokalen DMS Konfiguration hinzu: -# 1. Ergänzt SRS_EXCLUDE_DOMAINS in docker-compose.yml -# 2. Ergänzt Whitelist in smtp_header_checks +# 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 -DOMAIN=$1 -DOCKER_COMPOSE_FILE="./docker-compose.yml" -HEADER_CHECKS_FILE="./docker-data/dms/config/postfix/smtp_header_checks" +DMS_CONTAINER=${DMS_CONTAINER:-"mailserver"} +CONFIG_DIR="./docker-data/dms/config" +NODE_HOSTNAME=${NODE_HOSTNAME:-"node1.email-srvr.com"} -if [ -z "$DOMAIN" ]; then - echo "Usage: $0 " - echo "Example: $0 cielectrical.com" - exit 1 +# 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 -echo "=== Aktualisiere lokale Konfiguration für $DOMAIN ===" +# ========================================== +# 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 -# --------------------------------------------- -# 1. Update docker-compose.yml (SRS Exclude) -# --------------------------------------------- -if [ -f "$DOCKER_COMPOSE_FILE" ]; then - echo "-> Prüfe docker-compose.yml..." - - # Prüfen, ob Domain schon in der Zeile steht - if grep -q "SRS_EXCLUDE_DOMAINS=.*$DOMAIN" "$DOCKER_COMPOSE_FILE"; then - echo " Domain bereits in SRS_EXCLUDE_DOMAINS vorhanden." - else - # Backup erstellen - cp "$DOCKER_COMPOSE_FILE" "${DOCKER_COMPOSE_FILE}.bak" - - # sed Magie: Suche Zeile mit SRS_EXCLUDE_DOMAINS, hänge ",domain" am Ende an - # Wir nutzen ein Komma als Trenner vor der neuen Domain - sed -i "s/SRS_EXCLUDE_DOMAINS=.*/&,$DOMAIN/" "$DOCKER_COMPOSE_FILE" - echo " ✅ $DOMAIN zu SRS_EXCLUDE_DOMAINS hinzugefügt." - fi -else - echo "❌ Fehler: $DOCKER_COMPOSE_FILE nicht gefunden!" - exit 1 -fi +# 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. Update smtp_header_checks (PCRE Whitelist) -# --------------------------------------------- -if [ -f "$HEADER_CHECKS_FILE" ]; then - echo "-> Prüfe smtp_header_checks..." - - # Domain für Regex escapen (der Punkt muss \. sein) - ESCAPED_DOMAIN="${DOMAIN//./\\.}" - NEW_LINE="/.*@${ESCAPED_DOMAIN}/ DUNNO" - - # Prüfen, ob Eintrag existiert - if grep -Fq "@$ESCAPED_DOMAIN/" "$HEADER_CHECKS_FILE"; then - echo " Domain bereits in smtp_header_checks vorhanden." - else - # Backup erstellen - cp "$HEADER_CHECKS_FILE" "${HEADER_CHECKS_FILE}.bak" - - # Wir fügen die Zeile oben bei den Whitelists ein (nach dem Kommentar "# 1. EIGENE...") - # Oder einfach am Anfang der Datei, falls die Reihenfolge egal ist. - # Aber bei PCRE ist Reihenfolge wichtig! Whitelist muss VOR Rewrite stehen. - - # Strategie: Wir suchen die erste Zeile, die mit /.*@ anfängt und fügen davor ein - # Oder wir hängen es einfach oben an einen definierten Marker an. - - # Einfachste sichere Methode für dein File: Nach dem Kommentarblock einfügen - # Wir suchen nach der Zeile mit "1. EIGENE DOMAINS" und fügen 3 Zeilen später ein - # Aber sed insert ist tricky. - - # Bessere Methode: Wir wissen, dass Whitelists ganz oben stehen sollen. - # Wir erstellen eine temporäre Datei. - - # 1. Header (Kommentare) behalten oder neu schreiben? - # Wir hängen es einfach GANZ OBEN in die Datei ein (vor alle anderen Regeln), - # das ist bei "DUNNO" (Whitelist) immer sicherste Variante. - - sed -i "1i $NEW_LINE" "$HEADER_CHECKS_FILE" - - echo " ✅ $DOMAIN zu smtp_header_checks hinzugefügt (ganz oben)." - fi -else - echo "⚠️ Warnung: $HEADER_CHECKS_FILE nicht gefunden. Überspringe." -fi +# ========================================== +# 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" -echo "========================================================" -echo "Konfiguration aktualisiert." -echo "HINWEIS: Damit die Änderungen wirksam werden, führen Sie bitte aus:" -echo " docker compose up -d --force-recreate" -echo "========================================================" \ No newline at end of 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!" \ No newline at end of file