- Astro 60.3%
- JavaScript 21.1%
- TypeScript 10.4%
- CSS 6.3%
- PHP 1.9%
| .vscode | ||
| example | ||
| public | ||
| scripts | ||
| server | ||
| src | ||
| .gitignore | ||
| AGENTS.md | ||
| astro.config.mjs | ||
| CLAUDE.md | ||
| keystatic.config.ts | ||
| package-lock.json | ||
| package.json | ||
| README.md | ||
| tsconfig.json | ||
zorgalgoritmen.nl
Statische website van het Expertisecentrum Zorgalgoritmen, gebouwd met Astro en Keystatic. Vervangt de eerdere headless-WordPress-opzet.
Architectuur
Forgejo-repo (forgejo.ezamonitoring.nl)
▲
│ commits (Keystatic op /keystatic tijdens dev, of direct in Markdown)
▼
git push ──▶ op de Hetzner-server: git pull && npm run build
└─▶ Caddy serveert dist/ op www.ezamonitoring.nl
- Content staat als Markdown en JSON in de repo (versiebeheerd, geen database):
src/content/nieuws/— nieuwsartikelen (frontmatter:title,pubDate,excerpt,cover)src/content/paginas/— contentpagina's (wat-we-doen, over-ons, werken-bij, privacy, disclaimer, cookieverklaring)src/data/— sitegegevens, homepage- en contactpagina-instellingen
- Schema's:
src/content.config.ts(Astro, met Zod-validatie) enkeystatic.config.ts(admin UI) beschrijven dezelfde velden — houd ze samen in sync. - Styling: Tailwind CSS 4; het kleurenpalet en de fonts staan in
src/styles/global.css(@theme). - Formulier: het contactformulier wordt afgehandeld door
public/contact.php(PHPmail()via php-fpm + msmtp op de Hetzner-server). Ontvanger en afzender staan bovenin dat bestand. - Keystatic draait alleen tijdens
npm run dev(zieastro.config.mjs); de productie-build is statisch (plus het ene PHP-bestand voor het formulier).
Commando's
| Commando | Actie |
|---|---|
npm install |
Dependencies installeren |
npm run dev |
Dev-server op localhost:4321, CMS op /keystatic |
npm run build |
Productie-build naar ./dist/ |
npm run preview |
Build lokaal bekijken |
npm run deploy |
Bouwen én uploaden via SFTP (alternatief; de git-route hieronder is leidend) |
Content bewerken
npm run dev- Open
http://localhost:4321/keystatic - Bewerk nieuws, pagina's of sitegegevens — wijzigingen worden als bestanden opgeslagen
- Commit en push naar Forgejo; publiceer op de server met
git pull && npm run build
Direct Markdown bewerken in src/content/ kan uiteraard ook.
Later — redacteuren zonder lokale setup: schakel Keystatic om naar GitHub mode (
storage: { kind: 'github' }). Redacteuren bewerken dan via de browser; wijzigingen worden commits.
Hosting: Hetzner-server met Caddy
De site draait op een eigen Hetzner-server. Caddy serveert
/home/bverhoeff/projects/ezawebsite/dist.
Publiceren (de normale route): lokaal committen en pushen, daarna op de server
git pull && npm run build
Serverkant (eenmalig): zie server/Caddyfile.voorbeeld voor het Caddy-blok
(statische site + eigen 404 + caching + beveiligingsheaders) en
server/msmtprc.voorbeeld voor mailbezorging van het contactformulier.
De hardening van de server (firewall, SSH, fail2ban, automatische updates)
staat beschreven in server/hardening.md. Benodigde pakketten op de server:
- Caddy — serveert
dist/, automatische HTTPS - php-fpm — alleen voor
contact.php(het formulier) - msmtp-mta — laat PHP
mail()versturen via de Strato-SMTP-relay (poort 587/STARTTLS; Hetzner blokkeert 465)
Alternatief — SFTP-upload met npm run deploy: maak eenmalig een
.env-bestand in de projectroot (staat in .gitignore):
DEPLOY_HOST=<hetzner-server>
DEPLOY_USER=<ssh-gebruiker>
DEPLOY_KEY=C:\Users\<jij>\.ssh\id_ed25519
DEPLOY_DIR=/home/bverhoeff/projects/ezawebsite/dist
(DEPLOY_PASS=<wachtwoord> kan ook, maar een sleutel heeft de voorkeur.)
Nog te doen
- Uptime-monitoring: gratis monitor (bijv. UptimeRobot, of Uptime Kuma op een van de andere servers) die www.ezamonitoring.nl elke paar minuten checkt en mailt bij een storing — zodat een verstoring opvalt zonder er zelf naar te kijken.
- Noodplan bij DDoS: vooraf niets instellen (Hetzner filtert volumetrische
aanvallen al en de statische site is zelf robuust), maar bij een echte aanval
Cloudflare voor de site zetten (DNS-wijziging, ±1 uur werk). Zie ook
server/hardening.mdvoor de afweging en de overige openstaande punten (SPF/DKIM/DMARC, externe scan).
Versiebeheer (Forgejo)
De repo staat op https://forgejo.ezamonitoring.nl/bverhoeff/ezawebsite.git (branch main).
Migratie
scripts/migrate.mjs heeft de content eenmalig opgehaald uit de oude WordPress-API (cms.zorgalgoritmen.nl/wp-json). Het script kan opnieuw draaien (node scripts/migrate.mjs) zolang de oude site online is; daarna kan het verwijderd worden.