Files
worker/config/secrets/secrets.go
Gleb Tv 2c884c5612
Некоторые проверки не удались
CI / test (push) Successful in 2m5s
Docker / Build and publish worker image (push) Failing after 31s
refactor: adopt worker module path
2026-07-13 17:56:12 +03:00

173 строки
3.8 KiB
Go

// Package secrets provides functionality.
package secrets
import (
"log"
"os"
"path/filepath"
"github.com/go-yaml/yaml"
"rocketgit.ru/rsmon/worker/config/application"
_ "rocketgit.ru/rsmon/worker/config/env" // Import to ensure .env is loaded before reading env vars
)
const envTest = "test"
// SecretsBase provides functionality.
type SecretsBase struct {
URL string `yaml:"url"`
InfluxToken string `yaml:"influx_token"`
WorkerAdminSecret string `yaml:"worker_admin_secret"`
}
// SecretsCrypto provides functionality.
type SecretsCrypto struct {
SessionKey string `yaml:"session_key"`
CsrfKey string `yaml:"csrf_key"`
Pepper string `yaml:"pepper"`
}
// SecretsCrm provides functionality.
type SecretsCrm struct {
URL string `yaml:"url"`
IngressToken string `yaml:"ingress_token"`
}
// SecretsData provides functionality.
type SecretsData struct {
Base *SecretsBase `yaml:"base"`
Crypto *SecretsCrypto `yaml:"crypto"`
Crm *SecretsCrm `yaml:"crm"`
}
var (
// Data provides functionality.
Data SecretsData
// Base provides functionality.
Base *SecretsBase
// Crypto provides cryptography configuration.
Crypto *SecretsCrypto
// Crm provides CRM configuration.
Crm *SecretsCrm
)
func envFirst(keys ...string) string {
for _, key := range keys {
if value := os.Getenv(key); value != "" {
return value
}
}
return ""
}
func buildSecretsFromEnv() SecretsData {
baseURL := envFirst("BASE_URL", "APP_BASE_URL")
if baseURL == "" {
baseURL = "http://localhost:7401"
}
sessionKey := envFirst("SESSION_KEY")
pepper := envFirst("PEPPER")
csrfKey := envFirst("CSRF_KEY")
return SecretsData{
Base: &SecretsBase{
URL: baseURL,
InfluxToken: envFirst("INFLUX_TOKEN"),
WorkerAdminSecret: envFirst("WORKER_ADMIN_SECRET", "RSMON_ADMIN_SECRET"),
},
Crypto: &SecretsCrypto{
SessionKey: sessionKey,
CsrfKey: csrfKey,
Pepper: pepper,
},
Crm: &SecretsCrm{
URL: envFirst("CRM_URL", "SENSEI_CRM_URL"),
IngressToken: envFirst("CRM_INGRESS_TOKEN", "SENSEI_CRM_INGRESS_TOKEN"),
},
}
}
func assign(data SecretsData) {
Data = data
Base = Data.Base
Crypto = Data.Crypto
Crm = Data.Crm
}
func init() {
var err error
// Try multiple paths for secrets.yml
cwd := os.Getenv("CWD")
if cwd == "" {
cwd = "."
}
// Possible paths to check - try relative to CWD and from module root
paths := []string{
filepath.Join(cwd, "config", "secrets.yml"),
"config/secrets.yml",
"../../config/secrets.yml",
"../../../config/secrets.yml",
"../../../../config/secrets.yml",
}
var dat []byte
for _, path := range paths {
dat, err = os.ReadFile(path)
if err == nil {
break
}
}
// If we're in test mode and no secrets file found, use defaults
// Check multiple test indicators since init() order is unpredictable
isTest := os.Getenv("RSMON_ENV") == envTest ||
os.Getenv("GO_ENV") == envTest ||
os.Getenv("CI") == "true" ||
application.Env == envTest
if err != nil && isTest {
log.Println("No secrets.yml found in test environment, using defaults")
// Set default values for test environment
Base = &SecretsBase{
URL: "http://localhost:7401",
InfluxToken: "",
WorkerAdminSecret: "test-secret",
}
Crypto = &SecretsCrypto{
SessionKey: "abc",
CsrfKey: "bGludXhoaW50LmNvbQo=",
Pepper: "abc",
}
Crm = &SecretsCrm{URL: "", IngressToken: ""}
assign(SecretsData{
Base: Base,
Crypto: Crypto,
Crm: Crm,
})
return
}
if err != nil {
log.Println("No secrets.yml found, using environment variables")
assign(buildSecretsFromEnv())
return
}
var AllSecrets map[string]SecretsData
err = yaml.Unmarshal(dat, &AllSecrets)
if err != nil {
panic(err)
}
env := application.Env
if env == "" {
env = "development"
}
assign(AllSecrets[env])
}