Beim Ablegen eines Schreibens stand in der Oberflaeche "Das Schreiben konnte nicht abgelegt werden." Bei einer Fehlersuche am 31.08.2026 lagen hinter genau diesem Satz nacheinander DREI verschiedene Ursachen: ein fehlender Ablagebereich, ein Endpunkt, der auf einen fremden Anbieter zeigte, und eine Verschluesselung, die der Speicher nicht anbietet. Ohne Zugang zum Serverlog waere die Suche aussichtslos gewesen. Jetzt uebersetzt src/lib/speicher/fehler.ts die bekannten Faelle in Saetze, die sagen, was zu tun ist - fehlender Ablagebereich mit Verweis auf Schritt 6 der Installation, abgelehnte Zugangsdaten mit den Namen der beiden Variablen, nicht unterstuetzte Verschluesselung mit dem Hinweis auf S3_SSE, und nicht erreichbarer Speicher mit der Zusicherung, dass die Eingaben bleiben. Durchgereicht wird dabei nichts. Fremde Fehlertexte tragen Hostnamen, Eimernamen und Anfragekennungen - das gehoert ins Log, nicht auf den Bildschirm eines Betreuers. Uebersetzt werden nur die bekannten Faelle; alles andere bleibt bei der allgemeinen Meldung. Dazu eine Bereitschaftspruefung: Sie schreibt eine winzige Datei, liest sie zurueck und raeumt sie weg - und beantwortet damit erreichbar, Ablagebereich vorhanden und Schreibrecht auf einmal. Das Ergebnis steht in /api/gesundheit und als Zeile im Log. ## Warum nicht instrumentation.ts Der naheliegende Ort waere der Starthaken von Next. Der wird aber auch fuer die Edge-Laufzeit gebuendelt, und ueber die Treiber kaeme node:path in ein Buendel, in dem es das nicht gibt - der Build schlaegt fehl. Das war ausprobiert, nicht vermutet. Die Pruefung haengt deshalb an der Gesundheitsabfrage. Der Healthcheck ruft sie ab 40 Sekunden nach dem Start alle 30 Sekunden auf; die erste Pruefung passiert also von selbst kurz nach dem Hochfahren. Eine Schonfrist von fuenf Minuten verhindert, dass dabei alle 30 Sekunden eine Probedatei in den Objektspeicher geht, und gemeldet wird nur bei einer Aenderung. Ein gestoerter Speicher fuehrt ausdruecklich NICHT zu 503. Sonst startete der Healthcheck den Behaelter neu und machte die ganze Akte unerreichbar - wegen eines Teils, den ein Neustart nicht repariert. Gegen drei Mutationen geprueft: NotImplemented ohne Textpruefung, alte Reihenfolge bei der Codeermittlung, Erklaerung nicht benutzt - jede wird rot. Refs #44
54 lines
1.9 KiB
TypeScript
54 lines
1.9 KiB
TypeScript
import { NextResponse } from 'next/server'
|
|
import { db } from '@/lib/db'
|
|
import { COMMIT, VERSION } from '@/lib/version'
|
|
import { speicherZustand } from '@/lib/speicher/pruefung'
|
|
|
|
/**
|
|
* Betriebsbereitschaft fuer den Healthcheck in docker-compose.
|
|
*
|
|
* Bewusst ohne Anmeldung, aber ohne jede Auskunft ueber Inhalte: geprueft
|
|
* wird, ob Datenbank und Dateiablage antworten.
|
|
*
|
|
* Nur die Datenbank entscheidet ueber 503. Ein gestoerter Speicher wird
|
|
* gemeldet, laesst den Behaelter aber laufen - sonst wuerde der
|
|
* Healthcheck ihn neu starten, und die ganze Akte waere weg wegen eines
|
|
* Teils, den ein Neustart nicht repariert.
|
|
*
|
|
* Die Version steht dabei: sie wird beim Aktualisieren gebraucht, um zu
|
|
* sehen, ob der neue Stand tatsaechlich laeuft. Das ist keine Auskunft
|
|
* ueber die betreuten Daten, und die Adresse ist ohnehin nur ueber den
|
|
* eigenen Reverse Proxy erreichbar.
|
|
*/
|
|
export const runtime = 'nodejs'
|
|
export const dynamic = 'force-dynamic'
|
|
|
|
export async function GET() {
|
|
try {
|
|
await db.$queryRaw`SELECT 1`
|
|
} catch {
|
|
return NextResponse.json(
|
|
{ status: 'datenbank nicht erreichbar', version: VERSION },
|
|
{ status: 503, headers: { 'Cache-Control': 'no-store' } },
|
|
)
|
|
}
|
|
|
|
// Der Speicher wird mitgeprueft, aber er entscheidet NICHT ueber die
|
|
// Betriebsbereitschaft: Faellt er aus, funktioniert alles ausser dem
|
|
// Ablegen von Dateien. Ein 503 wuerde den Behaelter neu starten lassen
|
|
// und die ganze Akte unerreichbar machen - wegen eines Teils, den ein
|
|
// Neustart nicht repariert.
|
|
const speicher = await speicherZustand()
|
|
|
|
return NextResponse.json(
|
|
{
|
|
status: 'bereit',
|
|
version: VERSION,
|
|
commit: COMMIT || undefined,
|
|
speicher: speicher.ok
|
|
? { status: 'bereit', treiber: speicher.treiber }
|
|
: { status: 'gestoert', treiber: speicher.treiber, art: speicher.art },
|
|
},
|
|
{ headers: { 'Cache-Control': 'no-store' } },
|
|
)
|
|
}
|