Convert db backend to use Gorm, with basis for support

for Mysql and Postgres in addition to existing Sqlite
This commit is contained in:
Jamie Curnow
2023-05-26 11:04:43 +10:00
parent b4e5b8b6db
commit 29990110b1
93 changed files with 1215 additions and 3075 deletions

View File

@ -0,0 +1,16 @@
package config
import (
"fmt"
)
type acmesh struct {
Home string `json:"home" envconfig:"optional,default=/data/.acme.sh"`
ConfigHome string `json:"config_home" envconfig:"optional,default=/data/.acme.sh/config"`
CertHome string `json:"cert_home" envconfig:"optional,default=/data/.acme.sh/certs"`
}
// GetWellknown returns the well known path
func (a *acmesh) GetWellknown() string {
return fmt.Sprintf("%s/.well-known", a.Home)
}

View File

@ -0,0 +1,79 @@
package config
import (
"fmt"
"strings"
)
const (
DatabaseSqlite = "sqlite"
DatabasePostgres = "postgres"
DatabaseMysql = "mysql"
)
type db struct {
Driver string `json:"driver" envconfig:"optional,default=sqlite"`
Host string `json:"host" envconfig:"optional,default="`
Port int `json:"port" envconfig:"optional,default="`
Username string `json:"username" envconfig:"optional,default="`
Password string `json:"password" envconfig:"optional,default="`
Name string `json:"name" envconfig:"optional,default="`
SSLMode string `json:"sslmode" envconfig:"optional,default=deisable"`
}
// GetDriver returns the lowercase driver name
func (d *db) GetDriver() string {
return strings.ToLower(d.Driver)
}
// GetGormConnectURL is used by Gorm
func (d *db) GetGormConnectURL() string {
switch d.GetDriver() {
case DatabaseSqlite:
return fmt.Sprintf("%s/nginxproxymanager.db", Configuration.DataFolder)
case DatabasePostgres:
return fmt.Sprintf("host=%s user=%s password=%s dbname=%s port=%d sslmode=%s TimeZone=UTC",
d.Host,
d.Username,
d.Password,
d.Name,
d.Port,
d.SSLMode,
)
case DatabaseMysql:
return fmt.Sprintf("%s:%s@tcp(%s:%d)/%s?charset=utf8mb4&parseTime=True&loc=Local",
d.Username,
d.Password,
d.Host,
d.Port,
d.Name,
)
}
return ""
}
// GetDBMateConnectURL is used by Dbmate
func (d *db) GetDBMateConnectURL() string {
switch d.GetDriver() {
case DatabaseSqlite:
return fmt.Sprintf("sqlite:%s/nginxproxymanager.db", Configuration.DataFolder)
case DatabasePostgres:
return fmt.Sprintf("postgres://%s:%s@%s:%d/%s?sslmode=%s",
d.Username,
d.Password,
d.Host,
d.Port,
d.Name,
d.SSLMode,
)
case DatabaseMysql:
return fmt.Sprintf("mysql://%s:%s@%s:%d/%s",
d.Username,
d.Password,
d.Host,
d.Port,
d.Name,
)
}
return ""
}

View File

@ -1,7 +1,6 @@
package config
import (
"fmt"
"npm/internal/logger"
)
@ -30,22 +29,12 @@ type log struct {
Format string `json:"format" envconfig:"optional,default=nice"`
}
type acmesh struct {
Home string `json:"home" envconfig:"optional,default=/data/.acme.sh"`
ConfigHome string `json:"config_home" envconfig:"optional,default=/data/.acme.sh/config"`
CertHome string `json:"cert_home" envconfig:"optional,default=/data/.acme.sh/certs"`
}
// Configuration is the main configuration object
var Configuration struct {
DataFolder string `json:"data_folder" envconfig:"optional,default=/data"`
DisableIPV4 bool `json:"disable_ipv4" envconfig:"optional"`
DisableIPV6 bool `json:"disable_ipv6" envconfig:"optional"`
Acmesh acmesh `json:"acmesh"`
DB db `json:"db"`
Log log `json:"log"`
}
// GetWellknown returns the well known path
func (a *acmesh) GetWellknown() string {
return fmt.Sprintf("%s/.well-known", a.Home)
}