Zwei Kleinigkeiten ohne Issue, beide aus der Arbeit an #2, #4 und #5 entstanden.
update.sh: Rückfall auf den Container-Healthcheck
Bisher prüfte das Skript ausschließlich http://127.0.0.1:$APP_PORT/api/health. Hinter einem Reverse Proxy ist der App-Port oft gar nicht auf dem Host veröffentlicht — dann meldete das Skript nach zwei Minuten einen Fehlschlag samt Rollback-Anleitung, obwohl das Update sauber durchgelaufen war.
Schlägt die Abfrage vom Host fehl, zählt jetzt der HEALTHCHECK des Containers. Den bringt das Image bereits mit (Dockerfile:86); er fragt /api/health von innen ab und ist damit unabhängig davon, ob ein Port nach außen führt.
Im Fehlerfall nennt das Skript zusätzlich den Zustand und ordnet ihn ein:
Zustand
Auskunft
kein Container
Der Start ist fehlgeschlagen
starting
Migrationen dauern noch — Zeit geben, Log ansehen
unhealthy
Läuft, aber die Anwendung hat ein Problem — nicht der Port
ohne Healthcheck
Älteres Image; nur das Log verrät mehr
Ohne diese Auskunft sah ein nicht veröffentlichter Port genauso aus wie eine abgestürzte Anwendung.
container_zustand() gibt bewusst immer 0 zurück: unter set -e dürfte die Diagnose nicht selbst abbrechen, bevor der Weg zurück ausgegeben ist.
Geprüft — die Funktion isoliert gegen echte Container, alle drei Zweige:
db (hat Healthcheck): healthy
Container ohne Healthcheck: ohne-healthcheck:running
gibtsnicht: kein-container
Dazu bash -n und die Hilfeausgabe. Den vollen Lauf habe ich hier nicht ausgelöst — der würde den Produktivstack bauen.
CLAUDE.md: drei Merkposten
Klickwege nie gegen npm run dev prüfen. Unter headless Chromium scheitert der HMR-Socket, dadurch hydratisiert keine Seite und kein Knopf reagiert — ohne Seitenfehler, ohne fehlgeschlagene Anfrage. Sieht aus wie ein Fehler im eigenen Code. Gegen npm run build && npm start prüfen. (Hat bei #4 spürbar Zeit gekostet.)
Vor npm start prüfen, ob der Port noch von einem früheren Lauf belegt ist — sonst testet man unbemerkt den alten Bau. (Bei #5 passiert.)
scripts/shot.mjs meldet sich nicht an: bei geschützten Seiten entsteht kommentarlos ein Bild der Anmeldemaske. (Bei #2 passiert.)
Kein Issue verknüpft — beides sind Werkzeug- und Dokumentationsänderungen, kein Produktcode. Tests und Typecheck sind davon unberührt.
Zwei Kleinigkeiten ohne Issue, beide aus der Arbeit an #2, #4 und #5 entstanden.
## `update.sh`: Rückfall auf den Container-Healthcheck
Bisher prüfte das Skript ausschließlich `http://127.0.0.1:$APP_PORT/api/health`. Hinter einem Reverse Proxy ist der App-Port oft gar nicht auf dem Host veröffentlicht — dann meldete das Skript nach zwei Minuten einen Fehlschlag samt Rollback-Anleitung, obwohl das Update sauber durchgelaufen war.
Schlägt die Abfrage vom Host fehl, zählt jetzt der **HEALTHCHECK des Containers**. Den bringt das Image bereits mit (`Dockerfile:86`); er fragt `/api/health` von innen ab und ist damit unabhängig davon, ob ein Port nach außen führt.
Im Fehlerfall nennt das Skript zusätzlich den Zustand und ordnet ihn ein:
| Zustand | Auskunft |
|---|---|
| kein Container | Der Start ist fehlgeschlagen |
| `starting` | Migrationen dauern noch — Zeit geben, Log ansehen |
| `unhealthy` | Läuft, aber die Anwendung hat ein Problem — nicht der Port |
| ohne Healthcheck | Älteres Image; nur das Log verrät mehr |
Ohne diese Auskunft sah ein nicht veröffentlichter Port genauso aus wie eine abgestürzte Anwendung.
`container_zustand()` gibt bewusst immer `0` zurück: unter `set -e` dürfte die Diagnose nicht selbst abbrechen, bevor der Weg zurück ausgegeben ist.
**Geprüft** — die Funktion isoliert gegen echte Container, alle drei Zweige:
```
db (hat Healthcheck): healthy
Container ohne Healthcheck: ohne-healthcheck:running
gibtsnicht: kein-container
```
Dazu `bash -n` und die Hilfeausgabe. Den vollen Lauf habe ich hier nicht ausgelöst — der würde den Produktivstack bauen.
## `CLAUDE.md`: drei Merkposten
- **Klickwege nie gegen `npm run dev` prüfen.** Unter headless Chromium scheitert der HMR-Socket, dadurch hydratisiert keine Seite und kein Knopf reagiert — ohne Seitenfehler, ohne fehlgeschlagene Anfrage. Sieht aus wie ein Fehler im eigenen Code. Gegen `npm run build && npm start` prüfen. (Hat bei #4 spürbar Zeit gekostet.)
- Vor `npm start` prüfen, ob der Port noch von einem früheren Lauf belegt ist — sonst testet man unbemerkt den alten Bau. (Bei #5 passiert.)
- `scripts/shot.mjs` meldet sich **nicht** an: bei geschützten Seiten entsteht kommentarlos ein Bild der Anmeldemaske. (Bei #2 passiert.)
Kein Issue verknüpft — beides sind Werkzeug- und Dokumentationsänderungen, kein Produktcode. Tests und Typecheck sind davon unberührt.
Das Update-Skript prüfte allein http://127.0.0.1:APP_PORT/api/health. Hinter
einem Reverse Proxy ist der App-Port oft gar nicht auf dem Host
veröffentlicht — dann meldete das Skript nach zwei Minuten einen Fehlschlag,
obwohl das Update sauber durchgelaufen war.
Schlägt die Abfrage vom Host fehl, zählt jetzt der HEALTHCHECK des Containers.
Den bringt das Image schon mit; er fragt /api/health von innen ab und ist
damit unabhängig von der Portveröffentlichung.
Im Fehlerfall nennt das Skript zusätzlich den Container-Zustand und ordnet ihn
ein: kein Container (Start fehlgeschlagen), startet noch (Migrationen dauern),
läuft aber ungesund (Fehler in der Anwendung), oder ein älteres Image ohne
Healthcheck. Ohne diese Auskunft sah ein nicht veröffentlichter Port genauso
aus wie eine abgestürzte Anwendung.
container_zustand() gibt bewusst immer 0 zurück — unter set -e dürfte die
Diagnose nicht selbst abbrechen, bevor der Weg zurück ausgegeben ist.
Dazu drei Merkposten in CLAUDE.md, die diese Sitzung Zeit gekostet haben:
Klickwege müssen gegen einen Produktionsbau geprüft werden (im
Entwicklungsmodus hydratisiert unter headless Chromium nichts, weil der
HMR-Socket scheitert — ohne jede Fehlermeldung), vor npm start den Port
prüfen, und dass scripts/shot.mjs sich nicht anmeldet.
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Zwei Kleinigkeiten ohne Issue, beide aus der Arbeit an #2, #4 und #5 entstanden.
update.sh: Rückfall auf den Container-HealthcheckBisher prüfte das Skript ausschließlich
http://127.0.0.1:$APP_PORT/api/health. Hinter einem Reverse Proxy ist der App-Port oft gar nicht auf dem Host veröffentlicht — dann meldete das Skript nach zwei Minuten einen Fehlschlag samt Rollback-Anleitung, obwohl das Update sauber durchgelaufen war.Schlägt die Abfrage vom Host fehl, zählt jetzt der HEALTHCHECK des Containers. Den bringt das Image bereits mit (
Dockerfile:86); er fragt/api/healthvon innen ab und ist damit unabhängig davon, ob ein Port nach außen führt.Im Fehlerfall nennt das Skript zusätzlich den Zustand und ordnet ihn ein:
startingunhealthyOhne diese Auskunft sah ein nicht veröffentlichter Port genauso aus wie eine abgestürzte Anwendung.
container_zustand()gibt bewusst immer0zurück: unterset -edürfte die Diagnose nicht selbst abbrechen, bevor der Weg zurück ausgegeben ist.Geprüft — die Funktion isoliert gegen echte Container, alle drei Zweige:
Dazu
bash -nund die Hilfeausgabe. Den vollen Lauf habe ich hier nicht ausgelöst — der würde den Produktivstack bauen.CLAUDE.md: drei Merkpostennpm run devprüfen. Unter headless Chromium scheitert der HMR-Socket, dadurch hydratisiert keine Seite und kein Knopf reagiert — ohne Seitenfehler, ohne fehlgeschlagene Anfrage. Sieht aus wie ein Fehler im eigenen Code. Gegennpm run build && npm startprüfen. (Hat bei #4 spürbar Zeit gekostet.)npm startprüfen, ob der Port noch von einem früheren Lauf belegt ist — sonst testet man unbemerkt den alten Bau. (Bei #5 passiert.)scripts/shot.mjsmeldet sich nicht an: bei geschützten Seiten entsteht kommentarlos ein Bild der Anmeldemaske. (Bei #2 passiert.)Kein Issue verknüpft — beides sind Werkzeug- und Dokumentationsänderungen, kein Produktcode. Tests und Typecheck sind davon unberührt.