Pendahuluan

Jika kamu mengakses https://tanggalnya.com, permintaanmu akan diarahkan ke salah satu domain ini

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: tanggalnya.com architecture

Detail

Dalam pandangan ๐Ÿš, berikut komponennya:

  1. DNS
  2. Load Balancer
  3. Services
  4. Database
  5. Storage

DNS

Cloudflare adalah penyedia DNS yang sangat powerful, berikut record A dan CNAME saya

  • A
  • CNAME 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: logs

Services

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

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 tailscale

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!