How to Deploy Ghost on CentOS 7.3

Published on: Wed, Jan 25, 2017 at 3:57 pm EST
This article is a port of my "How to Deploy Ghost on Ubuntu 16.04" tutorial. It has been updated for CentOS 7.

Ghost is an open source blogging platform that is gaining popularity among developers and ordinary users since its 2013 release. It puts focus on content and blogging. The most attractive thing about Ghost is its simple, clean, and responsive design. You can write your blog posts from a mobile phone. Content for Ghost is written using the Markdown language.

In this guide we are going to set up and deploy a secure Ghost blog on an CentOS 7 VPS using Let's Encrypt, Node.js and Nginx.

Let's Encrypt (Certbot)

Before starting this step, ensure that you have set DNS records for your domain.

We are going to use Let's Encrypt Certificate Authority and its Certbot client to obtain TLS certificates for our Ghost blog. Don't forget to replace all instances of example.com with your domain name.

  1. Update system:

    yum check-update && yum update
    
  2. Install development tools:

    yum groupinstall -y 'Development Tools'
    
  3. Enable the EPEL (Extra Packages for Enterprise Linux) repository.

    # Certbot is packaged in EPEL (Extra Packages for Enterprise Linux). To use Certbot, you must first enable the EPEL repository.
    yum install -y epel-release
    
  4. Install Certbot (a.k.a Let's Encrypt client):

    yum install -y certbot
    
  5. Check version:

    certbot --version
    # certbot 0.9.3
    
  6. Obtain certificate:

    certbot certonly -d example.com -d www.example.com --email john.doe@mail.com --agree-tos --standalone
    

After going through previous steps, your certificate and private key will be in the /etc/letsencrypt/live/example.com directory.

Install NodeJS

Ghost currently supports Node versions 0.12.x, 4.2+, and 6.9+ only.

We are going to install recommended version for Ghost which is Node v4.x argon LTS at the time of this writing.

  1. Download and install the LTS version of Node.js:

    curl --silent --location https://rpm.nodesource.com/setup_4.x | bash -
    yum --disablerepo "*" --enablerepo "nodesource" install -y nodejs
    
  2. Check Node and NPM version:

    node -v && npm -v
    # v4.7.2
    # 2.15.11
    

Install Nginx

  1. Run vi /etc/yum.repos.d/nginx.repo and copy/paste the below directives and save and exit:

    [nginx]
    name=nginx repo
    baseurl=https://nginx.org/packages/mainline/centos/7/$basearch/
    gpgcheck=0
    enabled=1
    
  2. Download and install Nginx:

    yum install -y nginx
    
  3. Check Nginx version:

    nginx -v
    # nginx version: nginx/1.11.8
    
  4. Start Nginx process and check status:

    systemctl start nginx
    systemctl status nginx
    
  5. Configure Nginx as a reverse proxy:

    vi /etc/nginx/conf.d/ghost.conf
    
  6. Add the following to /etc/nginx/conf.d/ghost.conf:

    server {
        listen 80;
        listen [::]:80;
        listen 443 ssl http2;
        listen [::]:443 ssl http2;
        server_name example.com www.example.com;
    
        ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    
        location / {
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header Host $http_host;
            proxy_set_header X-Forwarded-Proto $scheme;
            proxy_pass http://127.0.0.1:2368;
        }
    }
    
  7. Check syntax:

    nginx -t
    
  8. Restart Nginx:

    systemctl restart nginx
    

Install Ghost

If you want to host multiple Ghost blogs on same VPS, each Ghost instance must be running on a separate port.

  1. Make webroot directory:

    mkdir -p /var/www/
    
  2. Create a Ghost user:

    useradd -c "Ghost Application" ghost
    
  3. Download and install Ghost:

    cd /var/www
    wget https://ghost.org/zip/ghost-latest.zip
    unzip ghost-latest.zip -d ghost
    chown -R ghost:ghost /var/www/ghost/
    rm ghost-latest.zip
    
  4. Switch to the ghost user:

    su - ghost
    
  5. Install Ghost:

    cd /var/www/ghost
    npm install --production
    
  6. Configure Ghost by changing url property of production object inside of config.js file:

    cp config.example.js config.js
    
    vi config.js
    
    config = {
        // ### Production
        // When running Ghost in the wild, use the production environment.
        // Configure your URL and mail settings here
        production: {
            url: 'https://example.com',
            ...
        }
        ...
        ...        
    
  7. Save config.js file and exit.

  8. Start Ghost:

    npm start --production
    

Ghost will now be running. Both blog front-end and admin interface are secured with HTTPS and HTTP/2 is working also. You can open your browser and visit site at https://example.com. Don't forget to replace example.com with your domain name.  

Run Ghost persistently

If you close your terminal session with your VPS, your blog will also go down. That's not good. To avoid this, we are going to use the Forever process manager. That will keep our blog up 24/7.

  1. Switch to ghost user if you are not:

    su - ghost
    
  2. Go to ghost folder

    cd /var/www/ghost
    
  3. Install Forever process manager:

    npm install forever
    
  4. Add the new forever command to your path:

    echo "export PATH=/var/www/ghost/node_modules/forever/bin:$PATH" >> ~/.bashrc
    source ~/.bashrc
    
  5. Start Ghost with forever:

    NODE_ENV=production /var/www/ghost/node_modules/forever/bin/forever start index.js
    

      At this point, forever should have started Ghost.

  6. Go to https://example.com/ghost and create a Ghost admin account. Do this as soon as possible. To check running version of Ghost go to https://example.com/ghost/about/ after creating admin account.

Conclusion

That's it. We now have a fully functional Ghost blog. If you want to change the default Ghost theme called Casper to a custom one, you can just download and unzip the theme into the /var/www/ghost/content/themes folder and select it via Ghost admin interface, located at https://example.com/ghost.