source: Klonkt/scripts/klonkt-refresh-updater.sh@ 5462bab

main
Last change on this file since 5462bab was 5462bab, checked in by Robin <roboburr@…>, 6 weeks ago

Fix 500 op de Uiterlijk-pagina na een halve update (boiert.eu)

Bart kreeg een 500 op /admin/sites/<slug>/edit. Oorzaak was een gemengde
staat: zijn klonkt-update was gegenereerd voor de oude single-service-layout
en herstart nog klonkt.service, de unit die de migratie juist heeft
uitgezet. De code op schijf werd dus wel bijgewerkt, maar het draaiende
proces nooit herstart. De oude route rendert dan het nieuwe template, dat
een variabele verwacht die de oude route niet meegeeft: ReferenceError, en
Express cachet het gecompileerde template tot de volgende herstart.

Drie lagen gefixt:

  1. Het aliasveld degradeert bij een ontbrekende variabele naar leeg in plaats van de hele pagina mee te nemen (typeof-guard, zelfde patroon als auth-register). Een deploy-moment mag nooit een 500 opleveren.
  2. De nieuw-site-form gaf dezelfde ReferenceError ook met volledig nieuwe code: de /new-route rendert hetzelfde template maar gaf apAliases niet mee. Lokaal gereproduceerd en bevestigd gefixt (beide pagina's 200).
  3. De wortel: een gedeeld script dat /usr/local/bin/klonkt-update herschrijft voor de actuele layout. De migratie draait het voortaan zelf, install.sh genereert de updater er ook mee (kan nooit meer uiteenlopen), en al gemigreerde servers repareren het met een los commando.

Changed files:
src/routes/admin-sites.js

  • /new geeft apAliases mee aan het template

src/views/pages/admin-site-edit.ejs

  • typeof-guard op apAliases met uitleg waarom

scripts/klonkt-migrate-data.sh

  • herschrijft de updater na de unit-omschakeling; waarschuwt als het script in een oudere checkout ontbreekt

scripts/install.sh

  • inline updater-generatie vervangen door het gedeelde script

deploy/MULTI-INSTANCE.md

  • reparatie-instructie voor servers die voor deze fix zijn gemigreerd

New file:
scripts/klonkt-refresh-updater.sh

  • idempotent; detecteert de branch uit de checkout; herstart alle klonkt@<slug>-instances, of klonkt.service als er geen zijn

-robo
Co-Authored-By: Claude Fable 5 <noreply@…>

  • Property mode set to 100755
File size: 2.4 KB
Line 
1#!/usr/bin/env bash
2#
3# (Re)write /usr/local/bin/klonkt-update so it matches how this server runs.
4#
5# Why this exists: the updater is generated once at install time. A server
6# that later migrated to the split layout (klonkt@<slug> units) kept its old
7# updater, which still restarts the retired klonkt.service. Result: the code
8# on disk updates, the restart quietly fails, and the old process keeps
9# serving — half old routes, half new templates, which is how you get a 500
10# on one page and nothing in the logs that says why.
11#
12# Idempotent; safe to run any time:
13#
14# sudo bash /opt/klonkt/scripts/klonkt-refresh-updater.sh
15#
16set -euo pipefail
17
18KLONKT_DIR="${KLONKT_DIR:-/opt/klonkt}"
19KLONKT_USER="${KLONKT_USER:-klonkt}"
20DATA_ROOT="${KLONKT_DATA_ROOT:-/var/lib/klonkt}"
21# Follow whatever branch the checkout is on (stable for most self-hosters).
22BRANCH="${KLONKT_BRANCH:-$(git -C "$KLONKT_DIR" rev-parse --abbrev-ref HEAD 2>/dev/null || echo stable)}"
23
24[ "$(id -u)" = 0 ] || { echo "run this as root (sudo)." >&2; exit 1; }
25[ -d "$KLONKT_DIR/.git" ] || { echo "no git checkout at $KLONKT_DIR" >&2; exit 1; }
26
27cat > /usr/local/bin/klonkt-update <<EOF
28#!/usr/bin/env bash
29set -euo pipefail
30D="${KLONKT_DIR}"
31B=\$(runuser -u ${KLONKT_USER} -- git -C "\$D" rev-parse HEAD 2>/dev/null || true)
32runuser -u ${KLONKT_USER} -- git -C "\$D" fetch --depth 1 origin ${BRANCH}
33runuser -u ${KLONKT_USER} -- git -C "\$D" checkout -qf -B ${BRANCH} FETCH_HEAD
34A=\$(runuser -u ${KLONKT_USER} -- git -C "\$D" rev-parse HEAD)
35if [ "\$B" = "\$A" ]; then
36 echo "Klonkt is already up to date (\$A) — nothing to do."
37 exit 0
38fi
39if ! runuser -u ${KLONKT_USER} -- git -C "\$D" diff --quiet "\$B" "\$A" -- package-lock.json 2>/dev/null; then
40 runuser -u ${KLONKT_USER} -- env HOME="\$D" bash -c "cd '\$D' && npm ci --omit=dev"
41fi
42# Restart every instance sharing this checkout: one directory with an .env
43# under the data root per instance. No instances there = the pre-split
44# single-service layout, which still runs plain klonkt.service.
45N=0
46for d in ${DATA_ROOT}/*/; do
47 [ -f "\$d/.env" ] || continue
48 s=\$(basename "\$d")
49 systemctl restart "klonkt@\$s" && N=\$((N+1))
50done
51if [ "\$N" = 0 ]; then
52 systemctl restart klonkt
53 echo "Klonkt updated (\$A) + restarted."
54else
55 echo "Klonkt updated (\$A) + restarted \$N instance(s)."
56fi
57EOF
58chmod +x /usr/local/bin/klonkt-update
59echo "klonkt-update rewritten: branch ${BRANCH}, code ${KLONKT_DIR}, instances under ${DATA_ROOT}"
Note: See TracBrowser for help on using the repository browser.