Episode ini membahas deployment aplikasi Fiber: Dockerfile multi-stage dengan build statis CGO_ENABLED=0, image runtime minimal, manajemen konfigurasi lewat environment variables, health check, serta opsi deploy ke Vercel dan server biasa.

Menulis aplikasi Fiber hanya separuh perjalanan. Episode 21 membahas sisanya: deployment dan Docker — membangun image yang kecil dan aman, menjalankan aplikasi di container, mengelola konfigurasi, serta pilihan target produksi.
Aplikasi Go punya keunggulan unik: bisa dikompilasi menjadi binary statis yang berjalan tanpa runtime apa pun. Dengan strategi yang tepat, image Fiber bisa berukuran puluhan megabyte dan siap dijalankan di mana saja — dari VPS hingga orchestrator container.
Multi-stage membangun binary di satu image dan menyalin hasilnya ke image runtime yang ramping:
FROM golang:1.23-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /app/main .
FROM alpine:latest
RUN apk --no-cache add ca-certificates tzdata
WORKDIR /app
COPY --from=builder /app/main /app/main
EXPOSE 3000
CMD ["/app/main"]Tahap builder mengunduh modul dan mengompilasi binary dengan CGO_ENABLED=0 untuk build statis. Tahap runtime hanya berisi binary plus sertifikat CA dan data zona waktu — tidak ada toolchain Go di image produksi.
-ldflags="-s -w" membuang simbol dan tabel debug sehingga binary menyusut drastis. Untuk image yang lebih kecil lagi, ganti base alpine dengan scratch — pastikan binary memang statis dan sertifikat CA ditambahkan:
FROM scratch
COPY --from=builder /app/main /main
COPY --from=builder /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
EXPOSE 3000
ENTRYPOINT ["/main"]scratch menghasilkan image terkecil, tapi kalian bertanggung jawab atas semua yang dibutuhkan — seperti CA untuk koneksi TLS keluar. alpine adalah pilihan seimbang bila butuh shell untuk debugging.
Jangan hardcode nilai konfigurasi. Baca dari environment variables dengan default yang masuk akal:
app := fiber.New(fiber.Config{
Prefork: os.Getenv("PREFORK") == "true",
})
port := os.Getenv("PORT")
if port == "" {
port = "3000"
}
app.Listen(":" + port)Pola ini mengikuti twelve-factor app: konfigurasi datang dari lingkungan, bukan dari kode. Docker melewatkan env dengan -e atau file .env, dan platform cloud punya mekanisme masing-masing. Default lokal memudahkan pengembangan tanpa setup.
Orchestrator perlu tahu kapan aplikasi siap menerima traffic:
app.Get("/healthz", func(c fiber.Ctx) error {
return c.JSON(fiber.Map{"status": "ok"})
})
app.Get("/readyz", func(c fiber.Ctx) error {
if !databaseConnected() {
return fiber.NewError(fiber.StatusServiceUnavailable, "db belum siap")
}
return c.JSON(fiber.Map{"status": "ready"})
})/healthz menandakan proses hidup; /readyz menandakan dependensi (database, cache) siap. Dockerfile merujuk keduanya lewat HEALTHCHECK:
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
CMD wget -q -O - http://localhost:3000/healthz || exit 1Untuk fungsi serverless di Vercel, adaptor Fiber bisa dipanggil dari handler Go:
import "github.com/gofiber/adaptor/v2"
func handler(w http.ResponseWriter, r *http.Request) {
adaptor.FiberApp(app)(w, r)
}
func main() {
vercel.Serverless(handler)
}adaptor.FiberApp(app) mengonversi aplikasi Fiber menjadi http.Handler, dan vercel.Serverless(handler) membungkusnya untuk platform serverless. Pendekatan yang sama berlaku untuk Netlify dan platform lain yang mendukung Go. Perhatikan: panggilan yang bergantung pada satu instance (seperti session in-memory) perlu disesuaikan karena serverless bisa membuat instance baru.
docker build -t fiber-app .
docker run --rm -p 3000:3000 -e PORT=3000 fiber-app
curl http://localhost:3000/healthzdocker build menghasilkan image sesuai Dockerfile; docker run menjalankannya dengan port dan env diteruskan. Jika health check mengembalikan {"status":"ok"}, aplikasi siap menerima traffic. Cek ukuran image dengan docker images — bandingkan sebelum dan sesudah -ldflags.
Inti yang harus dibawa pulang:
CGO_ENABLED=0, runtime minimal (alpine atau scratch).-ldflags="-s -w" memperkecil ukuran binary./healthz dan /readyz untuk health check orchestrator.HEALTHCHECK di Dockerfile menjaga container tetap sehat.github.com/gofiber/adaptor/v2.Di episode 22 selanjutnya — episode terakhir — kita membahas wrap-up dengan contoh proyek CRUD lengkap yang menyatukan routing, middleware, binding, error handling, dan deployment.