From 4d760d9a9d637d6a29542ef4b3ca49501d59542f Mon Sep 17 00:00:00 2001 From: crapStone Date: Fri, 17 Nov 2023 22:53:24 +0100 Subject: [PATCH] fix pipeline --- integration/main_test.go | 7 +- main.go | 134 ++------------------------------------ server/startup.go | 137 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 145 insertions(+), 133 deletions(-) create mode 100644 server/startup.go diff --git a/integration/main_test.go b/integration/main_test.go index 99cdd4c..34e419b 100644 --- a/integration/main_test.go +++ b/integration/main_test.go @@ -10,9 +10,10 @@ import ( "testing" "time" - cmd "codeberg.org/codeberg/pages/cli" - "github.com/urfave/cli/v2" + + cmd "codeberg.org/codeberg/pages/cli" + "codeberg.org/codeberg/pages/server" ) func TestMain(m *testing.M) { @@ -47,7 +48,7 @@ func startServer(ctx context.Context) error { app := cli.NewApp() app.Name = "pages-server" - app.Action = cmd.Serve + app.Action = server.Serve app.Flags = cmd.ServerFlags go func() { diff --git a/main.go b/main.go index 2ceb645..87e21f3 100644 --- a/main.go +++ b/main.go @@ -1,147 +1,21 @@ package main import ( - "context" - "crypto/tls" - "fmt" - "net" - "net/http" "os" - "strings" - "time" _ "github.com/joho/godotenv/autoload" - "github.com/rs/zerolog" "github.com/rs/zerolog/log" - "github.com/urfave/cli/v2" - cmd "codeberg.org/codeberg/pages/cli" - "codeberg.org/codeberg/pages/config" - "codeberg.org/codeberg/pages/server/acme" - "codeberg.org/codeberg/pages/server/cache" - "codeberg.org/codeberg/pages/server/certificates" - "codeberg.org/codeberg/pages/server/gitea" - "codeberg.org/codeberg/pages/server/handler" + "codeberg.org/codeberg/pages/cli" + "codeberg.org/codeberg/pages/server" ) func main() { - app := cmd.CreatePagesApp() + app := cli.CreatePagesApp() + app.Action = server.Serve if err := app.Run(os.Args); err != nil { log.Error().Err(err).Msg("A fatal error occurred") os.Exit(1) } } - -// Serve sets up and starts the web server. -func Serve(ctx *cli.Context) error { - // initialize logger with Trace, overridden later with actual level - log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger().Level(zerolog.TraceLevel) - - cfg, err := config.ReadConfig(ctx) - if err != nil { - log.Error().Err(err).Msg("could not read config") - } - - config.MergeConfig(ctx, cfg) - - // Initialize the logger. - logLevel, err := zerolog.ParseLevel(cfg.LogLevel) - if err != nil { - return err - } - log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger().Level(logLevel) - - listeningSSLAddress := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) - listeningHTTPAddress := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.HttpPort) - - if cfg.Server.RawDomain != "" { - cfg.Server.AllowedCorsDomains = append(cfg.Server.AllowedCorsDomains, cfg.Server.RawDomain) - } - - // Make sure MainDomain has a leading dot - if !strings.HasPrefix(cfg.Server.MainDomain, ".") { - // TODO make this better - cfg.Server.MainDomain = "." + cfg.Server.MainDomain - } - - if len(cfg.Server.DefaultBranches) == 0 { - return fmt.Errorf("no default branches set (PAGES_BRANCHES)") - } - - // Init ssl cert database - certDB, closeFn, err := cmd.OpenCertDB(ctx) - if err != nil { - return err - } - defer closeFn() - - keyCache := cache.NewInMemoryCache() - challengeCache := cache.NewInMemoryCache() - // canonicalDomainCache stores canonical domains - canonicalDomainCache := cache.NewInMemoryCache() - // dnsLookupCache stores DNS lookups for custom domains - dnsLookupCache := cache.NewInMemoryCache() - // redirectsCache stores redirects in _redirects files - redirectsCache := cache.NewInMemoryCache() - // clientResponseCache stores responses from the Gitea server - clientResponseCache := cache.NewInMemoryCache() - - giteaClient, err := gitea.NewClient(cfg.Gitea, clientResponseCache) - if err != nil { - return fmt.Errorf("could not create new gitea client: %v", err) - } - - acmeClient, err := acme.CreateAcmeClient(cfg.ACME, cfg.Server.HttpServerEnabled, challengeCache) - if err != nil { - return err - } - - if err := certificates.SetupMainDomainCertificates(cfg.Server.MainDomain, acmeClient, certDB); err != nil { - return err - } - - // Create listener for SSL connections - log.Info().Msgf("Create TCP listener for SSL on %s", listeningSSLAddress) - listener, err := net.Listen("tcp", listeningSSLAddress) - if err != nil { - return fmt.Errorf("couldn't create listener: %v", err) - } - - // Setup listener for SSL connections - listener = tls.NewListener(listener, certificates.TLSConfig( - cfg.Server.MainDomain, - giteaClient, - acmeClient, - cfg.Server.DefaultBranches[0], - keyCache, challengeCache, dnsLookupCache, canonicalDomainCache, - certDB, - )) - - interval := 12 * time.Hour - certMaintainCtx, cancelCertMaintain := context.WithCancel(context.Background()) - defer cancelCertMaintain() - go certificates.MaintainCertDB(certMaintainCtx, interval, acmeClient, cfg.Server.MainDomain, certDB) - - if cfg.Server.HttpServerEnabled { - // Create handler for http->https redirect and http acme challenges - httpHandler := certificates.SetupHTTPACMEChallengeServer(challengeCache, uint(cfg.Server.Port)) - - // Create listener for http and start listening - go func() { - log.Info().Msgf("Start HTTP server listening on %s", listeningHTTPAddress) - err := http.ListenAndServe(listeningHTTPAddress, httpHandler) - if err != nil { - log.Panic().Err(err).Msg("Couldn't start HTTP server") - } - }() - } - - // Create ssl handler based on settings - sslHandler := handler.Handler(cfg.Server, giteaClient, dnsLookupCache, canonicalDomainCache, redirectsCache) - - // Start the ssl listener - log.Info().Msgf("Start SSL server using TCP listener on %s", listener.Addr()) - - return http.Serve(listener, sslHandler) -} diff --git a/server/startup.go b/server/startup.go new file mode 100644 index 0000000..286726a --- /dev/null +++ b/server/startup.go @@ -0,0 +1,137 @@ +package server + +import ( + "context" + "crypto/tls" + "fmt" + "net" + "net/http" + "os" + "strings" + "time" + + "github.com/rs/zerolog" + "github.com/rs/zerolog/log" + "github.com/urfave/cli/v2" + + cmd "codeberg.org/codeberg/pages/cli" + "codeberg.org/codeberg/pages/config" + "codeberg.org/codeberg/pages/server/acme" + "codeberg.org/codeberg/pages/server/cache" + "codeberg.org/codeberg/pages/server/certificates" + "codeberg.org/codeberg/pages/server/gitea" + "codeberg.org/codeberg/pages/server/handler" +) + +// Serve sets up and starts the web server. +func Serve(ctx *cli.Context) error { + // initialize logger with Trace, overridden later with actual level + log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger().Level(zerolog.TraceLevel) + + cfg, err := config.ReadConfig(ctx) + if err != nil { + log.Error().Err(err).Msg("could not read config") + } + + config.MergeConfig(ctx, cfg) + + // Initialize the logger. + logLevel, err := zerolog.ParseLevel(cfg.LogLevel) + if err != nil { + return err + } + log.Logger = zerolog.New(zerolog.ConsoleWriter{Out: os.Stderr}).With().Timestamp().Logger().Level(logLevel) + + listeningSSLAddress := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.Port) + listeningHTTPAddress := fmt.Sprintf("%s:%d", cfg.Server.Host, cfg.Server.HttpPort) + + if cfg.Server.RawDomain != "" { + cfg.Server.AllowedCorsDomains = append(cfg.Server.AllowedCorsDomains, cfg.Server.RawDomain) + } + + // Make sure MainDomain has a leading dot + if !strings.HasPrefix(cfg.Server.MainDomain, ".") { + // TODO make this better + cfg.Server.MainDomain = "." + cfg.Server.MainDomain + } + + if len(cfg.Server.DefaultBranches) == 0 { + return fmt.Errorf("no default branches set (PAGES_BRANCHES)") + } + + // Init ssl cert database + certDB, closeFn, err := cmd.OpenCertDB(ctx) + if err != nil { + return err + } + defer closeFn() + + keyCache := cache.NewInMemoryCache() + challengeCache := cache.NewInMemoryCache() + // canonicalDomainCache stores canonical domains + canonicalDomainCache := cache.NewInMemoryCache() + // dnsLookupCache stores DNS lookups for custom domains + dnsLookupCache := cache.NewInMemoryCache() + // redirectsCache stores redirects in _redirects files + redirectsCache := cache.NewInMemoryCache() + // clientResponseCache stores responses from the Gitea server + clientResponseCache := cache.NewInMemoryCache() + + giteaClient, err := gitea.NewClient(cfg.Gitea, clientResponseCache) + if err != nil { + return fmt.Errorf("could not create new gitea client: %v", err) + } + + acmeClient, err := acme.CreateAcmeClient(cfg.ACME, cfg.Server.HttpServerEnabled, challengeCache) + if err != nil { + return err + } + + if err := certificates.SetupMainDomainCertificates(cfg.Server.MainDomain, acmeClient, certDB); err != nil { + return err + } + + // Create listener for SSL connections + log.Info().Msgf("Create TCP listener for SSL on %s", listeningSSLAddress) + listener, err := net.Listen("tcp", listeningSSLAddress) + if err != nil { + return fmt.Errorf("couldn't create listener: %v", err) + } + + // Setup listener for SSL connections + listener = tls.NewListener(listener, certificates.TLSConfig( + cfg.Server.MainDomain, + giteaClient, + acmeClient, + cfg.Server.DefaultBranches[0], + keyCache, challengeCache, dnsLookupCache, canonicalDomainCache, + certDB, + )) + + interval := 12 * time.Hour + certMaintainCtx, cancelCertMaintain := context.WithCancel(context.Background()) + defer cancelCertMaintain() + go certificates.MaintainCertDB(certMaintainCtx, interval, acmeClient, cfg.Server.MainDomain, certDB) + + if cfg.Server.HttpServerEnabled { + // Create handler for http->https redirect and http acme challenges + httpHandler := certificates.SetupHTTPACMEChallengeServer(challengeCache, uint(cfg.Server.Port)) + + // Create listener for http and start listening + go func() { + log.Info().Msgf("Start HTTP server listening on %s", listeningHTTPAddress) + err := http.ListenAndServe(listeningHTTPAddress, httpHandler) + if err != nil { + log.Panic().Err(err).Msg("Couldn't start HTTP server") + } + }() + } + + // Create ssl handler based on settings + sslHandler := handler.Handler(cfg.Server, giteaClient, dnsLookupCache, canonicalDomainCache, redirectsCache) + + // Start the ssl listener + log.Info().Msgf("Start SSL server using TCP listener on %s", listener.Addr()) + + return http.Serve(listener, sslHandler) +}