Migrating WordPress Multisite setups to the cloud!
A couple of weeks back I did a stream with Amanda and Pilot where I showed off what I’ve been learning about moving WordPress Multisite and Commons in a Box setups to Reclaim Cloud. I’ve done a few CBOX Openlab migrations, most recently for SUNY Oneonta and University of New Haven, so I wanted to document what I’ve been learning. The great thing about CBOX Classic and CBOX Openlab is that they really are just WordPress Multisite, and so not too much special was necessary above and beyond moving any other Multisite.
This is not using a plugin like Updraft Plus or anything like that, as that is usually way slower and can be problematic for large or complex sites. Doing this via command line tools mostly manually means we can transfer files directly between servers using rsync, saving us lots of time. I go into detail in the stream, but the steps are also below. For simplicity, I’m going to refer to the new site on the cloud as the “destination” site and the old site on Shared Hosting as the “source.”
Install a fresh copy of WP
If on Reclaim Cloud, Use the WordPress standalone kit. On Reclaim Press, just make a new site.
Make copies of the wp-config.php
and .htaccess
files for both the destination and source sites
This is handy for database information in particular. There are also many cases where I need to fix .htaccess
rules after migration, like removing references to different PHP versions, or preserving redirect rules etc. Either download a copy to your computer for safe keeping, or copy and paste the contents somewhere.
Generate and install SSH keys
This will make things much easier when shuttling files around. I typically use this article as a reference: Generating and using SSH key pairs
After generating a keypair on the destination site, I add the public key to the ~/.ssh/authorized_keys
on the source.
Move the database over
First I need to dump the database of the site. From the source, I run this command to dump the database and gzip it:
mysqldump -u MYSQLUSER -p DATABASE --quick --skip-lock-tables --no-tablespaces | gzip > db.sql.gz
Doing this from the terminal rather than PhpMyAdmin is faster and way more reliable for larger databases. On the stream, I had trouble with doing this via the terminal, but it was because I forgot the --no-tablespaces
option.1
Then I will upload the dumped database to the destination site, typically just with the file manager in Reclaim Cloud, but if it’s a really large database I’ll SFTP or rsync
it. Then it’s time to restore the database:
# Unzip it
gzip -d db.sql.gz
# Restore it
mysql -u DB_USER -p DB_NAME < db.sql
For the restore command, I’ll use the database name, username, and password from the destination’s wp-config.php
file.
Rsync time!
Rsync is one of those tools that can be scary at first, but learning it pays dividends. We’re going to want to run the rsync command from the destination server, as that’s where we generated our keys. We’d replace USER
with the cPanel username on shared hosting, DOMAIN.COM
with the domain name, and /PATH/TO/SITE/
with the path of the source site on the server. /var/www/webroot/ROOT/
is always going to be the path to the webroot on Reclaim Cloud or Reclaim Press
rsync -ahzP USER@DOMAIN.COM:/PATH/TO/SITE/ /var/www/webroot/ROOT/
Fix permissions
Sometimes permissions problems can pop up after rsyncing stuff between different servers, as rsync will preserve ownership and permissions as much as it can. As a precaution, I always fix permissions on the destination with these commands after copying files:
cd /var/www/webroot/ROOT
find . -type d -exec chmod 755 {} \;
find . -type f -exec chmod 644 {} \;
Fix up .htaccess
and wp-config.php
files on the destination
We’ll need to replace the database information that came over in wp-config.php
with the proper stuff for the destination site. We may also need to any specific PHP paths referenced in .htaccess
if that’s in there. This why we made copies of both sets of these files near the start!
Fix upload path in the database
The upload path is often hard-coded into the database in the wp_options
table under upload_path
. We’ll need to update this to the proper location for Reclaim Press / Cloud, which is /var/www/webroot/ROOT/wp-content/uploads
.
Preview and point DNS!
You are ready to see how the migration went! Before pointing DNS for real, I’d suggest using your hosts file to preview the new site. Pointing localhost File to Preview Site – Reclaim Hosting
When you are ready, you can change your A record for the domain to point to the public IP in Reclaim Cloud. On Reclaim Press you can do the same, or you can map a domain with a CNAME record, which is super nice! You’ll also probably want to issue a Let’s Encrypt cert.
(Optional) If you are changing domain names
If we are moving a site from one domain name to another, say from oldurl.com
to newurl.com
, we’ll need to do a find and replace in the database for things to load properly. The wp
CLI is super handy for this:
wp search-replace --all-tables https://oldurl.com https://newurl.com --dry-run
wp search-replace --all-tables http://oldurl.com http://newurl.com --dry-run
Run the commands first with the --dry-run
flag as shown above to test things out, then do it for real by removing the --dry-run
flag.
You will also need to update wp-config.php
to reference the new domain name.
‘Access denied; you need (at least one of) the PROCESS privilege(s) for this operation’ when trying to dump tablespaces - Stack Exchange ↩︎
Comments