Files
qr-tabellen/docs/decisions.md
2026-07-05 11:25:27 +02:00

2.5 KiB

Entscheidungs- und Änderungslog

2026-07-05 — Projektstart (MVP)

  • Stack: Python/Flask + segno statt Node (Briefing-Vorschlag). Begründung: Hetzner-Deploy-Muster ist Python + systemd; csv ist Stdlib, segno rendert QR als SVG ohne weitere Abhängigkeiten. Herbs Entscheidung nach Vorlage.
  • Scope-Kürzungen gegenüber Briefing: kein XLSX-Upload (CSV reicht, Excel/LO können das), Schema-Designer minimal (Name + Typ), keine Süßholz-Features.
  • Architektur-Trennung: öffentliche Seiten sind beim Upload fertig gerendertes, in sich geschlossenes HTML (QR inline als SVG) → Nginx statisch; der Flask-Prozess existiert nur fürs Admin-Panel (Dropzone, Schema-Designer, Linkliste, Versionen) hinter Nginx Basic Auth.
  • Herbs Erweiterung zum Briefing: Admin-Panel mit Dropzone, automatischer Versions-Zuordnung (Dateiname → Header-Signatur → manuelle Wahl), CSV-Versionen jederzeit downloadbar, Linkliste mit QR pro Tabelle. Das beantwortet die offene Briefing-Frage: Upload läuft auf dem Server, nicht als lokales CLI.
  • Validierung: fehlerhafte CSVs werden komplett abgelehnt (Zeile/Spalte in der Fehlermeldung), nichts wird halb veröffentlicht.
  • Encoding-Realität: Vorlagen mit Semikolon + UTF-8-BOM (deutsches Excel); Upload-Decoder probiert utf-8-sig, dann cp1252; Delimiter wird gesnifft.
  • Design: Tokens als CSS-Variablen in table.css; Systemfont-Fallbacks für Source Serif 4 / Fira Sans, bewusst kein Google-CDN (Schulkontext). Vertiefung später.
  • Global: Docker-Default aus den Infrastruktur-Regeln gestrichen — Docker nur noch als Vorschlag für Projekte mit eigenem Ökosystem.

2026-07-05 — Deployment auf Hetzner

  • Gitea-Repo öffentlich statt privat: entspricht dem Muster der anderen Web-Projekte (arduino/3d.lehrstun.de) und vermeidet, dass der Gitea-Token auf dem Server abgelegt werden muss. Das Repo enthält keine Secrets.
  • gunicorn (2 Worker, Port 8010) + systemd statt Flask-Dev-Server; QT_PUBLIC_DIR=/var/www/table, damit Nginx die öffentlichen Seiten ohne Zugriff auf /home/herb ausliefern kann.
  • Basic Auth in Nginx, nicht in der App: /etc/nginx/htpasswd-table (apr1-Hash), Klartext-Zugangsdaten nur lokal in ~/.config/claude-secrets/qr-tabellen.env.
  • Verifiziert: kompletter Workflow live (Tabelle anlegen → Vorlage → Upload → veröffentlichte Seite mit QR-SVGs); öffentliche Seiten bleiben bei gestopptem App-Prozess erreichbar (Nginx statisch).