# Fully Booked - Zero-Downtime Migration to Self-Hosted Kubernetes

Company: Fully Booked
Service: DevOps Engineering
Period: 2026-05 - 2026-06
Tech: Kubernetes, Docker, Cloudflare, Terraform, CI/CD, Linux, Node.js, PostgreSQL
Web: https://fully-booked.uk
Canonical: https://webanion.com/portfolio/fully-booked-zero-downtime-migration-to-self-hosted-kubernetes

Fully Booked ran on managed cloud infrastructure with a bill that grew every month and a stack nobody fully owned. We moved the whole platform onto a self-hosted Kubernetes cluster without a minute of downtime for the people using it. The cutover covered DNS, ingress, databases and the release pipeline, staged so that traffic shifted only once each layer had been proven on the new cluster. Nobody using the app that week knew anything had happened, which was the point. The recurring bill became owned hardware, and the same cluster now carries the platform's weekly releases.

## The Full Story

From a growing cloud bill to owned hardware with zero downtime recorded, this is how the migration was staged, proven and flipped.

### A bill that grew, a stack nobody owned

<p>Fully Booked ran on DigitalOcean droplets it had outgrown: around a thousand people a day on rented infrastructure, every scaling decision priced by the vendor, and a monthly bill that only moved in one direction. The ask was simple to say and hard to do. Move the whole platform onto hardware the business owns, and do it without anyone who uses the app noticing that anything changed.</p>

### Parity first, then traffic

<p>The migration was staged so that trust was earned before traffic moved. A multi-node k3s cluster went up on owned hardware, hardened with UFW and fail2ban, and every service was containerized to run identically on both infrastructures. Certificates, scheduled backups and monitoring were in place before the switch, not bolted on after. Only then did traffic start to move, surface by surface, with instant rollback available at every step.</p>

### The cutover as a proxy flip

<p>Cloudflare already sat in front of the platform for DNS, caching and TLS, and that is what made the final step calm: the cutover was a proxy flip rather than a DNS gamble. Behind the edge, the cluster runs a control plane and worker nodes carrying the portal, admin, backend and job pods, with monitoring watching and backups on a schedule. The diagram shows no IPs and no hostnames, because the shape of the system is not its secrets.</p>

### Zero downtime, measured

<p>Zero downtime was recorded across the cutover, and nobody using the app that week knew anything had happened, which was the entire point. The recurring cloud bill became owned infrastructure, the client controls every layer from DNS to disk, and the same cluster now carries the platform's weekly releases. The platform this move carried is told in <a href="/portfolio/fully-booked-all-in-one-smart-booking-solution">the Fully Booked story</a>.</p>
