diff --git a/CLAUDE.md b/CLAUDE.md index 2671748..e1ade5a 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -1,7 +1,7 @@ # QR-Tabellen (table.lehrstun.de) ## Status -**Phase:** MVP fertig — lokal verifiziert, Deployment auf Hetzner in Arbeit +**Phase:** MVP live auf https://table.lehrstun.de (Admin: /admin/, Basic Auth) **Stand:** 2026-07-05 ## Zweck @@ -41,10 +41,13 @@ tests/test_engine.py — Selbsttest ohne pytest 4. Validierung (URLs, Bewertung 1-5, Zahlen); bei Fehlern wird nichts gespeichert 5. Version abgelegt + in sich geschlossene HTML-Seite nach `public//` gerendert -### Produktion (Ziel) -- Öffentliche Seiten: Nginx liefert `public/` statisch aus (App-Ausfall egal) -- Admin-Panel: Flask via gunicorn + systemd, hinter Nginx Basic Auth unter `/admin` -- Env: `QT_BASE_URL=https://table.lehrstun.de`, `QT_DATA_DIR`, `QT_PUBLIC_DIR` +### Produktion (live seit 2026-07-05) +- Server: Hetzner, `~/qr-tabellen` (Klon von Gitea `admin/qr-tabellen`, öffentliches Repo) +- Öffentliche Seiten: Nginx statisch aus `/var/www/table` (verifiziert: bleiben bei App-Stopp online) +- Admin: gunicorn (Port 8010) via systemd `qr-tabellen.service`, Nginx Basic Auth unter `/admin` +- Zugangsdaten: lokal in `~/.config/claude-secrets/qr-tabellen.env`; Hash in `/etc/nginx/htpasswd-table` +- TLS: certbot (Let's Encrypt), DNS via hetznerdns.py angelegt +- Deploy-Update: `ssh herb@46.225.114.15`, `cd ~/qr-tabellen && git pull && sudo systemctl restart qr-tabellen` ## Design Tokens in `table.css` (`:root`-Variablen: Farben, Fonts, QR-Größe, Breite). @@ -67,6 +70,7 @@ lokal hosten (kein Google-CDN, Schulkontext). Print-Media-Query vorhanden. - Keine ## Nächste Schritte -- [ ] Deployment: DNS `table.lehrstun.de`, Gitea-Repo, gunicorn + systemd, Nginx (statisch + /admin Basic Auth), TLS +- [x] Deployment: DNS `table.lehrstun.de`, Gitea-Repo, gunicorn + systemd, Nginx (statisch + /admin Basic Auth), TLS +- [ ] Demo-Tabelle (`demo-stationenlernen`) nach dem Ausprobieren im Admin löschen - [ ] Design-Feintuning (Tokens in table.css), ggf. Fonts lokal hosten - [ ] Später: XLSX-Direkt-Upload, QR-Label-Styling, XLSX-Re-Export mit QR-Bildern diff --git a/docs/decisions.md b/docs/decisions.md index 09b5faa..4986ef6 100644 --- a/docs/decisions.md +++ b/docs/decisions.md @@ -24,3 +24,17 @@ 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).