- docker-compose.yml: db (timescaledb/pg17) + backend + frontend - backend/Dockerfile: multi-stage (golang:1.24-alpine -> debian:bookworm-slim) - frontend/Dockerfile: multi-stage (node:22-alpine -> nginx:alpine), Build-Args fuer VITE_* - frontend/nginx.conf: SPA-Routing + Asset-Caching - .env.example: BACKEND_HOST, DB_PASSWORD, JWT_SECRET, API_KEY - backend/config/config.go: ENV-Var-Support vervollstaendigt (JWT_SECRET, API_KEY, DB_PORT, DB_USER, DB_NAME) - backend/config.yaml.example: ENV-Var Kommentare ergaenzt - README: Docker-Quickstart als empfohlener Einstieg (3 Befehle) - .gitignore: .env zur ignore-Liste hinzugefuegt
84 lines
1.7 KiB
Go
84 lines
1.7 KiB
Go
package config
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
|
|
"github.com/cynfo/rmm-backend/db"
|
|
|
|
"gopkg.in/yaml.v3"
|
|
)
|
|
|
|
type Config struct {
|
|
ListenAddr string `yaml:"listen_addr"`
|
|
TLSCert string `yaml:"tls_cert"`
|
|
TLSKey string `yaml:"tls_key"`
|
|
APIKeys []string `yaml:"api_keys"`
|
|
JWTSecret string `yaml:"jwt_secret"`
|
|
Database db.DBConfig `yaml:"database"`
|
|
}
|
|
|
|
func Load(path string) (*Config, error) {
|
|
cfg := &Config{
|
|
ListenAddr: ":8443",
|
|
TLSCert: "certs/server.crt",
|
|
TLSKey: "certs/server.key",
|
|
Database: db.DBConfig{
|
|
Host: "127.0.0.1",
|
|
Port: 5432,
|
|
User: "rmm",
|
|
Password: "",
|
|
DBName: "rmm",
|
|
SSLMode: "disable",
|
|
},
|
|
}
|
|
|
|
data, err := os.ReadFile(path)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := yaml.Unmarshal(data, cfg); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Env overrides — alle Werte koennen via ENV ueberschrieben werden (z.B. Docker)
|
|
if v := os.Getenv("RMM_LISTEN_ADDR"); v != "" {
|
|
cfg.ListenAddr = v
|
|
}
|
|
if v := os.Getenv("RMM_TLS_CERT"); v != "" {
|
|
cfg.TLSCert = v
|
|
}
|
|
if v := os.Getenv("RMM_TLS_KEY"); v != "" {
|
|
cfg.TLSKey = v
|
|
}
|
|
if v := os.Getenv("RMM_JWT_SECRET"); v != "" {
|
|
cfg.JWTSecret = v
|
|
}
|
|
if v := os.Getenv("RMM_API_KEY"); v != "" {
|
|
cfg.APIKeys = append(cfg.APIKeys, v)
|
|
}
|
|
if v := os.Getenv("RMM_DB_HOST"); v != "" {
|
|
cfg.Database.Host = v
|
|
}
|
|
if v := os.Getenv("RMM_DB_PORT"); v != "" {
|
|
if port := 0; len(v) > 0 {
|
|
fmt.Sscanf(v, "%d", &port)
|
|
if port > 0 {
|
|
cfg.Database.Port = port
|
|
}
|
|
}
|
|
}
|
|
if v := os.Getenv("RMM_DB_USER"); v != "" {
|
|
cfg.Database.User = v
|
|
}
|
|
if v := os.Getenv("RMM_DB_PASSWORD"); v != "" {
|
|
cfg.Database.Password = v
|
|
}
|
|
if v := os.Getenv("RMM_DB_NAME"); v != "" {
|
|
cfg.Database.DBName = v
|
|
}
|
|
|
|
return cfg, nil
|
|
}
|