Baustein 1: Grundgeruest, Datenbank, Anmeldung, zwei Rollen

Legt das Fundament der Lern-Bar an:

- Next.js 15 (App Router), React 19, TypeScript, ESLint, Vitest
- SQLite ueber Drizzle hinter einer Repository-Schicht
- Eigener Migrationslauf mit Pruefsummen, beim Start angewendet
- Argon2id, serverseitige Sitzungen, HttpOnly-Cookie, SameSite=Lax
- Rollen Ausbilder und Azubi, Rechteregeln als reine Funktionen
- Verwaltung: Azubikonto und Ausbildung anlegen, Passwort, Sperren
- Gestaltung Petrol/Bernstein, helle und dunkle Darstellung
- Dockerfile, docker-compose, Lebenszeichen, update.sh mit Rueckfall
- Sicherung und Wiederherstellung als Shell-Skripte
- 29 Tests fuer Rechte, Zeitrechnung und Migrationslauf

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Florian Wilde
2026-09-10 00:52:44 +02:00
co-authored by Claude Opus 5
commit e856349cd4
51 changed files with 11883 additions and 0 deletions
+34
View File
@@ -0,0 +1,34 @@
# Lern-Bar – ein Dienst, ein Volume, mehr braucht es nicht.
# Vor einem TLS-beendenden Reverse Proxy betreiben (nginx, Caddy, Traefik).
services:
lernbar:
build:
context: .
dockerfile: Dockerfile
image: lernbar:lokal
container_name: lernbar
restart: unless-stopped
environment:
TZ: Europe/Berlin
PORT: "3000"
# Hinter einem Proxy, der TLS beendet, bleibt das hier http.
NODE_ENV: production
ports:
# Nur auf der Schleife lauschen – nach außen geht der Reverse Proxy.
- "127.0.0.1:3000:3000"
volumes:
- lernbar-daten:/daten
healthcheck:
test:
- CMD
- node
- -e
- "fetch('http://127.0.0.1:3000/api/gesundheit').then(r=>process.exit(r.ok?0:1)).catch(()=>process.exit(1))"
interval: 30s
timeout: 5s
retries: 3
start_period: 20s
volumes:
lernbar-daten: