Homelab: GitOps yang Men-deploy Situs Ini
Kubernetes k3d di rumah, dipapar ke internet lewat VPS dan terowongan WireGuard, dengan ArgoCD yang menarik perubahan dari Git. Termasuk halaman yang sedang Anda baca.
Homelab ini menjalankan stack observability lengkap di atas Kubernetes (k3d), dengan paparan publik yang diperantarai VPS lewat WireGuard. Halaman yang sedang Anda baca ini di-deploy oleh mesin yang sama.
Arsitektur
Jalur request dirancang supaya homelab tidak pernah terhubung langsung ke internet publik. Cloudflare menangani TLS di edge, sebuah VPS jadi reverse proxy, dan terowongan WireGuard membawa trafiknya masuk:
Internet → Cloudflare → VPS (Caddy) → terowongan WireGuard → Caddy homelab → NodePort k3d → Pod
Yang perlu digarisbawahi: tidak ada port masuk yang dibuka di rumah. Terowongannya dibangun dari dalam ke luar. Yang punya alamat publik hanya VPS-nya, dan yang bisa dijangkau dari VPS hanya apa yang sengaja diarahkan ke sana.
Seluruh trafik lewat proxy Caddy di level host, bukan DNAT. Ini bukan pilihan estetis — isolasi bridge Docker membuat DNAT tidak berperilaku seperti yang diharapkan, dan menempatkan Caddy di host jauh lebih mudah dipahami saat ada yang salah jam dua pagi.
Bukan kubectl apply
Tidak ada yang di-deploy dengan tangan. Repo homelab-platform yang jadi sumber kebenaran, dan ArgoCD yang menariknya masuk. Manifes aplikasi disusun dengan Kustomize (base + overlays/production), infrastrukturnya lewat Helm values, dan argocd/ berisi Application CRD-nya.
Rantai deploy untuk situs ini berjalan begini:
- Push ke
masterdi repo situs. - GitHub Actions membangun image dan mendorongnya ke GHCR sebagai
ghcr.io/arisros/arisjirat-site:latest. - ArgoCD Image Updater memantau tag itu, mendeteksi digest baru, lalu menulis digest itu kembali ke repo
homelab-platform— langsung keoverlays/production/kustomization.yaml. - ArgoCD melihat commit baru di repo GitOps-nya dan menyinkronkan cluster.
argocd-image-updater.argoproj.io/image-list: site=ghcr.io/arisros/arisjirat-site:latest
argocd-image-updater.argoproj.io/site.update-strategy: digest
argocd-image-updater.argoproj.io/write-back-method: git
argocd-image-updater.argoproj.io/write-back-target: kustomization
Strateginya digest, bukan latest, dan ini bagian yang penting. Tag latest yang bergerak berarti Kubernetes bisa menjalankan image yang berbeda dari yang tertulis di Git, dan tidak ada yang bisa memberi tahu kita image mana yang sebenarnya sedang jalan. Dengan digest yang di-pin balik ke Git, isi cluster selalu bisa dibaca dari sebuah commit. Rollback jadi git revert, bukan mengingat-ingat tag mana yang tadi dipakai.
syncPolicy menyalakan selfHeal dan prune. Artinya perubahan yang saya lakukan langsung ke cluster akan dikembalikan sendiri oleh ArgoCD — yang terasa menjengkelkan tepat sekali, lalu setelah itu terasa melegakan.
Stack
| Lapisan | Tool |
|---|---|
| Orkestrasi | Kubernetes via k3d |
| GitOps | ArgoCD + ArgoCD Image Updater |
| Manifest | Kustomize (base + overlays), Helm untuk infrastruktur |
| Monitoring | Prometheus + Grafana + Alertmanager |
| Logging | Loki + Grafana Alloy |
| Tracing | Tempo (OpenTelemetry) |
| Secrets | HashiCorp Vault |
| Reverse proxy | Caddy, di VPS dan di homelab |
| VPN | Terowongan WireGuard |
| DNS / CDN | Cloudflare (mode proxy campuran) |
| CI/CD | GitHub Actions → GHCR → GitOps |
Monitoring
Seluruh service mengirim telemetri ke Grafana, yang jadi muka tunggal untuk ketiga sinyal observability:
- Dashboard — 35+ panel mencakup kondisi cluster, aplikasi, dan infrastruktur.
- Alerting — dirutekan lewat Alertmanager ke Telegram.
- SLO — kebijakan burn-rate yang menentukan kapan harus dibangunkan, bukan threshold mentah.
Bidang observability-nya sendiri tetap privat, hanya bisa dijangkau lewat WireGuard. Grafana tidak punya alamat publik, dan memang tidak butuh.
Apa saja yang jalan di sini
Selain situs ini: demo deteksi jalan berlubang, bot notifikasi WhatsApp, runner absensi terjadwal, beberapa aplikasi internal, dan Vault yang menyimpan kredensialnya. Semuanya di-deploy lewat jalur yang sama — satu direktori di apps/, satu Application CRD, dan tidak ada langkah manual.