Naar de inhoud
RolloutDocs
EN
Verdieping

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.

Eén eerlijke beperking

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 adresTwee adressen (aanbevolen)
Bestanddeploy/Caddyfiledeploy/Caddyfile.split
PubliekBoeklinks, portaal, toestemming en de publieke poortafspraak.jouwmsp.nl: alleen die pagina's, de rest geeft 404
BeheerZelfde adres, alleen vanaf ADMIN_ALLOWED_RANGESrollout.intern.jouwmsp.nl: alleen intern of via VPN
Twee adressen
  1. afspraak.jouwmsp.nl
    internet: alleen boeklinks en portaal
  2. Caddy
    HTTPS, al het andere 404
  3. Rollout
    container, alleen-lezen, geen root
  4. rollout.intern…
    alleen kantoor of VPN

Stap voor stap

  1. Database

    Supabase Cloud (EU) of zelf gehost. Migraties en de eerste beheerder:

    Terminal
    $ DATABASE_URL='postgresql://postgres:<wachtwoord>@<db-host>:5432/postgres' ./deploy/migrate.sh
    Klaar: 17 nieuwe migratie(s).
    $ psql "$DATABASE_URL" -c "update platform_settings set bootstrap_admin_email = 'jij@jouwmsp.nl';"
    UPDATE 1
  2. Configuratie en geheimen
    Terminal
    $ 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/.env in (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.

  3. 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/16
    

    Voeg in Entra bij Rollout – Readiness https://afspraak.jouwmsp.nl/toestemming toe als omleidings-URI.

  4. Bouwen en starten
    Terminal
    $ docker compose -f deploy/compose.yaml --env-file deploy/.env up -d --build
    $ docker compose -f deploy/compose.yaml ps
    rollout 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.

Beperk het beheer

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

NaarWaarom
login.microsoftonline.com:443Tokens voor klanttenants
graph.microsoft.com:443Gereedheid, imports, e-mail
Je Supabase-adres :443Sessies 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.
Zelf hosten (Docker) · Rollout Docs