Over the last few days, I've been exploring options for making my website faster and cheaper. While I ultimately moved to the $10 Linode option, I nearly switched to Squarespace. During that trial period, I developed a guide for moving from Ghost to Squarespace.

Migrating from Ghost to WordPress

The first step of your migration will be to get your blog posts out of Ghost and into a usable format.

Exporting from Ghost

  1. Log in to your Ghost site (https://yoursite.com/ghost).
  2. Go to Settings > Labs.
  3. Under Migration Options, click Export.
  4. This will download a Ghost JSON file that will begin the process.

Converting from Ghost to WordPress

  1. Install ghost-to-wp from GitHub.
  2. Run ghost-to-wp export.json to get a usable XML file.

While this file does work with WordPress, it’s not compatible with the Squarespace WordPress import tool. So next you’ll need to use an actual WordPress instance to get a usable format.

Getting a WordPress Droplet on Digital Ocean

Digital Ocean makes it fast and easy to get up and running with WordPress in just a few minutes. Once you're signed in or signed up, just follow these instructions to get a usable WordPress instance.

  1. Click Create and then Droplets.
  2. Under Choose an Image, click Marketplace.
  3. Click the first WordPress image option.
  4. Select the Shared CPU, Basic plan at $5/mo. You’ll only need this for a few minutes.
  5. No other settings need to be adjusted, so scroll all the way down and click Create Droplet.

After a few minutes, your droplet will be created and you can SSH in to finish setting up WordPress.

ssh [email protected]
  1. For Domain/Subdomain name, enter the droplet’s IP address.
  2. Enter your details for Username, Password, and Blog Title.
  3. Respond N for LetsEncrypt since this is a short-term instance.
Domain/Subdomain name: xxx.xxx.xxx.xxx
Your Email Address: [email protected]
Username: bluesabre
Password: ********
Blog Title: bluesabre.org
Is the information correct? [Y/n] Y

Would you like to use LetsEncrypt (certbot) to configure SSL(https) for your new site? (y/n): n

Importing the WordPress Export

  1. Login to the WordPress admin dashboard (http://xxx.xxx.xxx.xxx/wp-admin).
  2. In the sidebar, go to Tools > Import.
  3. Under WordPress, click Install Now.
  4. After it installs, click Run Importer.
  5. Click Choose File and select your converted WP_Import.xml.
  6. Click Upload file and import.
  7. Under Assign Authors, assign the posts to the existing user or create additional users as needed.
  8. DO NOT select Import Attachments. You’ll be using S3 instead later.
  9. Click Submit.

Once this finishes, you can now export an official WordPress export file!

Exporting from WordPress

  1. In the sidebar, go to Tools > Export.
  2. Select All content.
  3. Click Download Export File.
  4. This will download an export file compatible with Squarespace!

Deleting the WordPress Droplet

With the export file in hand, you no longer need your temporary WordPress instance.

  1. Go to your Droplet on Digital Ocean.
  2. Click on Destroy in the droplet sidebar.
  3. Click Destroy this Droplet.
  4. Click Confirm.

Cleaning up the WordPress Export

The WordPress export file needs a bit of cleaning up before it can be imported. Open it up in your favorite text editor, and strip out every instance of “index.php/”. Without this step, your posts will be imported with the unnecessary “index.php” in the slug.

Migrating Images to Amazon S3

In my testing, Squarespace didn’t import any images, so they’ll need to be hosted elsewhere. Thankfully, Amazon S3 is incredibly affordable and easy to get set up.

Caveat: If your blog hosts more than 2,000 photos, you will go beyond the AWS free tier with the initial data push. Be sure to read up on Amazon S3 pricing if you think you may be affected.

Configuring the Bucket

  1. Set up an account with Amazon Web Services (AWS).
  2. Once you’re logged in, go to the search at the top and enter S3. Select the S3 service.
  3. Click Create Bucket.
  4. Give your bucket a memorable name, such as domain-tld.

Uncheck Block all public access.

  1. This bucket will host your static web assets and needs to be publicly accessible.
  2. For this same reason, absolutely do not use this bucket for anything else that could be sensitive in nature.
  3. Click the checkbox to acknowledge enabling public access.
  4. All other settings can remain defaulted, so scroll to the bottom and click Create Bucket.

Once the bucket has been created, proceed with uploading your images from Ghost. This can be done one-at-a-time, but you can use the AWS CLI to push the files quickly from the Ghost server.

Using the AWS CLI

Before you can use the AWS CLI, you will need to create an IAM user with S3 access permissions. The full documentation for this process can be found on Amazon, but I’ve simplified it below.

  1. Log in to your AWS IAM dashboard.
  2. In the sidebar, click Access management > Users.
  3. Click Add user.
  4. On page 1 of the Add user screen, enter a name for the user (I entered s3-upload). Select Programmatic access for the Access type. Then click Next: Permissions.
  5. On page 2, click Attach existing policies directly. A list of policies will be displayed. Search for AmazonS3FullAccess and select it. Click Next: Tags to continue.
  6. On page 3, tags are optional. Skip this step and click Next: Review to continue.
  7. On page 4, you can review the IAM user to be created. Click Create user.
  8. On page 5, you can now record your Access key id and Secret access key. These will only be displayed on this screen, so save them somewhere secure for later use.

With your S3-friendly IAM user ready to go, you can now proceed with installing the AWS CLI on your Ghost server.

  1. Install the AWS CLI version 2 according to your setup.
  2. After installing, run aws configure to start setting up your profile.
  3. For AWS Access Key ID and AWS Secret Access Key, use the values you recorded in step 8 above.

For Default region name, enter the region as found on your bucket URL (mine is us-east-2).

  1. https://s3.console.aws.amazon.com/s3/buckets/mybucket-name?region=us-east-2
  2. For Default output format, enter “json”.
  3. If everything worked correctly, you should now be able to run S3 commands. Use aws s3 ls to verify.

Finally, you have everything you need to migrate your images from Ghost to S3.

cd /var/www/ghost/content
aws s3 cp images s3://mybucket-name/content/images --recursive

This may take some time, but once it’s finished, all of your images from your Ghost server should now be available on S3.

Update the S3 Bucket Policy

Now that your files are in place, you will need to update the bucket policy to allow public read access.

  1. Go back to the AWS dashboard and head to the S3 service.
  2. Click on the bucket you created previously.
  3. Click on the Permissions tab and scroll down to Bucket policy.
  4. Add a policy that enables public access for the content directory.
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "AddPerm",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::mybucket-name/content/*"
        }
    ]
}

With this bucket policy in place, your files will now be accessible at:

https://<bucket name>.s3.<region name>.amazonaws.com/content/images/path/to/image.png

Update the WordPress export file again

With your files now on S3, update the WordPress export file again, replacing any instances of the previous paths. Replace:

  • https://yoursite.com/content/
  • /content/

with

https://<bucket name>.s3.<region name>.amazonaws.com/content/

Your WordPress export file is finally ready to be imported into Squarespace.

Import the WordPress export file into Squarespace

  1. From the Squarespace sidebar, go to Settings > Advanced > Import / Export.
  2. Click the Import button.
  3. Click WordPress.
  4. Click the Advanced tab.
  5. Select Standard WordPress for Processor.
  6. Click Add a File and select your WordPress export file.
  7. Click Begin Import.

After a few minutes, your Ghost blog will have successfully imported into Squarespace!

  1. Navigate back to the first level of the Squarespace sidebar.
  2. Click Pages.
  3. The name of your blog should appear under the Not Linked section.

You should now be up and running with Squarespace. I hope this guide helped make a large project a little more approachable. Thanks for reading!

Thanks to the following resources that helped me put this guide together!