@@ -3,9 +3,14 @@ package main
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"log"
|
||||
"net/http"
|
||||
"os"
|
||||
"os/signal"
|
||||
"strings"
|
||||
"syscall"
|
||||
"time"
|
||||
|
||||
"github.com/google/uuid"
|
||||
"github.com/redis/go-redis/v9"
|
||||
@@ -22,6 +27,13 @@ import (
|
||||
"github.com/omnex/control-plane/api/internal/sub"
|
||||
)
|
||||
|
||||
// shutdownGracePeriod : délai laissé aux requêtes HTTP en cours pour se
|
||||
// terminer après réception de SIGTERM/SIGINT (ex. redéploiement Docker
|
||||
// Compose) avant l'arrêt forcé. Ne couvre pas les provisionnings de démo en
|
||||
// arrière-plan (goroutines fire-and-forget, voir demos.Service.Create) —
|
||||
// seules les requêtes HTTP en vol sont drainées.
|
||||
const shutdownGracePeriod = 15 * time.Second
|
||||
|
||||
// memUsers : store utilisateurs en mémoire (fallback dev sans base).
|
||||
type memUsers map[string]auth.User
|
||||
|
||||
@@ -147,12 +159,12 @@ func main() {
|
||||
TTL: demos.TTL,
|
||||
})
|
||||
|
||||
// Alerting : surveille les pods des démos actives, notifie Discord et/ou
|
||||
// Telegram de chaque admin ayant configuré son propre canal (voir profil
|
||||
// admin, /profile/alerts). Désactivé en mode mémoire (pas de réglages
|
||||
// persistés à interroger).
|
||||
// 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).
|
||||
// Désactivé en mode mémoire (pas de réglages persistés à interroger).
|
||||
if alertRecipients != nil {
|
||||
watcher := alerts.NewWatcher(k8sClient, alertRecipients, func() ([]string, error) {
|
||||
watcher := alerts.NewWatcher(k8sClient, metricsClient, alertRecipients, func() ([]string, error) {
|
||||
all, err := demoSvc.List()
|
||||
if err != nil {
|
||||
return nil, err
|
||||
@@ -182,9 +194,27 @@ func main() {
|
||||
}
|
||||
|
||||
r := router.New(deps)
|
||||
log.Printf("Omnex API sur %s (env=%s)", cfg.Addr, cfg.Env)
|
||||
if err := r.Run(cfg.Addr); err != nil {
|
||||
log.Fatal(err)
|
||||
srv := &http.Server{Addr: cfg.Addr, Handler: r}
|
||||
|
||||
go func() {
|
||||
log.Printf("Omnex API sur %s (env=%s)", cfg.Addr, cfg.Env)
|
||||
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
|
||||
log.Fatalf("serveur HTTP: %v", err)
|
||||
}
|
||||
}()
|
||||
|
||||
// Arrêt propre : sur SIGTERM/SIGINT, cesse d'accepter de nouvelles
|
||||
// connexions et laisse shutdownGracePeriod aux requêtes en cours pour se
|
||||
// terminer (évite de couper une requête en vol lors d'un redéploiement).
|
||||
stop := make(chan os.Signal, 1)
|
||||
signal.Notify(stop, syscall.SIGTERM, syscall.SIGINT)
|
||||
<-stop
|
||||
log.Printf("signal d'arrêt reçu, extinction en cours (jusqu'à %s)...", shutdownGracePeriod)
|
||||
|
||||
ctx, cancel := context.WithTimeout(context.Background(), shutdownGracePeriod)
|
||||
defer cancel()
|
||||
if err := srv.Shutdown(ctx); err != nil {
|
||||
log.Printf("extinction forcée après délai: %v", err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user