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:
@@ -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.
|
||||
Reference in New Issue
Block a user