Skip to main content

Database Config

Dokumentasi konfigurasi koneksi database.

Overview​

Package config menyediakan function untuk membangun Database Source Name (DSN) dari environment variables.

DatabaseConfiguration Struct​

type DatabaseConfiguration struct {
Driver string
Dbname string
Username string
Password string
Host string
Port string
LogMode bool
}

DbConfiguration​

Membangun DSN string untuk master dan replica database.

func DbConfiguration() (string, string)

Return Values​

ReturnDeskripsi
masterDSNConnection string untuk master database
replicaDSNConnection string untuk replica database

Implementation​

func DbConfiguration() (string, string) {
// Master Database
masterDBName := viper.GetString("MASTER_DB_NAME")
masterDBUser := viper.GetString("MASTER_DB_USER")
masterDBPassword := viper.GetString("MASTER_DB_PASSWORD")
masterDBHost := viper.GetString("MASTER_DB_HOST")
masterDBPort := viper.GetString("MASTER_DB_PORT")
masterDBSslMode := viper.GetString("MASTER_SSL_MODE")

// Replica Database
replicaDBName := viper.GetString("REPLICA_DB_NAME")
replicaDBUser := viper.GetString("REPLICA_DB_USER")
replicaDBPassword := viper.GetString("REPLICA_DB_PASSWORD")
replicaDBHost := viper.GetString("REPLICA_DB_HOST")
replicaDBPort := viper.GetString("REPLICA_DB_PORT")
replicaDBSslMode := viper.GetString("REPLICA_SSL_MODE")

masterDBDSN := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=%s",
masterDBHost, masterDBUser, masterDBPassword,
masterDBName, masterDBPort, masterDBSslMode,
)

replicaDBDSN := fmt.Sprintf(
"host=%s user=%s password=%s dbname=%s port=%s sslmode=%s",
replicaDBHost, replicaDBUser, replicaDBPassword,
replicaDBName, replicaDBPort, replicaDBSslMode,
)

return masterDBDSN, replicaDBDSN
}

Environment Variables​

Master Database​

VariableDeskripsiExample
MASTER_DB_HOSTDatabase hostlocalhost
MASTER_DB_PORTDatabase port5432
MASTER_DB_NAMEDatabase namesisappra
MASTER_DB_USERDatabase usernamepostgres
MASTER_DB_PASSWORDDatabase passwordsecret
MASTER_SSL_MODESSL modedisable

Replica Database​

VariableDeskripsiExample
REPLICA_DB_HOSTReplica hostreplica.db.local
REPLICA_DB_PORTReplica port5432
REPLICA_DB_NAMEReplica database namesisappra
REPLICA_DB_USERReplica usernamepostgres_read
REPLICA_DB_PASSWORDReplica passwordsecret
REPLICA_SSL_MODESSL modedisable

DSN Format​

host=HOST user=USER password=PASSWORD dbname=DBNAME port=PORT sslmode=SSLMODE

Example DSN​

host=localhost user=postgres password=secret123 dbname=sisappra port=5432 sslmode=disable

SSL Modes​

ModeDeskripsi
disableTidak menggunakan SSL
requireMenggunakan SSL, tidak verifikasi certificate
verify-caSSL dengan verifikasi CA
verify-fullSSL dengan verifikasi CA dan hostname

Development​

MASTER_SSL_MODE=disable

Production​

MASTER_SSL_MODE=verify-full

Usage​

func main() {
config.SetupConfig()

masterDSN, replicaDSN := config.DbConfiguration()

if err := database.DbConnection(masterDSN, replicaDSN); err != nil {
log.Fatal("Failed to connect to database")
}
}

Connection String for Different Databases​

PostgreSQL (Current)​

host=localhost user=postgres password=secret dbname=sisappra port=5432 sslmode=disable

MySQL​

user:password@tcp(localhost:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local

SQLite​

/path/to/database.db

Best Practices​

  1. Use Different Credentials for Master/Replica

    • Master: Read/Write user
    • Replica: Read-only user
  2. Enable SSL in Production

    MASTER_SSL_MODE=verify-full
    REPLICA_SSL_MODE=verify-full
  3. Use Connection Pooling

    sqlDB, _ := db.DB()
    sqlDB.SetMaxIdleConns(10)
    sqlDB.SetMaxOpenConns(100)
  4. Monitor Connection Health

    sqlDB, _ := db.DB()
    if err := sqlDB.Ping(); err != nil {
    log.Fatal("Database not reachable")
    }

Troubleshooting​

Connection Refused​

Error: dial tcp 127.0.0.1:5432: connect: connection refused

Solution: Pastikan PostgreSQL server running dan port benar.

Authentication Failed​

Error: password authentication failed for user "postgres"

Solution: Cek username dan password di .env.

Database Does Not Exist​

Error: database "sisappra" does not exist

Solution: Buat database terlebih dahulu:

CREATE DATABASE sisappra;