From 6494a7cb38a668b8bf5853e0c58c750e27f00e22 Mon Sep 17 00:00:00 2001 From: mhoennig Date: Wed, 26 Aug 2026 19:09:35 +0200 Subject: [PATCH] fix(deploy): sagen, WARUM der Dienst nicht startet MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Bei einem Fehlstart zeigte das Skript `tail -30` des Logs — also das Ende eines Stacktrace, die Rahmenliste, gerade das was nichts erklaert. Jetzt wird der letzte Startversuch herausgeschnitten und daraus die Ursachenkette gezeigt; die tiefste Zeile ist die Antwort. Dazu ein Hinweis auf den einen Fall, der beim Umstieg zwangslaeufig auftritt: eine Datenbank aus der Zeit mit MODE=PostgreSQL passt nicht mehr und muss einmal weg. Ausserdem eine Neustart-Grenze in der Unit: Ohne sie laeuft ein kaputtes Deployment endlos im Kreis, `is-active` sagt dauerhaft "activating", und der eigentliche Fehler steht irgendwo weit oben im wachsenden Log. Mit ihr endet es nach fuenf Fehlstarts sichtbar in "failed". Co-Authored-By: Claude Opus 5 --- scripts/deploy-backend.sh | 21 +++++++++++++++++++-- scripts/werkbaum-backend.service | 7 +++++++ 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/scripts/deploy-backend.sh b/scripts/deploy-backend.sh index d7aa1a7..7904151 100755 --- a/scripts/deploy-backend.sh +++ b/scripts/deploy-backend.sh @@ -205,8 +205,25 @@ if [ "$RESTART" -eq 1 ]; then echo ' ! antwortet nicht.'; exit 1"; then : else - echo "==> Letzte Zeilen des Logs:" >&2 - ssh "$SSH_TARGET" "export XDG_RUNTIME_DIR=\${XDG_RUNTIME_DIR:-/run/user/\$(id -u)}; tail -30 \"$DIR_SH/backend.log\" 2>/dev/null || systemctl --user status werkbaum-backend --no-pager -l | tail -30" >&2 + # Nicht `tail`: Am Ende eines Stacktrace steht die Rahmenliste, also + # gerade das, was nichts erklärt. Gezeigt wird der **letzte Startversuch** + # und daraus die Ursachenkette — die tiefste Zeile ist die Antwort. + echo "==> Warum er nicht startet (letzter Versuch):" >&2 + ssh "$SSH_TARGET" " + log=\"$DIR_SH/backend.log\" + if [ -r \"\$log\" ]; then + awk '/Starting EditorBackendApplication/ {n=NR} {z[NR]=\$0} + END {for(i=n;i<=NR;i++) print z[i]}' \"\$log\" \ + | grep -E 'Caused by|ERROR' | cut -c1-200 + else + export XDG_RUNTIME_DIR=\${XDG_RUNTIME_DIR:-/run/user/\$(id -u)} + systemctl --user status werkbaum-backend --no-pager -l | tail -20 + fi" >&2 + echo >&2 + echo " Steht dort \"Schema \\\"public\\\" not found\" oder \"databasechangelog already" >&2 + echo " exists\", stammt die Datenbank aus der Zeit mit MODE=PostgreSQL und passt" >&2 + echo " nicht mehr (D77). Sie muss einmal weg:" >&2 + echo " ssh $SSH_TARGET 'rm -rf $DIR_SH/data'" >&2 exit 1 fi fi diff --git a/scripts/werkbaum-backend.service b/scripts/werkbaum-backend.service index 3ca0e66..628dab5 100644 --- a/scripts/werkbaum-backend.service +++ b/scripts/werkbaum-backend.service @@ -14,6 +14,13 @@ Description=Werkbaum backend After=network.target +# Nach fuenf Fehlstarts in fuenf Minuten gibt systemd auf. Ohne diese Grenze +# laeuft ein kaputtes Deployment endlos im Kreis: `is-active` sagt dann +# dauerhaft „activating", das Log waechst, und der eigentliche Fehler steht +# irgendwo weit oben. Mit ihr endet es sichtbar in „failed". +StartLimitIntervalSec=300 +StartLimitBurst=5 + [Service] Type=simple WorkingDirectory=__DIR__