From 4dee1da2aed6c96a71aac4257e16ced46513ed0c Mon Sep 17 00:00:00 2001 From: kiwiidb Date: Thu, 16 Feb 2023 14:46:39 +0100 Subject: [PATCH] feature: add db pool config --- db/db.go | 8 ++++- integration_tests/util.go | 4 +-- lib/service/config.go | 65 ++++++++++++++++++++------------------- main.go | 2 +- 4 files changed, 44 insertions(+), 35 deletions(-) diff --git a/db/db.go b/db/db.go index a194ae7..7f0a437 100644 --- a/db/db.go +++ b/db/db.go @@ -4,19 +4,25 @@ import ( "database/sql" "fmt" "strings" + "time" + "github.com/getAlby/lndhub.go/lib/service" "github.com/uptrace/bun" "github.com/uptrace/bun/dialect/pgdialect" "github.com/uptrace/bun/driver/pgdriver" "github.com/uptrace/bun/extra/bundebug" ) -func Open(dsn string) (*bun.DB, error) { +func Open(config *service.Config) (*bun.DB, error) { var db *bun.DB + dsn := config.DatabaseUri switch { case strings.HasPrefix(dsn, "postgres://") || strings.HasPrefix(dsn, "postgresql://") || strings.HasPrefix(dsn, "unix://"): dbConn := sql.OpenDB(pgdriver.NewConnector(pgdriver.WithDSN(dsn))) db = bun.NewDB(dbConn, pgdialect.New()) + db.SetMaxOpenConns(config.DatabaseMaxConns) + db.SetMaxIdleConns(config.DatabaseMaxIdleConns) + db.SetConnMaxLifetime(time.Duration(config.DatabaseConnMaxLifetime) * time.Second) default: return nil, fmt.Errorf("Invalid database connection string %s, only (postgres|postgresql|unix):// is supported", dsn) } diff --git a/integration_tests/util.go b/integration_tests/util.go index 5bf606f..8acf8a4 100644 --- a/integration_tests/util.go +++ b/integration_tests/util.go @@ -53,7 +53,7 @@ func LndHubTestServiceInit(lndClientMock lnd.LightningClientWrapper) (svc *servi LNDAddress: mockLNDAddress, LNDMacaroonHex: mockLNDMacaroonHex, } - dbConn, err := db.Open(c.DatabaseUri) + dbConn, err := db.Open(c) if err != nil { return nil, fmt.Errorf("failed to connect to database: %w", err) } @@ -87,7 +87,7 @@ func LndHubTestServiceInit(lndClientMock lnd.LightningClientWrapper) (svc *servi } func clearTable(svc *service.LndhubService, tableName string) error { - dbConn, err := db.Open(svc.Config.DatabaseUri) + dbConn, err := db.Open(svc.Config) if err != nil { return fmt.Errorf("failed to connect to database: %w", err) } diff --git a/lib/service/config.go b/lib/service/config.go index cd41902..ed9cb03 100644 --- a/lib/service/config.go +++ b/lib/service/config.go @@ -6,37 +6,40 @@ import ( ) type Config struct { - DatabaseUri string `envconfig:"DATABASE_URI" required:"true"` - SentryDSN string `envconfig:"SENTRY_DSN"` - SentryTracesSampleRate float64 `envconfig:"SENTRY_TRACES_SAMPLE_RATE"` - LogFilePath string `envconfig:"LOG_FILE_PATH"` - JWTSecret []byte `envconfig:"JWT_SECRET" required:"true"` - AdminToken string `envconfig:"ADMIN_TOKEN"` - JWTRefreshTokenExpiry int `envconfig:"JWT_REFRESH_EXPIRY" default:"604800"` // in seconds, default 7 days - JWTAccessTokenExpiry int `envconfig:"JWT_ACCESS_EXPIRY" default:"172800"` // in seconds, default 2 days - LNDAddress string `envconfig:"LND_ADDRESS" required:"true"` - LNDMacaroonFile string `envconfig:"LND_MACAROON_FILE"` - LNDCertFile string `envconfig:"LND_CERT_FILE"` - LNDMacaroonHex string `envconfig:"LND_MACAROON_HEX"` - LNDCertHex string `envconfig:"LND_CERT_HEX"` - CustomName string `envconfig:"CUSTOM_NAME"` - Host string `envconfig:"HOST" default:"localhost:3000"` - Port int `envconfig:"PORT" default:"3000"` - EnableGRPC bool `envconfig:"ENABLE_GRPC" default:"false"` - GRPCPort int `envconfig:"GRPC_PORT" default:"10009"` - DefaultRateLimit int `envconfig:"DEFAULT_RATE_LIMIT" default:"10"` - StrictRateLimit int `envconfig:"STRICT_RATE_LIMIT" default:"10"` - BurstRateLimit int `envconfig:"BURST_RATE_LIMIT" default:"1"` - EnablePrometheus bool `envconfig:"ENABLE_PROMETHEUS" default:"false"` - PrometheusPort int `envconfig:"PROMETHEUS_PORT" default:"9092"` - WebhookUrl string `envconfig:"WEBHOOK_URL"` - FeeReserve bool `envconfig:"FEE_RESERVE" default:"false"` - AllowAccountCreation bool `envconfig:"ALLOW_ACCOUNT_CREATION" default:"true"` - MinPasswordEntropy int `envconfig:"MIN_PASSWORD_ENTROPY" default:"0"` - MaxReceiveAmount int64 `envconfig:"MAX_RECEIVE_AMOUNT" default:"0"` - MaxSendAmount int64 `envconfig:"MAX_SEND_AMOUNT" default:"0"` - MaxAccountBalance int64 `envconfig:"MAX_ACCOUNT_BALANCE" default:"0"` - Branding BrandingConfig + DatabaseUri string `envconfig:"DATABASE_URI" required:"true"` + DatabaseMaxConns int `envconfig:"DATABASE_MAX_CONNS" default:"10"` + DatabaseMaxIdleConns int `envconfig:"DATABASE_MAX_IDLE_CONNS" default:"5"` + DatabaseConnMaxLifetime int `envconfig:"DATABASE_CONN_MAX_LIFETIME" default:"30"` + SentryDSN string `envconfig:"SENTRY_DSN"` + SentryTracesSampleRate float64 `envconfig:"SENTRY_TRACES_SAMPLE_RATE"` + LogFilePath string `envconfig:"LOG_FILE_PATH"` + JWTSecret []byte `envconfig:"JWT_SECRET" required:"true"` + AdminToken string `envconfig:"ADMIN_TOKEN"` + JWTRefreshTokenExpiry int `envconfig:"JWT_REFRESH_EXPIRY" default:"604800"` // in seconds, default 7 days + JWTAccessTokenExpiry int `envconfig:"JWT_ACCESS_EXPIRY" default:"172800"` // in seconds, default 2 days + LNDAddress string `envconfig:"LND_ADDRESS" required:"true"` + LNDMacaroonFile string `envconfig:"LND_MACAROON_FILE"` + LNDCertFile string `envconfig:"LND_CERT_FILE"` + LNDMacaroonHex string `envconfig:"LND_MACAROON_HEX"` + LNDCertHex string `envconfig:"LND_CERT_HEX"` + CustomName string `envconfig:"CUSTOM_NAME"` + Host string `envconfig:"HOST" default:"localhost:3000"` + Port int `envconfig:"PORT" default:"3000"` + EnableGRPC bool `envconfig:"ENABLE_GRPC" default:"false"` + GRPCPort int `envconfig:"GRPC_PORT" default:"10009"` + DefaultRateLimit int `envconfig:"DEFAULT_RATE_LIMIT" default:"10"` + StrictRateLimit int `envconfig:"STRICT_RATE_LIMIT" default:"10"` + BurstRateLimit int `envconfig:"BURST_RATE_LIMIT" default:"1"` + EnablePrometheus bool `envconfig:"ENABLE_PROMETHEUS" default:"false"` + PrometheusPort int `envconfig:"PROMETHEUS_PORT" default:"9092"` + WebhookUrl string `envconfig:"WEBHOOK_URL"` + FeeReserve bool `envconfig:"FEE_RESERVE" default:"false"` + AllowAccountCreation bool `envconfig:"ALLOW_ACCOUNT_CREATION" default:"true"` + MinPasswordEntropy int `envconfig:"MIN_PASSWORD_ENTROPY" default:"0"` + MaxReceiveAmount int64 `envconfig:"MAX_RECEIVE_AMOUNT" default:"0"` + MaxSendAmount int64 `envconfig:"MAX_SEND_AMOUNT" default:"0"` + MaxAccountBalance int64 `envconfig:"MAX_ACCOUNT_BALANCE" default:"0"` + Branding BrandingConfig } type BrandingConfig struct { diff --git a/main.go b/main.go index 828933e..1da692b 100644 --- a/main.go +++ b/main.go @@ -78,7 +78,7 @@ func main() { logger := lib.Logger(c.LogFilePath) // Open a DB connection based on the configured DATABASE_URI - dbConn, err := db.Open(c.DatabaseUri) + dbConn, err := db.Open(c) if err != nil { logger.Fatalf("Error initializing db connection: %v", err) }