I moved my domain from the
.dev and at the same time I wanted to set up a blog for our farm.
I really like the Ghost blogging platform, so I wanted to stay with them, but I didn't want to pay for 2 servers, so I wanted to see if it was possible to host 2 ghost blogs on 1 server, without a lot of hassle.
The good news is that the Ghost CLI handles it all really well.
For each installation, Ghost will set up its own database user, its own database, its own Nginx configs, its own SSL certificates and even its own ghost systemctl runner (as far as I can tell).
The only thing you need to do to make it happen is give each ghost instance its own folder to live in and the Ghost CLI takes care of the rest.
If you know how to do the rest, then you can stop reading here.
But if you are not 100% sure on how to set up a ghost blog, I will go through the steps to do so.
Ghost Blog Setup
These are the 2 articles that I used to get an idea of how to install a single ghost blog.
I ended up doing a combination of both of these, so my walkthrough is a little different.
I started with a server with ubuntu installed, so once I had logged into the server, the first thing I did was update the packages.
sudo apt update;sudo apt upgrade # chose to keep the grub file when there was a new version
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash - sudo apt install nodejs node -v # v10.18.1 npm -v # 6.13.4
sudo apt-get install mysql-server
This script walks your through a few options that will secure MySQL.
Make sure that you set a root password in this step as it will be needed for Ghost-CLI.
Enable MySQL on startup.
sudo systemctl enable mysql
Install Nginx Web Server
Ghost needs a web server to handle incoming web requests and passing them to the running ghost instances. In our case, we will use Nginx.
sudo apt install nginx
If you are using the UFW firewall, then you also need to open port 80 and 443.
sudo ufw allow 80/tcp sudo ufw allow 443/tcp
Create an A Record For Your Blog Domain Name
Before installing Ghost, it’s recommended that you create the DNS
A record for your blog domain name. The A record points your domain name to the IP address of your Ubuntu server.
I bought my 2 new domain names from NameCheap and used their DNS to create
A records pointing to the server IP address for
Note: This step is important, I messed this step up and pointed the
A record to the wrong ip for the first one I set up. I ended up having to uninstall it and delete all the things it had done and run it again on a clean folder to reinstall it.
sudo npm install ghost-cli@latest -g
This installs the Ghost-CLI globally so that it can be used from anywhere on the server.
Installing a Ghost website
This is the part that needs to be repeated for each blog that you want to install on your server.
You will just need to make sure that they each have their own installation folder.
To create a directory do the following:
sudo mkdir -p /var/www/firstblog/
You then need to give your user special permissions for this new folder. Replace
youruser with your actual username on the server.
sudo setfacl -R -m u:youruser:rwx /var/www/firstblog/ sudo chown youruser: /var/www/firstblog sudo chmod 775 /var/www/firstblog
Next navigate to this new directory
Then, you run Ghost-CLI and let it do the rest.
It will ask you questions along the way.
When it asks for the website url, according to one of the guides I was following, if you give it to them with the
https on the front, like
https://firstblog.com then Ghost will ask you about setting up the SSL for you and then do it all for you if you say yes.
Other things that it asks you are for the MySQL server location, which if you have been following this guide will be
localhost and then you will need to give it
root as the MySQL user and then give it the root password you set earlier.
I just said yes to everything else and when it was done, the site was all set up for me and running, ready for me to login and start adding content.
Again, if you create another directory with permissions and do the
ghost install command again, it will create a second, completely separate instance that will run separately alongside your other instance.