Episode ini membawa Echo ke jaringan produksi: TLS manual dengan sertifikat sendiri, Auto TLS via Let's Encrypt, HTTP/2, reverse proxy dengan nginx dan caddy, middleware.Proxy untuk load balancing, serta penanganan header X-Forwarded yang aman.

HTTP polos sudah tidak punya tempat di production. Episode ini membawa Echo ke jaringan produksi: mengamankan koneksi dengan TLS, mengotomatisasi sertifikat, dan menempatkan aplikasi di belakang proxy — arsitektur yang akan kalian temui di hampir semua deployment nyata.
Episode 15 ini membahas TLS manual, Auto TLS via Let's Encrypt, HTTP/2, reverse proxy dengan nginx dan caddy, middleware.Proxy, serta penanganan header X-Forwarded-* yang aman.
Untuk environment internal atau testing, e.StartTLS cukup. Sertifikat bisa dibuat dengan openssl:
openssl req -x509 -newkey rsa:2048 \
-keyout key.pem -out cert.pem \
-days 365 -nodes \
-subj "/CN=localhost"Jalankan server dengan sertifikat:
e.Logger.Fatal(e.StartTLS(":443", "cert.pem", "key.pem"))Perintah e.StartTLS(":443", "cert.pem", "key.pem") menangani seluruh handshake TLS. Sertifikat self-signed menimbulkan peringatan di browser — gunakan hanya untuk pengujian.
Echo mendukung Auto TLS yang meminta dan memperbarui sertifikat dari Let's Encrypt secara otomatis. Ini menghilangkan pekerjaan manual memperbarui sertifikat:
e.AutoTLSManager.HostPolicy = autocert.HostWhitelist("api.example.com")
e.AutoTLSManager.Cache = autocert.DirCache("/var/www/.cache")
go func() {
e.Logger.Fatal(e.StartAutoTLS(":443"))
}()
e.Logger.Fatal(e.Start(":80"))Kombinasi StartAutoTLS di port 443 dan Start di port 80 diperlukan: Let's Encrypt memakai HTTP untuk validasi domain sebelum menerbitkan sertifikat. Sertifikat tersimpan di cache sehingga tidak diminta ulang setiap boot.
Dengan TLS aktif, net/http dan Echo mendukung HTTP/2 secara otomatis. Tidak ada konfigurasi tambahan — klien modern akan menegosiasikan HTTP/2 saat handshake, membawa keuntungan multiplexing dan kompresi header.
Arsitektur umum: nginx menerima traffic, menangani TLS dan static caching, lalu meneruskan ke Echo:
server {
listen 443 ssl;
server_name api.example.com;
ssl_certificate /etc/letsencrypt/live/api.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/api.example.com/privkey.pem;
location / {
proxy_pass http://127.0.0.1:8080;
proxy_set_header Host $host;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
}
}Konfigurasi nginx ini meneruskan request ke Echo di 127.0.0.1:8080 sambil menyisipkan header X-Forwarded-* yang dibutuhkan aplikasi.
Echo juga bisa berperan sebagai proxy ke beberapa instance backend. middleware.Proxy dengan round-robin balancer:
e.Use(middleware.ProxyWithConfig(middleware.ProxyConfig{
Balancer: middleware.NewRoundRobinBalancer([]*middleware.ProxyTarget{
{URL: mustParseURL("http://backend-1:8080")},
{URL: mustParseURL("http://backend-2:8080")},
}),
}))Request masuk akan disebar bergantian ke backend-1 dan backend-2. Ini pola yang sama dipakai service mesh seperti Envoy.
Header X-Forwarded-For, X-Forwarded-Proto, dan X-Forwarded-Host dikirim proxy untuk memberi tahu aplikasi asal request. Masalahnya: klien juga bisa mengirim header ini dan memalsukan alamat IP.
Aturan utamanya: percayai header hanya dari proxy yang memang kalian kendalikan. Dengan middleware.Proxy internal, gunakan middleware.ExtractIPWithConfig untuk membaca IP asli dari header dengan aman:
e.Use(middleware.ExtractIPWithConfig(middleware.ExtractIPConfig{
Skipper: func(c echo.Context) bool { return false },
}))Di belakang nginx atau caddy, pastikan proxy meng-overwrite header sebelum diteruskan, bukan menambahkan nilai kedua. Kalau tidak, attacker bisa memalsukan IP yang dipakai logging dan rate limiter.
Episode 15 membawa Echo ke jaringan produksi: TLS manual dengan e.StartTLS, Auto TLS dari Let's Encrypt tanpa perawatan manual, HTTP/2 otomatis, reverse proxy dengan nginx, middleware.Proxy untuk load balancing, dan penanganan header X-Forwarded-* yang aman dari pemalsuan.
Inti yang harus dibawa pulang:
e.StartTLS memakai sertifikat manual; self-signed hanya untuk testing.StartAutoTLS mengotomatisasi sertifikat Let's Encrypt.middleware.Proxy melakukan load balancing antar instance.X-Forwarded-* hanya dipercaya dari proxy yang dikendalikan.Di episode 16 selanjutnya kita akan membahas WebSocket, streaming & SSE — koneksi WebSocket dengan gorilla/websocket di dalam handler Echo, Server-Sent Events untuk notifikasi, streaming response, dan use case chat serta long-lived connections.