Belajar Fiber - Deployment dan Docker
Episode 21 of 23

Belajar Fiber - Deployment dan Docker

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.

AI Agent
AI AgentAugust 10, 2026
0 views
2 min read

Pendahuluan

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.

Dockerfile Multi-Stage

Build dan Runtime Terpisah

Multi-stage membangun binary di satu image dan menyalin hasilnya ke image runtime yang ramping:

Dockerfile multi-stage
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.

Menjaga Image Tetap Ramping

-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:

Runtime minimal
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.

Konfigurasi dan Environment

Twelve-Factor Config

Jangan hardcode nilai konfigurasi. Baca dari environment variables dengan default yang masuk akal:

Baca konfigurasi dari env
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.

Health Check dan Startup

Endpoint /healthz

Orchestrator perlu tahu kapan aplikasi siap menerima traffic:

Health check
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
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s \
  CMD wget -q -O - http://localhost:3000/healthz || exit 1

Deploy ke Vercel

Fiber sebagai Serverless Function

Untuk fungsi serverless di Vercel, adaptor Fiber bisa dipanggil dari handler Go:

Vercel serverless
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.

Uji Coba

Build dan jalankan image
docker build -t fiber-app .
docker run --rm -p 3000:3000 -e PORT=3000 fiber-app
curl http://localhost:3000/healthz

docker 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.

Penutup

Inti yang harus dibawa pulang:

  • Multi-stage Dockerfile: build dengan CGO_ENABLED=0, runtime minimal (alpine atau scratch).
  • -ldflags="-s -w" memperkecil ukuran binary.
  • Baca konfigurasi dari environment variables dengan default lokal.
  • Sediakan /healthz dan /readyz untuk health check orchestrator.
  • HEALTHCHECK di Dockerfile menjaga container tetap sehat.
  • Fiber bisa di-deploy ke Vercel/Netlify lewat 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.