Diese Adresse führte bis September 2026 eine Anwendung: Zeitnahme, Kader, Trails, Renntage. Die heißt jetzt Kurbeler, liegt unter kurbeler.de und führt den Stammtisch als eines von mehreren Teams. Was hier bleibt, ist die Adresse — und die soll niemanden ins Leere laufen lassen. Übrig sind drei vorgerenderte Seiten: Wappen, ein Satz, ein Knopf, dazu Impressum und Datenschutz. Kein Konto, keine Datenbank, kein Formular, keine Cookies, keine Schriften oder Karten von fremden Servern. Die Datenschutzerklärung ist deshalb kurz und nicht die von Kurbeler mit Streichungen — eine Erklärung, die von Konten und Benachrichtigungen spricht, wäre auf dieser Seite schlicht falsch. `adapter-static` statt `adapter-node`, ausgeliefert von nginx: Für drei Seiten ohne eine dynamische Angabe einen JavaScript-Prozess laufen zu lassen, der auf Anfragen wartet, um jedes Mal dieselbe Datei herauszugeben, wäre Beschäftigung ohne Arbeit. Von den Abhängigkeiten bleiben die zwölf, die zum Bauen nötig sind; zur Laufzeit keine einzige. Das Bild ist damit 492 kB statt elf Megabyte — zwei alte Grafiken von je 2,4 MB lagen ungenutzt in `static/`. Das Backend bleibt unangetastet. Es wird vom Wegweiser nicht benutzt, aber darin liegen die Daten des alten Deployments. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01LTw6xVYgjMy9AQtfs1Gdyu |
||
|---|---|---|
| .. | ||
| src | ||
| static | ||
| .dockerignore | ||
| .env.example | ||
| .npmrc | ||
| bun.lock | ||
| components.json | ||
| docker-compose.yaml | ||
| Dockerfile | ||
| nginx.conf | ||
| package.json | ||
| README.md | ||
| svelte.config.js | ||
| tsconfig.json | ||
| vite.config.ts | ||
stammtisch-hersbruck.de — Frontend
SvelteKit-5-Anwendung (Svelte 5 Runes, Tailwind 4) für Zeitnahme und Verwaltung.
Einrichten
.env aus der Vorlage anlegen und ausfüllen — .env.example beschreibt jede
Variable:
cp .env.example .env
npm ci
npm run dev
Die App läuft dann auf http://stammtisch-hersbruck.de.localhost:31337
Befehle
| Befehl | Zweck |
|---|---|
npm run dev |
Development-Server (Port 31337, strict) |
npm run build |
Produktions-Build |
npm run preview |
Produktions-Build lokal ansehen |
npm run check |
Typprüfung (svelte-check) |
npm run check:watch |
Typprüfung im Watch-Modus |
npm run generate-pocketbase-types |
src/lib/types.d.ts aus dem PocketBase-Schema erzeugen |
Welche PocketBase-Instanz?
PUBLIC_PB_URL in .env entscheidet, wohin das Frontend spricht:
| Wert | Instanz |
|---|---|
https://api.stammtisch-hersbruck.de |
produktiv (Default) |
http://127.0.0.1:8090 |
lokales Backend aus ../backend |
Die Variable wird von SvelteKit zur Buildzeit eingesetzt
($env/static/public). Ein Wechsel der Instanz erfordert deshalb einen
Neustart des Dev-Servers bzw. einen neuen Build — ein bloßer Neustart des
Containers genügt nicht.
Es ist die einzige Variable in .env; ein Token wird nicht mehr gebraucht.
Deployment
Gebaut wird mit adapter-node; der Startbefehl ist node build.
adapter-auto funktioniert hier nicht — es erkennt Coolify nicht, meldet
„Could not detect a supported production environment" und erzeugt gar kein
build/, woraufhin node build sofort scheitert.
Zwei Dinge müssen in der Deployment-Umgebung stimmen:
PUBLIC_PB_URL muss als Environment-Variable gesetzt sein. Sie wird zur
Buildzeit eingesetzt; fehlt sie, bricht schon der Build ab:
"PUBLIC_PB_URL" is not exported by "virtual:env/static/public"
Die .env aus dem Arbeitsverzeichnis steht auf dem Build-Server nicht zur
Verfügung — sie ist gitignored.
Node ≥ 22.12. Das engines-Feld in package.json schreibt die Anforderung
von vite und @sveltejs/vite-plugin-svelte fest. Zusammen mit
engine-strict=true aus der .npmrc bricht npm ci bei einer älteren
Version ab (EBADENGINE) — was bei Node 22.11 aus einem
NIXPACKS_NODE_VERSION=22 bereits passiert ist.
Typen
Das maßgebliche Schema liegt als Migration in ../backend/pb_migrations/.
Daraus entstehen auch die TypeScript-Typen:
npm run generate-pocketbase-types
Das Script liest das Collections-Array aus der Migration
(scripts/schema-to-json.mjs) und erzeugt daraus src/lib/types.d.ts. Es
braucht keine laufende Instanz, keinen Token und keinen Netzwerkzugriff —
Schema und Typen kommen aus derselben versionierten Quelle und können deshalb
nicht auseinanderlaufen.
Nach jeder Schema-Änderung in ../backend/pb_migrations/ einmal ausführen und
die aktualisierte types.d.ts mitcommitten.
Die System-Collections (
_superusers,_mfas, …) stehen bewusst nicht in der Migration und fehlen deshalb in den Typen. Die Anwendung verwendet sie nicht.