Laudende Default seite entfernen

main
boksbc 2025-10-16 22:31:57 +02:00
parent eb21584f33
commit ae883adf9f
2 changed files with 63 additions and 26 deletions

View File

@ -205,20 +205,41 @@ build_site_acme_only(){
local host="$1" outfile="$2"
cat > "$outfile" <<CONF
# --- ${host} : ACME-only (für LE-HTTP-01) ---
# --- ${host} : ACME-only (80 + 443), KEIN App-Root ---
server {
listen 80;
listen [::]:80;
server_name ${host};
# Nur Challenge-Dateien ausliefern
# HTTP-01 Challenge exakt ausliefern
location ^~ /.well-known/acme-challenge/ {
root ${ACME_ROOT};
allow all;
default_type "text/plain";
try_files \$uri =404;
}
# Alles andere → nach https
location / { return 301 https://\$host\$request_uri; }
}
server {
listen 443 ssl${NGINX_HTTP2_SUFFIX};
listen [::]:443 ssl${NGINX_HTTP2_SUFFIX};
server_name ${host};
ssl_certificate /etc/ssl/mail/fullchain.pem;
ssl_certificate_key /etc/ssl/mail/privkey.pem;
ssl_protocols TLSv1.2 TLSv1.3;
# Auch via https die Challenge bedienen (falls Redirects gefolgt werden)
location ^~ /.well-known/acme-challenge/ {
root ${ACME_ROOT};
default_type "text/plain";
try_files \$uri =404;
}
# Sonst nichts preisgeben
return 204;
location / { return 444; }
}
CONF
}
@ -228,21 +249,21 @@ MX_SITE="/etc/nginx/sites-available/mx-mailwolt.conf"
UI_SITE="/etc/nginx/sites-available/ui-mailwolt.conf"
WEBMAIL_SITE="/etc/nginx/sites-available/webmail-mailwolt.conf"
build_site_acme_only "${MAIL_HOSTNAME}" "$MX_SITE"
if [[ "${PROXY_MODE}" -eq 1 ]]; then
# Hinter NPM/Proxy: Backend nur HTTP:80 (keine Redirects, kein 443)
# UI & Webmail wie gehabt …
if [[ "${PROXY_MODE:-0}" -eq 1 ]]; then
build_site_http_only "$UI_HOST" "$UI_SITE"
build_site_http_only "$WEBMAIL_HOST" "$WEBMAIL_SITE"
else
# Live-Server: 80→443 + TLS vHosts
build_site_tls "$UI_HOST" "/etc/ssl/ui" "$UI_SITE"
build_site_tls "$WEBMAIL_HOST" "/etc/ssl/webmail" "$WEBMAIL_SITE"
build_site_tls "$UI_HOST" "/etc/ssl/ui" "$UI_SITE"
build_site_tls "$WEBMAIL_HOST" "/etc/ssl/webmail" "$WEBMAIL_SITE"
fi
ln -sf "$MX_SITE" "/etc/nginx/sites-enabled/mx-mailwolt.conf"
ln -sf "$UI_SITE" "/etc/nginx/sites-enabled/ui-mailwolt.conf"
ln -sf "$WEBMAIL_SITE" "/etc/nginx/sites-enabled/webmail-mailwolt.conf"
# MX: **immer** ACME-only (kein Laravel dahinter)
build_site_acme_only "${MAIL_HOSTNAME}" "$MX_SITE"
ln -sf "$UI_SITE" /etc/nginx/sites-enabled/ui-mailwolt.conf
ln -sf "$WEBMAIL_SITE" /etc/nginx/sites-enabled/webmail-mailwolt.conf
ln -sf "$MX_SITE" /etc/nginx/sites-enabled/mx-mailwolt.conf
# ── Real-IP nur, wenn Proxy davor ──────────────────────────────────────────
if [[ "${PROXY_MODE}" -eq 1 && -n "${NPM_IP}" ]]; then

View File

@ -3,29 +3,46 @@ set -euo pipefail
source ./lib.sh
ACME_WEBROOT="/var/www/letsencrypt"
install -d -m 0755 "${ACME_WEBROOT}/.well-known/acme-challenge"
CERTBOT_EXTRA=()
LE_STAGING="${LE_STAGING:-0}" # 1 = Let's Encrypt Staging aktivieren
[[ "$LE_STAGING" = "1" ]] && CERTBOT_EXTRA+=(--test-cert)
resolve_ok() {
local host="$1"
getent ahosts "$host" | awk '{print $1}' | sort -u | grep -q -F "$SERVER_PUBLIC_IPV4"
local pats=()
[[ -n "${SERVER_PUBLIC_IPV4:-}" ]] && pats+=("${SERVER_PUBLIC_IPV4//./\\.}")
[[ -n "${SERVER_PUBLIC_IPV6:-}" ]] && pats+=("${SERVER_PUBLIC_IPV6//:/\\:}")
# Wenn gar nichts bekannt ist, lieber nicht blockieren:
[[ ${#pats[@]} -eq 0 ]] && return 0
getent ahosts "$host" | awk '{print $1}' | sort -u \
| grep -Eq "^($(IFS='|'; echo "${pats[*]}"))$"
}
probe_http() {
local host="$1"
echo test > "${ACME_WEBROOT}/.well-known/acme-challenge/_probe"
curl -fsS --max-time 5 -4 "http://${host}/.well-known/acme-challenge/_probe" >/dev/null \
|| curl -fsS --max-time 5 -6 "http://${host}/.well-known/acme-challenge/_probe" >/dev/null
}
issue() {
local host="$1"
echo "[i] Versuche LE für ${host}"
if ! resolve_ok "$host"; then
echo "[!] DNS zeigt (noch) nicht auf diese IP überspringe: ${host}"
return 0
resolve_ok "$host" || { echo "[!] DNS zeigt (noch) nicht hierher skip ${host}"; return 0; }
if ! probe_http "$host"; then
echo "[!] ACME-HTTP-Check für ${host} fehlgeschlagen (Port 80/IPv6/Firewall/Nginx prüfen)."
fi
# Für MX den Schlüssel beibehalten, damit TLSA (3 1 1) stabil bleibt
# MX: Key beibehalten (TLSA 3 1 1 bleibt stabil)
EXTRA_ARGS=()
if [[ "$host" == "$MAIL_HOSTNAME" ]]; then
EXTRA_ARGS+=(--reuse-key)
fi
[[ "$host" == "$MAIL_HOSTNAME" ]] && EXTRA_ARGS+=(--reuse-key)
certbot certonly --agree-tos -m "${LE_EMAIL:-admin@${BASE_DOMAIN}}" \
--non-interactive --webroot -w "$ACME_WEBROOT" -d "$host" \
"${EXTRA_ARGS[@]}" || true
"${EXTRA_ARGS[@]}" "${CERTBOT_EXTRA[@]}" || true
}
if [[ "$BASE_DOMAIN" != "example.com" ]]; then
@ -33,10 +50,9 @@ if [[ "$BASE_DOMAIN" != "example.com" ]]; then
issue "$WEBMAIL_HOST"
issue "$MAIL_HOSTNAME"
# Nginx neu laden (Symlink-Hook verlinkt die neuen Zerts)
systemctl reload nginx || true
# Direkt nach Erst-Ausstellung TLSA für MX einmal erzeugen
# TLSA direkt einmal schreiben (Hook macht es bei Renewals sowieso)
MX_CERT="/etc/letsencrypt/live/${MAIL_HOSTNAME}/fullchain.pem"
if [[ -s "$MX_CERT" ]]; then
HASH="$(openssl x509 -in "$MX_CERT" -noout -pubkey \
@ -48,5 +64,5 @@ if [[ "$BASE_DOMAIN" != "example.com" ]]; then
echo "[TLSA] ${TLSA_LINE}"
fi
else
echo "[i] BASE_DOMAIN=example.com LE-Ausstellung wird übersprungen."
echo "[i] BASE_DOMAIN=example.com LE wird übersprungen."
fi