The DevOps Odyssey, Part 8: The Weekend Zero-Downtime Migration — GoDaddy Hosting + Email → K3s + Zoho Mail (aka Zero$Ops?)

The DevOps Odyssey, Part 8: The Weekend Zero-Downtime Migration — GoDaddy Hosting + Email → K3s + Zoho Mail (aka Zero$Ops?)

originally posted at LinkedIn at January 4, 2026

In Part 7, I added observability to my OCI Free Tier K3s setup — Grafana, Loki, Prometheus — because running workloads is easy, but operating them is the real work.

Now, in Part 8, the project was more personal: I helped my cousin migrate a small business website and email off GoDaddy.

Not to save money.

But to use better technology — the kind that can be versioned, automated, secured, and upgraded without clicking through a UI that time forgot.

(Still… the side effect was cutting the recurring cost down to almost nothing. We’ll call it Zero$Ops?)

Zero-downtime GoDaddy migration to K3s + Zoho Mail

The “It Works” Trap

GoDaddy isn’t “broken.” Shared hosting and bundled email work for a lot of people.

But the operating model is where things start to hurt:

  • manual steps everywhere
  • changes that live in a UI instead of Git
  • hard to reproduce, hard to roll back
  • impossible to standardize into “one way we do things”

For a busy small business, infrastructure shouldn’t be a recurring surprise. It should be boring.

What was bad about GoDaddy (in practice)

1) SSL was not “set and forget”

Let’s Encrypt certificates are short-lived by design, and on GoDaddy shared hosting you often end up in a world where renewal and installation is not fully automated.

Which means: if you forget, you break HTTPS. And if you break HTTPS, you break trust.

2) Hosting felt like it was stuck in a narrow lane

The hosting model was basically: HTML / JS / PHP — and anything else felt like trying to bend the platform into something it wasn’t designed to be.

Even simple operations felt tedious:

  • “upload these files”
  • “click through cPanel”
  • “repeat next time”

3) The “hidden fee” pattern

It’s not always upfront, but the pattern is familiar:

  • warnings about old stacks (like outdated PHP)
  • upsells to stay on “legacy” environments
  • renewals that look very different from the intro price

4) Email storage and setup felt legacy-shaped

Mailbox limits add pressure over time — and client setup often feels like you’re configuring POP3/IMAP in the 90s:

  • server names
  • ports
  • security settings
  • “did I pick the right checkbox?”

5) No GitOps, no real automation

No Git history. No pull requests. No “rollback by reverting a commit.”

Just clickops.

What was good about the new setup

K3s (with GitOps) for hosting

  • K3s for a lightweight Kubernetes runtime
  • Helm charts to package the app the same way as everything else
  • Argo CD to keep the cluster continuously synced with Git
  • cert-manager + Let’s Encrypt for automated HTTPS: renewals happen before expiry

Zoho Mail for email

  • clean admin UX
  • easy onboarding
  • generous free tier for many small businesses
  • consistent login flow across web, mobile, and desktop apps (with optional 2FA)

Zero downtime: the strategy (not the magic)

“Zero downtime” is mostly discipline:

  1. Build the new thing in parallel
  2. Validate it end-to-end
  3. Flip traffic with DNS
  4. Keep rollback options alive until you’re confident

Hosting migration: GoDaddy → K3s

Step 1: Containerize the website

First, we took the existing site and turned it into a container image.

That sounds fancy, but it’s really just a way to make the app:

  • repeatable
  • portable
  • deployable in a single command

A tiny example (yours will vary):

FROM nginx:alpine
COPY ./site /usr/share/nginx/html

Step 2: Helm chart (minutes, not hours)

I already had a working pattern from other apps in the cluster (photo-app, job-winner, etc.), so this was basically “fill in the blanks.”

The chart looked like:

charts/
  cousin-site/
    Chart.yaml
    values.yaml
    templates/
      deployment.yaml
      service.yaml
      ingress.yaml

Step 3: GitOps wiring (Argo CD)

Once the chart landed in Git, Argo CD did what Argo CD does best:

  • detect change
  • sync
  • keep it that way

In practice, the workflow becomes almost boring:

git commit -> git push -> Argo sync -> app is live

Step 4: DNS cutover

Finally, we updated the DNS A record to point the domain to the public IP of the new entry point.

This is the only “big red button,” so the key is to push it only after you’ve validated:

  • the site loads
  • HTTPS is issued
  • redirects behave
  • the app is stable under normal traffic

Email migration: GoDaddy → Zoho Mail

This is where I expected the real pain.

Instead, it was the biggest surprise of the weekend.

Step 1: Backup the existing email (because paranoia is healthy)

We started with a backup plan because email is the kind of data you don’t want to “recreate later.”

Step 2: Zoho signup took minutes

Setup was fast, and the UI was clearly designed for admins who don’t want to read a novel.

Step 3: Domain ownership verification — guided and simple

Zoho detected the domain was registered with GoDaddy and guided the verification flow.

No guessing. No “try again in 30 minutes.”

Step 4: DNS records — one-click guidance for MX / SPF / DKIM

Zoho provided clear steps to update:

  • MX for mail routing
  • SPF for sender validation
  • DKIM for signing

Step 5: The surprise — migrating old mail in the background

Zoho offered a migration tool that pulled mail over in the background.

That turned our “manual backup” from required into nice insurance.

The Zero$Ops? conclusion

We didn’t start this project to save money.

But when you stop paying for:

  • manual renewal pain
  • narrow hosting constraints
  • legacy admin flows
  • “just in case” upgrades

…your bill tends to shrink.

If the business ever needs:

  • more compute and storage
  • better uptime guarantees
  • paid email features or more mailbox capacity

…the savings (roughly $150/year in our case) can be reinvested intentionally:

  • upgrade OCI to pay-as-you-go for more headroom
  • upgrade Zoho only when there’s a real need

That’s the whole idea of Zero$Ops: not “spend nothing forever” — but “spend intentionally, when it actually matters.”