U7 — tells a website builder what they need to know

WEBSITE_WORKSPACE.md, plus the parts of the README that were still
describing the old layout or a manual step the code doesn't need
anymore (the key-ring paragraph, mainly - that one was actively
wrong now, not just stale).
This commit is contained in:
2026-07-28 16:30:19 +02:00
parent 9f4ae475e7
commit 88770c5bd0
6 changed files with 258 additions and 6 deletions
+80
View File
@@ -0,0 +1,80 @@
# Website Workspace Contract
Dit document is voor wie de publieke website bouwt die naast de SlpModularCms-admin draait. Je hoeft
de rest van deze repository niet te lezen om een werkende site te kunnen opleveren — dit contract is
compleet genoeg om zelfstandig te volgen.
## Doelpad
De website hoort in **`wwwroot/web/`**, in de root van de gepubliceerde applicatie. Dit pad **moet**
minimaal een `index.html` bevatten. Alles onder `wwwroot/web/` is van jou — de applicatie zelf raakt
deze map nooit aan buiten het plaatsen van de bestanden die je aanlevert, en een CMS-deploy verwijdert
of overschrijft de inhoud nooit (zie "Waarom dit veilig is" hieronder).
```
wwwroot/
web/ ← jouw site komt hier (dit contract)
index.html ← verplicht
assets/...
...
admin/ ← VERBODEN — dit is de CMS admin-UI, hoort niet bij deze repo
```
## Verboden en gereserveerde paden
**Verboden** — plaats hier nooit bestanden:
- `wwwroot/admin/` — dit is de CMS admin-single-page-app, wordt door deze repository zelf beheerd
en bij elke build overschreven
- De applicatie-root zelf (waar de `.dll`-bestanden van de API staan)
**Gereserveerd** — deze paden bestaan al en je site mag er niet mee botsen:
- `/admin` — de CMS admin-UI
- `/api/v1` — de backend-API
- `/health` — infrastructuur-liveness-check (zie hieronder — dit is geen CMS-functionaliteit)
Als jouw site een eigen route of bestand op een van deze paden zou plaatsen, wint de gereserveerde
route altijd.
## Routing (SPA-fallback)
Voor paden die **geen bestandsextensie** hebben (bijv. `/over-ons`, `/producten/123`) valt de
applicatie terug op **`wwwroot/web/index.html`** — zo werkt client-side routing (React Router, Vue
Router, of vergelijkbaar) zoals verwacht. Voor paden die er wél uitzien als een bestand (bijv.
`/assets/logo.png`) geldt geen fallback: ontbreekt het bestand, dan krijg je gewoon een `404`, niet
per ongeluk de `index.html`.
Dit betekent: bouw je een Single Page Application, dan hoeft je routing-configuratie niets speciaals
te doen voor deze server — de fallback wordt door de applicatie zelf verzorgd.
## De API aanroepen
Roep `/api/v1/...` aan met **relatieve URL's** (bijv. `fetch('/api/v1/System/capabilities')`). Omdat
je site en de API door hetzelfde proces op dezelfde origin worden geserveerd, is dit een **same-origin
request** — er is geen CORS-configuratie nodig, en er hoeft niets ingesteld te worden om dit te laten
werken.
## Content-Security-Policy
Jouw site valt onder het **`Relaxed`**-beleid (de standaardpolicy voor alle paden die niet expliciet
`Strict` zijn — `/admin`, `/api/v1` en `/health` krijgen `Strict`, `/` (jouw site) niet). Dit beleid is
bewust minder streng, zodat je niet gebonden bent aan restricties die voor de CMS-admin gelden maar
die je als website-bouwer nooit zou hoeven kennen. De exacte permissieve/strikte policy-definities
staan in code (`SlpModularCms.Core`), niet in configuratie — je hoeft ze niet zelf te lezen om te
weten dat je site onder het permissieve beleid valt.
## Umami-analytics insluiten
Als de instantie analytics gebruikt, wordt het Umami-trackingscript geladen via een build-time
omgevingsvariabele op de **admin**-kant (`VITE_UMAMI_SCRIPT_URL` / `VITE_UMAMI_WEBSITE_ID`) — dat
script wordt dus niet door jouw site zelf ingesloten. Wil je dat jouw website ook gemeten wordt via
dezelfde Umami-instantie, vraag dan de scriptregel en het bijbehorende website-ID op bij wie de CMS
beheert, en neem die regel zelf op in je `index.html` (Umami's standaard `<script>`-snippet). Dit
contract schrijft niets voor over jouw eigen analytics-keuze — dit is puur de informatie die je nodig
hebt als je bij dezelfde Umami-instantie wilt aansluiten.
## Waarom dit veilig is
Een deploy van de CMS zelf gebeurt via een atomische release-switch: een nieuwe release komt in een
verse map te staan en pas daarna wisselt de actieve release in één keer over. `wwwroot/web/` staat
**buiten** die verwisselde map en wordt er telkens in gelinkt — een CMS-deploy kan je site dus
structureel niet raken, ongeacht hoe vaak de CMS zelf wordt bijgewerkt.