From 5f695ebe2a7ea17a75d7ba957432fa1ca0dc3cf7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Reinhard=20X=2E=20F=C3=BCrst?= Date: Sun, 5 Jul 2026 15:28:08 +0200 Subject: [PATCH] =?UTF-8?q?fix:=20kein=20WAL=20mehr,=20damit=20die=20read-?= =?UTF-8?q?only=20Web-App=20die=20DB=20=C3=B6ffnen=20kann?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Eine readonly-Verbindung (web-Container) kann eine WAL-Datenbank ohne aktiven Writer/-shm nicht öffnen -> "attempt to write a readonly database", die Seite blieb leer. Da collector (Writer) und web (Reader) getrennte Prozesse sind und der collector keine Dauerverbindung hält, existiert im Ruhezustand kein -shm. - collector/db.py + schema.sql: WAL entfernt (Rollback-Journal als Default); readonly-Reads sind damit jederzeit möglich. - web/lib/db.ts: busy_timeout=5s, falls gerade geschrieben wird. Bestehende DB einmalig umstellen: PRAGMA journal_mode=DELETE; Co-Authored-By: Claude Opus 4.8 (1M context) --- collector/db.py | 5 ++++- collector/schema.sql | 2 -- web/lib/db.ts | 4 +++- 3 files changed, 7 insertions(+), 4 deletions(-) diff --git a/collector/db.py b/collector/db.py index 6bee655..3d8a638 100644 --- a/collector/db.py +++ b/collector/db.py @@ -17,7 +17,10 @@ def connect() -> sqlite3.Connection: Path(path).parent.mkdir(parents=True, exist_ok=True) conn = sqlite3.connect(path) conn.row_factory = sqlite3.Row - conn.execute("PRAGMA journal_mode=WAL;") + # Bewusst KEIN WAL: Der web-Container liest die DB read-only aus einem + # anderen Prozess. Eine readonly-Verbindung kann eine WAL-Datenbank ohne + # aktiven Writer/-shm nicht öffnen ("attempt to write a readonly database"). + # Rollback-Journal (Default) lässt readonly-Reads jederzeit zu. return conn diff --git a/collector/schema.sql b/collector/schema.sql index 2317356..c0fa291 100644 --- a/collector/schema.sql +++ b/collector/schema.sql @@ -1,5 +1,3 @@ -PRAGMA journal_mode=WAL; - CREATE TABLE IF NOT EXISTS charges ( id INTEGER PRIMARY KEY AUTOINCREMENT, start_time TEXT NOT NULL, -- ISO 8601, lokale Zeit (Europe/Berlin) diff --git a/web/lib/db.ts b/web/lib/db.ts index ddb079a..47abf0d 100644 --- a/web/lib/db.ts +++ b/web/lib/db.ts @@ -32,7 +32,9 @@ export interface Totals { function withDb(fallback: T, fn: (conn: Database.Database) => T): T { let conn: Database.Database | null = null; try { - conn = new Database(DB_PATH, { readonly: true, fileMustExist: true }); + // timeout: wartet kurz, falls der collector gerade schreibt (statt + // sofort mit SQLITE_BUSY zu scheitern). + conn = new Database(DB_PATH, { readonly: true, fileMustExist: true, timeout: 5000 }); const hasTable = conn .prepare("SELECT name FROM sqlite_master WHERE type='table' AND name='charges'") .get();