mirror of
https://github.com/Pacerino/CaddyProxyManager.git
synced 2026-07-07 14:21:42 -04:00
Introduce per-host plugin support: Caddy module discovery, module config endpoints, plugin schemas (basicauth, cloudflare) and the host plugins API. On the frontend, add the Plugins page, plugin/host plugin dialogs and schema-driven form fields.
72 lines
1.7 KiB
Go
72 lines
1.7 KiB
Go
package database
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/Pacerino/CaddyProxyManager/internal/config"
|
|
"github.com/Pacerino/CaddyProxyManager/internal/logger"
|
|
|
|
"github.com/glebarez/sqlite"
|
|
"golang.org/x/crypto/bcrypt"
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
var dbInstance *gorm.DB
|
|
|
|
// NewDB creates a new connection
|
|
func NewDB() {
|
|
logger.Info("Creating new DB instance")
|
|
dbInstance = SqliteDB()
|
|
dbInstance.AutoMigrate(&Host{}, &Upstream{}, &HostPlugin{}, &User{}, &ModuleConfig{})
|
|
seedAdmin()
|
|
}
|
|
|
|
// seedAdmin creates a default admin user the first time CPM starts with an
|
|
// empty database. The credentials can be overridden via CPM_ADMIN_EMAIL and
|
|
// CPM_ADMIN_PASSWORD. This makes initial login possible without a separate
|
|
// setup step.
|
|
func seedAdmin() {
|
|
if config.Configuration.Auth.Mode == "oidc" {
|
|
return
|
|
}
|
|
var count int64
|
|
dbInstance.Model(&User{}).Count(&count)
|
|
if count > 0 {
|
|
return
|
|
}
|
|
|
|
email := config.Configuration.Admin.Email
|
|
password := config.Configuration.Admin.Password
|
|
hash, err := bcrypt.GenerateFromPassword([]byte(password), bcrypt.DefaultCost)
|
|
if err != nil {
|
|
logger.Error("AdminSeedError", err)
|
|
return
|
|
}
|
|
user := User{Name: "Admin", Email: email, Secret: string(hash), Provider: "local"}
|
|
if err := dbInstance.Create(&user).Error; err != nil {
|
|
logger.Error("AdminSeedError", err)
|
|
return
|
|
}
|
|
logger.Info("Seeded default admin user: %s", email)
|
|
}
|
|
|
|
// GetInstance returns an existing or new instance
|
|
func GetInstance() *gorm.DB {
|
|
if dbInstance == nil {
|
|
NewDB()
|
|
}
|
|
return dbInstance
|
|
}
|
|
|
|
// SqliteDB Create sqlite client
|
|
func SqliteDB() *gorm.DB {
|
|
dbFile := fmt.Sprintf("%s/caddyproxymanager.db", config.Configuration.DataFolder)
|
|
db, err := gorm.Open(sqlite.Open(dbFile), &gorm.Config{})
|
|
if err != nil {
|
|
logger.Error("SqliteError", err)
|
|
return nil
|
|
}
|
|
|
|
return db
|
|
}
|