For the complete documentation index, see llms.txt. This page is also available as Markdown.

Configuration

Selama ini kita menulis konfigurasi seperti port server dan koneksi database secara hardcoded โ€” langsung ditulis dalam kode. Ini masalah besar karena:

  • Berbeda antara laptop developer (development) dengan server produksi

  • Konfigurasi rahasia (password database) tidak boleh masuk ke repository Git

  • Mengganti konfigurasi memerlukan compile ulang kode

Solusinya adalah membaca konfigurasi dari environment variable dan file .env.

๐Ÿ“‚ Kode Lengkap Bab Ini: Seluruh kode yang dibahas di bab ini tersedia di GitHub:

๐Ÿ”— github.com/jacky-htg/workshop/tree/main/06-configuration

6.1 Strategi Konfigurasi

Lingkungan
Sumber Konfigurasi
Contoh

Development

File .env

APP_PORT=9000

Production

Environment variable

export APP_PORT=8080

Container (Docker)

Environment variable

-e APP_PORT=8080

Pola yang akan kita terapkan:

  1. Baca file .env jika ada (untuk development)

  2. Jika variabel yang sama diset di environment, nilai environment lebih prioritas

  3. Setiap konfigurasi memiliki nilai default (fallback)

6.2 Library yang Digunakan

Kita akan menggunakan dua library:

  • godotenv โ€“ membaca file .env

  • go-libs/env โ€“ wrapper yang memberi prioritas ke environment variable

Install dependency:

6.3 File .env

Buat file .env di root proyek:

Keamanan: Jangan commit file .env ke Git! Tambahkan .env ke .gitignore.

6.4 Struct Konfigurasi

Buat folder config/ dan file config/config.go. Struct ini akan mengelompokkan konfigurasi berdasarkan domainnya:

Pola ini penting: Dengan mengelompokkan konfigurasi, kita bisa dengan mudah melewatkan cfg.Server atau cfg.Database ke fungsi yang membutuhkan, bukan seluruh Config.

6.5 Fungsi LoadConfig

Fungsi LoadConfig akan membaca environment (dan file .env jika ada), lalu mengembalikan struct Config yang sudah terisi:

Perhatikan setiap nilai memiliki fallback default โ€” parameter kedua di env.EnvInt, env.EnvDuration, dll.

6.6 Update Package Database

Ubah pkg/database/postgre.go untuk menerima konfigurasi:

Penjelasan tambahan tentang connection pool:

  • MaxOpenConns โ€“ maksimal koneksi aktif ke database (25 adalah nilai yang baik untuk aplikasi skala sedang)

  • MaxIdleConns โ€“ koneksi idle yang disimpan untuk dipakai ulang

  • ConnMaxLifetime โ€“ maksimal umur koneksi (mencegah koneksi stale)

  • ConnMaxIdleTime โ€“ waktu maksimal koneksi idle sebelum ditutup

6.7 Update CLI dan Server

cmd/cli/main.go

cmd/server/main.go

Perhatikan bahwa GracefulShutdownTimeout sekarang juga dibaca dari konfigurasi (tidak hardcoded 30 detik lagi).

6.8 Menjalankan Aplikasi

Ringkasan Bab 6

Di bab ini kita telah belajar:

Konsep
Implementasi

Environment variable

Prioritas tertinggi, aman untuk production

File .env

Untuk development, tidak di-commit

Default values

Fallback jika variabel tidak diset

Struct grouping

ServerConfig, DatabaseConfig โ€“ mudah di-passing

Connection pool

SetMaxOpenConns, SetMaxIdleConns, dll

Manfaat yang kita peroleh:

  • โœ… Tidak ada lagi hardcoded configuration

  • โœ… Password database bisa disimpan di environment (aman)

  • โœ… Port, timeout, dan koneksi database bisa diubah tanpa recompile

  • โœ… Connection pool database bisa diatur sesuai beban

  • โœ… Satu kode berjalan di development dan production

Yang akan datang:

  • โŒ Belum ada log yang terstruktur (masih pakai log.Printf)

  • โŒ Belum ada error handling yang konsisten

Pada bab berikutnya, kita akan membahas pola penggunaan log.Fatal yang disiplin dan terpusat.

Last updated