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?)

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:
- Build the new thing in parallel
- Validate it end-to-end
- Flip traffic with DNS
- 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.”