Pendahuluan
Jika kamu mengakses https://tanggalnya.com, permintaanmu akan diarahkan ke salah satu domain ini
- https://www.tanggalnya.com
- https://www1.tanggalnya.com
- https://www2.tanggalnya.com
- https://www3.tanggalnya.com
- https://www4.tanggalnya.com
Kecuali www, yang lain diarahkan ke raspy / orange pi di rumah saya.
Tapi, bagaimana bisa? Bagaimana cara saya mengekspos raspy & orange pi saya ke dunia luar?
Arsitektur
Mari kita gali lebih dalam arsitekturnya dulu
Saya membagi ingress ke 5 mesin
- VM: www
- Orange Pi 5: www1 & www2
- Raspberry Pi 4: www3 & www4
Berikut diagramnya:

Detail
Dalam pandangan ๐, berikut komponennya:
- DNS
- Load Balancer
- Services
- Database
- Storage
DNS
Cloudflare adalah penyedia DNS yang sangat powerful, berikut record A dan CNAME saya

Seperti yang bisa kamu lihat, untuk record A hanya menuju ke alamat IPv4 (Vultr Classic VM). Untuk CNAME, menuju ke cloudflared tunnel. Tunnel ini akan mengekspos port 80 dari pi saya ke dunia luar.
Akan menyimpan instance Vultr saya untuk sementara sampai stabil (tidak ada komplain dari pelanggan ๐)
Ketika menggunakan dig, tidak ada dari pi saya yang terekspos
โ dig www1.tanggalnya.com +noall +answer -t A
; <<>> DiG 9.10.6 <<>> www1.tanggalnya.com +noall +answer -t A
;; global options: +cmd
www1.tanggalnya.com. 678 IN A 172.67.203.58
www1.tanggalnya.com. 678 IN A 104.21.52.196
Load Balancer
Saya menggunakan Cloudflare Worker untuk LB. Cloudflare Worker adalah fungsi serverless (seperti AWS Lambda). Berikut source code untuk round-robin request. Saya membangun load balancer sederhana dengan health check yang diaktifkan. Cek kodenya untuk detailnya ๐ค
Logs:

Services
Sebelum mencapai service saya, ingress ditangani oleh cloudflared terlebih dahulu. Berikut arsitektur folder dan config

Cloudflared kemudian mengarahkan request ke nginx
Service saya terdiri dari monorepo Nginx + PHP ๐ + JS (FE) + hasura.io sebagai Server API GraphQL. Tidak banyak yang bisa saya katakan
Untuk mengakses server saya, saya menggunakan tailscale. Tailscale dibangun di atas WireGuard dengan menambahkan konfigurasi mesh otomatis, single sign-on (SSO), NAT traversal, transport TCP, dan Access Control Lists (ACL) terpusat. Yang terbaik? Gratis hingga 100 perangkat!
Setelah terhubung ke tailscale, lalu ssh ke ip internal

Database
Postgres. Untuk saat ini hanya single node ๐, jelas SPOF (single point of failure) ada di sini ๐ข
Di masa depan akan membangun cluster DB saya sendiri menggunakan patroni yang dihosting jelas di raspy/orange pi.
Storage
Untuk menyimpan aset kami memilih storj.io, tapi berencana bermigrasi ke Cloudflare R2 di masa depan (gratis egress ftw).
Untuk layanan cache & resize gambar, kami menggunakan wsrv
Catatan
- PROYEK INI TUJUAN UTAMANYA ADALAH MENGURANGI BIAYA SEBAGAI FOUNDER YANG BOOTSTRAP ๐คฃ
- Cloudflare Worker sudah cukup baik jika trafficmu rendah, tapi jika butuh lebih maka lebih baik menggunakan Argo Smart Routing untuk load balancer di level DNS (record A)
- Tidak ada auto recovery ๐ข. Tapi karena worker(LB) sudah memiliki health check, jika 1 node mati tidak ada traffic yang akan diberikan
Penutup
Proyek ini terutama terinspirasi oleh blog DHH yang luar biasa blog. Ruby on Rails sudah mati, hiduplah Ruby on Rails
Punya pertanyaan? Ingin berdiskusi? Hubungi saya di ardi.nusawan13[at]gmail.com!
