69 lines
3.0 KiB
Markdown
69 lines
3.0 KiB
Markdown
# 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
|
|
|
|
```bash
|
|
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()`, kein `UseHsts()`.** NPM terminiert TLS; beides
|
|
erzeugt hinter dem Proxy eine Redirect-Schleife. `UseForwardedHeaders` mit
|
|
geleerten `KnownNetworks`/`KnownProxies` ist korrekt so, weil der Container kein
|
|
Port-Mapping hat und nur über NPM erreichbar ist.
|
|
- **Das chiseled-Runtime-Image hat keine Shell.** `HEALTHCHECK` mit `curl` oder
|
|
`sh` schlägt dort fehl.
|
|
- Neue Seite = Markdown in `Content/pages/`. Neuer Termin = Eintrag in
|
|
`Content/termine.yml`. In beiden Fällen wird **kein** `.razor` angefasst.
|
|
- Slugs ohne Umlaute (`ueber-uns`, nicht `über-uns`).
|
|
|
|
## Regeln
|
|
|
|
- **Statisches SSR ist der Default.** Kein `@rendermode` ohne 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`, nicht `Events`.
|
|
- Neue NuGet-Abhängigkeiten vorher begründen. Bestand: `Markdig`, `YamlDotNet`.
|
|
|
|
## Stil
|
|
|
|
- Nullable aktiviert, `ImplicitUsings` an, File-scoped Namespaces.
|
|
- Services über DI, als Singleton registriert (Inhalte werden beim Start
|
|
eingelesen und gecacht).
|
|
- Öffentliche Typen und Methoden der `Services` bekommen XML-Doc (auf Englisch,
|
|
leicht verständlich), Razor-Markup nicht.
|
|
- **Code auf Englisch** — Typen, Member, Variablen, Kommentare, Skripte und Doku.
|
|
Ausnahme: UI-Texte und Redakteurs-Inhalte bleiben Deutsch (Markdown-Inhalte,
|
|
Frontmatter-Schlüssel wie `titel:`, sowie Slugs/Dateinamen unter `Content/`,
|
|
z. B. `vorstandsteam`).
|