1) TLDR
tet tet tetttt … balek lagi sama saya, berrabe … dimana saya suka memecahkan masalah tanpa masalah … YEAY 😎
kali ini, saya pengen curhat dikit tentang jiwa kere hore saya …. 😅
Jadi saya punya beberapa WEB-APP yang mau di jalanin, katakanlah ada Wordpress, Grafana dll … tapi saya ga mau jalanin WEB-APP tadi di server-server terpisah kaya gini nih
+-------------------------+
| |
+----------> | SERVER 1 (WordPress) |
| | |
+--------------+ | +-------------------------+
+--------+ | | |
| USER | +------> | INTERNET | +-+
+--------+ | | | +-------------------------+
+--------------+ | | |
+----------> | SERVER 2 (GRAFANA) |
| |
+-------------------------+
saya mau nya yangggg … paket hematttt kere hore ala anak kostan setiap akhir bulan, yang kalo makan nasi nya satu ember tapi lauknya cuman tempe goreng secuil 😩
pokoknya saya mau yang gimana caranya, semua WEB-APP yang buanyak tadi muat dalam satu server, dan AKTIF SEMUA
+-------------------------+
| SERVER 1 |
+--------------+ | |
+--------+ | | | = WordPress |
| USER | +------> | INTERNET | +-------> | = PHPMyAdmin |
+--------+ | | | = Grafana |
+--------------+ | = dst |
| |
+-------------------------+
dan jugaaaa, per aplikasi ini di bedakan per domain, bukan per port …. ingat ya, per DOMAIN, jadi wordpress di wp.berrabe.com
dan grafana di dash.berrabe.com
Uda kere, banyak mau nya pulakk 😑 … huufttt 😪
tapi seperti biasaaa, tetap panik dan jangan tenang, karna berrabe selalu tidak punya solusi YEAY 😎
2) Reverse Proxy … Gebetan Yang Terlupakan
Setelah bertapa selama 1 jam di depan laptop, akhirnya saya ketemu dan kenalan ama gebetan baru saya reverse proxy 😅 … ni saya kasih fotonya
hhmm … hhmm … hhmm … 😱
sepertinya saya mulai jatuh cinta … eh, paham maksudnya 😅 … kalau di lihat dari gambar, dalam satu server bisa di letakkan 2 website yang berbeda dengan di kasih reverse-proxy di depannya
btw, gambarnya kalo di lihat malah kayak cinta segitiga 😂
3) PDKT Sama Gebetan Baruuu
kayaknya bakal seru nih mainan ama gebetan reverse-proxy, hehe 😍
perlu di ingat, semua teknologi ini berbasis docker … baik reverse-proxy maupun webapps / upstream server nya, jadi pastikan uda paham apa itu docker dan istilah2 di dalamnya
nah, gambaran jelasnya akan seperti ini
3.a) Persiapan Nembak Gebetan
sebelum menggunakan reverse proxy, pastikan sudah ada otak nya dulu .. yaitu docker, cara install nya sangattttt mudahhh
> curl -fsSL https://get.docker.com -o get-docker.sh
> sh get-docker.sh
> systemctl start docker
3.b) Setup Env
okeh, supaya mudah dalam maintenance kedepannya … maka lebih baik di buat folder hirarki berstruktur seperti di bawah
Reverse_Proxy/
├── auto_net.brb
├── docker-compose.yml
tidak semua file akan di isi langsung, bertahap … karna artikel ini akan puanjang 😱
4) Compose File != Surat Cinta
setelah selesai membuat struktur folder, saat nya mengisi file-file yang telah di buat … copy config di bawah ke file docker-compose.yml
version: "2.2"
services:
reverse-proxy:
image: jwilder/nginx-proxy:alpine
container_name: reverse-proxy
volumes:
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./reverse-proxy/cert:/etc/nginx/certs
- ./reverse-proxy/vhost.d:/etc/nginx/vhost.d
- ./reverse-proxy/html:/usr/share/nginx/html
- ./reverse-proxy/dhparam:/etc/nginx/dhparam
- ./conf/my_proxy.conf:/etc/nginx/conf.d/my_proxy.conf:ro
ports:
- "80:80"
- "443:443"
environment:
- HTTPS_METHOD=noredirect
- DEFAULT_HOST=example.com
restart: unless-stopped
cpus: 1
mem_limit: 100M
memswap_limit: 100M
network_mode: bridge
reverse-proxy-letencrypt:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: reverse-proxy-letencrypt
volumes_from:
- reverse-proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./reverse-proxy/acme:/etc/acme.sh
environment:
- DEFAULT_EMAIL=xxx@example.com
depends_on:
- reverse-proxy
restart: unless-stopped
cpus: 1
mem_limit: 100M
memswap_limit: 100M
network_mode: bridge
⚠️ Note : Oiya, jangan lupa ganti beberapa value yang ada kata example.com
ke domain yang sudah di sediakan
5) Jalanin Aja Dulu
menjalankan docker-compose reverse-proxy ini sangat mudah … tidak seperti menjalankan hubungan yang tidak pasti 😞
> docker-compose up -d
Starting reverse-proxy ... done
Starting reverse-proxy-letencrypt ... done
untuk melihat status container nya, apakah sudah up / restart gegara ada error
> docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
67627ced6c7e jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 3 seconds ago Up 2 seconds reverse-proxy-letencrypt
59f8fc51bfbc jwilder/nginx-proxy:alpine "/app/docker-entrypo…" 21 seconds ago Up 2 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp reverse-proxy
6) Testing
untuk testing, pastikan sudah punya domain sendiri … contoh nya di sini berrabe.com
yang di pointing ke ip server 1.2.3.4
… jangan lupa, server nya yang sudah ada reverse-proxy nya
1. berrabe.com ----> 1.2.3.4
2. a.berrabe.com ----> 1.2.3.4
3. b.berrabe.com ----> 1.2.3.4
setelah di pastikan domain sudah ada dan resolved dengan benar ke ip server, jalankan web server sederhana untuk mengecek apakah reverse-proxy sudah berjalan dengan semestinya
> docker run -d \
--name web \
-e VIRTUAL_HOST=a.berrabe.com \
-e LETSENCRYPT_HOST=a.berrabe.com \
nginx:alpine
untuk melihat apakah ada error saat proses auto-generated conf dan ssl certs berjalan, bisa di lihat pakai command
> docker-compose logs -f
seharusnya docker-reverse-proxy yang tadi di jalankan menggunakan compose mendeteksi adanya container nginx:alpine
diatas dan otomatis men-generated conf untuk nginx dan validasi ssl certs
dannn … tadaaa, reverse-proxy bisa di gunakan
> curl -s -I http://a.berrabe.com | head -n 1
HTTP/1.1 200 OK
> curl -s -I https://a.berrabe.com | head -n 1
HTTP/2 302
⚠️ Note : agar reverse-proxy berhasil, pastikan antara container reverse-proxy dan container upstream harus dalam satu network (default bridge) … lihat di sini
7) Untuk Yang Kepo
untuk yang kepo bagaimana cara kerja docker ini
- pertama, kita menjalankan docker reverse-proxy menggunakan docker-compose … yang akan menciptakan 2 container, yaitu
reverse-proxy
danreverse-proxy-letencrypt
reverse-proxy
untuk auto-gen conf dan handle nginx reverse proxy lewat proxy passreverse-proxy-letencrypt
untuk auto-gen dan validasi SSL Certs
- setelah 2 container RP tadi berjalan, saat nya menjalankan WEB-APP / Upstream Server (contoh: nginx:alpine)
- saat WEB-APP berjalan dan status nya UP, maka 2 container RP tadi tau kalau ada container baru, gimana bisa tahu? karna dia komunikasi dengan
docker.sock
- jika container baru yang sudah UP tadi terdapat 2 environment variable seperti
VIRTUAL_HOST
danLETSENCRYPT_HOST
, maka 2 container RP akan men-generated conf sesuai dengan :VIRTUAL_HOST
untuk generated domain mapping ke nginx conf, terdapat di/etc/nginx/conf.d/default.conf
pada containerreverse-proxy
LETSENCRYPT_HOST
untuk generated dan validasi SSL Certs domain menggunakan letsencrypt
8) Peringatan
Agar reverse-proxy ini bekerja, pastikan antara container reverse-proxy dan container upstream (contoh: nginx-alpine) berada dalam satu network (default bridge) … jika semisal upstream di jalan kan sebagai docker-compose up
yang biasanya akan otomatis auto generated nama network sendiri, maka container reverse-proxy tadi harus di masukkan ke network tersebut … artikel nya ada di docker reverse proxy #2
jika yang ndak mau repot-repot copy paste script di atas, tinggal clone github saya di sini