Zelf hosten (Docker)
Liever in je eigen omgeving? Rollout draait als Docker-container achter Caddy, met dezelfde code als de gehoste versie. Het beheer kan helemaal intern blijven; alleen de boeklinks en het klantportaal hoeven van buitenaf bereikbaar te zijn.
Rollout controleert Microsoft 365, en dat staat in de cloud van Microsoft. De server moet dus altijd login.microsoftonline.com en graph.microsoft.com kunnen bereiken. Wat wel kan: geen inkomend verkeer naar het beheer, al het uitgaande verkeer via je proxy, en een licentiecontrole zonder internet.
Een of twee adressen
| Eén adres | Twee adressen (aanbevolen) | |
|---|---|---|
| Bestand | deploy/Caddyfile | deploy/Caddyfile.split |
| Publiek | Boeklinks, portaal, toestemming en de publieke poort | afspraak.jouwmsp.nl: alleen die pagina's, de rest geeft 404 |
| Beheer | Zelfde adres, alleen vanaf ADMIN_ALLOWED_RANGES | rollout.intern.jouwmsp.nl: alleen intern of via VPN |
- afspraak.jouwmsp.nlinternet: alleen boeklinks en portaal
- CaddyHTTPS, al het andere 404
- Rolloutcontainer, alleen-lezen, geen root
- rollout.intern…alleen kantoor of VPN
Stap voor stap
- Database
Supabase Cloud (EU) of zelf gehost. Migraties en de eerste beheerder:
Terminal$ DATABASE_URL='postgresql://postgres:<wachtwoord>@<db-host>:5432/postgres' ./deploy/migrate.shKlaar: 17 nieuwe migratie(s).$ psql "$DATABASE_URL" -c "update platform_settings set bootstrap_admin_email = 'jij@jouwmsp.nl';"UPDATE 1 - Configuratie en geheimenTerminal$ cp deploy/.env.example deploy/.env$ install -m 600 rollout-graph.key deploy/secrets/graph-cert-key.pem$ openssl rand -hex 32 > deploy/secrets/updater-secret$ node scripts/gateway-secret.mjs
Vul
deploy/.envin (ROLLOUT_DOMAIN,APP_URL, Supabase, Graph,ROLLOUT_GATEWAY_SECRET). Het Graph-certificaat is een Docker-secret: het staat nooit in een omgevingsvariabele, een image of een log. - Twee adressen (optioneel).env
CADDYFILE=Caddyfile.split PUBLIC_DOMAIN=afspraak.jouwmsp.nl PUBLIC_URL=https://afspraak.jouwmsp.nl ROLLOUT_DOMAIN=rollout.intern.jouwmsp.nl ADMIN_TLS=internal ADMIN_ALLOWED_RANGES=10.0.0.0/8 192.168.0.0/16Voeg in Entra bij Rollout – Readiness
https://afspraak.jouwmsp.nl/toestemmingtoe als omleidings-URI. - Bouwen en startenTerminal$ docker compose -f deploy/compose.yaml --env-file deploy/.env up -d --build$ docker compose -f deploy/compose.yaml psrollout running (healthy)caddy running$ curl -fsS https://rollout.intern.jouwmsp.nl/api/ready{"ready":true,"checks":{"database":"ok","graph":"ok","gateway":"not-enforced","license":"valid"}}
Zet daarna de hash van de server-poort in de database.
Standaard staat ADMIN_ALLOWED_RANGES op de hele wereld (0.0.0.0/0). Zet hier de IP-reeksen van je kantoor en VPN neer, of gebruik twee adressen.
Uitgaand verkeer
| Naar | Waarom |
|---|---|
login.microsoftonline.com:443 | Tokens voor klanttenants |
graph.microsoft.com:443 | Gereedheid, imports, e-mail |
Je Supabase-adres :443 | Sessies controleren, gedeelde limieten |
onboarding-planning.vercel.app:443 (optioneel) | Ondertekende lijst met nieuwe versies; uit te zetten met ROLLOUT_UPDATE_CHECK=off |
Verder niets: geen telemetrie, geen licentieserver. Achter een proxy: HTTPS_PROXY, NO_PROXY en, bij TLS-inspectie, NODE_EXTRA_CA_CERTS met je eigen root-CA. Zet certificaatcontrole nooit uit.
Zo is de container gehard
- Alleen-lezen bestandssysteem, geen Linux-rechten (
cap_drop: ALL), geen rechtenverhoging, draait niet als root. - Geen poorten naar buiten: alleen Caddy praat met de app.
- Basisimage vastgepind op een vaste versie (digest), zodat dezelfde bouw hetzelfde resultaat geeft.
- De optionele updater-container installeert alleen versies uit de door ons ondertekende lijst, en draait zelf terug als een nieuwe versie niet gezond opstart.