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.
- homepage
- latar belakang yayasan
- program yayasan
- pengurus yayasan
- keuangan yayasan
- inisiator yayasan
- nama 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.