Update bricht nicht mehr an unversionierten Laufzeitdateien ab

Auf dem Produktionsserver scheiterte "update.sh" an der untracked hosts.conf:
seit Issue #70 schreibt check_fds.sh diese Datei bei jedem Lauf neu, versioniert
ist nur hosts-sample.conf - in .gitignore stand sie aber (anders als
monitor-api.conf und credentials.conf) nicht.

- hosts.conf in .gitignore aufgenommen
- update.sh blockiert nur noch bei Aenderungen an versionierten Dateien und
  listet sie auf; unversionierte Dateien werden nur als Hinweis geloggt, denn
  der ff-only-Pull laesst sie unangetastet bzw. bricht selbst kontrolliert ab
- neuer Notausgang UPDATE_ALLOW_DIRTY=1 fuer den Fall, dass doch einmal an einer
  versionierten Datei gedreht wurde

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01HBVdYcfaXNq49bMdQQcZue
This commit is contained in:
fds2610-bot 2026-09-01 17:45:42 +02:00
parent 55d5c34ca6
commit 25f8acacc6
3 changed files with 30 additions and 5 deletions

3
.gitignore vendored
View file

@ -7,3 +7,6 @@ deploy-webhook.log
.phpunit.result.cache
monitor-api.conf
credentials.conf
# Wird von check_fds.sh bei jedem Lauf aus der API neu geschrieben (Issue #70),
# versioniert ist nur hosts-sample.conf.
hosts.conf

View file

@ -31,9 +31,11 @@ daher hier nur als Checkliste:
1. **Repo auskecken.** `git clone https://codeberg.org/fds2610/monitor.git` (oder per SSH,
falls Push-Zugangsdaten fuer `git pull` als Deploy-Key/SSH-Key eingerichtet werden) nach
z.B. `/opt/monitor`, Branch `main` ausgecheckt. Der Arbeitsbaum muss beim Update sauber
sein - `update.sh` bricht kontrolliert ab, wenn lokale Aenderungen vorhanden sind, statt sie
zu ueberschreiben.
z.B. `/opt/monitor`, Branch `main` ausgecheckt. Versionierte Dateien duerfen dort nicht
lokal veraendert werden - `update.sh` bricht kontrolliert ab, statt die Aenderungen zu
ueberschreiben (Notausgang: `UPDATE_ALLOW_DIRTY=1`). Unversionierte Dateien neben dem Repo
(`.env`, `hosts.conf`, `monitor-api.conf`, `credentials.conf`) stoeren dagegen nicht, sie
bleiben beim Update unangetastet.
2. **Docker + Docker Compose** installieren (`docker compose version` muss funktionieren).
Der Benutzer, unter dem `deploy-webhook.py` laeuft, braucht Mitgliedschaft in der
`docker`-Gruppe (oder aequivalente Rechte), um `docker compose` ohne `sudo` aufzurufen.

View file

@ -10,6 +10,8 @@
# UPDATE_REMOTE - Git-Remote, aus dem geholt wird (Default: origin)
# UPDATE_BRANCH - Branch, der aktualisiert wird (Default: aktuell ausgecheckter Branch)
# UPDATE_RUN_TESTS - "0" setzen, um die Testsuiten nach dem Update zu ueberspringen (Default: 1)
# UPDATE_ALLOW_DIRTY - "1" setzen, um auch bei lokalen Aenderungen an versionierten Dateien
# weiterzumachen (Default: 0, d.h. kontrollierter Abbruch)
set -euo pipefail
@ -33,9 +35,27 @@ git -C "$REPO_DIR" rev-parse --is-inside-work-tree >/dev/null 2>&1 \
UPDATE_REMOTE="${UPDATE_REMOTE:-origin}"
UPDATE_BRANCH="${UPDATE_BRANCH:-$(git rev-parse --abbrev-ref HEAD)}"
UPDATE_RUN_TESTS="${UPDATE_RUN_TESTS:-1}"
UPDATE_ALLOW_DIRTY="${UPDATE_ALLOW_DIRTY:-0}"
if [ -n "$(git status --porcelain)" ]; then
fail "Lokale Aenderungen/unversionierte Dateien vorhanden - bitte erst committen/stashen. Breche ab, um nichts zu ueberschreiben."
# Unversionierte Dateien blockieren das Update bewusst NICHT: neben dem Repo liegen auf einem
# Produktionsserver Laufzeit-/Konfigurationsdateien (hosts.conf, monitor-api.conf, ...), die
# beim ff-only-Pull ohnehin unangetastet bleiben - stuende eine davon einem neuen Commit im
# Weg, bricht git selbst kontrolliert ab. Blockierend sind nur Aenderungen an versionierten
# Dateien, weil der Pull die verlieren koennte.
DIRTY_TRACKED="$(git status --porcelain --untracked-files=no)"
if [ -n "$DIRTY_TRACKED" ]; then
printf '%s\n' "$DIRTY_TRACKED" >&2
if [ "$UPDATE_ALLOW_DIRTY" = "1" ]; then
log "Warnung: lokale Aenderungen an versionierten Dateien (siehe oben), UPDATE_ALLOW_DIRTY=1 - fahre trotzdem fort."
else
fail "Lokale Aenderungen an versionierten Dateien (siehe oben) - bitte erst committen/stashen (oder UPDATE_ALLOW_DIRTY=1 setzen). Breche ab, um nichts zu ueberschreiben."
fi
fi
UNTRACKED="$(git ls-files --others --exclude-standard)"
if [ -n "$UNTRACKED" ]; then
log "Hinweis: unversionierte Dateien im Arbeitsbaum, sie bleiben unveraendert:"
printf '%s\n' "$UNTRACKED" | sed 's/^/ /'
fi
log "Hole Aenderungen von ${UPDATE_REMOTE}/${UPDATE_BRANCH}..."