fix(deploy): sagen, WARUM der Dienst nicht startet

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 <noreply@anthropic.com>
This commit is contained in:
mhoennig
2026-08-26 19:09:35 +02:00
co-authored by Claude Opus 5
parent dea904814b
commit 6494a7cb38
2 changed files with 26 additions and 2 deletions
+19 -2
View File
@@ -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
+7
View File
@@ -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__