diff --git a/docs/vorfall-2026-08-12-gitea.md b/docs/vorfall-2026-08-12-gitea.md index 80ab9e0..0d9389a 100644 --- a/docs/vorfall-2026-08-12-gitea.md +++ b/docs/vorfall-2026-08-12-gitea.md @@ -259,3 +259,67 @@ Datei zurueckgestellt -> "Wieder in Ordnung (Merker geleert)" Er prüft zuerst, ob er überhaupt etwas sehen kann, und meldet sonst „ungültig" statt „sauber" — die Lehre aus zwei Suchen, die genau das verwechselt haben. + +--- + +## Nachtrag 13.08.2026 — ein Schaden aus dem Aufräumen selbst + +Beim Einrichten des Panels in `d4rk_gameserver` sollte ein Benutzer im Nginx +Proxy Manager angelegt werden. Die Oberfläche antwortete mit **„Internal +Error"**. Im Container-Log stand, was sie verschwieg: + +``` +insert into `user` ... - attempt to write a readonly database +``` + +**Der Nginx Proxy Manager konnte seit dem 12.08.2026, 22:11 Uhr, nichts mehr +speichern.** Der letzte erfolgreiche Schreibvorgang war um 22:06 Uhr. + +### Die Ursache war das Aufräumen + +``` +lrwx------ 1 root root 64 Aug 11 16:04 18 -> /data/database.sqlite (deleted) +``` + +Der Prozess hielt einen Zeiger auf eine **gelöschte** Datei. Beim Aufräumen +nach dem Vorfall wurde `/data/database.sqlite` per `docker cp` zurückgeschrieben +— und `docker cp` **ersetzt** die Datei, statt sie zu überschreiben. Der seit +dem 01.08. laufende Prozess zeigte danach ins Leere. SQLite meldet das als +„readonly database", was in die Irre führt: Rechte, Eigentümer und Platz waren +alle in Ordnung (root, 905 GB frei, Verzeichnis beschreibbar). + +### Was es fast gekostet hätte + +Nicht den Betrieb — Lesen ging weiter, alle Seiten liefen, fünfzehn Stunden +lang fiel nichts auf. Aber: + +| Wann | Was | +|---|---| +| ab 03.09.2026 | Erste Zertifikatsverlängerung, wäre still gescheitert | +| ab 03.10.2026 | `proxy`, `portainer` und `cdn` laufen in TLS-Warnungen | + +Ohne Meldung, ohne Eintrag, ohne dass jemand etwas geändert hätte. + +### Behoben + +Container neu gestartet, **4 Sekunden** Ausfall. Danach zeigt der Dateizeiger +wieder auf die echte Datei, alle sechs Seiten antworten, und der Benutzer ließ +sich anlegen. Die Datenbank liegt vorher als +`database.sqlite.vor-neustart-2026-08-13` daneben. + +### Die Lehre + +**Eine Datei unter einem laufenden Dienst zu ersetzen ist etwas anderes, als +sie zu überschreiben.** Richtig wäre gewesen: + +```sh +docker exec sh -c 'cat /pfad/neu > /data/database.sqlite' # behält die Inode +# oder +docker cp neu :/data/database.sqlite && docker restart +``` + +Und der zweite Teil derselben Lehre: der Fehler war **fünfzehn Stunden lang +unsichtbar**, weil nur Schreibvorgänge betroffen waren und niemand welche +auslöste. Der Wächter in `tools/waechter.ps1` hätte ihn nicht gefunden — er +zählt Ports und rechnet Prüfsummen, er versucht nirgends zu schreiben. Ob eine +Schreibprobe je Dienst dazugehört, steht in `ROADMAP.md` als offene Frage.