Setup a Ghost Blog on Ubuntu 16.04

Introduction

Ghost blog is a very popular, fast and open source blogging and publishing platform,  written in JavaScript, using the Node.js framework. As stated on the their website, “the inventors of JavaScript, Android and StackOverflow all use Ghost for their blogs”.

So let’s install and configure Ghost on an Ubuntu 16.04

Getting started – Install Node.js

It is possible to install Node.js using NodeSource binary distributions repository. To accomplish this task, execute the following commands:

$ curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -
$ sudo apt-get install -y nodejs

Install build tools, required for building and installing npm, with apt:

# apt-get -y install build-essential

Install Ghost

If it doesn’t already exist, create the directory /var/www/:

# mkdir -p /var/www/

There, download Ghost, grabbing the latest version from Ghost.org:

# cd /var/www
# curl -L https://ghost.org/zip/ghost-latest.zip -o ghost.zip

Next, unzip the downloaded archive:

# unzip -uo ghost.zip -d ghost

Move to the new ghost directory, and install Ghost using npm:

# cd ghost
# npm install --production

This is a very fast process, and is totally automated. At the end, Ghost will be correctly installed on the server. Start Ghost (for this moment, just for testing) :

# npm start --production

By default, Ghost runs on http://192.168.1.1:2368 (replace 192.168.1.1 with your server IP Address)

Let’s open http://192.168.1.1:2368 in our browser, we should now see:

In the terminal used for starting Ghost, the process should display a WARNING message:

WARNING: Ghost is attempting to use a direct method to send email.
It is recommended that you explicitly configure an email service.

Right now, this is not a problem and can be ignored. Stop the process with CTRL+C.

Ghost configuration

First of all, create a new user used to run Ghost with the following command:

# useradd -d /var/www -s /bin/bash ghost
# passwd ghost

Change the owner of the Ghost root directory:

# chown -R ghost:ghost /var/www/ghost

After running Ghost for the first time, looking in its root directory you should see different files. We are interested in the one named config.js .

If you haven’t yet run Ghost for the first time, you will see only config.example.js. Copy it:

# cp config.example.js config.js

Open this file with a text editor:

# $EDITOR config.js

In that, we are interested in the production block:

production: { 
 url: 'http://my-ghost-blog.com',
 mail: {},
 database: {
 client: 'sqlite3',
 connection: {
 filename: path.join(__dirname, '/content/data/ghost.db')
 },
 debug: false
 }, 

 server: {
 host: '127.0.0.1',
 port: '2368'
 }
 },

This is the default. We will change it after configuring the server.

Install and configure Apache Web Server

Install Apache with apt:

# apt-get install apache2

Next, enable SSL for Ghost. To do this, create a directory which will contain the SSL certificates:

# mkdir -p /etc/apache2/certs

Generate the certificate (self-signed) with OpenSSL, executing the command:

# openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/apache2/certs/ghost.key -out /etc/apache2/certs/ghost.crt

Change permissions on the certificate file:

# chmod 600 /etc/apache2/certs/*

Next step is to create a new Virtual Host file for Ghost. With a text editor, create a new file:

# $EDITOR /etc/apache2/sites-available/ghost.conf

In this file, paste the following content:

<VirtualHost *:80>
    ServerName myblog.com
    ServerAlias www.myblog.com
    # Force http to https
    Redirect permanent / https://myblog.com/
#    ProxyRequests off 
#    ProxyPass / http://127.0.0.1:2368/ 
#    ProxyPassReverse / http:/127.0.0.1:2368/     
</VirtualHost>

<VirtualHost *:443>

   ServerName myblog.com

   SSLEngine on
   SSLCertificateFile /etc/apache2/certs/ghost.crt
   SSLCertificateKeyFile /etc/apache2/certs/ghost.key

   ProxyPass / http://127.0.0.1:2368/
   ProxyPassReverse / http:/127.0.0.1:2368/
   ProxyPreserveHost   On

   RequestHeader set X-Forwarded-Proto "https"

</VirtualHost>

Save, exit, and activate the SSL Apache module with the following command:

# a2enmod ssl headers

Next, restart Apache:

# systemctl restart apache2

Edit Ghost configuration file

Open the config.js file we have already seen:

# $EDITOR /var/www/ghost/config.js

Change the URL line in the production block, as follows:

url: 'https://myblog.com'

Save and exit. With this change, all requests made via plain HTTP will be redirected to HTTPS.

Create a new systemd service for Ghost

To make it easier to start Ghost, we will create a new systemd service. With a text editor, create a new file:

# $EDITOR /lib/systemd/system/ghost.service

In this empty file, paste the following content:

[Unit]
Description=Ghost - Blogging platform
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/www/ghost
User=ghost
Group=ghost
ExecStart=/usr/bin/npm start --production
ExecStop=/usr/bin/npm stop --production
Restart=always
SyslogIdentifier=Ghost

[Install]
WantedBy=multi-user.target

Save and exit.

Reload the systemd daemon:

# systemd daemon-reload

Using systemd, start Ghost and enable it to start at boot time:

# systemctl start ghost
# systemctl enable ghost

Now, with a web browser, go to URL https://myblog.com and you should see the Ghost Welcome Page.

Conclusion

Ghost is an easy to configure blogging and publishing platform, used by many companies worldwide, like Mozilla and SkyNews. It’s a free and open source software which makes it possible for anyone to easily create a new blog. In this tutorial, we have shown how a full installation and configuration can be completed in just a few steps, using Ubuntu 16.04 and Apache as your web server. Blog away!

Was this answer helpful? 0 Users Found This Useful (0 Votes)