Replacing a production platform, node by node, without losing data

Role: operator of my own infrastructure — this is my own company's platform, not a client engagement
What I did: replaced the platform underneath running production workloads, while they kept serving
Period: self-hosted bare metal from ~February 2026; production workloads on it from ~April 2026
Read this before the rest. This runs on a single control-plane-node topology. No outage has happened, but the control plane is not HA-redundant — so what follows is an operating record, not a redundancy guarantee. A second control-plane failure domain is a different claim and I am not making it. I would rather you heard that from me in the first paragraph than found it in the third meeting.

The objection this answers

Almost nobody who asks me about leaving the cloud is really asking about money. They have already done that arithmetic. What they are asking is whether the move will break something — whether they will be down, whether they will lose data, whether the thing they migrate onto turns out to be worse than the thing they left.

It is a fair question and it deserves better than reassurance. So here is the version of it I did to myself, with what it actually cost.

What happened

I have run self-hosted bare metal since roughly February 2026, with production workloads on it since roughly April 2026 — about five months of production on my own hardware. The OVH era ended around 23 May 2026.

Then, on 3 June 2026, I did the frightening part: I replaced the entire platform underneath running production workloads. Cozystack out, Talos in. Not a rebuild on new hardware with a cutover weekend — a replacement of the platform on the machines that were already serving.

How it was done, and what it cost in downtime

  1. Rolling, node by node. Absorb a node, wipe it, rejoin it to the new cluster. The cluster was never torn down and rebuilt as a unit, so there was never a moment when everything depended on one big step working.
  2. Per-service cutover, not a big-bang switch. Workloads moved one service at a time via edge Caddy backend flips. Each flip is a single change.
  3. Instant rollback on every flip. If a service misbehaved on the new platform, the flip went back and the old path kept serving. The unit of risk was one service for as long as it took to notice — not the estate.
  4. Storage with two independent answers. LINSTOR at RF=2 for replication, and restic to offsite object storage for the case where replication is not the thing that saves you.

Zero data loss across the replacement.

What it cost in downtime: 77 minutes. The cutover ran in two planned windows on 8 June 2026 — one of 53 minutes and one of 24 minutes, both returning HTTP 503 while the flip completed. That is the honest answer to the question behind the objection: not "no downtime", which nobody should believe, but seventy-seven minutes, on a date, in windows I chose.

Where that number comes from: it is measured at the service endpoint by my own monitoring, running continuously since 3 May 2026 — not by a third party, and I am not going to describe it as if it were. It is a duration observed at the service, which is a different and smaller claim than an availability figure.

What broke

Two real failures, both during the period described. Neither took the cluster down, and both are worth stating plainly — a migration story with no failures in it is a story someone is not telling you all of.

The operating record

In roughly three months of steady-state Talos operation, there has been no complete cluster outage.

Here is how that is measured, because "no outage" is worth exactly as much as the method behind it. The control-plane node's kube-apiserver shows an age of 98 days with 0 restarts. A node reboot resets a static pod's age — so that single figure says both that the node has not rebooted and that the API server has not dropped since 8 June 2026. One number, checkable in one command, and it constrains both facts at once.

Platform replaced under live production. Zero data loss. No complete cluster outage since.
~5 months production on bare metal · ~3 months steady-state on the current platform

What I am not claiming

There is no uptime percentage here, and I am not going to give you one. I do not have a defensible number yet, and a figure I cannot show you the working for is worth less than nothing — it invites you to trust the one claim I could not support and discount the ones I could.

What I have instead is a date: external, third-party uptime measurement started on 15 September 2026. After it has run a real window there will be a verifiable figure for a stated period, measured by something that is not me. Until then the claim is the one above — no complete cluster outage in roughly three months of steady state, measured the way described.

Free 15-min bill review → Cloud Bill Teardown → Cloud Escape Rescue → managed platform

If you are weighing a move and what you actually want to know is what breaks, that is the conversation I would rather have. You can stop after any step.

Book the free review →
Rajesh Medampudi · [email protected] · rajesh.medampudi.com · cal.com/rajesh-medampudi/bill-review