Merge: Version 1.12.0
This commit was merged in pull request #54.
This commit is contained in:
+82
-1
@@ -26,6 +26,86 @@ Wiederherstellung*.
|
|||||||
|
|
||||||
_Noch nichts._
|
_Noch nichts._
|
||||||
|
|
||||||
|
## [1.12.0] – 2026-09-01
|
||||||
|
|
||||||
|
Diese Fassung geht aus einer Fehlersuche im laufenden Betrieb hervor. Ein
|
||||||
|
Schreiben ließ sich nicht in der Akte ablegen — und hinter derselben
|
||||||
|
Meldung lagen nacheinander drei verschiedene Ursachen. Beim Nachsehen kam
|
||||||
|
ein vierter Punkt dazu, der schwerer wiegt als alle anderen zusammen.
|
||||||
|
|
||||||
|
### Nach dem Update: einmal die Sicherung prüfen
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker compose up -d
|
||||||
|
docker compose exec sicherung /bin/sh /sicherung.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
Erwartet werden drei Zeilen: `Datenbank gesichert`, `Dokumente gesichert`
|
||||||
|
und `Selbstpruefung bestanden - Datenbank und Dokumente.`
|
||||||
|
|
||||||
|
### Behoben
|
||||||
|
|
||||||
|
- **Deine Dokumente waren in keiner Sicherung.** Der Sicherungsdienst
|
||||||
|
machte täglich ein `pg_dump` und sonst nichts. Nach einem Plattenschaden
|
||||||
|
wäre die Akte vollständig wiederhergestellt worden — mit allen
|
||||||
|
Einträgen, Verweisen und Prüfsummen, aber ohne eine einzige Datei
|
||||||
|
dahinter. Die Prüfsumme in der Akte hätte dann ein Dokument belegt, das
|
||||||
|
es nicht mehr gibt.
|
||||||
|
|
||||||
|
Je Lauf entstehen jetzt zwei verschlüsselte Dateien mit demselben
|
||||||
|
Zeitstempel — der Datenbankstand und ein Archiv der Dokumente. Beide mit
|
||||||
|
Prüfsumme, beide in der Aufbewahrung, beide in der Selbstprüfung.
|
||||||
|
Schlägt der Dokumententeil fehl, bricht der Lauf ab und räumt den
|
||||||
|
angefangenen Datenbankstand weg: Eine Sicherung, die nur die halbe
|
||||||
|
Wahrheit enthält, aber vollständig aussieht, ist schlimmer als gar
|
||||||
|
keine.
|
||||||
|
|
||||||
|
- **Der mitgelieferte Objektspeicher konnte keine Dokumente aufnehmen.**
|
||||||
|
Die Anwendung verlangte bei jeder Ablage serverseitige Verschlüsselung,
|
||||||
|
das mitgelieferte MinIO kann sie ohne Zusatzdienst nicht. Wer der
|
||||||
|
Installationsanleitung folgte, landete zwangsläufig dort. Sie ist jetzt
|
||||||
|
abschaltbar und standardmäßig aus — gebraucht wird sie nicht, weil die
|
||||||
|
Anwendung seit 1.11.0 selbst verschlüsselt.
|
||||||
|
|
||||||
|
- **„Das Schreiben konnte nicht abgelegt werden" sagte nichts.** Jetzt
|
||||||
|
steht dort, was los ist: fehlender Ablagebereich mit Verweis auf den
|
||||||
|
Installationsschritt, abgelehnte Zugangsdaten, nicht erreichbarer
|
||||||
|
Speicher. Und in jedem Fall, ob deine Eingaben erhalten bleiben.
|
||||||
|
|
||||||
|
- **Zwei Einstellungen erreichten die Anwendung nie.**
|
||||||
|
`ERSTEINRICHTUNG_GEHEIMNIS` und `VERTRAUE_PROXY` standen zwar in der
|
||||||
|
Anleitung, wurden aber nicht an den Behälter durchgereicht. Bei
|
||||||
|
`VERTRAUE_PROXY` fiel das nicht auf: Die Anmeldesperre zählte still eine
|
||||||
|
Dimension weniger.
|
||||||
|
|
||||||
|
- **Die Beispielkonfiguration zeigte auf einen fremden Anbieter.**
|
||||||
|
`S3_ENDPOINT` war mit einer externen Adresse vorbelegt und hebelte damit
|
||||||
|
den richtigen Standard aus. Die Zeile ist jetzt auskommentiert.
|
||||||
|
|
||||||
|
### Neu
|
||||||
|
|
||||||
|
- **Die Anwendung prüft ihre Dateiablage selbst.** Sie schreibt eine
|
||||||
|
winzige Datei, liest sie zurück und räumt sie weg — und beantwortet
|
||||||
|
damit auf einmal, ob der Speicher erreichbar ist, der Ablagebereich
|
||||||
|
existiert und geschrieben werden darf. Das Ergebnis steht unter
|
||||||
|
`/api/gesundheit` und im Log. Bisher fiel eine kaputte Konfiguration
|
||||||
|
erst auf, wenn jemand ein Dokument ablegen wollte.
|
||||||
|
|
||||||
|
- **Ein neuer Abschnitt in der Anleitung: „Wo deine Daten liegen".**
|
||||||
|
Die drei Orte, der Pfad auf der Platte, welche Schlüssel unverzichtbar
|
||||||
|
sind — und wie man prüft, ob zu jedem Akteneintrag auch eine Datei
|
||||||
|
gehört.
|
||||||
|
|
||||||
|
### Geändert
|
||||||
|
|
||||||
|
- **Ausschlussfristen warnen nur noch, wenn sie näherrücken.** Auf dem
|
||||||
|
Dashboard standen dauerhaft drei rote Kästen mit Warndreieck — für
|
||||||
|
Aufwandspauschalen, die 2027, 2028 und 2029 ablaufen. Eine Warnung, die
|
||||||
|
monatelang dasteht und nichts von einem will, stumpft ab; man übersieht
|
||||||
|
die vierte, die etwas will. Ab drei Monaten vor Ablauf meldet sich eine
|
||||||
|
Frist wieder, Versäumtes immer. In der Fristenliste stehen sie
|
||||||
|
unverändert weiter.
|
||||||
|
|
||||||
## [1.11.0] – 2026-08-24
|
## [1.11.0] – 2026-08-24
|
||||||
|
|
||||||
Diese Fassung geht aus einer Sicherheitsprüfung hervor. Sie ändert nichts
|
Diese Fassung geht aus einer Sicherheitsprüfung hervor. Sie ändert nichts
|
||||||
@@ -1265,7 +1345,8 @@ Was davon wann angegangen wird, steht in [`docs/ROADMAP.md`](docs/ROADMAP.md).
|
|||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
[Unveröffentlicht]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.11.0...HEAD
|
[Unveröffentlicht]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.12.0...HEAD
|
||||||
|
[1.12.0]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.11.0...v1.12.0
|
||||||
[1.11.0]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.2...v1.11.0
|
[1.11.0]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.2...v1.11.0
|
||||||
[1.10.2]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.1...v1.10.2
|
[1.10.2]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.1...v1.10.2
|
||||||
[1.10.1]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.0...v1.10.1
|
[1.10.1]: https://git.wilde-server.de/florian.wilde/betreuungs-cockpit/compare/v1.10.0...v1.10.1
|
||||||
|
|||||||
@@ -323,7 +323,7 @@ betreuungs-cockpit-sicherung-1 Up
|
|||||||
```bash
|
```bash
|
||||||
# Antwortet die Anwendung? (Port anpassen, falls du APP_PORT gesetzt hast)
|
# Antwortet die Anwendung? (Port anpassen, falls du APP_PORT gesetzt hast)
|
||||||
curl -s http://127.0.0.1:3000/api/gesundheit
|
curl -s http://127.0.0.1:3000/api/gesundheit
|
||||||
# {"status":"bereit","version":"1.11.1","commit":"...",
|
# {"status":"bereit","version":"1.12.0","commit":"...",
|
||||||
# "speicher":{"status":"bereit","treiber":"s3"}}
|
# "speicher":{"status":"bereit","treiber":"s3"}}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -1,6 +1,6 @@
|
|||||||
{
|
{
|
||||||
"name": "betreuungs-cockpit",
|
"name": "betreuungs-cockpit",
|
||||||
"version": "1.11.0",
|
"version": "1.12.0",
|
||||||
"private": true,
|
"private": true,
|
||||||
"description": "Arbeits- und Dokumentationswerkzeug fuer die ehrenamtliche rechtliche Betreuung",
|
"description": "Arbeits- und Dokumentationswerkzeug fuer die ehrenamtliche rechtliche Betreuung",
|
||||||
"engines": {
|
"engines": {
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ echo "$(date -Iseconds) Datenbank wiederhergestellt."
|
|||||||
# --- Dokumente ---------------------------------------------------------------
|
# --- Dokumente ---------------------------------------------------------------
|
||||||
# Zu "cockpit_2026-09-01_0315.dump.enc" gehoert
|
# Zu "cockpit_2026-09-01_0315.dump.enc" gehoert
|
||||||
# "dokumente_2026-09-01_0315.tar.gz.enc" - gleicher Zeitstempel, anderer
|
# "dokumente_2026-09-01_0315.tar.gz.enc" - gleicher Zeitstempel, anderer
|
||||||
# Name. Fehlt sie, stammt die Sicherung aus einer Fassung vor v1.11.1.
|
# Name. Fehlt sie, stammt die Sicherung aus einer Fassung vor v1.12.0.
|
||||||
ZEITSTEMPEL="$(basename "$DATEI" | sed -n 's/^cockpit_\(.*\)\.dump\.enc$/\1/p')"
|
ZEITSTEMPEL="$(basename "$DATEI" | sed -n 's/^cockpit_\(.*\)\.dump\.enc$/\1/p')"
|
||||||
DOKUMENTE_DATEI="$(dirname "$DATEI")/dokumente_${ZEITSTEMPEL}.tar.gz.enc"
|
DOKUMENTE_DATEI="$(dirname "$DATEI")/dokumente_${ZEITSTEMPEL}.tar.gz.enc"
|
||||||
AUSPACKZIEL="$(dirname "$DATEI")/dokumente-wiederhergestellt_${ZEITSTEMPEL}"
|
AUSPACKZIEL="$(dirname "$DATEI")/dokumente-wiederhergestellt_${ZEITSTEMPEL}"
|
||||||
@@ -109,7 +109,7 @@ if [ ! -f "$DOKUMENTE_DATEI" ]; then
|
|||||||
echo ""
|
echo ""
|
||||||
echo "WARNUNG: Zu dieser Sicherung gibt es kein Dokumentenarchiv."
|
echo "WARNUNG: Zu dieser Sicherung gibt es kein Dokumentenarchiv."
|
||||||
echo " Erwartet wurde: $DOKUMENTE_DATEI"
|
echo " Erwartet wurde: $DOKUMENTE_DATEI"
|
||||||
echo " Sicherungen aus Fassungen vor v1.11.1 enthalten nur die"
|
echo " Sicherungen aus Fassungen vor v1.12.0 enthalten nur die"
|
||||||
echo " Datenbank. Die Akte ist dann vollstaendig, die Dateien"
|
echo " Datenbank. Die Akte ist dann vollstaendig, die Dateien"
|
||||||
echo " dahinter fehlen."
|
echo " dahinter fehlen."
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { speicherfehlerErkennen } from '@/lib/speicher/fehler'
|
|||||||
/**
|
/**
|
||||||
* Ist die Dateiablage benutzbar?
|
* Ist die Dateiablage benutzbar?
|
||||||
*
|
*
|
||||||
* Bis v1.11.1 fiel eine kaputte Speicherkonfiguration erst auf, wenn
|
* Bis v1.12.0 fiel eine kaputte Speicherkonfiguration erst auf, wenn
|
||||||
* jemand ein Dokument ablegen wollte. Auf dem Livesystem waren das
|
* jemand ein Dokument ablegen wollte. Auf dem Livesystem waren das
|
||||||
* mehrere Wochen nach der Installation - und dann mitten in der Arbeit,
|
* mehrere Wochen nach der Installation - und dann mitten in der Arbeit,
|
||||||
* mit einer Meldung, die nichts sagte.
|
* mit einer Meldung, die nichts sagte.
|
||||||
|
|||||||
+1
-1
@@ -17,7 +17,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/** Muss zur "version" in der package.json passen. */
|
/** Muss zur "version" in der package.json passen. */
|
||||||
export const VERSION = '1.11.0'
|
export const VERSION = '1.12.0'
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Kurzer Git-Stand, beim Bauen hineingereicht:
|
* Kurzer Git-Stand, beim Bauen hineingereicht:
|
||||||
|
|||||||
@@ -104,7 +104,7 @@ describe('Installationsanleitung', () => {
|
|||||||
})
|
})
|
||||||
|
|
||||||
it('behauptet nicht mehr, die Dokumente seien ungesichert', () => {
|
it('behauptet nicht mehr, die Dokumente seien ungesichert', () => {
|
||||||
// Stand bis v1.11.1 so drin und stimmt seit der Sicherung nicht mehr.
|
// Stand bis v1.12.0 so drin und stimmt seit der Sicherung nicht mehr.
|
||||||
expect(anleitung).not.toMatch(/Was das Backup nicht enthält:.*Dateien im Objektspeicher/s)
|
expect(anleitung).not.toMatch(/Was das Backup nicht enthält:.*Dateien im Objektspeicher/s)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|||||||
@@ -6,7 +6,7 @@ import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest'
|
|||||||
/**
|
/**
|
||||||
* Die Bereitschaftsprüfung der Dateiablage.
|
* Die Bereitschaftsprüfung der Dateiablage.
|
||||||
*
|
*
|
||||||
* Bis v1.11.1 fiel eine kaputte Speicherkonfiguration erst auf, wenn
|
* Bis v1.12.0 fiel eine kaputte Speicherkonfiguration erst auf, wenn
|
||||||
* jemand ein Dokument ablegen wollte. Auf dem Livesystem waren das
|
* jemand ein Dokument ablegen wollte. Auf dem Livesystem waren das
|
||||||
* mehrere Wochen nach der Installation — und dann mitten in der Arbeit,
|
* mehrere Wochen nach der Installation — und dann mitten in der Arbeit,
|
||||||
* mit einer Meldung, die nichts sagte.
|
* mit einer Meldung, die nichts sagte.
|
||||||
|
|||||||
Reference in New Issue
Block a user