diff --git a/pkg/cmd/server/server.go b/pkg/cmd/server/server.go index a881d62419..2ea31c3772 100644 --- a/pkg/cmd/server/server.go +++ b/pkg/cmd/server/server.go @@ -4,8 +4,13 @@ package server import ( + "fmt" + "time" + "github.com/daytonaio/daytona/pkg/server" "github.com/daytonaio/daytona/pkg/server/config" + "github.com/daytonaio/daytona/pkg/server/frpc" + "github.com/daytonaio/daytona/pkg/views/util" log "github.com/sirupsen/logrus" "github.com/spf13/cobra" @@ -20,17 +25,27 @@ var ServerCmd = &cobra.Command{ // for now, force the log level to info when running the server log.SetLevel(log.InfoLevel) } + errCh := make(chan error) + + err := server.Start(errCh) + if err != nil { + log.Fatal(err) + } - config, err := config.GetConfig() + c, err := config.GetConfig() if err != nil { log.Fatal(err) } - if config == nil { - log.Fatal("Server configuration is not set. Please run `daytona configure`.") + select { + case err := <-errCh: + log.Fatal(err) + // TODO: This is an optimistic check. We should check if the server is actually running + case <-time.After(5 * time.Second): + util.RenderBorderedMessage(fmt.Sprintf("Daytona Server running on port: %d.\nTo connect to the server remotely, use the following command on the client machine:\n\ndaytona profile add -a %s", c.ApiPort, frpc.GetApiUrl(c))) } - err = server.Start() + err = <-errCh if err != nil { log.Fatal(err) } diff --git a/pkg/server/server.go b/pkg/server/server.go index a29978b189..232c75c893 100644 --- a/pkg/server/server.go +++ b/pkg/server/server.go @@ -25,7 +25,7 @@ type Self struct { DNSName string `json:"DNSName"` } -func Start() error { +func Start(errCh chan error) error { err := logs.Init() if err != nil { return err @@ -66,13 +66,13 @@ func Start() error { go func() { if err := frpc.ConnectServer(); err != nil { - log.Fatal(err) + errCh <- err } }() go func() { if err := frpc.ConnectApi(); err != nil { - log.Fatal(err) + errCh <- err } }() @@ -95,7 +95,7 @@ func Start() error { select { case err := <-errChan: - log.Fatal(err) + errCh <- err case <-time.After(1 * time.Second): go func() { errChan <- headscale.Connect() @@ -103,10 +103,17 @@ func Start() error { } if err := <-errChan; err != nil { - log.Fatal(err) + errCh <- err } }() - log.Infof("Starting api server on port %d", c.ApiPort) - return apiServer.Serve(apiListener) + go func() { + log.Infof("Starting api server on port %d", c.ApiPort) + err := apiServer.Serve(apiListener) + if err != nil { + errCh <- err + } + }() + + return nil } diff --git a/pkg/views/util/globals.go b/pkg/views/util/globals.go index bba30d0ef8..672b6dabf6 100644 --- a/pkg/views/util/globals.go +++ b/pkg/views/util/globals.go @@ -25,3 +25,14 @@ func RenderListLine(message string) { func RenderInfoMessageBold(message string) { fmt.Println(lipgloss.NewStyle().Bold(true).Padding(1, 0, 1, 1).Render(message)) } + +func RenderBorderedMessage(message string) { + fmt.Println(lipgloss. + NewStyle(). + Margin(1, 0). + Padding(1, 1, 1, 1). + BorderForeground(views.Green). + Border(lipgloss.RoundedBorder()). + Render(message), + ) +}