You may backup ghost using the ghost UI, or using command line. Each one has its advantages and disadvantages.
|Ghost UI||Command Line|
|Easy to use||Requires command line knowledge|
|Doesn’t require stopping ghost||requires stopping ghost|
|Can’t automate (currently)||Can be automated|
|Doesn’t include images (currently)||Includes images|
Let’s go through them:
- Sign in to your ghost blog as usual at
- Go to the debug screen at
- There should be a big export button, click it and decide where you want to save it.
For those who want some more control, they can do it by command line.
- Root access to your server or have access to an account that has sudo powers on your servers – Instructions here to see how to give a linux user sudo powers.
npminstalled – Instructions here.
ghostinstalled – Instructions here
Making a backup directory
You can put your backups wherever you want, even on a different server or computer. For now I will just make a directory on the same server to put the backup.
[ahmed@amayem ~]$ mkdir ghostbackups [ahmed@amayem ~]$ ls ghostbackups
This directory will be in my home directory i.e.
/home/ahmed. I can also make it in
/var but then I would have to use
[ahmed@amayem ~]$ sudo mkdir /var/ghostbackups
Check here to see how to give a linux user sudo powers.
Discovering the content directory
- Log in to your server command line interface (probably by ssh)
Go to your ghost blog directory
[ahmed@amayem ~]$ cd /var/www/ghost/
[ahmed@amayem ghost]$ ls -1
Things look good. We are interested in the
content directory, because that is where the content is obviously.
Let’s take a peek inside:
[ahmed@amayem ghost]$ ls content/ apps data images themes [ahmed@amayem ghost]$ ls content/data/ ghost.db ghost-dev.db README.md
That’s where the ghost database, and all your posts are.
Dangers of Copying a database while operating
We can just copy that file, however that may not be a good idea to do while ghost is running in case the database is being used. It is best to turn ghost off and then do the backing up before turning ghost back on again.
This will depend on how you are running ghost. You will probably be running it in the background using
I am using
supervisor so it will look like the following:
[ahmed@amayem ~]$ sudo supervisorctl ghost RUNNING pid 654, uptime 14 days, 16:00:42 supervisor> stop ghost ghost: stopped supervisor> status ghost STOPPED Nov 05 10:41 PM supervisor> quit
I only have ghost running on forever so I will use
$forever stopall info: Forever stopped processes: data: uid command script forever pid logfile uptime data:  7z38 /usr/bin/node /var/www/ghost/index.js 791 793 /root/.forever/7z38.log 0:0:0:9.299
Making a copy of the content directory
You can choose to copy whatever you want. In this example I will copy the content directory only:
[ahmed@amayem ghost]$ cp -r content /home/ahmed/ghostbackups/2014-11-05GhostBackupContent [ahmed@amayem ghost]$ ls /home/ahmed/ghostbackups/ 2014-11-05GhostBackupContent
Looks good. Now we need to turn ghost back on.
Turning ghost on
[ahmed@amayem ghost]$ sudo supervisorctl ghost STOPPED Nov 05 10:41 PM supervisor> start ghost ghost: started supervisor> status ghost RUNNING pid 25226, uptime 0:00:03
forever start /var/www/ghost/index.js warn: --minUptime not set. Defaulting to: 1000ms warn: --spinSleepTime not set. Your script will exit if it does not stay up for at least 1000ms info: Forever processing file: /var/www/ghost/index.js
Automating backups using cron
Now that we know how to backup a file we just need to automate it using cron:
[ahmed@amayem ghost]$ crontab -e @weekly sudo supervisorctl stop ghost; cp -r /var/www/ghost/content "/home/ahmed/ghostbackups/$(date +%F)GhostBackupContent"; sudo supervisorctl start ghost
To test it replace
* * * * *, which should activate it every minute so you can test it out.
Of course replace weekly with whatever period you want. Also replace
$(date +%F) with whatever format you want. You can see different formats in
- allaboutghost.com‘s backup post.
- pantz.com‘s post on cron