package main import ( "context" "errors" "log/slog" "net/http" "os" "os/signal" "syscall" "time" "faro/internal/api" "github.com/moby/moby/client" ) func main() { logger := slog.New(slog.NewJSONHandler(os.Stdout, nil)) dockerClient, err := client.NewClientWithOpts(client.FromEnv, client.WithAPIVersionNegotiation()) if err != nil { logger.Error("create local Docker client", "error", err) os.Exit(1) } defer dockerClient.Close() server := &http.Server{ Addr: ":8080", Handler: api.NewHandler(dockerClient, logger), ReadHeaderTimeout: 5 * time.Second, } ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM) defer stop() go func() { logger.Info("Faro API listening", "address", server.Addr) if err := server.ListenAndServe(); err != nil && !errors.Is(err, http.ErrServerClosed) { logger.Error("serve API", "error", err) os.Exit(1) } }() <-ctx.Done() shutdownCtx, cancel := context.WithTimeout(context.Background(), 10*time.Second) defer cancel() if err := server.Shutdown(shutdownCtx); err != nil { logger.Error("shut down API", "error", err) } }