88 lines
1.9 KiB
Go
88 lines
1.9 KiB
Go
package config
|
|
|
|
import (
|
|
"crypto/rand"
|
|
"encoding/hex"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
)
|
|
|
|
type Config struct {
|
|
Addr string
|
|
Driver string // sqlite | postgres
|
|
DSN string
|
|
AdminUser string
|
|
AdminPass string
|
|
SessionSec string
|
|
WebDist string
|
|
DataDir string
|
|
SiteURL string
|
|
InsecureDev bool
|
|
}
|
|
|
|
func getenv(k, def string) string {
|
|
if v := strings.TrimSpace(os.Getenv(k)); v != "" {
|
|
return v
|
|
}
|
|
return def
|
|
}
|
|
|
|
func Load() (*Config, error) {
|
|
root := getenv("ONE_ROOT", "")
|
|
if root == "" {
|
|
if wd, err := os.Getwd(); err == nil {
|
|
root = filepath.Dir(wd) // server/ -> repo root
|
|
} else {
|
|
root = "."
|
|
}
|
|
}
|
|
|
|
c := &Config{
|
|
Addr: getenv("ONE_ADDR", ":8080"),
|
|
Driver: strings.ToLower(getenv("ONE_DB_DRIVER", "sqlite")),
|
|
AdminUser: getenv("ONE_ADMIN_USER", "admin"),
|
|
AdminPass: getenv("ONE_ADMIN_PASSWORD", "admin"),
|
|
SessionSec: getenv("ONE_SECRET", ""),
|
|
WebDist: getenv("ONE_WEB_DIST", filepath.Join(root, "frontend", "dist")),
|
|
DataDir: getenv("ONE_DATA_DIR", filepath.Join(root, "data")),
|
|
SiteURL: getenv("ONE_SITE_URL", "http://localhost:8080"),
|
|
}
|
|
|
|
if c.Driver == "" {
|
|
c.Driver = "sqlite"
|
|
}
|
|
if c.Driver != "sqlite" && c.Driver != "postgres" && c.Driver != "postgresql" {
|
|
return nil, &badDriver{c.Driver}
|
|
}
|
|
if c.Driver == "postgresql" {
|
|
c.Driver = "postgres"
|
|
}
|
|
|
|
if c.DSN = getenv("ONE_DB_DSN", ""); c.DSN == "" {
|
|
if c.Driver == "sqlite" {
|
|
c.DSN = filepath.Join(c.DataDir, "one.db")
|
|
} else {
|
|
c.DSN = "postgres://localhost/one?sslmode=disable"
|
|
}
|
|
}
|
|
|
|
if c.SessionSec == "" {
|
|
b := make([]byte, 32)
|
|
if _, err := rand.Read(b); err != nil {
|
|
return nil, err
|
|
}
|
|
c.SessionSec = hex.EncodeToString(b)
|
|
}
|
|
|
|
c.InsecureDev = os.Getenv("ONE_ADMIN_PASSWORD") == ""
|
|
|
|
return c, nil
|
|
}
|
|
|
|
type badDriver struct{ d string }
|
|
|
|
func (e *badDriver) Error() string {
|
|
return "unsupported ONE_DB_DRIVER: " + e.d + " (use sqlite or postgres)"
|
|
}
|