Abgleich ohne rsync ueber einen Commit-Merkzettel
Deploy auf den Timer-Server / deploy (push) Successful in 18s

Auf dem Zielhost gibt es kein rsync (und im Runner-Container laeuft es
wegen des Docker-Hosts ohnehin nicht). Der ausgerollte Commit steht jetzt
in /opt/timer-app/.deploy-commit; die Aenderungsliste kommt aus git diff
gegen diesen Stand.

Das ist genauer als ein Zeitstempelvergleich: geloeschte Dateien sind als
solche benannt und werden gezielt entfernt, und ob npm ci und ein Neustart
noetig sind, entscheidet dieselbe Liste. Ist kein Vorgaengerstand bekannt,
gilt alles als neu.

Der Pruefschritt bricht jetzt ab, wenn der Deploy-Benutzer im Zielpfad
nicht schreiben darf - das ist besser als ein halb ausgerollter Stand.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-09-04 18:10:07 +02:00
co-authored by Claude Opus 5
parent b85e4610e0
commit 5e83999950
2 changed files with 59 additions and 46 deletions
+7 -5
View File
@@ -487,12 +487,14 @@ Stand selbsttaetig auf den Server aus. Der Workflow liegt in
### Was der Workflow tut
1. Uebertraegt die versionierten Dateien als tar-Paket auf den Server und
gleicht sie dort per `rsync` gegen `/opt/timer-app` ab. (Im Runner-Container
laesst der Docker-Host rsync nicht laufen - `pipe: Permission denied`.)
1. Uebertraegt die versionierten Dateien als tar-Paket und entpackt sie ueber
`/opt/timer-app`. Kein rsync: im Runner-Container verbietet der Docker-Host
dessen `pipe()`-Aufruf, und auf dem Zielhost ist rsync nicht installiert.
**Nicht angefasst** werden `backend/.env`, `data/` und `node_modules/` —
sie sind vom Abgleich ausgenommen und ueberleben auch das `--delete`,
das geloeschte Dateien auf dem Server aufraeumt.
sie liegen nicht im Repo und sind damit auch nicht im Paket.
Im Repo geloeschte Dateien werden auf dem Server entfernt: die Liste kommt
aus `git diff` gegen den zuletzt ausgerollten Commit, der als Merkzettel
in `/opt/timer-app/.deploy-commit` liegt.
2. `npm ci --omit=dev` **nur**, wenn sich `backend/package*.json` geaendert hat.
Das laeuft bewusst auf dem Zielhost: `bcrypt` und `sqlite3` sind native
Module und muessen zur dortigen Architektur passen.