Ga naar inhoud

Rondleiding door de repo

De repo is een monorepo: drie apps en vier gedeelde packages in één Git-repository, beheerd met pnpm workspaces en Turborepo.

  • Directoryapps/
    • Directorysite-template/ Astro SSR, publieke klantsite plus CMS, per klant gedeployed
    • Directorymaster-dashboard/ Nuxt, centraal beheer voor de platformbeheerder
    • Directorydocs/ Astro Starlight, deze documentatie
  • Directorypackages/
    • Directorycontract/ types en Zod-schema’s, de enige bron voor alles wat beide apps raakt
    • Directorydb/ Drizzle-schema’s, migraties en connectie, voor tenant en master
    • Directoryblocks/ blokkenbibliotheek, schema plus renderer per blok
    • Directoryops/ beheerscripts, bootstrap, users, backup, restore, verify
  • Directorytenants/ bootstrap-JSON per klant met eerste pagina’s, navigatie en theme
  • Directoryscripts/ shell-scripts voor de VPS en Postgres, provisioning, backups, verificatie
  • AGENTS.md instructies voor AI-agents die in de repo werken
  • README.md korte start
  • docker-compose.yml lokale Postgres 18 en MinIO
  • pnpm-workspace.yaml welke mappen packages zijn
  • turbo.json de taken build, dev, typecheck en clean
  • tsconfig.base.json gedeelde TypeScript-instellingen en de platform-paden

De klantsite: één Astro-app die zowel de publieke site als het CMS is. De belangrijkste mappen onder src/:

  • pages/ bevat de routes: publieke pagina’s in de root, het CMS onder admin/, API-routes onder api/.
  • actions/ bevat de server-acties van het CMS (cms-pages.ts, cms-media.ts en zo verder): validatie, opslaan, auditlog, cache-purge, webhook.
  • lib/ bevat alles wat pagina’s en acties delen: auth, hosts, cache, media, mail, CSRF, en onder lib/platform/ de koppeling met het dashboard.
  • components/ en layouts/ bevatten de Astro-componenten, met components/cms/ voor het CMS.
  • middleware.ts beslist per verzoek: publieke host of CMS-host, sessie nodig of niet.
  • styles/global.css koppelt Tailwind-utilities aan de theme-variabelen.

Lees De klantsite van binnen voor de samenhang.

Het dashboard: een Nuxt 4-app met de UI in app/ (pagina’s, layout, composables) en de server in server/ (api/ voor routes, utils/ voor de logica: provisioning, Coolify, Cloudflare, secrets, webhooks). Configuratie via runtimeConfig in nuxt.config.ts. Lees Het master dashboard van binnen.

Deze site. Content in src/content/docs/, één map per sectie. Lees Documentatie uitbreiden.

De afhankelijkheden lopen één richting:

site-template ──┐ ┌── master-dashboard
├─► blocks ───┤
├─► db ───────┼─► contract
└─► ops ──────┘
  • @platform/contract staat onderaan en hangt van niets anders af (alleen Zod). Alles wat beide apps raakt, staat hier: theme, blokken, content, platform-types, webhook-events, bootstrap-config.
  • @platform/db exporteert het tenant-schema als @platform/db en het master-schema als @platform/db/master, elk met eigen migraties (drizzle/ en drizzle-master/). Verder alleen de connectie getDb(databaseUrl); geen applicatielogica.
  • @platform/blocks kent per bloktype het schema (uit contract), een label en beschrijving voor het CMS, en de Astro-renderer. BlockRenderer.astro kiest op type de juiste component.
  • @platform/ops bevat pure functies (bootstrapTenant, createCmsUser, backupTenant, restoreTenant, verifyTenant, provisionTenantDatabase) met dunne CLI-wrappers. Het dashboard roept dezelfde functies aan.

De packages exporteren TypeScript-bron, geen gebouwde dist/. Daarom staan ze in astro.config.mjs onder vite.ssr.noExternal en in nuxt.config.ts onder build.transpile.

  • pnpm workspaces koppelt de packages via workspace:*. Installeer altijd vanuit de root met pnpm install.
  • Turborepo draait taken over alle packages: pnpm build, pnpm typecheck, pnpm dev, pnpm clean. Een package zonder het betreffende script wordt overgeslagen. In turbo.json staat welke omgevingsvariabelen een build mag zien (env en passThroughEnv).
  • TypeScript in strict mode. De root en de packages gebruiken TypeScript 7; site-template en docs (voor astro check) en master-dashboard (voor vue-tsc) pinnen 6.0.3.
  • Versies zijn exact gepind in de apps. Verifieer een versie altijd met npm view <pakket> dist-tags voordat je configuratie schrijft; zie Werkwijze en regels.
  1. Architectuur voor de keuzes en de harde regels.
  2. packages/contract/src/ om de vormen van de gegevens te zien; dat is de snelste manier om het domein te leren.
  3. apps/site-template/src/middleware.ts, daarna één publieke pagina en één CMS-actie.
  4. Datamodel naast packages/db/src/schema.ts.