dfgdfg
This commit is contained in:
parent
3381fd68c2
commit
98c78d8dce
|
|
@ -138,8 +138,8 @@ services:
|
||||||
- ROUNDCUBEMAIL_DEFAULT_HOST=ssl://node1.email-srvr.com
|
- ROUNDCUBEMAIL_DEFAULT_HOST=ssl://node1.email-srvr.com
|
||||||
- ROUNDCUBEMAIL_DEFAULT_PORT=993
|
- ROUNDCUBEMAIL_DEFAULT_PORT=993
|
||||||
# Interner Traffic ohne TLS
|
# Interner Traffic ohne TLS
|
||||||
- ROUNDCUBEMAIL_SMTP_SERVER=mailserver
|
- ROUNDCUBEMAIL_SMTP_SERVER=tls://node1.email-srvr.com
|
||||||
- ROUNDCUBEMAIL_SMTP_PORT=25
|
- ROUNDCUBEMAIL_SMTP_PORT=587
|
||||||
|
|
||||||
# WICHTIG: Variablen LEER lassen, damit Roundcube keine Authentifizierung versucht!
|
# WICHTIG: Variablen LEER lassen, damit Roundcube keine Authentifizierung versucht!
|
||||||
- ROUNDCUBEMAIL_SMTP_USER=
|
- ROUNDCUBEMAIL_SMTP_USER=
|
||||||
|
|
|
||||||
|
|
@ -1,91 +1,122 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
# update_dms_config.sh
|
# setup-dms-tls.sh
|
||||||
# Fügt eine neue Domain zur lokalen DMS Konfiguration hinzu:
|
# Generiert SNI-Konfigurationen für Dovecot und Postfix anhand der DMS-Accounts.
|
||||||
# 1. Ergänzt SRS_EXCLUDE_DOMAINS in docker-compose.yml
|
#
|
||||||
# 2. Ergänzt Whitelist in smtp_header_checks
|
# Vorbereitung:
|
||||||
|
# Stelle sicher, dass dieses Skript ausführbar ist: chmod +x setup-dms-tls.sh
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
DOMAIN=$1
|
DMS_CONTAINER=${DMS_CONTAINER:-"mailserver"}
|
||||||
DOCKER_COMPOSE_FILE="./docker-compose.yml"
|
CONFIG_DIR="./docker-data/dms/config"
|
||||||
HEADER_CHECKS_FILE="./docker-data/dms/config/postfix/smtp_header_checks"
|
NODE_HOSTNAME=${NODE_HOSTNAME:-"node1.email-srvr.com"}
|
||||||
|
|
||||||
if [ -z "$DOMAIN" ]; then
|
# Zieldateien im Config-Verzeichnis (werden in den Container gemountet)
|
||||||
echo "Usage: $0 <domain>"
|
DOVECOT_SNI_FILE="$CONFIG_DIR/dovecot-sni.cf"
|
||||||
echo "Example: $0 cielectrical.com"
|
POSTFIX_MAIN_FILE="$CONFIG_DIR/postfix-main.cf"
|
||||||
exit 1
|
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
|
fi
|
||||||
|
|
||||||
echo "=== Aktualisiere lokale Konfiguration für $DOMAIN ==="
|
# ==========================================
|
||||||
|
# 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
|
||||||
# 1. Update docker-compose.yml (SRS Exclude)
|
# Wir nutzen 'texthash', damit Postfix die Klartext-Map direkt lesen kann,
|
||||||
# ---------------------------------------------
|
# ohne dass 'postmap' im Container ausgeführt werden muss!
|
||||||
if [ -f "$DOCKER_COMPOSE_FILE" ]; then
|
tls_server_sni_maps = texthash:/tmp/docker-mailserver/postfix-sni.map
|
||||||
echo "-> Prüfe docker-compose.yml..."
|
EOF
|
||||||
|
|
||||||
# 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. Update smtp_header_checks (PCRE Whitelist)
|
# 2. Dovecot & Postfix SNI Maps initialisieren
|
||||||
# ---------------------------------------------
|
# ==========================================
|
||||||
if [ -f "$HEADER_CHECKS_FILE" ]; then
|
echo "📝 Initialisiere Map-Dateien..."
|
||||||
echo "-> Prüfe smtp_header_checks..."
|
echo "# dovecot-sni.cf - Automatisch generiert" > "$DOVECOT_SNI_FILE"
|
||||||
|
echo "# postfix-sni.map - Automatisch generiert (Format: domain key_pfad cert_pfad)" > "$POSTFIX_SNI_FILE"
|
||||||
# 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
|
|
||||||
|
|
||||||
echo "========================================================"
|
# ==========================================
|
||||||
echo "Konfiguration aktualisiert."
|
# 3. Schleife über alle Kundendomains
|
||||||
echo "HINWEIS: Damit die Änderungen wirksam werden, führen Sie bitte aus:"
|
# ==========================================
|
||||||
echo " docker compose up -d --force-recreate"
|
for domain in $DOMAINS; do
|
||||||
echo "========================================================"
|
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!"
|
||||||
Loading…
Reference in New Issue