GHOST CMS: backup and restore ⏤ Self-hosting.
We’ve talked a lot about security… but one of the most overlooked aspects of running a website is having a backup. You must take all necessary precautions to ensure that your website is regularly and safely backed up.

Maintaining a full backup of your website—including HTML, CSS, JavaScript, images, videos, and databases that store critical information such as user data and CMS configurations protects you from potential risks and ensures you can restore your site in the event of data loss, hacking, or other unexpected incidents.
🎧
According to IBM's Cost of a Data Breach Report 2024, the global average cost of a data breach reached $4.88 million in 2024—a 10% jump from the previous year and the largest annual increase since the pandemic. That's a staggering figure, especially for small businesses. No matter your industry, customer base size, or how frequently you update your site, having a backup is the digital equivalent of keeping a spare tire in your trunk—you hope never to need it, but there's peace of mind knowing it's there. The same applies to your website.
BACKUPS ARE CRUCIAL [period!]
Backup Your Business
Ghost doctor
Before running into the backup we suggest that you run the following command ghost doctor
first under your working directory.
Running this will check the system for potential hiccups, and provide information about what needs to be resolved if any issues arise.
See below (hiccups !!!)
$ ghost doctor
...
..
.
✔ Checking system Node.js version - found v18.19.0
✔ Checking logged in user
✔ Ensuring user is not logged in as ghost user
✔ Checking if logged in user is directory owner
✔ Checking current folder permissions
✔ Checking system compatibility
✔ Checking for a MySQL installation
+ sudo systemctl is-active ghost_localhost
Instance is currently running
ℹ Validating config [skipped]
✖ Checking folder permissions
✖ Checking file permissions
✖ Checking content folder ownership
✔ Checking memory availability
✔ Checking binary dependencies
✔ Checking free space
✔ Checking systemd unit file
✔ Checking systemd node version - found v18.19.0
One or more errors occurred.
1) Checking folder permissions
Message: Ghost can't access some files or directories to check for correct permissions.
Help: Run sudo find ./ -type d -exec chmod 00775 {} \; and try again.
2) Checking file permissions
Message: Ghost can't access some files or directories to check for correct permissions.
Help: Run sudo find ./ -type d -exec chmod 00775 {} \; and try again.
3) Checking content folder ownership
Message: Ghost can't access some files or directories to check for correct permissions.
Help: Run sudo find ./ -type d -exec chmod 00775 {} \; and try again.
Debug Information:
OS: Ubuntu, v22.04.3 LTS
Node Version: v18.19.0
Ghost Version: 5.76.2
Ghost-CLI Version: 1.25.3
Environment: production
Command: 'ghost doctor'
Try running ghost doctor to check your system for known issues.
As you can see from the report, Ghost can't access some files or directories because of some misconfigured permissions.
In this case, we have to run the following command to get it fixed.
$ sudo find ./ -type d -exec chmod 00775 {} \;
Let's break it down a little.
sudo
: we execute a command as root to level privileges.find ./
: the find
command is one of the most powerful tools in Linux, it searches for files in a directory hierarchy.-type d
: find all directories in the current working directory.-exec {} \;
: this tells find
to execute a specified command on each file it locates. The {}
acts as a placeholder that gets replaced with the current file name, and \;
marks the end of the command. The command runs in the directory where find
was originally executed. Only one instance of {}
is allowed in the command. While many files may match the criteria, the actual number of command executions may be fewer, as find tries to group file names efficiently where possible.chmod
: change file mode bits.
Now, let's run the command one more time:
$ ghost doctor
...
..
.
✔ Checking system Node.js version - found v18.19.0
✔ Checking logged in user
✔ Ensuring user is not logged in as ghost user
✔ Checking if logged in user is directory owner
✔ Checking current folder permissions
✔ Checking system compatibility
✔ Checking for a MySQL installation
+ sudo systemctl is-active ghost_localhost
Instance is currently running
ℹ Validating config [skipped]
✔ Checking folder permissions
✔ Checking file permissions
✔ Checking content folder ownership
✔ Checking memory availability
✔ Checking binary dependencies
✔ Checking free space
✔ Checking systemd unit file
✔ Checking systemd node version - found v18.19.0
All clear!
Now, let's run the backup command:
$ ghost backup
...
..
.
= Checking for deprecations
...
..
+ sudo systemctl is-active ghost_localhost
+ sudo mkdir -p /var/www/snub_test/backup
? Enter your Ghost administrator email address youremail@whatever.com
? Enter your Ghost administrator password [hidden]
+ sudo cp /var/www/snub_test/backup/content-from-v5.76.2-on-2024-01-29-00-59-18.json /var/www/snub_test/content/data/content-from-v5.76.2-on-2024-01-29-00-59-18.json
+ sudo cp /var/www/snub_test/backup/members-from-v5.76.2-on-2024-01-29-00-59-18.csv /var/www/snub_test/content/data/members-from-v5.76.2-on-2024-01-29-00-59-18.csv
+ sudo chown -R ghost:ghost /var/www/snub_test/content
✔ Backing up site
Backup saved to /var/www/snub_test/backup-from-[backup-name].zip
Ghost backup
The fastest way to back up your Ghost site is by using the Ghost CLI. With a single ghost backup command, it automatically generates a ZIP file containing all your site data. This step is especially important before upgrading to a major new version.
The backup ZIP file includes:
- Your content in JSON format
- A full member CSV export
- All installed themes, including your current active theme
- Images, files, and media (including video and audio)
- A copy of routes.yaml and redirects.yaml (or redirects.json)
How to Remove Existing Content for a Clean Ghost Backup
To avoid duplicating posts and to create a fresh backup, remove all existing content through the Ghost admin interface.
Here's how you can delete content from your Ghost CMS:
- Log in to your Ghost admin dashboard:
Access your Ghost site's admin dashboard by navigating to your site's URL followed by "/ghost" and logging in with your credentials. - Settings:
Go to settings (the gear or cog wheel) - Navigate to Labs:
On the Left end side, scroll down until you see Labs. - Labs menu
On the right end side, under Danger Zone, click on Delete all content.
*This will permanently delete all posts and tags from the database, a hard reset.
Import your backup data
With your new site up and running, it's time to bring your data over.
Starting in your Ghost installation directory, extract the backup ZIP file directly into the content folder to restore your data:
$ sudo unzip /path/to/backup-from-v5.1xx.x-on-202x-0x-0x-2x-0x-1x.zip -d content
You should see something similar to the one below.
Archive: /home/xxxx/backup-from-v5.1xx.x-on-202x-0x-0x-2x-0x-1x.zip
inflating: content/data/content-from-v5.1xx.x-on-202x-0x-0x-2x-0x-1x.json
inflating: content/data/members-from-v5.1xx.x-on-202x-0x-0x-2x-0x-1x.csv
creating: content/files/2024/
creating: content/files/2024/11/
inflating: content/files/2024/11/49_most_used_linux_Commands_-you_should_know.pdf
inflating: content/files/2024/11/top_five_-5-_most_commonly_used_commands.pdf
creating: content/images/2023/
creating: content/images/2023/08/
inflating: content/images/2023/08/54673r.jpg
inflating: content/images/2023/08/54673r_o.jpg
inflating: content/images/2023/08/Gabriella_bennett.jpg
inflating: content/images/2023/08/Gabriella_bennett_o.jpg
inflating: content/images/2023/08/IMG_0399.jpg
inflating: content/images/2023/08/IMG_0399_o.jpg
inflating: content/images/2023/08/IMG_0645.jpg
inflating: content/images/2023/08/IMG_0645_o.jpg
inflating: content/images/2023/08/IMG_9525.jpg
inflating: content/images/2023/08/IMG_9525_o.jpg
inflating: content/images/2023/08/alias.jpg
inflating: content/images/2023/08/alias_o.jpg
inflating: content/images/2023/08/between_apt.jpg
inflating: content/images/2023/08/between_apt_o.jpg
...
..
.
zip
is a command-line utility used to compress files and directories, making them easier to transfer, store, or email.
In contrast, unzip
is used to decompress those files, restoring them to their original form.
If not installed, you might see something like this:
$ sudo unzip: command not found.
proceed with
$ sudo apt install unzip
or
$ brew install unzip
for macOS users.
Next;
- Make sure the files have the right permissions:
$ sudo chown -R ghost:ghost content
- Restart Ghost:
$ ghost restart -d /path/to/where/is/ghost_installed
- Import your content:
$ ghost import content/data/content-from-v5.1xx.x-on-202x-0x-0x-2x-0x-1x.json
This requires your username and password, and can also be done on the labs page in Ghost Admin.
Backing up your website might seem boring, but it's an absolute lifesaver when things go wrong. I can't stress enough how critical backups are—they're not just a good habit, they're a vital part of your overall security strategy.
We hope you found these tips helpful and interesting!