Moving posts from Ghost v1 to v2
In Ghost blog, I tried to export this current blog - as json - and import it to the new blog.
However, I received the error:
Import failed
Request is larger than the maximum file size the server allows
Looking at the server's response it was:
413 Request Entity Too Large
nginx/1.17.3
So my nginx proxy refuses to process a file this big in the upload.
nginx.config per domain
With the nginx-proxy docker image, there's a way to create hostname specific configurations:
I have mapped the folder ./nginx/vhost.d
to /etc/nginx/vhost.d
inside the container.
In that folder I can create a file named after the hostname. In this case:
blog-test.aaronlenoir.com
Configure entity size
According to this website I must add a client_max_body_size
setting to the ´http´, ´server´ or ´location´ context.
In my case, the config files are by default in the location
context so I can add a line:
client_max_body_size 2M;
The file is about 1.6M so this should be enough.
Restart nginx
To restart I take down all the containers using docker-compose:
sudo docker-compose down
And I restart it back in "background mode" (-d
):
sudo docker-compose up -d
If there are no errors with my config, the nginx docker container will be up and running quickly, otherwise it'll probably bail out and I will have to look at the docker-compose output.
Luckily, everything started up without a hitch!
Import Warnings
After this change, I was able to import all posts.
There were a few warnings:
- User: Entry was imported, but we were not able to resolve the following user references: created_by, updated_by. The user does not exist, fallback to owner user.
- User: Entry was not imported and ignored. Detected duplicated entry.
- Settings: Theme not imported, please upload in Settings - Design
- Settings: Permalink Setting was removed. Please configure permalinks in your routes.yaml.
Only the last one, I think, will require some looking into.
Permalinks
On my blog, I enable permalinks. This adds a date to the URL. Apparently, according to the warning, I should use routes.yaml
for this.
In the "Labs" section of ghost I can upload a routes configuration file. But I'm not sure what I should put in the file.
The default, according to the Ghost 2 docs, looks like this:
routes:
collections:
/:
permalink: /{slug}/
template: index
taxonomies:
tag: /tag/{slug}/
author: /author/{slug}/
My current blog posts have a URL in the form of:
https://blog.aaronlenoir.com/<YYYY>/<MM>/<DD>/<POST_TITLE>
This post on Some Dude's Tech Blog already details how to do this.
The permalink
line needs updating to /{year}/{month}/{day}/{slug}/
:
routes:
collections:
/:
permalink: /{year}/{month}/{day}/{slug}/
template: index
taxonomies:
tag: /tag/{slug}/
author: /author/{slug}/
So I put this in a routes.yaml file and upload it ... this did the trick.
Checking on the server, the file is stored in: data/ghost/settings
.
It may seem unimportant, but when I add a third party comment app to my blog, the comments from the old blog will still be there if the URL of the posts remains the same.
Images
The json that exports my posts does not include images.
For this, I must copy the "images" folder from my original blog to the new one. The images folder can be found in data/ghost/images
Since both are on the same server, I could do this in a single command:
cp -a ~/aaronlenoir.com/blog/data/ghost/images ~/aaronlenoir.com/blog2/data/ghost
Conclusion
In this post I wanted to import my existing posts in a blog running on Ghost 1.25.7 to a new blog running on Ghost 2.
I exported my posts using the Labs section in the Administration section.
That gave me a 1.6 MB JSON file which I could not upload because nginx limited the upload size. I changed the setting client_max_body_size
to be 2M
, which allowed me to import the posts.
Secondly, I made sure the URL's to the posts remained the same by restoring the "permalink" setting that includes the date in my posts.
Finally, I copied over all images from my old posts, which were not included in the export.
I had some other warnings during the import. They were not so important: couldn't find an old author and a duplicated entry. Finally, it complained it could not find my custom theme. But that's for next time.