How to Install Ghost on Ubuntu Linux

This post shows students and new users steps to install Ghost CMS on Ubuntu Linux with Nginx support. Ghost is a powerful open source publishing platform for the modern web built on Node.js platform.

The new Ghost 2.0 introduces many new features including, a powerful new editor, multi-language support, custom homepages, dynamic routes, custom structures and much more.

Ghost is a clean and lightweight platform designed for bloggers who want to focus on blogging and nothing else. Unlike WordPress and other content management systems which are based on PHP, Ghost is simple in design and function.

No additional packages and server needed, just JavaScript.

In this post, we’re going to show you how to install Nginx as proxy, MariaDB, and use Let’s Encrypt SSL certificate to secure Ghost website.

For more about Ghost, please visit its homepage.

To get started with installing Ghost on Ubuntu Linux, follow the steps below:

How to install Nginx on Ubuntu Linux

This this post, we’re going to be install Nginx HTTP server to serve as proxy to Ghost. Nginx is lightweight and should be perfect to run with Ghost.

To install Nginx, run the commands below:

sudo apt update
sudo apt install nginx

After installing Nginx, the commands below can be used to stop, start and enable Nginx service to always start up with the server boots.

sudo systemctl stop nginx.service
sudo systemctl start nginx.service
sudo systemctl enable nginx.service

Once Nginx is installed, open a web browser and browse to the server hostname or IP address. If you see a Nginx welcome page, Nginx is successfully installed and running on Ubuntu.

How to install MariaDB on Ubuntu Linux

We’re going to be using a database server with Ghost. If you’re looking for a truly open source database server, then MariaDB is a great place to start.

To install MariaDB run the commands below:

sudo apt install mariadb-server

After installing MariaDB, the commands below can be used to stop, start and enable MariaDB service to always start up when the server boots.

sudo systemctl stop mariadb.service
sudo systemctl start mariadb.service
sudo systemctl enable mariadb.service

After that, run the commands below to secure MariaDB server by creating a root password, disallowing remote root access removing anonymous and more.

sudo mysql_secure_installation

When prompted, answer the questions below by following the guide.

If you've just installed MariaDB, and haven't set the root password yet, you should just press enter here.

Enter current password for root (enter for none): PRESS ENTER

Switch to unix_socket authentication [Y/n] n

Change the root password? [Y/n] n

Remove anonymous users? [Y/n] y

Disallow root login remotely? [Y/n] y

Remove test database and access to it? [Y/n] y

Reload privilege tables now? [Y/n] y

All done!

The latest MariaDB servers comes with root user is set to use the auth_socket authentication method by default.

The auth_socket plugin authenticates users that connect from the localhost through the Unix socket file. This means that you can’t authenticate as a root by providing a password.

This can cause issues with some apps that need to connect to the database via root. To fix that, you’ll need to change the default authentication mechanism from auth_socket to mysql_native_password.

However, doing so might introduce security risks since root users shouldn’t be used to connect remotely to the database. A recommended method is to create a dedicated user to connected remotely to your database servers.

Since you don’t want to connect to MariaDB database server from phpMyAdmin as root user, you should probably create a separate account instead of connecting with root.

Run the commands below to logon to MariaDB server.

sudo mysql -u root -p

Then run the SQL commands below to create a new user for Ghost to use to connect to the database.

CREATE USER 'ghostadmin'@'localhost' IDENTIFIED BY 'very_strong_password_here';

Then grant the user full access to manage the database server.

GRANT ALL PRIVILEGES ON *.* TO 'ghostadmin'@'localhost' WITH GRANT OPTION;

If you see a similar screen as shown above, then the server was successfully installed.

Create Ghost Database on Ubuntu Linux

Now that you’ve installed all the severs above, continue below to start configuring the servers. First run the commands below to create a blank Ghost database.

To logon to MariaDB, run the commands below.

sudo mysql -u root -p

Then create a database called ghost

CREATE DATABASE ghost;

Next, use the Ghost account created above and give it access to the ghost database.

GRANT ALL ON ghost.* TO 'ghostadmin'@'localhost' WITH GRANT OPTION;

Finally, save your changes and exit.

FLUSH PRIVILEGES;
EXIT;

How to install Node.js on Ubuntu Linux

Since Ghost is based on Node.js run the commands below to download Node.js version 14 LTS packages from its repository

sudo apt install curl
curl -sL  | sudo bash -

Next, run the commands below to install Node.js and required packages in order for Ghost to function. Nginx webserver will be needed for this. s

sudo apt install nodejs

Next, run the commands below to include Yarn repository and enable it.

curl -sS  | sudo apt-key add -
echo "deb  stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

Once the repository is enabled, install yarn with:

sudo apt update
sudo apt-get -o Dpkg::Options::="--force-overwrite" install yarn

How to download and install Ghost

We’ll install Ghost using the official Ghost CLI utility. This utility allows you to install or update Ghost in a single command.

Run the commands below to install Ghost install tool.

sudo yarn global add ghost-cli

We’re going to create a folder for Ghost content in the /var/www/ghost directory. To create the folder run the commands below.

sudo mkdir -p /var/www/ghost

Next, change the folder ownership to your account so you can run the Ghost tool to download Ghost packages.

sudo chown $USER:$USER /var/www/ghost
sudo chmod 775 /var/www/ghost

Next, change into the directory and install Ghost.

cd /var/www/ghost

To start the installation, run the command below. The command will install and configure Ghost, configure Nginx as a reverse proxy , and secure the site with a free let’s encrypt SSL certificate.

ghost install

You should begin to see Ghost changing for packages that are required. Once all is validated, Ghost should begin downloading its package dependencies to install.

 Checking system Node.js version - found v14.18.0
✔ Checking logged in user
✔ Checking current folder permissions
✔ Checking system compatibility
✔ Checking for a MySQL installation
✔ Checking memory availability
✔ Checking free space
✔ Checking for latest Ghost version
✔ Setting up install directory
Downloading and installing Ghost v4.16.0 > Installing dependencies >

Next, setup the database connection with info created above.

? Enter your blog URL: 
? Enter your MySQL hostname: localhost
? Enter your MySQL username: ghostadmin
? Enter your MySQL password: [hidden]
? Enter your Ghost database name: ghost
✔ Configuring Ghost
✔ Setting up instance

When asked if you want to setup Nginx, type yes.

 Setting up "ghost" system user
ℹ Setting up "ghost" mysql user [skipped]
? Do you wish to set up Nginx? Yes
+ sudo nginx -s reload
✔ Setting up Nginx
? Do you wish to set up SSL? Yes
? Enter your email (For SSL Certificate) [email protected]
Running sudo command: mkdir -p /etc/letsencrypt
Running sudo command: ./acme.sh --install --home /etc/letsencrypt
Running sudo command: /etc/letsencrypt/acme.sh --issue --home /etc/letsencrypt --domain example.com --webroot /var/www/ghost/system/nginx-root --reloadcmd "nginx -s reload" --accountemail [email protected]
Running sudo command: openssl dhparam -out /etc/nginx/snippets/dhparam.pem 2048
Running sudo command: mv /tmp/ssl-params.conf /etc/nginx/snippets/ssl-params.conf
✔ Creating ssl config file at /var/www/ghost/system/files/example.com-ssl.conf
Running sudo command: ln -sf /var/www/ghost/system/files/example.com-ssl.conf /etc/nginx/sites-available/example.com-ssl.conf
Running sudo command: ln -sf /etc/nginx/sites-available/example.com-ssl.conf /etc/nginx/sites-enabled/example.com-ssl.conf
Running sudo command: nginx -s reload
✔ Setting up SSL

When prompted with questions below, choose yes.

 Do you wish to set up Systemd? Yes
✔ Setting up Systemd
? Do you want to start Ghost? Yes
✔ Starting Ghost

If all went well, you should then see a complete setup message similar to the one below.

Running sudo command: /var/www/ghost/current/node_modules/.bin/knex-migrator-migrate --init --mgpath /var/www/ghost/current
✔ Running database migrations
? Do you want to start Ghost? Yes
Running sudo command: systemctl is-active ghost_example-com
✔ Ensuring user is not logged in as ghost user
✔ Checking if logged in user is directory owner
✔ Checking current folder permissions
Running sudo command: systemctl is-active ghost_example-com
✔ Validating config
✔ Checking folder permissions
✔ Checking file permissions
✔ Checking content folder ownership
✔ Checking memory availability
Running sudo command: systemctl start ghost_example-com
✔ Starting Ghost
Running sudo command: systemctl is-enabled ghost_example-com
Running sudo command: systemctl enable ghost_example-com --quiet
✔ Starting Ghost
You can access your publication at 
Next, go to your admin interface at /ghost/ to complete the setup of your publication

Ghost uses direct mail by default
To set up an alternative email method read our docs at 

After that, open your browser and browse to the Ghost admin interface using the server hostname or IP address followed by /ghost/

/ghost/
Ghost setup Ubuntu

To get started click on the Create your account button to create your account and start configuring Ghost.

That should do it!

Conclusion:

This post showed you how to install Ghost CMS on Ubuntu with Nginx. If you find any error above or have something to add, please use the comment form below.