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;