This guide will detail the steps used to Install Ghost CMS on CentOS 8 / RHEL 8 Linux server. Ghost is an open source content management system designed for both beginners and professional bloggers and documentation teams alike. Ghost CMS has full support for Markdown and provides an easy to use web interface for both management and content generation.

For Ubuntu, check How to install Ghost CMS on Ubuntu

In this article, we will do installation of Ghost on CentOS 8 with Nginx as reverse proxy. I’m doing this setup on a fresh installation of CentOS 8. This is recommended to ensure you don’t break your Production environments.

Install and Configure Ghost on CentOS / RHEL 8

Here are the steps you’ll generally follow to install Ghost on RHEL / CentOS 8. Take a cup of coffee as you perform installation of Ghost on CentOS 8 / RHEL 8.

Step 1: Update CentOS system

We always begin our installation with yum package updates.

sudo dnf -y update
sudo reboot

After reboot, set your SELinux in permissive mode.

sudo setenforce 0
sudo sed -i 's/^SELINUX=.*/SELINUX=permissive/g' /etc/selinux/config

Step 2: Add EPEL repository

Some dependency packages will be pulled from EPEL repository. Add it to your system through command execution below.

sudo dnf -y install epel-release

Step 3: Install MySQL / MariaDB database server

Install a database server for Ghost CMS. This can either be MySQL or MariaDB database server. We have the guides for setting MySQL or MariaDB database server.

Install MariaDB on CentOS / RHEL 8

How to Install MySQL 8 on CentOS / RHEL 8

When done, Create the database for ghost blog you plan to add:

$ mysql -u root -p
CREATE USER [email protected] IDENTIFIED BY "StrongPassword";
CREATE DATABASE ghost;
GRANT ALL ON ghost.* TO [email protected];
FLUSH PRIVILEGES;
QUIT

Step 3: Install Node.js

The core of Ghost is written in Node.js. The npm package manager will be installed as a dependency.

sudo dnf -y install @nodejs

Confirm Node version

$ node -v
v10.14.1

The Ghost process can be controlled via pm2 process manager. Let’s ensure pm2 is installed in the system.

sudo npm install pm2 -g

Successful installation output;

Step 5: Install Ghost-CLI

Create Ghost admin user:

sudo useradd ghostadmin
sudo passwd ghostadmin
sudo usermod -aG wheel ghostadmin

We now need to install the package ghost-cli which provides ghost command.

$ sudo npm i -g ghost-cli
/usr/bin/ghost -> /usr/lib/node_modules/ghost-cli/bin/ghost
+ [email protected]
added 364 packages from 191 contributors in 16.712s

$ which ghost
/usr/bin/ghost

Step 4: Install Ghost on CentOS 8

Create a new folder for Ghost Data:

Please note that:

  • Installing Ghost in the /root folder won’t work and result in a broken setup!
  • Installing Ghost in your /home/{user} folder won’t work and result in a broken setup!
  • Please only use /var/www/{folder} because it has the right permissions.

So let’s create this directory:

sudo mkdir -p /var/www/ghost
sudo chown ghostadmin:ghostadmin /var/www/ghost
sudo chmod 775 /var/www/ghost

Create your Ghost project (blog) folder:

sudo su - ghostadmin
cd /var/www/ghost
mkdir blog.example.com
cd blog.example.com

Where:

  • blog.example.com is the directory containing site/blog files.
  • /var/www/ghost is the path to your blogs directories

If you want install Ghost with sqlite database, run:

ghost install --db=sqlite3

For Development environment, you can do:

ghost install local

Else to use MySQL Database, run:

$ ghost install

Provide service URL, database connection details, and agree to configure Systemd.

✔ Finishing install process
? Enter your blog URL: http://localhost:2368
? Enter your MySQL hostname: localhost
? Enter your MySQL username: ghost
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: ghost
? Do you wish to set up Systemd? Yes

This is my installation output:

Confirm service status by running:

$ ghost ls
$ systemctl status ghost_blog-computingforgeeks-com
● ghost_blog-computingforgeeks-com.service - Ghost systemd service for blog: blog-computingforgeeks-com
   Loaded: loaded (/var/www/ghost/blog.computingforgeeks.com/system/files/ghost_blog-computingforgeeks-com.service; indirect; vendor preset: disab>
   Active: active (running) since Sat 2019-10-05 19:05:48 EAT; 10min ago
     Docs: https://docs.ghost.org
 Main PID: 12669 (ghost run)
    Tasks: 18 (limit: 11512)
   Memory: 142.9M
   CGroup: /system.slice/ghost_blog-computingforgeeks-com.service
           ├─12669 ghost run
           └─12678 /usr/bin/node current/index.js
...............................................................

Example:

Step 5: Configure Nginx proxy

Install Nginx

sudo dnf install @nginx

Create Nginx configuration file for Ghost.

sudo vi /etc/nginx/conf.d/ghost.conf

Add your Website configurations.

server {
    listen 80;
    listen [::]:80;

    server_name blog.example.com;
    root /var/www/ghost/blog.example.com/system/nginx-root;

    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:2368;
        
    }

    location ~ /.well-known {
        allow all;
    }

    client_max_body_size 50m;
}

Replace:

  • blog.example.com with your Ghost site URL
  • /var/www/ghost/blog.example.com with Path to your site DocumentRoot
  • http://127.0.0.1:2368 with local Ghost listening URL

Your Nginx configuration should not contain any error.

$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Confirm the Node service backend is active.

# netstat -tunlp | grep 2368
tcp        0      0 127.0.0.1:2368          0.0.0.0:*               LISTEN      12678/node 

After confirmation, restart nginx service.

sudo systemctl enable --now nginx
sudo systemctl restart nginx

A successful restart is expected as a result of the executed command.

$ systemctl status nginx
● nginx.service - The nginx HTTP and reverse proxy server
   Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
   Active: active (running) since Sun 2019-10-06 12:05:47 EAT; 29s ago
  Process: 21817 ExecStart=/usr/sbin/nginx (code=exited, status=0/SUCCESS)
  Process: 21814 ExecStartPre=/usr/sbin/nginx -t (code=exited, status=0/SUCCESS)
  Process: 21812 ExecStartPre=/usr/bin/rm -f /run/nginx.pid (code=exited, status=0/SUCCESS)
 Main PID: 21819 (nginx)
    Tasks: 2 (limit: 11512)
   Memory: 3.9M
   CGroup: /system.slice/nginx.service
           ├─21819 nginx: master process /usr/sbin/nginx
           └─21820 nginx: worker process

Oct 06 12:05:47 centos8.novalocal systemd[1]: Stopped The nginx HTTP and reverse proxy server.
Oct 06 12:05:47 centos8.novalocal systemd[1]: Starting The nginx HTTP and reverse proxy server...
Oct 06 12:05:47 centos8.novalocal nginx[21814]: nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
Oct 06 12:05:47 centos8.novalocal nginx[21814]: nginx: configuration file /etc/nginx/nginx.conf test is successful
Oct 06 12:05:47 centos8.novalocal systemd[1]: Started The nginx HTTP and reverse proxy server.

Open http and https service ports in the firewall.

sudo firewall-cmd --add-service={http,https} --permanent
sudo firewall-cmd --reload

Step 6: Access Ghost CMS Dashboard on CentOS 8 / RHEL 8

Your setup is now ready, access Ghost web admin interface where you can upload themes, change settings and write content using markdown syntax.

To complete setup of your publication, visit: http://blog.example.com/ghost.

Create your first Ghost administrator/publisher account by clicking on “Create your account”.

Optionally invite other members. You’ll get to Ghost CMS dashboard in a few.

Step 7: Ghost Basic Management Commands

Here are the commands you’ll need for most Ghost management operations.

Logs dir: /content/logs/
$ ghost start: Start ghost
$ ghost restart: Restart ghost
$ ghost run: Test if the ghost can start successfully
$ ghost uninstall: Re-install ghost
$ ghost update: Upgrade ghost
$ ghost update –force: Force upgrade if there are errors
$ ghost update –rollback: Revert to the earlier version if an upgrade fails
$ sudo npm i -g [email protected]: Upgrade Ghost-CLI
$ ghost ssl-renew: Renew ssl certificate
$ ls ./system/files/*.conf: System configuration files
$ ghost setup nginx: Manually Setup nginx
$ ghost setup nginx ssl: Setup nginx with SSL

Other CentOS / RHEL 8 installation guides:

Install Puppet Master and Agent on CentOS 8 / RHEL 8

Enable automatic software updates on CentOS 8 / RHEL 8

How To Join CentOS 8 / RHEL 8 System to Active Directory (AD) domain

How To Set System hostname on CentOS 8 / RHEL 8