Onder de motorkap · voor developers

Kubernetes, zonder de YAML.

Het platform dat je zelf zou bouwen als je er een jaar voor had: onveranderlijke builds, geïsoleerde projecten, een uitrol die wacht tot je app antwoordt, en back-ups die we elke week echt terugzetten. Jij pusht code. Wij draaien het cluster.

  • k3s · Hetzner · Neurenberg
  • Railpack + BuildKit
  • deploys op digest
  • Postgres 18 · CloudNativePG
  • Let’s Encrypt
  • HTTP/2 · IPv6
bakkerijdevries.nl · TLS voor je vernieuwd

01 · de deploy-pipeline

Van push tot pod.

Elke deploy gaat dezelfde weg, elke keer. Geen met de hand gebouwde servers, geen half afgemaakte uitrol. Kies een stap.

De code komt binnen

Elke push naar je branch start een deploy via onze GitHub-app. Je kunt ook deployen vanuit het dashboard, of met de CLI vanuit je terminal of AI-tool. Wordt een deploy halverwege afgebroken, dan wordt hij als mislukt gemarkeerd en blijft de live versie staan.

start
GitHub-push, dashboard of CLI
halverwege afgebroken
mislukt na 45 min
live versie
onaangeroerd

Railpack zoekt de stack uit

Railpack herkent je taal en framework, en BuildKit bouwt de image. Builds draaien op buildservers, los van de servers waar je apps op draaien.

tijdslimiet
15 min
build-cache
per service, nooit gedeeld
buildvariabelen
secrets, nooit in de image
node
20 · 22 · 24 (standaard)

Vastgezet op digest

De deploy wijst naar de digest van de image, niet naar een tag die kan verschuiven. Die build verandert nooit meer onder je handen, dus wat je getest hebt, is wat draait.

verwijzing
image-digest
wijzigt na de build
nooit
zelfde image bij promote
ja

Pas live als hij antwoordt

De nieuwe versie moet een readiness-check halen op een HTTP-pad of op zijn TCP-poort. Tot die tijd blijft de oude versie je bezoekers bedienen.

check
HTTP-pad of TCP-poort
interval
elke 3 s
geeft op
na 5 min of een snelle crash

Het verkeer gaat over

Is de nieuwe versie klaar, dan gaat het verkeer ernaartoe, en krijgt de oude versie nog even de tijd voordat hij stopt. Een versie die niet opstart, gaat nooit live: de vorige blijft staan of wordt teruggezet.

gratieperiode
5 s
mislukte start
vorige versie blijft
variabele gewijzigd
herstart met de nieuwe waarden

De laatste goede versie, bij de hand

Eerdere images worden bewaard. Terugdraaien start er een opnieuw zonder te bouwen, en zet de variabelen terug waarmee die versie draaide.

opnieuw bouwen
nee
variabelen
zoals ze toen waren
hoe
één klik, of npx cubli rollback

02 · één project, laag voor laag

Doe de motorkap open.

Geen zwarte doos. Kies een onderdeel van een project en zie wat daar draait en hoe het is ingesteld. Dit zijn de echte instellingen, geen verkoopplaatje.

01 / 08rand

Ingress + TLS

Elk verzoek komt binnen via Traefik achter een load balancer van Hetzner. HTTPS is de enige ingang, en certificaten regelen zichzelf.

doorsturen
HTTP gaat altijd naar HTTPS
certificaten
Let’s Encrypt via cert-manager, automatisch vernieuwd
domeinen
Een wildcard voor *.cubli.app, HTTP-01 voor je eigen domeinen
protocol
HTTP/2 met zstd-, brotli- of gzip-compressie
ipv6
Bezoekers bereiken je ook via IPv6
client-ip
Het echte IP van de bezoeker komt bij je app aan (proxy protocol)
previews
*.cubli.app-adressen krijgen noindex
02 / 08build

Build

Push naar GitHub, deploy vanuit het dashboard of gebruik de CLI. Railpack herkent je stack en BuildKit bouwt de image. Geen Dockerfile nodig.

waar
Op buildservers, los van waar apps draaien
limiet
15 minuten per build
cache
Per service bewaard, nooit gedeeld tussen klanten
secrets
Buildvariabelen komen binnen als BuildKit-secrets, nooit opgeslagen in de image
image
Gedeployd op digest, dus een release verandert nooit onder je handen
node
20, 22 of 24 (standaard 24)
03 / 08runtime

Je app

Je code draait in een geharde container met geheugen- en CPU-limieten uit je pakket. Een nieuwe versie neemt pas over als hij klaar is.

live gaan
Na een readiness-check: HTTP-pad of TCP-poort, elke 3 s
overdracht
De oude versie blijft bedienen tot de nieuwe klaar is
slechte start
Gaat nooit live. De vorige versie blijft of wordt teruggezet
terugdraaien
Start een eerdere image met zijn variabelen, zonder rebuild
harding
seccomp RuntimeDefault, geen privilege escalation, NET_RAW eraf, geen service-account-token
crash
Kubernetes herstart hem, en de uptimecheck meldt het als hij plat blijft
logs
Live uit de container: de laatste 200 regels, tot 2.000
04 / 08data

Database

Postgres of MySQL naast je app, voor je beheerd. De verbindingsgegevens komen als variabelen bij je app.

postgres
Postgres 18 op CloudNativePG
wal
Doorlopend gearchiveerd, gecomprimeerd met zstd, plus elke week een volledige back-up
pitr
Terug naar elk moment van de laatste 14 dagen. Ons supportteam zet het terug
mysql
MariaDB 11.8 via mariadb-operator
dumps
Elke 6 uur (een dag bewaard), plus dagelijks (14 dagen bewaard)
opslag
Verdubbelt bij 70% vol, binnen je pakket
05 / 08data

Bestandsvolume

Uploads en andere bestanden die je app schrijft, zoals WordPress-media. Met een eigen back-upschema.

back-up
restic via k8up, elke 6 uur
methode
Incrementeel en gededupliceerd
versleuteling
Een back-uprepository, versleuteld per project
bewaren
De laatste 4, plus 14 dagelijkse
controle
Repository elke week gecontroleerd
opslag
Verdubbelt bij 80% vol, binnen je pakket
seintje
Een mail bij 90% als je de grens van je pakket bereikt
06 / 08herstel

Back-ups

Bewaard buiten de servers waar je app draait, in de EU. En echt getest, want een back-up die je nooit hebt teruggezet, is een gok.

test
Elke maandag om 02:00
wat
Een Postgres-database, een MariaDB-database en de bestanden van een app
hoe
Echt teruggezet in een verborgen namespace
oordeel
Aantallen tabellen en bestanden vergeleken, het team krijgt een melding als het misgaat
eerste keer
2 oktober 2026: 13 van 13 tabellen, 543 van 543 bestanden
versheid
Elke 30 minuten gecontroleerd
07 / 08isolatie

Isolatiegrens

Elk project krijgt per omgeving een eigen Kubernetes-namespace, dus ook productie en staging zijn van elkaar afgeschermd.

netwerk
Default-deny-policies: andere projecten kunnen niet bij je services
uitgaand
Alleen je eigen project, DNS, Cubli Mail en het publieke internet
geblokkeerd
Privénetwerken en het metadata-endpoint van de cloud
variabelen
Versleuteld met AES-256-GCM in onze database
secrets
Kubernetes-secrets versleuteld opgeslagen
inloggen
Tweestapsverificatie voor elk account: een authenticator-app of een passkey
support
Toegang van support wordt gelogd, met secrets verborgen
08 / 08beheer

Geplande controles

Een planner in het platform draait deze controles dag en nacht. Meestal vinden ze niets. Daar gaat het om.

1 min
Uptime van elke live app. Plat na 3 mislukte checks op rij: je krijgt een mail, en nog een als hij terug is
1 min
Meegroeien van opslag voor databases en appbestanden
1 min
Nieuwe eigen domeinen: DNS en certificaat
5 min
Gezondheid van servers en platform, met meldingen aan het Cubli-team
10 min
Afgebroken deploys: mislukt na 45 min, live versie blijft
30 min
Of de back-ups vers zijn
elk uur
Een domein waarvan de DNS verhuisd is, 48 uur lang
dagelijks
Domeincheck: site, SSL en mailrecords
ma 02:00
De hersteltest
  • Kubernetes (k3s) op Hetzner Cloud, Neurenberg
  • Drie control-plane-servers, elk op een eigen fysieke host
  • Je app draait los van de buildservers en onze eigen servers

03 · data

Back-ups die je echt hebt teruggezet.

Back-ups maken is het makkelijke deel. Weten dat ze terugkomen is het deel dat de meeste setups overslaan. Wij zetten er elke week echt een terug, en bewaren ze buiten je app, in de EU.

Postgres: terug naar elk moment

CloudNativePG · Postgres 18 · WAL doorlopend gearchiveerd (zstd) · elke week een volledige back-up

14dagen terug
doorlopend WAL-archiefwekelijkse volledige back-upEen moment terug nodig? Ons supportteam zet het voor je terug.
MySQL · MariaDB 11.8

Dumps op een schema

Elke 6 uur een dump, een dag bewaard. Plus een dagelijkse dump, 14 dagen bewaard.

elke 6 uur
1 dag bewaard
dagelijks
14 dagen bewaard
bestanden · restic

Bestanden elke 6 uur

Uploads en andere appbestanden, incrementeel en gededupliceerd. Elk project heeft een eigen versleutelde repository.

bewaard
laatste 4 + 14 dagelijkse
repositorycheck
wekelijks
opslag · automatisch

Schijven die zelf meegroeien

Opslag verdubbelt voordat hij volloopt, altijd binnen je pakket. Bij de grens van je pakket krijg je een mail bij 90%.

database
verdubbelt bij 70%
appbestanden
verdubbelt bij 80%

elke maandag · 02:00

Elke week echt teruggezet.

Eén Postgres-database, één MariaDB-database en de bestanden van één app worden echt teruggezet, in een verborgen namespace. Het aantal tabellen en bestanden wordt vergeleken met het origineel, en het team krijgt een melding als er iets niet klopt.

Wekelijkse hersteltestGeslaagd
13 / 13databasetabellen terug
543 / 543bestanden terug
› kies een back-up uit de EU
› zet hem terug in een aparte omgeving
› vergelijk tabellen en bestanden met het origineel
✓ alles kwam terug

De cijfers van de eerste test, 2 oktober 2026.

04 · CLI en MCP

Je terminal en je AI, allebei welkom.

Deployen, logs lezen en terugdraaien vanaf de commandline. Of geef je AI-tool dezelfde mogelijkheden via MCP, zodat hij kan uitrollen wat hij net geschreven heeft.

De CLI

Draait met npx, niets te installeren. Uploadt de map waarin je staat.

Eén keer inloggen
npx cubli login
Deploy de map waarin je staat
npx cubli up
Of eerst naar staging
npx cubli up --staging
De logs volgen
npx cubli logs
Terug naar de vorige versie
npx cubli rollback
De code van een project ophalen
npx cubli pull

MCP voor je AI-tool

Claude Code, of elke tool die een lokale MCP-server draait
claude mcp add cubli -- npx -y cubli mcp
Chat-apps zoals claude.ai of ChatGPT: voeg een eigen connector toe
https://mcp.cubli.io
jij, tegen je AI

Zet dit op staging, kijk in de logs, en zet het live als hij antwoordt.

Tools die je AI krijgt

  • deploy
  • get_logs
  • rollback
  • create_database
  • create_staging
  • promote
  • add_domain
  • search_domains
  • order_domains
  • setup_domain_mail
  • domain_health
  • add_template
  • migrate_wordpress
  • pull_code

en meer, voor projecten, services, variabelen en DNS. order_domains vraagt altijd eerst jouw ja voordat er iets gekocht wordt.

Variabelen en logs

Variabelen stel je in in het dashboard. Ze worden versleuteld met AES-256-GCM, en na een wijziging herstart je app met de nieuwe waarden. Koppel je een database, dan worden de verbindingsgegevens voor je toegevoegd.

Logs komen live uit de draaiende container: standaard de laatste 200 regels, tot 2.000. Bouwlogs worden bij elke deploy bewaard.

Er is ook een API op api.cubli.io, met een OpenAPI-contract.

Variabelen
# voor je toegevoegd
CUBLI_URL=https://bakery.cubli.app
DATABASE_URL=postgres://…
# je eigen
MAIL_FROM=hallo@bakkerijdevries.nl

05 · de eerlijke vergelijking

Je VPS, zonder de klusjes.

Een VPS geeft je een lege server. Dit is alles wat je er zelf op zou bouwen, en wat Cubli al doet. Vink aan wat je VPS nu al heeft.

  • De stack

    op een VPS doe jeWebserver, PHP of Node en de database installeren en patchen.

    op CubliGeen server of OS om te beheren. Railpack bouwt de runtime, databases draaien als beheerde services.

  • TLS

    op een VPS doe jeCertificaten opzetten, vernieuwen en hopen dat het vernieuwen lukt.

    op CubliLet’s Encrypt-certificaten, automatisch aangevraagd en vernieuwd. HTTP gaat naar HTTPS.

  • Back-ups

    op een VPS doe jeScripts schrijven en de kopieën van de server af krijgen.

    op CubliBestanden en MySQL elke 6 uur, Postgres doorlopend gearchiveerd. Bewaard buiten je app, in de EU.

  • Hersteltests

    op een VPS doe jeTijdens de storing ontdekken of het werkt.

    op CubliElke week echt teruggezet, met het aantal tabellen en bestanden vergeleken.

  • Monitoring

    op een VPS doe jeEen tool kiezen, checks schrijven, meldingen regelen.

    op CubliElke minuut een uptimecheck met een mail aan jou, plus back-up- en servercontroles voor ons team.

  • Volle schijf om 3 uur ’s nachts

    op een VPS doe jeWakker worden, volume vergroten, logs opruimen.

    op CubliDatabase- en bestandsopslag groeien vanzelf mee, binnen je pakket.

  • Isolatie

    op een VPS doe jeZelf zorgen dat sites niet bij elkaar kunnen.

    op CubliEen netwerk-geïsoleerd project per klant, geharde containers en limieten per app.

  • Deploy-pipeline

    op een VPS doe jeCI, terugdraaien en een staging-opzet bouwen.

    op CubliDeploy bij elke push, onveranderlijke builds, terugdraaien met één klik, staging die dezelfde build live zet.

  • Point-in-time recovery

    op een VPS doe jeWAL-archivering opzetten en het terugzetten oefenen.

    op CubliIngebouwd voor elke Postgres-database, 14 dagen terug.

Vink aan wat je VPS al heeft. Op Cubli zijn ze er alle 9 vanaf dag één.

Eerlijk is eerlijk

Wanneer een VPS beter past.

We zien je liever het juiste gereedschap kiezen dan het verkeerde pakket.

  1. 01 · rootJe hebt root en willekeurige software nodig

    Daemons, eigen poorten, geplande taken, SSH, je eigen Dockerfile. Cubli heeft nog geen shell, geen cron en geen eigen containers.

  2. 02 · rekenkrachtJe wilt zoveel mogelijk CPU per euro

    Een kale server geeft je meer CPU en geheugen voor je geld. Een Cubli-pakket geeft elke app zijn eigen deel.

  3. 03 · de hobbyJe vindt servers beheren leuk

    Terecht. Patchen, back-upscripts en meldingen om 3 uur ’s nachts kunnen leuk zijn. Dan weet je precies wat deze pagina iedereen bespaart.

06 · waarom

Waarom dit de nieuwe manier van hosten is.

  1. 01

    Declaratief

    Jij zegt wat er moet draaien: een app, een database, een domein. Het platform zorgt dat het zo is, en zo blijft. Een gecrashte container komt vanzelf terug.

    desired state
  2. 02

    Onveranderlijk

    Elke deploy draait een image die vastzit op zijn digest. Wat je op staging getest hebt, is precies wat live gaat, en terugdraaien is een eerdere image starten.

    sha256:7c1e…a94f
  3. 03

    Standaard geïsoleerd

    Default-deny-netwerk, geharde containers en limieten per app. Er valt niets aan te zetten, want het staat nooit uit.

    default deny
  4. 04

    Getest, niet gehoopt

    Een back-up die je nooit hebt teruggezet, is een gok. Wij zetten er elke week een terug en vergelijken elke tabel en elk bestand.

    13/13 · 543/543
  5. 05

    Werkt met elke AI

    Zet Claude, Codex, Cursor of Lovable je code in GitHub, dan wordt hij gedeployd. Met de CLI en MCP kan je AI-tool ook zelf deployen, logs lezen en terugdraaien.

    git push

de kleine lettertjes, vooraf

Wat we (nog) niet doen.

Liever lees je het hier dan dat je het op dag drie ontdekt.

  • Geen shell-toegang tot je container.
  • Geen geplande taken (cron) en geen losse achtergrondworkers.
  • Geen eigen Dockerfiles. Railpack bouwt je app.
  • Geen CDN of edge-caching voor je site.
  • Nog geen HTTP/3. HTTP/2 staat aan voor elke site.
  • Geen wildcard voor eigen domeinen.
  • Geen loggeschiedenis of grafieken. Logs zijn live: de laatste 200 regels, tot 2.000.
  • Nog geen herstelknop of back-updownload in het dashboard. Support zet het voor je terug.
  • Eén regio: servers in Duitsland.
  • Geen uptimegarantie of SLA.
  • Node.js en PHP zijn bewezen. Andere talen die Railpack kent, werken misschien, maar dat hebben we nog niet bewezen.

Push iets. Zie het landen.

7 dagen gratis op elk pakket, altijd opzegbaar. Verwijder je het binnen de proefperiode, dan betaal je niets. Een project met een app en een database kost vanaf €19 per maand excl. btw, of €15,83 bij jaarlijks betalen.

  • servers en data in Europa
  • Kubernetes in Duitsland
  • back-ups elke week teruggezet
  • tweestapsverificatie op elk account