diff --git a/cmd/soft/serve/server.go b/cmd/soft/serve/server.go index 33679091f..1eea7d22b 100644 --- a/cmd/soft/serve/server.go +++ b/cmd/soft/serve/server.go @@ -93,20 +93,8 @@ func NewServer(ctx context.Context) (*Server, error) { // Start starts the SSH server. func (s *Server) Start() error { errg, _ := errgroup.WithContext(s.ctx) - errg.Go(func() error { - s.logger.Print("Starting Git daemon", "addr", s.Config.Git.ListenAddr) - if err := s.GitDaemon.Start(); !errors.Is(err, daemon.ErrServerClosed) { - return err - } - return nil - }) - errg.Go(func() error { - s.logger.Print("Starting HTTP server", "addr", s.Config.HTTP.ListenAddr) - if err := s.HTTPServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - return err - } - return nil - }) + + // start the SSH server errg.Go(func() error { s.logger.Print("Starting SSH server", "addr", s.Config.SSH.ListenAddr) if err := s.SSHServer.ListenAndServe(); !errors.Is(err, ssh.ErrServerClosed) { @@ -114,13 +102,46 @@ func (s *Server) Start() error { } return nil }) - errg.Go(func() error { - s.logger.Print("Starting Stats server", "addr", s.Config.Stats.ListenAddr) - if err := s.StatsServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { - return err - } - return nil - }) + + // optionally start the git daemon + if s.Config.Git.GitServerEnabled { + errg.Go(func() error { + s.logger.Print("Starting Git daemon", "addr", s.Config.Git.ListenAddr) + if err := s.GitDaemon.Start(); !errors.Is(err, daemon.ErrServerClosed) { + return err + } + return nil + }) + } else { + s.logger.Print("NOT Starting Git daemon, disabled in configuration (by setting GitServerEnabled).") + } + + // optionally start the HTTP server + if s.Config.HTTP.HttpServerEnabled { + errg.Go(func() error { + s.logger.Print("Starting HTTP server", "addr", s.Config.HTTP.ListenAddr) + if err := s.HTTPServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { + return err + } + return nil + }) + } else { + s.logger.Print("NOT Starting HTTP server, disabled in configuration (by setting HttpServerEnabled).") + } + + // optionally start the Stats server + if s.Config.Stats.StatsServerEnabled { + errg.Go(func() error { + s.logger.Print("Starting Stats server", "addr", s.Config.Stats.ListenAddr) + if err := s.StatsServer.ListenAndServe(); !errors.Is(err, http.ErrServerClosed) { + return err + } + return nil + }) + } else { + s.logger.Print("NOT Starting Stats server, disabled in configuration (by setting StatsServerEnabled).") + } + errg.Go(func() error { s.Cron.Start() return nil diff --git a/go.mod b/go.mod index 26e8adac4..f6e7a3b92 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,8 @@ module github.com/charmbracelet/soft-serve -go 1.21 -toolchain go1.22.5 +go 1.22 + +toolchain go1.23.3 require ( github.com/charmbracelet/bubbles v0.20.0 diff --git a/pkg/config/config.go b/pkg/config/config.go index 2b650984c..98aa96d3d 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -39,6 +39,9 @@ type SSHConfig struct { // GitConfig is the Git daemon configuration for the server. type GitConfig struct { + // GitServerEnabled toggles the Git daemon on/off + GitServerEnabled bool `env:"GIT_SERVER_ENABLED" yaml:"git_server_enabled"` + // ListenAddr is the address on which the Git daemon will listen. ListenAddr string `env:"LISTEN_ADDR" yaml:"listen_addr"` @@ -57,6 +60,9 @@ type GitConfig struct { // HTTPConfig is the HTTP configuration for the server. type HTTPConfig struct { + // HttpServerEnabled toggles the HTTP server on/off + HttpServerEnabled bool `env:"HTTP_SERVER_ENABLED" yaml:"http_server_enabled"` + // ListenAddr is the address on which the HTTP server will listen. ListenAddr string `env:"LISTEN_ADDR" yaml:"listen_addr"` @@ -72,6 +78,9 @@ type HTTPConfig struct { // StatsConfig is the configuration for the stats server. type StatsConfig struct { + // StatsServerEnabled toggles the HTTP server on/off + StatsServerEnabled bool `env:"STATS_SERVER_ENABLED" yaml:"stats_server_enabled"` + // ListenAddr is the address on which the stats server will listen. ListenAddr string `env:"LISTEN_ADDR" yaml:"listen_addr"` } @@ -171,15 +180,18 @@ func (c *Config) Environ() []string { fmt.Sprintf("SOFT_SERVE_SSH_CLIENT_KEY_PATH=%s", c.SSH.ClientKeyPath), fmt.Sprintf("SOFT_SERVE_SSH_MAX_TIMEOUT=%d", c.SSH.MaxTimeout), fmt.Sprintf("SOFT_SERVE_SSH_IDLE_TIMEOUT=%d", c.SSH.IdleTimeout), + fmt.Sprintf("SOFT_SERVE_GIT_SERVER_ENABLED=%s", c.Git.GitServerEnabled), fmt.Sprintf("SOFT_SERVE_GIT_LISTEN_ADDR=%s", c.Git.ListenAddr), fmt.Sprintf("SOFT_SERVE_GIT_PUBLIC_URL=%s", c.Git.PublicURL), fmt.Sprintf("SOFT_SERVE_GIT_MAX_TIMEOUT=%d", c.Git.MaxTimeout), fmt.Sprintf("SOFT_SERVE_GIT_IDLE_TIMEOUT=%d", c.Git.IdleTimeout), fmt.Sprintf("SOFT_SERVE_GIT_MAX_CONNECTIONS=%d", c.Git.MaxConnections), + fmt.Sprintf("SOFT_SERVE_HTTP_SERVER_ENABLED=%s", c.HTTP.HttpServerEnabled), fmt.Sprintf("SOFT_SERVE_HTTP_LISTEN_ADDR=%s", c.HTTP.ListenAddr), fmt.Sprintf("SOFT_SERVE_HTTP_TLS_KEY_PATH=%s", c.HTTP.TLSKeyPath), fmt.Sprintf("SOFT_SERVE_HTTP_TLS_CERT_PATH=%s", c.HTTP.TLSCertPath), fmt.Sprintf("SOFT_SERVE_HTTP_PUBLIC_URL=%s", c.HTTP.PublicURL), + fmt.Sprintf("SOFT_SERVE_STATS_SERVER_ENABLED=%s", c.Stats.StatsServerEnabled), fmt.Sprintf("SOFT_SERVE_STATS_LISTEN_ADDR=%s", c.Stats.ListenAddr), fmt.Sprintf("SOFT_SERVE_LOG_FORMAT=%s", c.Log.Format), fmt.Sprintf("SOFT_SERVE_LOG_TIME_FORMAT=%s", c.Log.TimeFormat), @@ -326,18 +338,21 @@ func DefaultConfig() *Config { IdleTimeout: 10 * 60, // 10 minutes }, Git: GitConfig{ - ListenAddr: ":9418", - PublicURL: "git://localhost", - MaxTimeout: 0, - IdleTimeout: 3, - MaxConnections: 32, + GitServerEnabled: false, // enabled by default, opt-in + ListenAddr: ":9418", + PublicURL: "git://localhost", + MaxTimeout: 0, + IdleTimeout: 3, + MaxConnections: 32, }, HTTP: HTTPConfig{ - ListenAddr: ":23232", - PublicURL: "http://localhost:23232", + HttpServerEnabled: true, // enabled by default, opt-out + ListenAddr: ":23232", + PublicURL: "http://localhost:23232", }, Stats: StatsConfig{ - ListenAddr: "localhost:23233", + StatsServerEnabled: false, // stats server if you need it, thus: opt-in + ListenAddr: "localhost:23233", }, Log: LogConfig{ Format: "text",