Journal-indexDockup / praktijknotitie
Note / self-host-metabase

Metabase zelf hosten in 2026: applicatiedatabase, TLS en back-ups

Een praktische handleiding voor het zelf hosten van Metabase, met aandacht voor Docker, poorten, persistente data, TLS, beveiliging, back-ups en fouten die productiegebruik verhinderen. Inclusief controles.

Als je Metabase al eens zelf hebt gehost, herken je deze frustrerende situatie waarschijnlijk: de UI verschijnt, maar de applicatiedatabase ontbreekt, terwijl de brondatabases voor dashboards nog wel aanwezig zijn. De container opnieuw aanmaken lost een verschil tussen URL's, state en dependencies zelden op.

Deze walkthrough gebruikt één concreet criterium voor voltooiing: verbinding maken met een read-only voorbeelddatabase, een vraag opslaan, een dashboard bouwen en een subscription versturen via het geconfigureerde mailkanaal. Elke configuratiekeuze wordt aan dat criterium getoetst, niet aan een groen containerbadge.

Credentials, rollen en blootgestelde oppervlakken

Maak een threat model van de acties die Metabase uitvoert, niet alleen van het loginformulier. De grootste fout hier is het gebruik van de ingebouwde H2-applicatiedatabase als enige productie-exemplaar. Implementeer deze grens: geef Metabase waar mogelijk read-only-database­rollen en houd collection-permissions gescheiden van databasecredentials.

Genereer MB_ENCRYPTION_SECRET_KEY één keer, houd deze uit Git en bewaar hem bij het recovery-manifest, omdat wijzigingen de versleutelde of ondertekende applicatiestate ongeldig kunnen maken. Los een permission error niet op door de container als root uit te voeren of de host breed te mounten. Resource limits maken ook deel uit van het securityontwerp wanneer JVM-heap, gelijktijdige queries, result caching en de belasting op elke analytics-databron door gebruikers kunnen worden geactiveerd.

Houd Metabase gescheiden van zijn dependencies

De kleinste verantwoorde Metabase-topologie bevat één private listener op 3000, een ingress-route en een gedocumenteerde state-grens. Het netwerkcontract voor Metabase is een dedicated Postgres-applicatiedatabase, gescheiden van analytics-bronnen. Houd private endpoints op interne DNS, sta alleen vereiste uitgaande verbindingen toe en geef Metabase een servicecredential met beperkte scope.

Valideer de topologie door een schone client verbinding te laten maken met een read-only voorbeelddatabase, een vraag te laten opslaan, een dashboard te laten bouwen en een subscription te laten versturen via het geconfigureerde mailkanaal. Houd tijdens deze test JVM-heap, gelijktijdige queries, result caching en de belasting op elke analytics-databron in de gaten. Het resultaat laat zien of de volgende verbetering thuishoort in memory, storage, networking of een aparte worker, in plaats van willekeurige containergrootte aan te moedigen.

Een Docker-basis voor Metabase

Met de volgende opdracht wordt de containergrens zichtbaar, zonder te doen alsof elke externe service wordt geprovisioned.

docker run -d \
  --name metabase \
  --restart unless-stopped \
  -p 127.0.0.1:3000:3000 \
  -v metabase-data:/metabase-data \
  -e MB_ENCRYPTION_SECRET_KEY=replace-with-a-long-random-value \
  -e MB_DB_TYPE=h2 \
  -e MB_DB_FILE=/metabase-data/metabase.db \
  metabase/metabase:latest

Inspecteer voordat je ingress opent de opgeloste environment, mounts en listener. Voeg de gecontroleerde connection settings toe voor een dedicated Postgres-applicatiedatabase, gescheiden van analytics-bronnen; gebruik private namen voor private services. Een succesvolle launch is pas voltooid wanneer je verbinding kunt maken met een read-only voorbeelddatabase, een vraag kunt opslaan, een dashboard kunt bouwen en een subscription kunt versturen via het geconfigureerde mailkanaal — niet wanneer docker ps Up afdrukt.

Bewijs de Metabase-deployment end-to-end

Een production gate voor Metabase moet uitvoerbaar zijn door iemand die de deployment niet heeft gebouwd. Geef die persoon de vastgezette versie, een niet-gevoelig testaccount en deze taak: verbinding maken met een read-only voorbeelddatabase, een vraag opslaan, een dashboard bouwen en een subscription versturen via het geconfigureerde mailkanaal. Als de instructies ongedocumenteerde shell-toegang vereisen, is de service operationeel nog niet klaar.

Herhaal de gate nadat je alleen de container hebt vervangen. Herstel vervolgens de Metabase-applicatiedatabase — niet alleen de opgevraagde databronnen — in een lege infrastructuur en bewijs dat gebruikers, collecties, vragen, dashboardfilters en subscriptions terugkomen en worden uitgevoerd tegen de herstelde connection metadata. Meet JVM-heap, gelijktijdige queries, result caching en de belasting op elke analytics-databron tijdens beide succesvolle runs; onverwachte verschillen wijzen vaak op een ontbrekende cache, index, worker of datamount.

Voeg een failure drill toe: blokkeer tijdelijk de toegang van de testidentiteit tot een dedicated Postgres-applicatiedatabase, gescheiden van analytics-bronnen. Metabase moet een bruikbare foutmelding geven, de bestaande state behouden en herstellen zodra de geldige situatie terugkeert. Sla de tijdstippen en relevante logregels op, met secrets verwijderd. Dat bewijs wordt de referentie voor de volgende image- of configuratiewijziging.

Houd interne en externe URL's correct

De browser, API-client en Metabase moeten het eens zijn over één origin. Stel MB_SITE_URL in op de publieke HTTPS-origin om dat te bereiken. Behoud de oorspronkelijke host en het protocol en houd poort 3000 onbeschikbaar als concurrerend publiek adres.

De handleiding voor problemen met een onbereikbare site helpt onderscheid maken tussen een onbereikbare route en een applicatie die wel antwoord geeft. Dat onderscheid is hier belangrijk: de applicatiedatabase ontbreekt, terwijl de brondatabases voor dashboards nog aanwezig zijn. Alleen het eerste probleem wordt door wijzigingen aan ingress opgelost; voor het tweede zijn inspecties van Metabase-logs, state of workload nodig.

Richt het beheer van Metabase op de echte bottleneck

Monitor bij Metabase een transactie in plaats van een proces: verbinding maken met een read-only voorbeelddatabase, een vraag opslaan, een dashboard bouwen en een subscription versturen via het geconfigureerde mailkanaal. Combineer de latency en error rate hiervan met JVM-heap, gelijktijdige queries, result caching en de belasting op elke analytics-databron, zodat een alert het beperkte onderdeel identificeert.

De upgrade-rehearsal moet rekening houden met het feit dat de Metabase-applicatiedatabase en pluginversies samen moeten migreren; opgevraagde bedrijfsdatabases zijn geen vervanging voor die state. Herstel, migreer en voer de transactie uit vóór de vervanging in productie. Als de applicatiedatabase ontbreekt terwijl de brondatabases voor dashboards nog aanwezig zijn, wis dan geen data om de startup groen te maken; vergelijk achtereenvolgens de versie, variabelen, mounts en bereikbaarheid van dependencies.

Volumes zijn slechts de eerste recoverylaag

Bescherm de state van Metabase voordat je de container optimaliseert. De vereiste set is de Metabase-applicatiedatabase, niet alleen de opgevraagde databronnen. Mount /metabase-data vóór de bootstrap, schrijf onschadelijke voorbeelddata en vervang de container om te bewijzen dat dit pad daadwerkelijk persistent is. Als meerdere stores consistent moeten blijven, documenteer dan de volgorde waarin writes worden gepauzeerd en back-ups worden gemaakt.

Bewaar kopieën buiten de deploymentserver en versleutel materiaal dat credentials of private content bevat. Recovery is geslaagd wanneer gebruikers, collecties, vragen, dashboardfilters en subscriptions terugkomen en worden uitgevoerd tegen de herstelde connection metadata. Het verschil tussen een persistente mount en een onafhankelijke kopie wordt behandeld in persistente storage en snapshots.

Metabase op Dockup deployen zonder de grenzen te verliezen

Een Dockup-template moet de image, poort 3000, mounts, health-timing, het domein, TLS en secret delivery vastleggen. Dockup moet private onderdelen van een dedicated Postgres-applicatiedatabase gescheiden houden van analytics-bronnen op interne networking en geen extra publieke poort beschikbaar stellen. Dezelfde deployment kan gericht zijn op Dockup-servers of capaciteit die door klanten is gekoppeld.

Nadat de route actief is, pas je de publieke instelling toe en probeer je verbinding te maken met een read-only voorbeelddatabase, een vraag op te slaan, een dashboard te bouwen en een subscription te versturen via het geconfigureerde mailkanaal. Maak een back-up van de Metabase-applicatiedatabase — niet alleen van de opgevraagde databronnen — en houd de restore-oefening in het operationele plan; dit zijn Metabase-verantwoordelijkheden die zichtbaar blijven nadat de infrastructuur is geprovisioned.

Veelgestelde vragen

Wat heeft Metabase nodig voor een production deployment?

Route de Metabase-container op poort 3000 via één HTTPS-origin. De vereiste ondersteunende netwerkcomponent is een dedicated Postgres-applicatiedatabase, gescheiden van analytics-bronnen. Verklaar Metabase pas gereed wanneer je verbinding kunt maken met een read-only voorbeelddatabase, een vraag kunt opslaan, een dashboard kunt bouwen en een subscription kunt versturen via het geconfigureerde mailkanaal.

Welke Metabase-data hoort in een back-up?

Maak /metabase-data persistent en neem de Metabase-applicatiedatabase op in hetzelfde recovery-manifest, niet alleen de opgevraagde databronnen. Een schone Metabase-restore is pas geslaagd wanneer gebruikers, collecties, vragen, dashboardfilters en subscriptions terugkomen en worden uitgevoerd tegen de herstelde connection metadata.

Heeft Metabase HTTPS nodig achter een reverse proxy?

Gebruik HTTPS voor de publieke Metabase-origin en houd poort 3000 op de interne route. Pas de Metabase-instelling correct toe: stel MB_SITE_URL in op de publieke HTTPS-origin. Voor Metabase beschermt HTTPS credentials of gebruikerscontent tijdens transport en zorgt het ervoor dat origingevoelig clientgedrag consistent blijft.

Hoe moet je een Metabase-upgrade testen?

Herstel de huidige Metabase-state in een geïsoleerde deployment, pas de kandidaatversie toe en herhaal de acceptance-transactie. Let hier extra op, omdat de Metabase-applicatiedatabase en pluginversies samen moeten migreren; opgevraagde bedrijfsdatabases zijn geen vervanging voor die state. Bewaar de vorige Metabase-image totdat de grenzen van datamigratie en rollback duidelijk zijn.