How to install Ghost with Apache HTTP Server on Ubuntu 20.04 (LTS)

How to install Ghost with Apache HTTP Server on Ubuntu 20.04 (LTS)

Ghost is the world’s most popular open source headless Node.js CMS — it ships with a default admin client and front-end, but you can also swap them out with your own JAMstack.

Refresh your local software package database

sudo apt-get update

Install MySQL

sudo apt-get install mysql-server

To set a password, run

sudo mysql

Now update your user with this password
Replace 'password' with your password, but keep the quote marks!

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';

Now let's create the database

CREATE DATABASE blogdb;

Then exit MySQL

quit

Install Node.js

Add the NodeSource APT repository for Node 12

curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash

Install Node.js

sudo apt-get install -y nodejs

Install Ghost-CLI

sudo npm install ghost-cli@latest -g

Create a new user

Create a new user and follow prompts

adduser barrouh

Add user to superuser group to unlock admin privileges

usermod -aG sudo barrouh

Create a directory

Create a directory for your installation

sudo mkdir -p /var/www/ghost

Replace barrouh with the name of your user who will own this directory

sudo chown barrouh:barrouh /var/www/ghost

Set the correct permissions

sudo chmod 775 /var/www/ghost

Then navigate into it

cd /var/www/ghost

Login to your Ubuntu user

su - barrouh

Run the install process

curl -L -O https://ghost.org/zip/ghost-latest.zip
unzip ghost-latest.zip
rm ghost-latest.zip
npm install --production

Open config.production.json file

sudo nano /var/www/ghost/core/shared/config/env/config.production.json

Change the configuration to be like the following:

{
  "url": "http://blog.barrouh.com",
  "server": {
    "port": 8081,
    "host": "127.0.0.1"
  },
  "database": {
    "client": "mysql",
    "connection": {
      "host": "127.0.0.1",
      "user": "root",
      "password": "@@password",
      "database": "blogdb"
    }
  },
  "paths": {
    "contentPath": "content/"
  },
  "logging": {
    "level": "info",
    "rotation": {
      "enabled": true
    },
    "transports": [
      "file",
      "stdout"
    ]
  }
}

Start Ghost

npm start --production

Output:

> ghost@3.21.0 start /var/www/ghost
> node index

[2020-06-28 17:14:28] INFO Creating table: posts
[2020-06-28 17:14:28] INFO Creating table: posts_meta
[2020-06-28 17:14:29] INFO Creating table: users
[2020-06-28 17:14:29] INFO Creating table: posts_authors
[2020-06-28 17:14:29] INFO Creating table: roles
[2020-06-28 17:14:29] INFO Creating table: roles_users
[2020-06-28 17:14:29] INFO Creating table: permissions
[2020-06-28 17:14:29] INFO Creating table: permissions_users
[2020-06-28 17:14:29] INFO Creating table: permissions_roles
[2020-06-28 17:14:29] INFO Creating table: permissions_apps
[2020-06-28 17:14:29] INFO Creating table: settings
[2020-06-28 17:14:29] INFO Creating table: tags
[2020-06-28 17:14:29] INFO Creating table: posts_tags
[2020-06-28 17:14:29] INFO Creating table: apps
[2020-06-28 17:14:29] INFO Creating table: app_settings
[2020-06-28 17:14:30] INFO Creating table: app_fields
[2020-06-28 17:14:30] INFO Creating table: invites
[2020-06-28 17:14:30] INFO Creating table: brute
[2020-06-28 17:14:30] INFO Creating table: webhooks
[2020-06-28 17:14:30] INFO Creating table: sessions
[2020-06-28 17:14:30] INFO Creating table: integrations
[2020-06-28 17:14:30] INFO Creating table: api_keys
[2020-06-28 17:14:30] INFO Creating table: mobiledoc_revisions
[2020-06-28 17:14:30] INFO Creating table: members
[2020-06-28 17:14:30] INFO Creating table: labels
[2020-06-28 17:14:30] INFO Creating table: members_labels
[2020-06-28 17:14:30] INFO Creating table: members_stripe_customers
[2020-06-28 17:14:30] INFO Creating table: members_stripe_customers_subscriptions
[2020-06-28 17:14:30] INFO Creating table: actions
[2020-06-28 17:14:30] INFO Creating table: emails
[2020-06-28 17:14:30] INFO Model: Tag
[2020-06-28 17:14:30] INFO Model: Role
[2020-06-28 17:14:31] INFO Model: Permission
[2020-06-28 17:14:31] INFO Model: User
[2020-06-28 17:14:32] INFO Model: Post
[2020-06-28 17:14:32] INFO Model: Integration
[2020-06-28 17:14:32] INFO Relation: Role to Permission
[2020-06-28 17:14:32] INFO Relation: Post to Tag
[2020-06-28 17:14:32] INFO Relation: User to Role
[2020-06-28 17:14:36] INFO Ghost is running in production...
[2020-06-28 17:14:36] INFO Your site is now available on http://blog.barrouh.com
[2020-06-28 17:14:36] INFO Ctrl+C to shut down
[2020-06-28 17:14:36] INFO Ghost boot 9.634s

Create a systemd Service File

sudo nano /etc/systemd/system/ghost.service

Content:

[Unit]
Description=Ghost: Just a blogging platform
After=network.target

[Service]
Type=simple
WorkingDirectory=/var/www/ghost
User=barrouh

ExecStart=/usr/bin/npm start --production
ExecStop=/usr/bin/npm stop --production

Restart=always

[Install]
WantedBy=multi-user.target

When you are finished, save and close the file.

Reload the systemd daemon so that it knows about our service file

sudo systemctl daemon-reload

For me i will use Ghost with Subdomain

I have already configured the subdomain blog.barrouh.com

How To Set Up Apache Virtual Host with Subdomain - Digitalocean

And i will use mod_proxy to link Apache with Ghost.

Here is an example for Tomcat:

Configuring Apache Tomcat With Apache HTTP Server - mod_proxy