Files
tingz/internal/config/config.go
2025-10-14 22:35:11 +03:00

119 lines
3.0 KiB
Go

package config
import (
"fmt"
"os"
"strconv"
)
type Config struct {
AdminToken string
DeployRoot string
ReleaseRoot string
DBPath string
DBJournalMode string
DBSynchronous string
DBBusyTimeout int
MaxUploadSize int64
LogLevel string
ReleasesToKeep int
DisableFileDeleteOnUserRemove bool
TLSCert string
TLSKey string
}
func LoadConfig() (*Config, error) {
cfg := &Config{
AdminToken: os.Getenv("ADMIN_TOKEN"),
DeployRoot: getEnvOrDefault("DEPLOY_ROOT", "/var/www/docs"),
ReleaseRoot: getEnvOrDefault("RELEASE_ROOT", "/var/www/deploys"),
DBPath: getEnvOrDefault("DB_PATH", "/data/deployer.db"),
DBJournalMode: getEnvOrDefault("DB_JOURNAL_MODE", "DELETE"),
DBSynchronous: getEnvOrDefault("DB_SYNCHRONOUS", "FULL"),
DBBusyTimeout: getEnvAsInt("DB_BUSY_TIMEOUT", 10000),
MaxUploadSize: getEnvAsInt64("MAX_UPLOAD_SIZE", 104857600),
LogLevel: getEnvOrDefault("LOG_LEVEL", "info"),
ReleasesToKeep: getEnvAsInt("RELEASES_TO_KEEP", 5),
DisableFileDeleteOnUserRemove: getEnvAsBool("DISABLE_FILE_DELETE_ON_USER_REMOVE", false),
TLSCert: os.Getenv("TLS_CERT"),
TLSKey: os.Getenv("TLS_KEY"),
}
if err := cfg.validate(); err != nil {
return nil, err
}
return cfg, nil
}
func (c *Config) validate() error {
if c.AdminToken == "" {
return fmt.Errorf("ADMIN_TOKEN is required")
}
validLogLevels := map[string]bool{
"debug": true,
"info": true,
"warn": true,
"error": true,
}
if !validLogLevels[c.LogLevel] {
return fmt.Errorf("invalid LOG_LEVEL: %s (must be debug, info, warn, or error)", c.LogLevel)
}
if c.MaxUploadSize <= 0 {
return fmt.Errorf("MAX_UPLOAD_SIZE must be positive")
}
if c.ReleasesToKeep < 1 {
return fmt.Errorf("RELEASES_TO_KEEP must be at least 1")
}
return nil
}
func getEnvOrDefault(key, defaultValue string) string {
if value := os.Getenv(key); value != "" {
return value
}
return defaultValue
}
func getEnvAsInt(key string, defaultValue int) int {
valueStr := os.Getenv(key)
if valueStr == "" {
return defaultValue
}
value, err := strconv.Atoi(valueStr)
if err != nil {
return defaultValue
}
return value
}
func getEnvAsInt64(key string, defaultValue int64) int64 {
valueStr := os.Getenv(key)
if valueStr == "" {
return defaultValue
}
value, err := strconv.ParseInt(valueStr, 10, 64)
if err != nil {
return defaultValue
}
return value
}
func getEnvAsBool(key string, defaultValue bool) bool {
valueStr := os.Getenv(key)
if valueStr == "" {
return defaultValue
}
value, err := strconv.ParseBool(valueStr)
if err != nil {
return defaultValue
}
return value
}