chore: update
This commit is contained in:
@@ -3,30 +3,41 @@ package config
|
||||
import (
|
||||
"errors"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
)
|
||||
|
||||
type Config struct {
|
||||
Addr string
|
||||
JWTSecret []byte // OMNEX_JWT_SECRET (min 32 octets) — signe les tokens
|
||||
SessionTTL time.Duration // durée de vie JWT + session Redis
|
||||
AllowedOrigins []string // CORS (vitrine + back-office)
|
||||
Env string // "dev" | "prod"
|
||||
DatabaseURL string // OMNEX_DATABASE_URL (DSN PostgreSQL GORM)
|
||||
RedisURL string // OMNEX_REDIS_URL (sessions), ex. redis://:pass@host:6379/0
|
||||
DemoDomain string // domaine des démos
|
||||
DemoHTTPSPort string // port HTTPS public à afficher dans l'URL des démos (443 = omis, sinon ex. NodePort)
|
||||
Kubeconfig string
|
||||
FrontendImage string
|
||||
BackendImage string
|
||||
LBTelegramImage string
|
||||
AppDownloadsDir string // OMNEX_APP_DOWNLOADS_DIR : répertoire des .apk téléchargeables (voir internal/downloads)
|
||||
Addr string
|
||||
JWTSecret []byte // OMNEX_JWT_SECRET (min 32 octets) — signe les tokens
|
||||
SessionTTL time.Duration // durée de vie JWT + session Redis
|
||||
AllowedOrigins []string // CORS (vitrine + back-office)
|
||||
Env string // "dev" | "prod"
|
||||
DatabaseURL string // OMNEX_DATABASE_URL (DSN PostgreSQL GORM)
|
||||
RedisURL string // OMNEX_REDIS_URL (sessions), ex. redis://:pass@host:6379/0
|
||||
DemoDomain string // domaine des démos
|
||||
DemoHTTPSPort string // port HTTPS public à afficher dans l'URL des démos (443 = omis, sinon ex. NodePort)
|
||||
Kubeconfig string
|
||||
FrontendImage string
|
||||
BackendImage string
|
||||
LBTelegramImage string
|
||||
AppDownloadsDir string // OMNEX_APP_DOWNLOADS_DIR : répertoire des .apk téléchargeables (voir internal/downloads)
|
||||
// DockerHubUsername/Password : compte Docker Hub authentifié (droits
|
||||
// lecture seule) injecté dans chaque namespace de démo (voir
|
||||
// deploy/chart-gestion/registry-credentials) pour passer le rate-limit
|
||||
// de pull anonyme (100/6h par IP) à 200/6h. "" = pull anonyme (défaut).
|
||||
DockerHubUsername string
|
||||
DockerHubPassword string
|
||||
|
||||
// Projets vitrine (abonnements de 1 à 12 mois, voir internal/projects).
|
||||
VitrineDomain string // OMNEX_VITRINE_DOMAIN : les projets sont servis sur <namespace>.<domaine>
|
||||
VitrineChartsDir string // OMNEX_VITRINE_CHARTS_DIR : charts backend/frontend/postgresql/redis/ingressroute du projet vitrine
|
||||
VitrineBackendImage string // VITRINE_BACKEND_IMAGE, ex. registry/vitrine-backend:1.0.0
|
||||
VitrineFrontendImage string // VITRINE_FRONTEND_IMAGE
|
||||
// VitrineGraceDays : jours pendant lesquels un projet dont l'abonnement
|
||||
// a expiré reste suspendu (données et sauvegardes conservées) avant sa
|
||||
// suppression définitive. Un renouvellement pendant ce délai le relance.
|
||||
VitrineGraceDays int
|
||||
}
|
||||
|
||||
// Load lit la config. Fail-secure : secret JWT obligatoire ; en prod base + Redis aussi.
|
||||
@@ -53,6 +64,19 @@ func Load() (Config, error) {
|
||||
AppDownloadsDir: getenv("OMNEX_APP_DOWNLOADS_DIR", "/app-downloads"),
|
||||
DockerHubUsername: os.Getenv("OMNEX_DOCKERHUB_USERNAME"),
|
||||
DockerHubPassword: os.Getenv("OMNEX_DOCKERHUB_PASSWORD"),
|
||||
|
||||
VitrineDomain: getenv("OMNEX_VITRINE_DOMAIN", "vitrine-omnex.club"),
|
||||
VitrineChartsDir: getenv("OMNEX_VITRINE_CHARTS_DIR", "/charts-vitrine"),
|
||||
VitrineBackendImage: os.Getenv("VITRINE_BACKEND_IMAGE"),
|
||||
VitrineFrontendImage: os.Getenv("VITRINE_FRONTEND_IMAGE"),
|
||||
VitrineGraceDays: 7,
|
||||
}
|
||||
if v := os.Getenv("OMNEX_VITRINE_GRACE_DAYS"); v != "" {
|
||||
days, err := strconv.Atoi(v)
|
||||
if err != nil || days < 0 || days > 365 {
|
||||
return Config{}, errors.New("OMNEX_VITRINE_GRACE_DAYS doit être un entier entre 0 et 365")
|
||||
}
|
||||
cfg.VitrineGraceDays = days
|
||||
}
|
||||
|
||||
if cfg.Env == "prod" {
|
||||
|
||||
@@ -100,3 +100,28 @@ func TestSplitCSV(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoad_VitrineDefaults(t *testing.T) {
|
||||
t.Setenv("OMNEX_JWT_SECRET", "0123456789abcdef0123456789abcdef")
|
||||
cfg, err := Load()
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if cfg.VitrineDomain != "vitrine-omnex.club" || cfg.VitrineGraceDays != 7 || cfg.VitrineChartsDir != "/charts-vitrine" {
|
||||
t.Errorf("défauts vitrine inattendus : %+v", cfg)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoad_VitrineGraceDaysInvalid(t *testing.T) {
|
||||
t.Setenv("OMNEX_JWT_SECRET", "0123456789abcdef0123456789abcdef")
|
||||
for _, v := range []string{"abc", "-1", "366"} {
|
||||
t.Setenv("OMNEX_VITRINE_GRACE_DAYS", v)
|
||||
if _, err := Load(); err == nil {
|
||||
t.Errorf("OMNEX_VITRINE_GRACE_DAYS=%q accepté", v)
|
||||
}
|
||||
}
|
||||
t.Setenv("OMNEX_VITRINE_GRACE_DAYS", "0")
|
||||
if cfg, err := Load(); err != nil || cfg.VitrineGraceDays != 0 {
|
||||
t.Errorf("grâce de 0 jour refusée ou mal lue : %v %d", err, cfg.VitrineGraceDays)
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user