No results
Table of Contents
- Entscheidungen & Historie (langlebiges Wissen)
- 1) Build-Output als deploybares public/
- 2) Anmeldung: Nummernvergabe atomar erst beim POST
- 3) Mailversand: asynchrone Mail-Queue + Rate-Limit
- 4) CSRF-Fixes: Rotation/Checks korrekt im Admin
- 5) SQLite-Performance: Connection-Pooling + PRAGMAs + SQL/Config-Caches
- 6) Admin-UI: Tabs + Live-Status für Mail-Queue
This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
Entscheidungen & Historie (langlebiges Wissen)
Ziel dieser Seite: die wichtigen, dauerhaften Änderungen/Entscheidungen festhalten (Warum? Wo im Code?). Keine Tasklisten – nur Dinge, die man in 6 Monaten noch wissen will.
1) Build-Output als deploybares public/
- Entscheidung: Deployt wird ausschließlich der Build-Output
public/. - Warum: Saubere Trennung zwischen Quellstruktur (content/static/zgb-backend) und Laufzeitstruktur.
- Wo:
zgb_www/scripts/build.mjs(kopiert Content/Assets/PHP/Backend/Data). - Detail: Das Build-Script stellt außerdem sicher, dass
public/data/.htaccessexistiert, um direkten HTTP-Zugriff auf DB/Logs zu blocken.
2) Anmeldung: Nummernvergabe atomar erst beim POST
- Problem: Nummern “reservieren” beim Formular-Rendern ist race-anfällig (GET→POST Zeitfenster).
- Entscheidung: Nummer wird erst beim POST vergeben, und zwar atomar in einer SQLite-Schreib-Transaktion (
BEGIN IMMEDIATE). - Warum: Parallelitätssicherheit unter Last; verhindert doppelte Nummern ohne fragile Hidden-Field-Reservierung.
- Wo:
zgb_www/static/registration/index.php(Nummernvergabe + Duplicate-Check im TX-Kontext).
3) Mailversand: asynchrone Mail-Queue + Rate-Limit
- Problem: Provider-Limits (z.B. 60 Mails/Stunde) → synchroner Versand blockiert/fehlschlägt bei Last.
- Entscheidung: Registrierung enqueued Mails; Versand läuft asynchron über Cron-Worker mit Rate-Limit.
- Warum:
- Registrierung darf nicht am Mailversand scheitern
- kontrollierter Durchsatz, Retry/Backoff, weniger Lastspitzen
- Wo:
- Enqueue nach erfolgreichem Save:
zgb_www/static/registration/index.php - Worker:
zgb_www/zgb-backend/Service/MailQueueWorker.php - Cron entry (CLI-only):
zgb_www/zgb-backend/cron/send_mail_queue.php - Queue-DB:
zgb_www/zgb-backend/Repository/MailQueueRepository.php+ Schema.../Schema/MailQueue/initMailQueueSchema.sql
- Enqueue nach erfolgreichem Save:
- Konfig-Keys:
mailQueueEnabled,mailMaxPerHour,mailRedirectToSchumbi- intern:
mailTokens,mailLastRefill
- Retention: Erfolgreich gesendete Jobs werden gelöscht (“Option A”).
4) CSRF-Fixes: Rotation/Checks korrekt im Admin
- Entscheidung: CSRF-Token werden nur dann rotiert, wenn der Browser anschließend eine neue Seite/Redirect bekommt; Downloads rotieren nicht.
- Warum: Token-Rotation bei Downloads führt zu “stale token” ohne Reload.
- Wo:
- CSRF-Basis:
zgb_www/zgb-backend/Service/CSRFService.php - Export:
zgb_www/zgb-backend/web/export_registrations.php(keine Rotation beim CSV-Download) - Logout:
zgb_www/zgb-backend/web/admin_logout.php(CSRF-Check) - Analyse:
zgb_www/docs/CSRF-ANALYSIS.md
- CSRF-Basis:
5) SQLite-Performance: Connection-Pooling + PRAGMAs + SQL/Config-Caches
- Entscheidung: Eine wiederverwendbare PDO-Verbindung pro DB-Pfad + Performance-PRAGMAs; SQL-Dateien und Config werden gecacht.
- Warum: SQLite profitiert stark von weniger Connection-Overhead; PRAGMAs verbessern Durchsatz; Caches reduzieren I/O/Queries.
- Wo:
- PDO Pool + PRAGMAs + SQL-Cache:
zgb_www/zgb-backend/Repository/Repository.php - Config Cache (TTL):
zgb_www/zgb-backend/Repository/ConfigRepository.php
- PDO Pool + PRAGMAs + SQL-Cache:
6) Admin-UI: Tabs + Live-Status für Mail-Queue
- Entscheidung: Admin-Seite als Tab-UI (Konfig / Admin&Export / Mail-Queue) mit Live-Polling.
- Warum: Einfache Bedienung + schneller Überblick (pending/sending/failed).
- Wo:
- UI + Polling:
zgb_www/zgb-backend/web/admin.php - JSON Endpoint:
zgb_www/zgb-backend/web/admin_queue_status.php
- UI + Polling:
Einstieg
Architektur
- Architektur-Übersicht
- Frontend-Build
- Backend
- Datenbank
- Mail-Queue
- Performance & Optimierungen
- Entscheidungen & Historie
Betrieb
Projektarbeit
- Code:
ssh://forgejo@home.schumbi.de/ralf/zgb_www.git - Wiki:
ssh://forgejo@home.schumbi.de/ralf/zgb_www.wiki.git