Move Jekyll blog to Ubuntu VPS

herrkaefer 2017-02-20 [blog, jekyll, vps, ubuntu]

(Tested on: Linode with Ubuntu 16.04 LTS)

Install Jekyll on Ubuntu VPS




sudo apt update && apt -y upgrade



sudo apt install ruby ruby-dev ruby-bundler zlib1g-dev build-essential make gcc git jekyll bundler

Automated deployment with Git

On VPS,




mkdir ~/blog.git # the site source



mkdir -p ~/www/blog # the built site

Setup git hook to automatically build the site whenever after site source is updated:




cd ~/blog.git



git init --bare



cp hooks/post-update.sample hooks/post-receive

> --bare means that our folder will have no source files, just the version control.

Edit hooks/post-receive:




#!/bin/sh



GIT_REPO=$HOME/blog.git



TMP_GIT_CLONE=$HOME/tmp/blog



PUBLIC_WWW=$HOME/www/blog



git clone $GIT_REPO $TMP_GIT_CLONE



jekyll build -s $TMP_GIT_CLONE -d $PUBLIC_WWW



rm -Rf $TMP_GIT_CLONE



exit

Serve static site with Nginx

Install nginx:




sudo apt install nginx

Add a configuration:




sudo nano /etc/nginx/conf.d/blog.conf

with content:




server {



# listen on http (port 80)



# remove the "default_server" if you are running multiple sites off the same VPS



listen 80 default_server;



# the IP address of your VPS



server_name herrkaefer.com;



# see http://nginx.org/en/docs/http/server_names.html for options



# to use your own domain, point a DNS A record at this IP address



# and set the server name to (eg.) "blog.example.com"



# the path you deployed to. this should match whatever was in your



# Capistrano deploy file, with "/current" appended to the end



# (Capistrano symlinks to this to your current site)



root /home/herrkaefer/www/blog;



index index.html



# how long should static files be cached for, see http://nginx.org/en/docs/http/ngx_http_headers_module.html for options.



expires 1d;



}

Then remove default config file and restart Nginx:




sudo rm /etc/nginx/sites-enabled/default



sudo systemctl restart nginx

Remember to allow Nginx port if the firewall is enabled.

Local machine setup

On local machine, in Jekyll repo folder, add remote repository:




cd [jekyll_blog_folder]

Show remotes:




git remote -v

Add remote named web:




git remote add web username@[host]:~/blog.git

If you need to specify other SSH port, you should do:




git remote add web ssh://username@[host]:[port][absolutePathTo]/blog.git

note that ssh:// can not be omitted.

Write and publish

After writing,




git commit -am "blog updated"



git push web master

Troubleshoot

Nginx 403 Forbidden

nginx 403 Forbidden 排错记录 - 简书