From ecf767cfb5fcaab98d516c76057353fb6659286b Mon Sep 17 00:00:00 2001 From: mhoennig Date: Wed, 22 Jul 2026 06:58:14 +0200 Subject: [PATCH] scripts/deploy-prod: ACME-Challenge vor --delete schuetzen rsync --filter='protect /.well-known/***' bewahrt am Ziel liegende .well-known-Dateien (Let's-Encrypt-Challenge waehrend einer Erneuerung) vor dem --delete, obwohl sie nicht in der Quelle liegen. Verhindert die Race Condition, dass ein Deploy eine laufende Zertifikatserneuerung abraeumt. Bedient Hostsharing die Challenge ausserhalb des Docroots, ist es ein No-op. Lokal verifiziert: .well-known/acme-challenge/testtoken ueberlebt den Deploy, eine sonstige Alt-Datei wird weiterhin per --delete entfernt. Co-Authored-By: Claude Opus 4.8 --- scripts/deploy-prod.sh | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/scripts/deploy-prod.sh b/scripts/deploy-prod.sh index 0719a97..b8bacc5 100755 --- a/scripts/deploy-prod.sh +++ b/scripts/deploy-prod.sh @@ -95,7 +95,12 @@ cp LICENSE "$STAGE/LICENSE" # lokalen Rechten: `mktemp -d` legt $STAGE mit 0700 an, und `rsync -a` würde # diesen Modus sonst auf das Ziel-Verzeichnis übertragen — dann kann der # Webserver es nicht betreten (Apache 403 „unable to read htaccess file“). -RSYNC_OPTS=(-avz --delete --chmod=D755,F644) +# --filter='protect /.well-known/***' bewahrt am Ziel liegende ACME-Challenge- +# Dateien (Let's-Encrypt-Erneuerung) vor dem --delete, obwohl sie nicht in der +# Quelle liegen — sonst könnte ein Deploy eine laufende Zertifikatserneuerung +# abräumen. Bedient Hostsharing die Challenge außerhalb des Docroots, ist es ein +# No-op. +RSYNC_OPTS=(-avz --delete --chmod=D755,F644 --filter='protect /.well-known/***') if [ "$YES" -ne 1 ]; then echo "==> Vorschau (rsync --dry-run --delete) nach ${TARGET}:" rsync "${RSYNC_OPTS[@]}" --dry-run "$STAGE"/ "$TARGET"