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 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-07-22 06:58:14 +02:00
co-authored by Claude Opus 4.8
parent 483bd89d25
commit ecf767cfb5
+6 -1
View File
@@ -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"