You could earn up to $300 by adding new articles!

Get Started Now

Setting up Ghost Professional Publishing Platform on OpenBSD 6

Published on: Thu, Dec 28, 2017 at 5:57 pm EST

Ghost is the latest and greatest upstart to rival WordPress. Theme development is quick and easy to learn because the Ghost developers decided to use both the ember.js and handlebars.js frameworks to remove some of the learning curve. The install and setup time should take approximately 45-60 minutes and makes use of the following technologies: Node.js, Relayd, and Httpd.

Note: Please replace with your domain name and 192.0.2.x with your assigned Vultr IP address. We will also be using self-signed certificates which are really good for testing only. If you decide to use Ghost in production, it is extremely important to be using a real certificate. Real certificates can be obtained for free using Let's Encrypt.

Configuring OpenBSD

Enable Httpd and relayd.

# rcctl enable httpd relayd

Create the /etc/httpd.conf configuration file for Httpd. In this example, the only purpose of Httpd is to redirect requests to https. Relayd will actually be the one listening on the https port and proxying requests to Ghost.

prefork 3
types { include "/usr/share/misc/mime.types" }

server "" {
    listen on port 80 
    # Redirect to https
    block return 301 "https://$SERVER_NAME:$REQUEST_URI"

Create the testing SSL certificates for your Ghost deployment. Since this will only really be for testing, you can leave most of the fields blank. The only one that you will need to complete is the Common Name field and that should match the fully-qualified domain name of the server. When you are ready to replace the self-signed certificate with ones that are true and valid, just remember to keep the file names the same. Relayd expects to find its key and certificate with the naming convention <ip address>.crt and <ip address>.key.

# cd /etc/ssl
# openssl req -x509 -new -nodes -newkey rsa:4096 -keyout private/ -out -days 364 -sha256
# chmod 0400 private/

Create the /etc/relayd.conf configuration file for Relayd. Relayd does the magic that proxies and redirects requests to Ghost.

prefork 3

http protocol https {
    match request header append "X-Forwarded-For" value "$REMOTE_ADDR"
    match request header append "X-Forwarded-By" \
        value "$SERVER_ADDR:$SERVER_PORT"

    tcp { nodelay, sack, socket buffer 65536, backlog 128 }

    tls { no tlsv1, ciphers HIGH }
    tls no session tickets
relay ghost {
    listen on port 443 tls
    protocol https
    forward to port 2368

Add the following packages.

pkg_add -r node unzip wget  

Install and Configure Ghost

Create a user and home directory for the Ghost installation. For example, create a user named ghost with a home directory called /var/www/ghost. Use a very strong password for this account.

# user add -m -c "Ghost User' -d /var/www/ghost -G wheel -g =uid -u 5000 -s /bin/ksh ghost
# passwd ghost 

Change to the ghost user and download the latest version of Ghost.

# doas su ghost
# cd /var/www/ghost
# mkdir blog
# cd blog/
# wget
# unzip

Install Ghost.

# npm install sqlite3 --sqlite=/usr/local
# npm install --production
# npm install forever
# doas npm install -g knex-migrator

Configure Ghost. Replace the database section of config.production.json with the database clause below if you would like to use sqlite instead of mysql. Sqlite will easily handle about 100,000 connections a day. If you already have MySQL installed, you can always choose to use it instead. For the defaults.json file, change the domain part of the url to your domain.

# cd core/server/config/env/config/
# vi config.production.json

"database": {
    "client": "sqlite3",
    "connection": {
            "filename": "content/data/ghost.db"

# cd core/server/config/
# vi defaults.json

"url": "http://www,",
"server": {
        "host": "",
        "port": 2368

Now we have to populate the database and start Ghost.

# cd ~/blog
# NODE_ENV=production knex-migrator init
# NODE_ENV=production ~/blog/node_modules/forever/bin/forever start ~/blog/index.js

Perform a netstat -na -f inet and look for a entry. You can also do a ps ax | grep node to verify that Ghost is running.

Open your favorite web browser and browse to You will automatically be redirected to You will be greeted with the default Ghost page.

Browse to to finish the installation.

Want to contribute ?

You could earn up to $300 by adding new articles!

Get started in the SSD Cloud!