package main import ( "context" "errors" "fmt" "os" "os/signal" "time" "alin.ovh/x/log" "github.com/ardanlabs/conf/v3" "github.com/osdevisnot/sorvor/pkg/livereload" "github.com/savsgio/atreugo/v11" website "alin.ovh/homestead/domain/web" "alin.ovh/homestead/domain/web/server" ) type Options struct { Website *website.Options Server *server.Options } func main() { options := &Options{} help, err := conf.Parse("", options) if err != nil { if errors.Is(err, conf.ErrHelpWanted) { fmt.Println(help) os.Exit(1) } panic("parsing runtime configuration" + err.Error()) } log := log.Configure(!options.Website.Development) if options.Website.Development { livereload := livereload.New() options.Server.LiveReload = livereload options.Server.ShutdownTimeout = 100 * time.Millisecond options.Server.Development = true } website, err := website.New(options.Website, log.Named("website")) if err != nil { log.Error("could not initialise website", "error", err) return } ago := atreugo.New(atreugo.Config{ Logger: server.AtreugoLogger{Logger: log.Named("server")}, ReadTimeout: server.ReadTimeout, WriteTimeout: server.WriteTimeout, IdleTimeout: server.IdleTimeout, Name: server.Header, Compress: !options.Server.Development, ErrorView: website.ErrorHandler, }) sv, err := server.New(options.Server, log.Named("server"), ago) if err != nil { log.Error("could not create server", "error", err) return } err = website.RegisterHandlers(sv.Router) if err != nil { log.Error("could not register website handlers", "error", err) return } website.MakeRedirectorApp(ago.NewVirtualHost(website.Config.Domains[1:]...)) ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt) defer cancel() go func() { log.Info("starting server", "base_url", options.Website.BaseURL.String()) if err := sv.Start(); err != nil { // Error starting or closing listener: log.Fatal("error starting server", err) } }() <-ctx.Done() log.Debug("calling stop") <-sv.Stop() log.Debug("done") }