Well, I did it. I successfully migrated my blog to Ghost. It was a bit of a wild ride. I’m going to jot down a few of the nerdier lessons learned, on the off-chance someone else runs into the same problems and happens upon this post.
Exporting from WordPress
Exporting the WordPress data was easy. I just used the Ghost export plugin for WordPress. I first exported all comments to Disqus, and I didn’t worry about images, since I don’t have that many and I didn’t really care if they were lost. I guess there are ways to save the images as well, but I didn’t bother. One caveat that you might also run into: tag descriptions cannot be more that 200 characters, so trim these first or you’ll be editing JSON by hand.
I chose to download from GitHub, in case I wanted to make any changes. I made my own fork as well. Anyway, that was the easy part. Just make sure you follow the right instructions (there are extra steps if you download from GitHub, in a “contributing” section). Once I did that it was a piece of cake.
The only tricky thing was that all off the post dates were way off, so I had to adjust the dates by +7 hours. Otherwise, all of my permalinks were broken. But now BYU students can still find the MRH.
Apache Reverse Proxy
I run Apache, including a few other blogs and other tools in PHP, so I needed to figure out a way to forward all https traffic to Ghost. I tried using a socket. That was a mistake. Apache’s Unix domain socket support is questionable, and documentation is nonexistant. Save yourself the pain and just use TCP/HTTP forwarding. I set Apache to redirect any HTTP traffic to mchasej.com, so I just had to worry about the SSL/HTTPS forwarding. But be sure to add the following line to your Apache conf file, or you’ll end up with endless redirect loops:
RequestHeader add X-Forwarded-Proto https
I’m sure that there’s a variable for the “https” but since this is a *:433 virtual host, it didn’t matter.
Ok, I guess that wasn’t as hard as it needed to be. Honestly, I probably spent a good 1-2 hours trying to get the socket thing to work. And before that, I spent 5-6 hours setting up SSL between my webhost and home server’s MySQL servers, as well as resyncing the slave. That was trickier than it needed to be, mostly because it left out the important detail that the CN for the requests had to be different between the CA, server, and client certificates. But now that’s finally secure. That wasn’t even something I thought of, then I stumbled upon the settings and realized that everything between my master and slave was plaintext. Oh, and tip: setup the slave certs through the CHANGE MASTER TO MASTER_SSL_CA=… command and not through the my.cnf file.
Well, I’m done with the nerdy stuff for now. I’m really excited to start using Ghost. The only thing I’m not happy with is the lack of browser spell-check support. Other than that, I’m tickled pink with this new blogging platform. My new little laptop handles it better as well.