package main import ( "context" "log" "log/slog" "net" "net/http" "os" "os/signal" "strconv" "syscall" "olexsmir.xyz/mugit/internal/config" "olexsmir.xyz/mugit/internal/handlers" "olexsmir.xyz/mugit/internal/ssh" ) func main() { if err := run(); err != nil { log.Fatalf("main: %s", err) os.Exit(1) } } func run() error { cfg, err := config.Load("/home/olex/code/mugit/config.yml") if err != nil { slog.Error("config error", "err", err) return err } httpServer := &http.Server{ Addr: net.JoinHostPort(cfg.Server.Host, strconv.Itoa(cfg.Server.Port)), Handler: handlers.InitRoutes(cfg), } go func() { slog.Info("starting http server", "host", cfg.Server.Host, "port", cfg.Server.Port) if err := httpServer.ListenAndServe(); err != nil && err != http.ErrServerClosed { slog.Error("HTTP server error", "err", err) } }() sshServer := ssh.NewServer(cfg) if cfg.SSH.Enable { slog.Info("starting ssh server", "port", cfg.SSH.Port) if err := sshServer.Start(); err != nil { slog.Error("ssh server error", "err", err) } } // Wait for interrupt signal sigChan := make(chan os.Signal, 1) signal.Notify(sigChan, syscall.SIGINT, syscall.SIGTERM) sig := <-sigChan slog.Info("received signal, starting graceful shutdown", "signal", sig) if err := httpServer.Shutdown(context.TODO()); err != nil { slog.Error("HTTP server shutdown error", "err", err) } else { slog.Info("HTTP server shutdown complete") } return nil }