Earlier this year we made the call to consolidate three WordPress sites — Rover Engineering, Rover Planet, and USYTech — off three separate AWS Lightsail instances and onto a single, scalable platform on IONOS Cloud. Here’s the story.

The original prompt

The trigger wasn’t cost. We had three Lightsail bundles humming away at modest monthly rates, and that wasn’t painful. The prompt was the shape of what we’re trying to build:

Cost savings would be a nice-to-have. The point was a better foundation, not a cheaper one.

The architecture we ended up with

After comparing IONOS’s VPS, Compute Engine vCPU servers, and Cloud Cubes — including a side-by-side scaling and IO analysis — we landed on:

The result is a single small server that hosts three production WordPress sites, scales by snapshot-and-recreate, and exposes a per-tenant management UI we can hand to clients.

Setting up the Plesk platform

Before any of the three migrations could happen, the Cube needed turning into a hosting platform. The short version of what we configured:

None of these are exotic; the point is that the platform setup is small, knowable, and codified. When we add the next client site, the steps are: provision the subscription, add the DNS records, issue Let’s Encrypt, pick the PHP version, attach the backup schedule, hand the client their customer login. Half an hour, repeatable.

The migration itself

We did the three sites in sequence: Rover Planet first as the pilot, then Rover Engineering, then USYTech. Each one taught us something.

Rover Planet — pilot

Rover Planet went smoothly using the Duplicator plugin: build a package on the source, upload to the destination via Plesk’s File Manager, run the installer in a browser. Duplicator handles the database import, URL search-and-replace, and (importantly) preserves the original WordPress salts. End-to-end this took a couple of hours including smoke testing.

Rover Engineering — the hard way

For Rover Engineering we tried to be clever. Instead of clicking through the UI we built a fully programmatic migrator: AWS CLI for the source audit, SSH and mysqldump for the database, tar for wp-content, GoDaddy DNS API for the cutover, and a custom PHP installer to do the import server-side. It worked, but several things bit us along the way:

The site went live, but it was a reminder that the boring path is often the right one.

USYTech — back to the boring path

For USYTech we went back to Duplicator + Plesk File Manager + browser installer. It took 30 minutes end to end. Salts came across automatically, permalinks worked first try, and the smoke tests were green.

Tools that earned their keep

Lessons we’re carrying forward

  1. Use the platform’s native migration tool when one exists. Plesk + Duplicator + WordPress Toolkit handles ten edge cases for free. Reinventing the import flow in custom code earned us new bugs without a meaningful upside.
  2. Stage to a migrate. subdomain first, always. It costs nothing and lets you do real end-to-end testing before flipping DNS.
  3. Salts and .htaccess are migration trip-hazards. Duplicator hides them; manual migrations need to handle them explicitly.
  4. Drive DNS cutovers via API. We wrote the apex A-record flip as a one-line API call. Rollback is the same call with the previous IP. No human typing the wrong octet under pressure.
  5. Backups before destruction. Plesk’s automated backups to IONOS Object Storage cover ongoing recovery, but we still pulled a final pre-decommission backup of each Lightsail to local + cold storage before deleting the AWS resources.
  6. Walk every custom plugin after cutover. Standard plugins from the WordPress.org repository typically recover cleanly — their authors test migration scenarios. Custom or private plugins are different: they may hard-code environment variables, store encrypted credentials that depend on the original wp-config.php salts, or carry staging URLs in their settings rows. Our own chatbot plugin is a good example — it stores its backend API credentials encrypted against the WordPress salts, so any migration that does not preserve the original salts will silently break it. After each cutover, go through every custom plugin’s settings screen and run its connection test before handing the site back. Ten minutes, saves a support call.

What’s next

With the three internal sites stable on IONOS, we’re using the same Plesk subscription model to host the first client sites — isolated WordPress installs with their own admin logins, scoped resource limits, and per-site SSL. Plus two operational pieces still on the punch list: enabling end-user SFTP for clients, and a shared post-cutover URL-fix script for sites whose page-builder hard-codes absolute URLs.

If you’re weighing a similar move, the short version is: IONOS Cubes plus Plesk hits a useful sweet spot for small-to-medium WordPress fleets — cheap NVMe-backed compute, a sensible per-tenant management UI, predictable scaling. And the boring tools beat the clever ones.