Last weekend, stars just aligned and I finally managed to deploy this personal blogging website I've been wanting to launch for a very long time. I have a Jenkins build server deployed in Linode/Ubuntu 16.04 and is very seldom used where I pay $10 a month (or is it $20?) so I figured why not.

I installed the following:

  1. nginx (web server)
  2. mysql (database)
  3. ghost (blog publishing platform)

I was trying to install ghost while having lunch at a mall using 4G internet and Android JuiceSSH and it just disconnected on me in the middle of an interactive SSH session. After logging again and reinstalling ghost it complains of a nodejs error something about url must be a string and not undefined. Lesson learned of course is to not have SSH session while eating.

I resumed installation of ghost at home and fixed the problem by uninstalling/reinstaling nodejs.

Next task is to buy a domain name so I chose since my linux username is always like this since my first job but without the period. For some reason .io top-level domain seemed a bit pricier than the usual .com or just maybe because the length of the domain name is smaller.

After assigning the IP address of my Linode box to the DNS server things seemed going nicely. However, I have to append :2368 port to the URL to access the website content so I have to implement a reverse proxy to the web server so that traffic in 80 port goes to ghost default port which is 2368. The problem is I'm familiar with Apache web server but not nginx. Luckily, the concept is the same just the configuration is a bit different.

Lastly, I installed an SSL certificate using Let's Encrypt and Certbot. There's an option in Certbot to automatically mess with nginx configuration and there's also an option to just generate the SSL certificate. I tried automatic nginx configuration, however, since I'm doing a proxy pass it messed up things. I have to write everything again by hand while retaining the lines generated by Certbot.

server {
    listen 80;

    return 301 https://$server_name$request_uri;

server {
    listen 443 ssl;

    ssl on;
    ssl_certificate /etc/letsencrypt/live/; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/; # managed by Certbot
    include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot

    location / {
        proxy_pass http://localhost:2368;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header Host $http_host;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;

A couple of days later, I changed the background image that I bought for like $1 and took me half a day to pick a choice. I then tried my hands on vector image logo (SVG format) using Adobe Illustrator but it's too much work. I ended up just using PNG format in Pixelmator which I created in less than 5 minutes as opposed to an hour trying vector font editing. I uploaded my bio and a photo selfie I did from Mount Ugo Benguet and things looked more interesting.

Then I did this first blog. A lot of work still needs to be done e.g. analytics, disclaimer, terms of use page, etc. but I think I can say that this is already a point of no return i.e. I guess I'll be doing blogging for the next few months/years to come so let's see.