Membangun website sederhana menggunakan golang nginx dan fabric

Intro

Atas permintaan dari paman untuk membuat sebuah web sederhana untuk kebutuhan yayasan milik keluarga saya mencoba untuk melakukannya dengan golang sebagai bahasa pemrograman, nginx sebagai webserver dan fabric sebagai deployment tools.

Website ini hampir mirip dengan sebuah web company profile dan bisa menggunakan konten statik namun untuk memudahkan pengembangan berikutnya saya memutuskan untuk membangun menggunakan bahasa go.

Skema web

Website memiliki sebuah halaman homepage yang berisi tentang visi misi dan alamat yayasan, kemudian beberapa link menuju halaman berisi tentang info dari yayasan.

Dari skema ini berarti akan ada kurang lebih 7 routing.

Kode

Pertama saya menyiapkan fungsi yang bertugas sebagai handler Not Found atau yang yang lainnya

func notFound(res http.ResponseWriter, req *http.Request, status int) {
    res.WriteHeader(status)
    res.Write([]byte("Not found"))
}

Kemudian handle untuk path “/” atau landing page

func home(res http.ResponseWriter, req *http.Request) {
    if req.URL.Path != "/" {
        notFound(res, req, http.StatusNotFound)
        return
    }
    res.Header().Set("Content-type", "text/html; charset=utf-8")
    res.WriteHeader(200)
    t := template.Must(template.ParseFiles("./template/home.html", "./template/layout.html"))
    t.ExecuteTemplate(res, "layout", Data{})
}

Kode jalan di localhost dengan ip 8787.

Untuk kode selengkapnya bisa dilihat di github.com/emaniacs/yayasan-hj-siti-adjir.org

Server

Untuk server saya menggunakan nginx yang bertindak sebagai load balancer dan caching terhadap request baik assets file dan lainnya. Berikut settingan nginxnya yang saya gunakan


# setting cache
proxy_cache_path /tmp/nginx levels=1:2 keys_zone=yhsacache:30m inactive=120m;
proxy_cache_key "$scheme$request_method$host$request_uri";
proxy_cache_valid 200 30m;

# upstream 
upstream yhsa {
    server 127.0.0.1:8787;
}

server {
    listen 80;
    server_name yayasan-hj-siti-adjir.org;
    charset utf-8;

    access_log /var/log/nginx/yhsa-access.log;
    error_log /var/log/nginx/yhsa-error.log;

    location / {
        proxy_cache yhsacache;
        proxy_cache_bypass $http_cache_control;
        add_header X-Proxy-Cache $upstream_cache_status;

        include proxy_params;
        proxy_pass http://yhsa;
    }

    location ~ \.(css|js|jpg|jpeg|png|svg|eot|otf|ttf|woff) {
        expires 1y;
        access_log off;
        add_header Cache-Control "public";
        root /data/sites/yhsa/assets;
    }

    # disable dotfiles
    location ~ /\. {
        deny all;
    }
}

Deployment

Untuk memudahkan proses deploy kode saya menggunakan fabric sebagai toolsnya. fabric saya gunakan untuk initialize project, clean dan deploy di sisi server. Berikut fabric code yang saya pakai


m fabric.api import *
env.hosts = ['yayasan-hj-siti-adjir.org']
env.user = 'ardi'
env.key_filename = '/home/ardi/.ssh/id_rsa_yhsa'

GIT_REPO_URL = '[email protected]:chars19/yhsa.git'

def init():
    with settings(warn_only=True):
        result = run('test -d /data/sites/yhsa')
        if result.return_code == 0:
            print("Directory exists, do clean first")
            return
        with cd('/data/sites'):
            run('git clone '+ GIT_REPO_URL)

def clean():
    run ('rm -rfv /data/sites/yhsa')

def deploy():
    with cd('/data/sites/yhsa'):
        run('git checkout --force')
        run('git pull')
        run('/usr/local/go/bin/go build')
        run('su -c "supervisorctl restart yhsa"')

Selain menggunakan fabric di sisi server saya juga menggunakan supervisord untuk management prosesnya, tutorial tentang supervisord bisa ditemukan banyak di internet.

Ada 3 perintah yang saya gunakan di fabric, yaitu init, clean, dan deploy, berikut penjelasannya.

init

Ini digunakan untuk create project pertama kali.

clean

Untuk menghapus project yang telah ada.

deploy

Disini akan dilakukan beberapa proses seperti pull ulang dari repo, build aplikasi backed dan restart supervisord untuk backend

Selain itu untuk mempermudah saat ssh saya melakukan copy ssh key ke server dan digunakan saat deploy dengan fabric.

Action

Berikut beberapa skrinsut output dari beberapa perintah diatas.