# Gateway & Reverse Proxy (Caddy) Dokumen ini mendokumentasikan konfigurasi reverse proxy dan gateway menggunakan **Caddy** di `infra/reverse-proxy/Caddyfile`. --- ## 1. Peran Reverse Proxy Caddy bertindak sebagai pintu gerbang (*single entrypoint*) untuk seluruh lalu lintas HTTP/HTTPS dari klien ke layanan-layanan KeluargaMart: 1. **Terminasi TLS/SSL Otomatis**: Caddy secara otomatis menerbitkan dan memperbarui sertifikat SSL melalui Let's Encrypt atau ZeroSSL tanpa konfigurasi manual. 2. **Path & Subdomain Routing**: Mengarahkan lalu lintas berdasarkan URL atau domain ke container yang tepat. 3. **Security Headers**: Menyisipkan header keamanan standar (HSTS, X-Content-Type-Options, Referrer-Policy). 4. **Kompresi Realtime**: Mengaktifkan `zstd` dan `gzip` untuk mempercepat pengiriman aset web frontend. --- ## 2. Pola Routing ### Opsi A: Subdomain Routing (Rekomendasi Produksi) - `api.keluargamart.com` ➔ `backend:8080` - `erp.keluargamart.com` ➔ `erp:80` - `pos.keluargamart.com` ➔ `pos:80` - `keluargamart.com` / `b2b.keluargamart.com` ➔ `b2b:3000` - `reports.keluargamart.com` ➔ `nextreport:8000` ### Opsi B: Unified Path Routing (Single Host / Local Development) - `/*` ➔ B2B Storefront (`b2b:3000`) - `/api/*` ➔ Backend REST API (`backend:8080`) - `/erp/*` ➔ ERP Portal (`erp:80`) - `/pos/*` ➔ POS Kasir (`pos:80`) --- ## 3. Contoh Konfigurasi `Caddyfile` ```caddyfile { admin off auto_https off } :80 { # Logging log { output stdout format console } # API Backend Reverse Proxy handle /api/* { reverse_proxy backend:8080 { header_up X-Real-IP {remote_host} header_up X-Forwarded-For {remote_host} header_up X-Forwarded-Proto {scheme} } } # POS Application handle_path /pos/* { reverse_proxy pos:80 } # ERP Application handle_path /erp/* { reverse_proxy erp:80 } # B2B Frontend (Default Catch-All) handle { reverse_proxy b2b:3000 } # Global Response Compression encode zstd gzip } ``` --- ## 4. Menjalankan Caddy Lokal Untuk menguji proxy di lingkungan lokal: ```bash caddy run --config infra/reverse-proxy/Caddyfile ``` Semua aplikasi dapat diakses melalui port 80 tunggal tanpa perlu mengingat port individual masing-masing service.