Recently, I tried to upgrade my self-hosted Ghost blog (https://ron.sh/) from version 3 to 4. It is installed in an Ubuntu machine but for some reason, ghost-cli is failing. I made several attempts but none of these are working for me.
Yesterday, I tried another approach - using Docker. With this approach, I am not reliant to ghost-cli anymore. The Docker approach worked for me and I believe this is more flexible and easily upgradable.
Here is my Compose file:
version: "3.8"
services:
<site-name>: # update site-name
image: ghost:4.5.0-alpine
restart: always
ports:
- "127.0.0.1:8085:2368"
env_file:
- env/<site-name>.env # update site-name
volumes:
- ./.content/<site-name>:/var/lib/ghost/content # update site-nameWith this format I can extend and host multiple Ghost containers in one docker-compose.yml file. [I am currently hosting 2 Ghost blogs]
Also, I can run my Ghost server locally with the env file below. mail* is optional but you will need this in production to send "secure" emails. In production, replace url with the correct URL.
url=http://localhost:8085
mail__transport=<mail-transport>
mail__options__service=<mail-service>
mail__options__host=<mail-host>
mail__options__port=<mail-port>
mail__options__auth__user=<mail-user>
mail__options__auth__pass=<mail-password>The last step in deploying to production is making sure that you have a SSL certificate. I used nginx to route my traffic and Let's Encrypt for the free SSL certificate. You can generate a certificate using certbot using the following command.
certbot --nginx -d <domain>Next, edit the generated nginx configuration in (/etc/nginx/sites-available/default) by changing the location / block and adding client_max_body_size 50m; (this is for uploading large images).
location / {
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header Host $http_host;
proxy_pass http://127.0.0.1:8085;
}
client_max_body_size 50m;If you are using another host and port, just replace proxy_pass http://<host>:<port> with correct values.
If all are set properly, just run docker-compose up -d. Enjoy!
Required files when migrating
- Export all contents from your Ghost admin page (including redirects and routes). Make sure to rename
routes.ymltoroutes.yamlbefore importing it to the new server as Ghost 4 does not accept.ymlfile. - Copy the
imagefolder from thecontentdirectory. You can't export images from from the admin page 😢. Just put theimagefolder in the generated content directory.content/<site-name>(whatever you put in the Compose file). For some images to reflect properly, you need to restart the container/s withdocker-compose down && docker-compose up -d.
Final Thoughts
- Using the Docker approach is much simpler and more portable.
- You can host multiple Ghost servers easily with a single Compose file.
- No need to create a separate Linux non-root user as required by
ghost-cli.