Installing Ghost on Ubuntu, Nignx and MySQL - Part 3

In continuation of Installing Ghost on Ubuntu, Nignx and MySQL - Part 2

Finally we arrive at the Ghost part mostly...

Install Node.js

sudo apt-get update
curl -sL | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install -y build-essential

Step: Check node.js version (v4.5.0 - in my case). This will also install npm (node package manager - v2.15.9 - in my case). If by any case npm is not installed then do sudo apt-get install npm

node -v
npm -v

Install MySQL

sudo apt-get update
sudo apt-get install mysql-client mysql-server

This will install MySQL 5.7.13 by default, during installation process you will be prompted to enter / set password for the MySQL root user (make sure it is complex enough, do not ignore).

You can always change password of your root user of MySQL by following command:

sudo dpkg-reconfigure mysql-server-5.7

Check status of your MySQL and to start / stop MySQL use following command:

sudo netstat -tap | grep mysql
sudo service mysql start
sudo service mysql stop

Step: Setup database and user for Ghost. Go to MySQL CLI (will ask for root password you set during installation)

mysql -uroot -p

Step: Create database. Note: Do not forget the ; at the end of the line.

create database <database-name>;

Step: Create user (access local) and set password.

create user '<username>'@'localhost' identified by '<your password>';

Step: Grant privileges to newly created user on the newly created database

grant all privileges on <database-name>.* to '<username>'@'localhost';
flush privileges;

Install Nginx

Nginx is a high performance, lightweight web server package.

Step: Install nginx

sudo apt-get update
sudo apt-get install nginx

Step: Start / stop nginx using follow command

sudo service nginx start
sudo service nginx stop

Step: Command to check if nginx is started

ifconfig eth0 | grep inet | awk '{ print $2}'

Step: Command to make sure nginx start after reboot

update-rc.d nginx defaults

Step: Create configuration for your Ghost site. Replace to the domain (or sub-domain) name you want to host your Ghost with.

sudo nano /etc/nginx/conf.d/<domain-name>.conf

Step: Paste or write down following lines. Note change the "domain-name" with your domain name (including brackets). Also port 2525 in below code can be any port as per your wish.

server {
	listen 80;
    server_name <domain-name> www.<domain-name>;
    client_max_body_size 10M;
    location / {
    	proxy_pass http://localhost:2368/;
        proxy_redirect off;
        proxy_set_header HOST $host;
        proxy_buffering off;
    location ~^/ghost/(signup) {
    	return 404;

Save this file (Ctrl + x > Y > Enter).

Note: You can skip

location ~^/ghost/(signup) {
    	return 404;

in above code till you do not signup on your ghost blog. (This block of code will prevent anyone to signup or create account on your blog).

Step: Create cache directory for webserver

sudo mkdir /var/cache/nginx
sudo chown www-data:www-data /var/cache/nginx

Step: Create web root directory and directory for the ghost we need to install for your domain.

sudo mkdir /var/www
sudo chown www-data:www-data /var/www
sudo mkdir /var/www/<domain-name>
sudo chown www-data:www-data /var/www/<domain-name>

Step: Remove default file if found in any of the following directories:
/etc/nginx/conf.d/, /etc/nginx/sites-available/ or /etc/nginx/sites-enabled.

Get Ghost

Step: Prepare for "Go get ghost" step.

sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y zip wget

Step: Navigate to /var/www/<domain-name>/ directory and download ghost. Then we will unzip the ghost package and install ghost (this will install all packages that is require it to run).

cd /var/www/<domain-name>/
sudo wget
sudo unzip -d ghost
sudo mv /var/www/<domain-name>/ghost/* /var/www/<domain-name>
sudo npm install --production

Step: Edit ghost - config file to modify and add Ghost configurations.

sudo nano config.example.js

Step: Go to ### Production section and modify it to make it look similar to this

production {
	url: 'http://<domain-name>,
    mail: {
    	transport: 'SMTP',
        options: {
        	service: 'Gmail',
            auth: {
            	user: 'mail-sender-email',
                pass: 'mail-sender-password'
    database: {
    	client: 'mysql',
        connection: {
        	host: 'localhost',
            user: 'demouser01',
            password: '<db-user-password>',
            database: '<database-name>',
            charset: 'utf8'
        debug: false
    server: {
    	host: '',
        port: '2368'

You can use other mail provider to setup mail sending configurations. Change the 2525 port in server section to the post you decided to use (ref: /etc/nginx/conf.d/<domain-name>.conf)

Step: Check if Ghost is ready and runs as expected or not

sudo npm start --production

This will create a copy of config.example.js and create config.js which will be used by Ghost to run.
If Ghost was configured correctly then you will see ghost home page at http:// with casper (default theme).

Step: Navigate to http://domain-name/ghost/signup to create new user for writing ghost posts and access backend at http://domain-name/ghost/

Step: Setup forever to run this ghost instance continuously

npm install forever -g

Step: You can start and stop this ghost instance using following command

NODE_ENV=production forever start index.js
forever stop index.js
forever list

Here remember to run those commands from the root folder where your ghosts files are residing. In this example case it is /var/www/<domain-name>/

Enjoy your Ghost !!