chore: update
ci-api / test (push) Successful in 24m6s
ci-web / test (push) Successful in 13m50s

This commit is contained in:
Xor290
2026-09-20 11:50:02 +02:00
parent cb48bb2b70
commit 76b1412968
23 changed files with 2141 additions and 89 deletions
+27 -35
View File
@@ -23,6 +23,7 @@ import (
"github.com/omnex/control-plane/api/internal/downloads"
"github.com/omnex/control-plane/api/internal/k8s"
"github.com/omnex/control-plane/api/internal/profile"
"github.com/omnex/control-plane/api/internal/projects"
"github.com/omnex/control-plane/api/internal/router"
"github.com/omnex/control-plane/api/internal/session"
"github.com/omnex/control-plane/api/internal/sub"
@@ -78,6 +79,7 @@ func main() {
var userStore auth.UserStore
var demoStore demos.Store
var projectStore projects.Store
var demoPool demos.Pool
var codeStore sub.Store
var profileStore profile.Store
@@ -96,19 +98,19 @@ func main() {
if err := db.SeedExternalPool(gdb); err != nil {
log.Fatalf("seed pool: %v", err)
}
users := auth.NewGormStore(gdb)
seedAdmin(users)
userStore = users
userStore = auth.NewGormStore(gdb)
codeStore = sub.NewGormStore(gdb)
demoStore = demos.NewGormStore(gdb)
projectStore = projects.NewGormStore(gdb)
demoPool = demos.NewGormPool(gdb)
profileStore = profile.NewGormStore(gdb)
alertRecipients = alerts.GormRecipients(gdb)
log.Printf("persistance: PostgreSQL (GORM)")
} else {
userStore = seedMemUsers()
userStore = memUsers{}
codeStore = sub.NewMemStore()
demoStore = demos.NewMemStore()
projectStore = projects.NewMemStore()
demoPool = demos.NewMemPool()
log.Printf("persistance: mémoire (dev — définir OMNEX_DATABASE_URL pour PostgreSQL)")
}
@@ -166,6 +168,15 @@ func main() {
// de ce fichier : pas de contexte annulable, s'arrête avec le processus.
go demoSvc.RunExpirationLoop(context.Background(), 5*time.Minute)
// Projets vitrine (abonnements de 1 à 12 mois) : même cluster, mêmes
// sauvegardes Velero que les démos, mais suspension puis suppression après
// un délai de grâce à l'échéance (voir internal/projects).
projectSvc := projects.NewService(projectStore, helmProv, projects.Config{
Domain: cfg.VitrineDomain,
Grace: time.Duration(cfg.VitrineGraceDays) * 24 * time.Hour,
})
go projectSvc.RunExpirationLoop(context.Background(), 5*time.Minute)
// Alerting : surveille les pods des démos actives (état + seuils
// CPU/mémoire/PVC), notifie Discord et/ou Telegram de chaque admin ayant
// configuré son propre canal (voir profil admin, /profile/alerts).
@@ -182,6 +193,17 @@ func main() {
ns = append(ns, d.Namespace)
}
}
// Projets vitrine en ligne (un projet suspendu n'a plus de pods :
// l'alerte « pod absent » serait un faux positif).
ps, err := projectSvc.List()
if err != nil {
return nil, err
}
for _, p := range ps {
if p.Status == projects.StatusReady {
ns = append(ns, p.Namespace)
}
}
return ns, nil
})
go watcher.Run(context.Background())
@@ -196,6 +218,7 @@ func main() {
Sessions: sessions,
AuthH: auth.NewHandler(userStore, sessions, iss, cfg.Secure()),
DemosH: demos.NewHandler(demoSvc, helmProv),
ProjectsH: projects.NewHandler(projectSvc),
SubH: sub.NewHandler(codeStore, demoSvc),
ProfileH: profile.NewHandler(profileStore),
DownloadsH: downloads.NewHandler(cfg.AppDownloadsDir, userStore, demoSvc),
@@ -225,34 +248,3 @@ func main() {
log.Printf("extinction forcée après délai: %v", err)
}
}
// seedAdmin crée l'utilisateur admin de départ depuis l'env (idempotent).
func seedAdmin(users *auth.GormStore) {
username, pass := os.Getenv("OMNEX_SEED_USERNAME"), os.Getenv("OMNEX_SEED_PASSWORD")
if username == "" || pass == "" {
return
}
hash, err := auth.HashPassword(pass)
if err != nil {
log.Fatalf("seed: %v", err)
}
if err := users.EnsureUser(username, hash, auth.RoleAdmin); err != nil {
log.Fatalf("seed: %v", err)
}
log.Printf("utilisateur admin seedé: %s", username)
}
// seedMemUsers construit un store mémoire depuis l'env (dev uniquement).
func seedMemUsers() memUsers {
users := memUsers{}
if username, pass := os.Getenv("OMNEX_SEED_USERNAME"), os.Getenv("OMNEX_SEED_PASSWORD"); username != "" && pass != "" {
hash, err := auth.HashPassword(pass)
if err != nil {
log.Fatalf("seed: %v", err)
}
key := strings.ToLower(strings.TrimSpace(username))
users[key] = auth.User{ID: "seed-admin", Username: key, PasswordHash: hash, Role: auth.RoleAdmin}
log.Printf("utilisateur admin seedé (mémoire): %s", key)
}
return users
}