A practical roadmap for moving critical workloads to infrastructure you actually own and control.

Every team we've migrated has had the same hesitation before starting: what if something breaks and we can't get it back? That fear is reasonable, and it's also the reason most lock-in situations never get resolved. The stack that's inconvenient today is still less scary than the migration that might go wrong tomorrow. So teams stay put, absorb the friction, and keep paying for infrastructure that doesn't serve them — sometimes for years longer than they should.

A migration doesn't have to be a leap of faith. It's a sequence of specific, checkable steps. Here's the roadmap we actually use.

Why Migrations Get Put Off

Before the how, it's worth naming the why-not. Most delayed migrations aren't blocked by technical difficulty — they're blocked by uncertainty. Nobody has mapped out exactly what depends on what. Nobody's verified the backups are actually restorable. Nobody wants to be the person who scheduled the downtime that took down production. Once you replace that uncertainty with a checklist, the emotional weight of the decision drops considerably.

Step 1: Audit Your Current Stack

You can't migrate what you haven't mapped. Before touching anything, get a complete inventory:

  • Every domain, subdomain, and DNS record currently in use
  • Every database, its engine and version, and its approximate size
  • Every application, its language/framework version, and its dependencies
  • Every scheduled job, cron task, and background worker
  • Every third-party integration and API key currently in play
  • Where email is currently handled, and by whom

This step feels tedious and it's the single most important one. Migrations don't fail because of the actual data transfer — they fail because of the thing nobody remembered was running until it stopped.

Step 2: Identify Your Lock-In Points

Lock-in isn't always obvious. Sometimes it's a proprietary control panel that doesn't export cleanly. Sometimes it's a "free" email plan bundled with hosting that becomes a headache to unwind. Sometimes it's a managed database service with a proprietary extension your application quietly depends on. Go through your Step 1 inventory and flag anything that isn't a portable, open standard — anything that would require re-engineering rather than re-pointing to move.

This is also where you decide what stays and what goes. Not everything needs to move at once. If you're on Google Workspace or Microsoft 365 for email today, you don't have to migrate that on day one — plenty of our clients run managed hosting with us while keeping their existing email provider, then migrate to something like Private Settlement™ later, on their own timeline.

Step 3: Plan the Cutover

With your inventory and lock-in points mapped, sequence the actual move:

  • Provision the new environment first, in parallel — never migrate into infrastructure that doesn't exist yet.
  • Set a low DNS TTL on the domains you'll be cutting over, well in advance, so the eventual switch propagates fast instead of taking 24-48 hours to fully resolve.
  • Migrate data with the environment still live wherever possible — sync first, cut over second, rather than taking everything offline to start the transfer.
  • Decide your rollback trigger in advance. Know exactly what condition would make you revert, before you're in the middle of the migration and under pressure.

Step 4: Execute With Minimal Downtime

On migration day, order of operations matters more than speed. Databases move first, with a final delta sync right before cutover to catch anything written during the transfer. Application code and dependencies deploy next, tested against the migrated database before any traffic touches it. DNS changes last, only once everything upstream has been verified. And all file transfer happens over SSH — SCP or rsync, never FTP. FTP transmits credentials and data in plain text; there's no scenario where that belongs in a migration you're trying to do securely.

Step 5: Verify Before You Celebrate

A migration isn't done when the new environment is live — it's done when you've confirmed it actually works. Check that scheduled jobs are running on the new infrastructure and not still firing from the old one. Confirm email deliverability and SPF/DKIM/DMARC records if mail moved. Load-test if the application is traffic-sensitive. And keep the old environment intact, untouched, for at least a full backup cycle before decommissioning it — your rollback plan is only real if the thing you'd roll back to still exists.

What This Looks Like With cPanel Migrations Specifically

cPanel-to-modern-stack migrations are their own category — we've done dozens of them and the edge cases repeat. Old PHP versions with deprecated extensions. Databases with character-set mismatches that only surface after the move. Cron jobs referencing absolute paths that don't exist on the new server. Email accounts with years of accumulated forwarders and filters nobody documented. None of this is exotic, but all of it is exactly the kind of detail that turns a planned two-hour migration into a two-day fire drill if it isn't accounted for up front.

This is the part of infrastructure work that benefits most from having done it before. We've been administering Linux servers and moving workloads off of platforms that outgrew their usefulness for 25 years — the pattern-matching that comes from that repetition is what turns a migration from a leap of faith into a checklist.

If you're weighing a move off commodity hosting and want a second set of eyes on the plan before you touch anything, that conversation costs nothing. Take a look at our plans and see where your current stack would land.