3.6 KiB
3.6 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: docs/architektur.md. Dort
nachlesen, bevor eine davon in Frage gestellt wird.
Wann welches Dokument
| Thema | Datei |
|---|---|
| Warum SSR statt WASM, warum keine DB (AE-1 bis AE-4) | docs/architektur.md |
| Unraid, compose, NPM-Proxy-Host, Registry, Rollback | docs/deployment.md |
| Inhalte anlegen und ändern | docs/inhalte-pflegen.md |
| Impressum, Datenschutz, Fotos | docs/recht.md |
| Offene Arbeit, Meilensteine, offene Punkte | Gitea-Issues (Milestone „Elternbeirat-Website") |
Offene Aufgaben liegen als Gitea-Issues, nicht als Markdown im Repo. So löst das Anlegen oder Ändern eines Tickets keinen Build aus. Die vier Arbeitsstränge (Redaktionssystem, Deployment, Inhalte, Infrastruktur) sind Parent-Issues mit Sub-Issues als Checkliste im Body, alle am Milestone „Elternbeirat-Website".
Kommandos
dotnet run --project Elternbeirat.Web # lokal; Inhalte werden beim Start gelesen (kein Auto-Reload)
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 (
docs/architektur.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/pages/. Neuer Beitrag = Markdown inContent/posts/. Neuer Termin = Eintrag inContent/events.yml. In allen 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 (auf Englisch, leicht verständlich), Razor-Markup nicht. - Code durchgängig auf Englisch — Typen, Member, Variablen, Kommentare,
Skripte und Doku. Das gilt auch für Domänenbegriffe: im Code
Event, nichtTermin;Post, nichtBeitrag. Deutsch bleibt ausschließlich, was ein Besucher liest oder ein Redakteur pflegt: UI-Texte, Markdown-Inhalte, Frontmatter-Schlüssel wietitel:sowie Slugs/Dateinamen unterContent/(z. B.vorstandsteam,/termine).