Migration plan
Annapolis, MD
0
SaltwickInn & Table · Migration
Production live38.97° N, 76.49° W—
Book Admin
PRODUCTION STAYS LIVE · ZERO LOST BOOKINGS ·▶
(Demo) WordPress → Linux VPSMySQL → PostgreSQL 16React / Next.js reservations

Move the site.Keep every booking.

A worked example of your brief, using a made-up client: Saltwick Inn & Table, a 13-room harbor inn and restaurant in Annapolis, Maryland. Its WordPress site moves to a hardened VPS, its data moves to PostgreSQL, and a new reservation system goes live. A tested rollback is ready at every step.

0rows checked, MySQL vs Postgres
0tables with matching checksums
0read-only window at cutover
0from audit to launch
(01)Your brief

Seven asks. Onecalm launch.

Each part of your post maps to one step with a result you can check. Click any card to open the details.

01 · Migrate

The complete WordPress site, nothing left behind

Files, database, media, plugins, themes, wp-config, cron jobs, redirects and email settings, all copied with checksums.

02 · Server

Hardened Linux VPS

Ubuntu 24.04 · Nginx · PHP 8.3

03 · Convert
$ pgloader \ mysql://wp@…/saltwick \ postgresql://app@…/saltwick ✓ 41 tables · 1,284,903 rows ✓ FKs rebuilt · seqs reset

MySQL → PostgreSQL 16

Types, keys and relationships mapped, then verified table by table.

04 · Fix

Compatibility fixes

05 · Build

React / Next.js reservation system

Rooms and dinner tables, live availability, confirmations and an admin board.

06 · Test & SSL
0

tables verified · SSL A+ · restore tested

07 · Docs

Runbook & handover

Deploy, rollback and renewal steps, written down.

Live site · safety first

Rollback ready at every step

The old server stays running and untouched for 14 days. One DNS switch takes you back.

(02)How the data moves

Old host → new VPS,checked in flight.

The 3D view stays in place while you scroll through the five steps. Drag it to rotate. Staging gets a full copy first, and production moves only once.

Current host · MySQL 5.7 New VPS · PostgreSQL 16
Tables0 / 41
Rows moved0
Checksumwaiting
Step 01 · T-48h

Snapshot & full backup

Host snapshot, mysqldump and an uploads archive, copied off-site, with a test restore on a scratch server before anything else happens.

mysqldump --single-transaction | gzip
Step 02 · T-36h

Copy to the staging VPS

rsync with checksums, then a search-replace of the URLs. Staging is password-protected and kept out of search engines.

rsync -azh --checksum
Step 03 · T-30h

pgloader → PostgreSQL 16

Schema types cast, foreign keys rebuilt, sequences reset. Legacy bookings move into a proper reservations table.

pgloader mysql://… postgresql://…
Step 04 · T-24h

Verify & fix plugins

Row counts and checksums are compared table by table, then every page and plugin gets a smoke test on staging.

./scripts/compare-checksums.sh
Step 05 · T-0

Cutover in five minutes

Read-only notice → final delta sync → DNS switch. Health checks are green before the switch, and the rollback script is ready.

./scripts/dns-switch.sh --back
(03)The actual commands

Nothing hidden.Everything logged.

This is the runbook you get, played back in order, so any engineer can repeat it later.

deploy@saltwick-vps-01 : ~/migration

    

Row-count check: MySQL vs PostgreSQL

Runs after the conversion and again after cutover.
TableMySQLPostgres
(04)The part most bids skip

WordPress & Postgres:the honest version.

WordPress core officially supports only MySQL and MariaDB, and many plugins write raw MySQL queries. So there are two paths. Both are tested on staging, and you choose.

Recommended

Path A: Postgres for your data, WordPress kept stable

Business data (reservations, guests, payments, leads) moves to PostgreSQL 16 behind the new Next.js API. WordPress content runs on MariaDB on the same VPS.

  • No unsupported database driver in production
  • Date ranges + an exclusion constraint block double bookings
  • Nightly pg_dump + MariaDB dump, restore-tested weekly
WordPressPHP 8.3 · pages, blog MariaDB 10.11wp_posts, wp_options Next.js API/api/reservations PostgreSQL 16guests · bookings React booking UI/book · /admin● mobile-first
Possible, needs testing

Path B: Full WordPress on PostgreSQL

WordPress itself runs on Postgres through a translation layer (the PG4WP drop-in), which rewrites MySQL queries on the fly. Every plugin has to pass on staging first.

  • One database engine for everything
  • Plugins with raw SQL may need patches or replacements
  • WordPress core updates must be tested on staging first
  • Extra fixes are listed and agreed with you before any work
Plugin (sample audit)Uses raw SQL?Path APath B (PG4WP)Action
Yoast SEOSome (indexables)WorksRe-indexRebuild indexables after the move
Contact Form 7 + FlamingoNoWorksWorksLeads also copied to Postgres
Old booking pluginYes (custom tables)ReplacedReplacedData migrated into the new system
WooCommerce (gift cards)Yes (HPOS)WorksFailsKeep on MariaDB or use Stripe links
ElementorLittleWorksPartialRegenerate CSS, test every template
WP Mail SMTPNoWorksWorksRe-authorize with Google Workspace / SES
(05)Timeline · 7 working days

One day, one result you can check.

01
Day 1 · Audit

Full backup & inventory

Snapshot, off-site backup, plugin and cron list, DNS TTL lowered to 300s.

02
Day 2 · Server

VPS built & hardened

Ubuntu 24.04, Nginx, PHP 8.3, Postgres 16, MariaDB, UFW, fail2ban.

03
Day 3 · Staging

Site cloned to staging

staging.saltwickinn.com, password-protected, kept out of search engines.

04
Day 4 · Convert

MySQL → PostgreSQL

pgloader run, checksums matched, plugin fixes applied and logged.

05
Day 5 · Build

Reservation system

Booking flow, availability rules, email confirmations, admin board.

06
Day 6 · Test

QA, SSL & restore test

Mobile + desktop tests, Let's Encrypt, a backup restored to prove it works.

07
Day 7 · Launch

Cutover & handover

5-min read-only window, DNS switch, 48h watch, docs delivered.

(07)Built in React · works live

Guests book inthree taps.

Both screens on the right are the real demo, not pictures. A booking on the phone appears on the admin board right away. In production the same calls go to /api/reservations on PostgreSQL.

Rooms & dinner tablesLive availability by night and seating time. The same room can't be booked twice.

Clear totals in USDNightly rate, estimated taxes and a confirmation code.

Basic adminArrivals, check-in, cancel, search, occupancy and CSV export.

Harbor View KingHarbor View Kingfrom $289 / night · 4 roomsBook →
(08)Your site is live, so

Every step hasa way back.

The old server stays untouched and running until the new one has worked for 14 days. If anything looks wrong, DNS points back within minutes.

1Before anything

Snapshot + off-site backup

Full host snapshot, database dump and uploads archive, with a test restore.

248 hours before

Lower DNS TTL to 300 seconds

So the final switch, and any switch back, spreads within minutes.

3Cutover · low-traffic hour (ET)

Five-minute read-only window

Bookings pause with a friendly notice, the last changes sync, and counts are re-checked.

4Switch

DNS points to the new VPS

SSL is already issued and health checks are green before the switch.

5Next 48 hours

Watch closely

1-minute uptime checks, error logs, booking test emails. Roll back if needed.

6Day 14

Retire the old host

Only after you confirm. A final archive is kept for 90 days.

Rollback target
0minutes or less

To switch back to the old server. Bookings made in the meantime are exported and re-entered, so none are lost.

Old server untouched Backups restore-tested Written runbook
(09)Security & launch checklist

Locked downon day one.

Each item is ticked in the handover document with the exact command or setting.

✓

SSH keys only

Password and root login off. PasswordAuthentication no

✓

Firewall

UFW allows only 22, 80 and 443. Databases listen on localhost only.

✓

fail2ban

Blocks brute-force attempts on SSH and wp-login.php.

✓

SSL A+ grade

Let's Encrypt with auto-renew, HSTS, TLS 1.2+.

✓

Nightly backups

pg_dump + files to off-site storage, kept 30 days.

✓

Restore tested

A backup is restored to a scratch database and checked.

✓

Auto security updates

unattended-upgrades. WordPress updates go to staging first.

✓

Uptime alerts

1-minute checks, with email/SMS if the site or API is down.

(10) Fixed price · as bid
$0

7 working days · USD

Migration, VPS setup, the conversion (Path A), the reservation system and documentation. If you choose Path B and many plugins fail, the extra fixes are listed and agreed before any work starts.

Test the booking flow →
What you receive
  1. Live site on the new VPS with SSL, all content, media and plugins working
  2. PostgreSQL 16 database with verified row counts (report included)
  3. Plugin compatibility report with each fix applied
  4. React / Next.js reservation system + admin, source in your Git repo
  5. Backup schedule plus a restore test that has actually been run
  6. Runbook: server access, deploy, rollback, renewals
  7. 48 hours of close monitoring after launch