183 lines
4.8 KiB
Go
183 lines
4.8 KiB
Go
package config
|
|
|
|
import (
|
|
"log"
|
|
"os"
|
|
|
|
"gopkg.in/ini.v1"
|
|
)
|
|
|
|
type DatabaseConfig struct {
|
|
Driver string // sqlite, mysql, postgres
|
|
Path string // SQLiteの場合パス
|
|
Host string
|
|
Port string
|
|
User string
|
|
Password string
|
|
Name string
|
|
}
|
|
|
|
type Config struct {
|
|
Port string
|
|
SessionSecret string
|
|
Debug bool
|
|
AllowRegistration bool
|
|
HTTPS bool
|
|
CSRFSecret string
|
|
RateLimitEnabled bool
|
|
RateLimitRequests int
|
|
RateLimitWindow int
|
|
TrustedProxies []string
|
|
Database DatabaseConfig
|
|
}
|
|
|
|
func Load(configPath string) *Config {
|
|
cfg := &Config{
|
|
Port: "8080",
|
|
SessionSecret: "",
|
|
Debug: true,
|
|
AllowRegistration: true,
|
|
HTTPS: false,
|
|
CSRFSecret: "",
|
|
RateLimitEnabled: true,
|
|
RateLimitRequests: 100,
|
|
RateLimitWindow: 60,
|
|
Database: DatabaseConfig{
|
|
Driver: "sqlite",
|
|
Path: "homework.db",
|
|
Host: "localhost",
|
|
Port: "3306",
|
|
User: "root",
|
|
Password: "",
|
|
Name: "homework_manager",
|
|
},
|
|
}
|
|
|
|
if configPath == "" {
|
|
configPath = "config.ini"
|
|
}
|
|
|
|
if iniFile, err := ini.Load(configPath); err == nil {
|
|
log.Printf("Loading configuration from %s", configPath)
|
|
|
|
section := iniFile.Section("server")
|
|
if section.HasKey("port") {
|
|
cfg.Port = section.Key("port").String()
|
|
}
|
|
if section.HasKey("debug") {
|
|
cfg.Debug = section.Key("debug").MustBool(true)
|
|
}
|
|
|
|
section = iniFile.Section("database")
|
|
if section.HasKey("driver") {
|
|
cfg.Database.Driver = section.Key("driver").String()
|
|
}
|
|
if section.HasKey("path") {
|
|
cfg.Database.Path = section.Key("path").String()
|
|
}
|
|
if section.HasKey("host") {
|
|
cfg.Database.Host = section.Key("host").String()
|
|
}
|
|
if section.HasKey("port") {
|
|
cfg.Database.Port = section.Key("port").String()
|
|
}
|
|
if section.HasKey("user") {
|
|
cfg.Database.User = section.Key("user").String()
|
|
}
|
|
if section.HasKey("password") {
|
|
cfg.Database.Password = section.Key("password").String()
|
|
}
|
|
if section.HasKey("name") {
|
|
cfg.Database.Name = section.Key("name").String()
|
|
}
|
|
|
|
section = iniFile.Section("session")
|
|
if section.HasKey("secret") {
|
|
cfg.SessionSecret = section.Key("secret").String()
|
|
}
|
|
|
|
section = iniFile.Section("auth")
|
|
if section.HasKey("allow_registration") {
|
|
cfg.AllowRegistration = section.Key("allow_registration").MustBool(true)
|
|
}
|
|
|
|
section = iniFile.Section("security")
|
|
if section.HasKey("https") {
|
|
cfg.HTTPS = section.Key("https").MustBool(false)
|
|
}
|
|
if section.HasKey("csrf_secret") {
|
|
cfg.CSRFSecret = section.Key("csrf_secret").String()
|
|
}
|
|
if section.HasKey("rate_limit_enabled") {
|
|
cfg.RateLimitEnabled = section.Key("rate_limit_enabled").MustBool(true)
|
|
}
|
|
if section.HasKey("rate_limit_requests") {
|
|
cfg.RateLimitRequests = section.Key("rate_limit_requests").MustInt(100)
|
|
}
|
|
if section.HasKey("rate_limit_window") {
|
|
cfg.RateLimitWindow = section.Key("rate_limit_window").MustInt(60)
|
|
}
|
|
if section.HasKey("trusted_proxies") {
|
|
proxies := section.Key("trusted_proxies").String()
|
|
if proxies != "" {
|
|
cfg.TrustedProxies = []string{proxies}
|
|
}
|
|
}
|
|
} else {
|
|
log.Println("config.ini not found, using environment variables or defaults")
|
|
}
|
|
|
|
if port := os.Getenv("PORT"); port != "" {
|
|
cfg.Port = port
|
|
}
|
|
if dbDriver := os.Getenv("DATABASE_DRIVER"); dbDriver != "" {
|
|
cfg.Database.Driver = dbDriver
|
|
}
|
|
if dbPath := os.Getenv("DATABASE_PATH"); dbPath != "" {
|
|
cfg.Database.Path = dbPath
|
|
}
|
|
if dbHost := os.Getenv("DATABASE_HOST"); dbHost != "" {
|
|
cfg.Database.Host = dbHost
|
|
}
|
|
if dbPort := os.Getenv("DATABASE_PORT"); dbPort != "" {
|
|
cfg.Database.Port = dbPort
|
|
}
|
|
if dbUser := os.Getenv("DATABASE_USER"); dbUser != "" {
|
|
cfg.Database.User = dbUser
|
|
}
|
|
if dbPassword := os.Getenv("DATABASE_PASSWORD"); dbPassword != "" {
|
|
cfg.Database.Password = dbPassword
|
|
}
|
|
if dbName := os.Getenv("DATABASE_NAME"); dbName != "" {
|
|
cfg.Database.Name = dbName
|
|
}
|
|
if sessionSecret := os.Getenv("SESSION_SECRET"); sessionSecret != "" {
|
|
cfg.SessionSecret = sessionSecret
|
|
}
|
|
if os.Getenv("GIN_MODE") == "release" {
|
|
cfg.Debug = false
|
|
}
|
|
if allowReg := os.Getenv("ALLOW_REGISTRATION"); allowReg != "" {
|
|
cfg.AllowRegistration = allowReg == "true" || allowReg == "1"
|
|
}
|
|
if https := os.Getenv("HTTPS"); https != "" {
|
|
cfg.HTTPS = https == "true" || https == "1"
|
|
}
|
|
if csrfSecret := os.Getenv("CSRF_SECRET"); csrfSecret != "" {
|
|
cfg.CSRFSecret = csrfSecret
|
|
}
|
|
if trustedProxies := os.Getenv("TRUSTED_PROXIES"); trustedProxies != "" {
|
|
cfg.TrustedProxies = []string{trustedProxies}
|
|
}
|
|
|
|
if cfg.SessionSecret == "" {
|
|
log.Fatal("FATAL: Session secret is not set. Please set it in config.ini ([session] secret) or via SESSION_SECRET environment variable.")
|
|
}
|
|
if cfg.CSRFSecret == "" {
|
|
log.Fatal("FATAL: CSRF secret is not set. Please set it in config.ini ([security] csrf_secret) or via CSRF_SECRET environment variable.")
|
|
}
|
|
|
|
return cfg
|
|
}
|
|
|