Files
Docker-Manager/backend/cmd/server/main.go
T

70 lines
1.5 KiB
Go

// Command server arranca la API central de Docker Manager.
package main
import (
"context"
"errors"
"fmt"
"log/slog"
"net/http"
"os"
"os/signal"
"syscall"
"time"
"dockermanager/backend/internal/config"
dockerconn "dockermanager/backend/internal/docker"
"dockermanager/backend/internal/httpserver"
)
func main() {
logger := slog.New(slog.NewJSONHandler(os.Stdout, nil))
if err := run(logger); err != nil {
logger.Error("fatal error", "err", err)
os.Exit(1)
}
}
func run(logger *slog.Logger) error {
cfg, err := config.Load()
if err != nil {
return fmt.Errorf("loading config: %w", err)
}
dockerCli, err := dockerconn.NewLocalConnector(cfg.DockerHost)
if err != nil {
return fmt.Errorf("connecting to docker: %w", err)
}
defer dockerCli.Close()
router := httpserver.NewRouter(httpserver.Deps{
Logger: logger,
Docker: dockerCli,
Origins: cfg.CORSAllowedOrigins,
})
srv := &http.Server{
Addr: fmt.Sprintf(":%d", cfg.Port),
Handler: router,
ReadHeaderTimeout: 5 * time.Second,
}
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
go func() {
logger.Info("server listening", "port", cfg.Port, "env", cfg.Env)
if err := srv.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) {
logger.Error("server error", "err", err)
}
}()
<-ctx.Done()
logger.Info("shutting down")
shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
return srv.Shutdown(shutdownCtx)
}