Architecture decisions with rationale (plan.md) and repo-specific build/run commands plus style rules (CLAUDE.md). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2.8 KiB
2.8 KiB
CLAUDE.md
Website des Elternbeirats der IGMH. Blazor Web App mit statischem Server-Side-Rendering, .NET 10. Läuft als Container auf Unraid hinter dem Nginx Proxy Manager.
Architekturentscheidungen und deren Begründung: plan.md. Dort nachlesen, bevor
eine davon in Frage gestellt wird.
Wann welches Dokument
| Thema | Datei |
|---|---|
| Warum SSR statt WASM, warum keine DB, offene Punkte, Meilensteine | plan.md |
| Unraid, compose, NPM-Proxy-Host, Registry, Rollback | docs/deployment.md |
| Strato, DynDNS, Mail-Records | docs/dns.md |
| Inhalte anlegen und ändern | docs/inhalte-pflegen.md |
| Impressum, Datenschutz, Fotos | docs/recht.md |
Kommandos
dotnet run --project Elternbeirat.Web # lokal, Content-Reload per FileSystemWatcher
dotnet test # Smoke-Tests: jede Route liefert 200
docker compose build && docker compose up -d
Es gibt keine Datenbank, keine Migrationen, kein Seeding. Ein git clone ist der
vollständige Stand.
Nicht offensichtlich
- Inhalte liegen im Image, nicht in einem Volume. Jede Textänderung braucht
Commit und Rebuild. Das ist Absicht (
plan.md, AE-3) — nicht „vereinfachen". - Kein
UseHttpsRedirection(), keinUseHsts(). NPM terminiert TLS; beides erzeugt hinter dem Proxy eine Redirect-Schleife.UseForwardedHeadersmit geleertenKnownNetworks/KnownProxiesist korrekt so, weil der Container kein Port-Mapping hat und nur über NPM erreichbar ist. - Das chiseled-Runtime-Image hat keine Shell.
HEALTHCHECKmitcurlodershschlägt dort fehl. - Neue Seite = Markdown in
Content/seiten/. Neuer Termin = Eintrag inContent/termine.yml. In beiden Fällen wird kein.razorangefasst. - Slugs ohne Umlaute (
ueber-uns, nichtüber-uns).
Regeln
- Statisches SSR ist der Default. Kein
@rendermodeohne konkreten Anlass, und wenn, dann an genau der einen Komponente — nie global. - Keine externen Ressourcen. Keine CDN-Skripte, keine Google Fonts, keine
Maps- oder Video-Embeds. Schriften werden selbst ausgeliefert. Grund ist
Datenschutz, nicht Geschmack (
docs/recht.md). - Keine Datenbank, kein EF Core, kein ORM. Inhalte sind Dateien.
- Inhalte gehören nach
Content/, nicht als Markup in Komponenten. - Kein CMS, kein Login, keine Benutzerkonten.
- UI-Texte auf Deutsch, ohne Anglizismen.
Termine, nichtEvents. - Neue NuGet-Abhängigkeiten vorher begründen. Bestand:
Markdig,YamlDotNet.
Stil
- Nullable aktiviert,
ImplicitUsingsan, File-scoped Namespaces. - Services über DI, als Singleton registriert (Inhalte werden beim Start eingelesen und gecacht).
- Öffentliche Typen und Methoden der
Servicesbekommen XML-Doc, Razor-Markup nicht. - Fachbegriffe im Code auf Deutsch, wenn sie Domänenbegriffe sind
(
Termin,Protokoll,Beitrag) — Framework-Begriffe bleiben englisch.