github.com/grafviktor/keep-my-secret@v0.9.10-0.20230908165355-19f35cce90e5/cmd/kms/main.go (about) 1 package main 2 3 import ( 4 "context" 5 "fmt" 6 "log" 7 "net/http" 8 "os" 9 "os/signal" 10 "syscall" 11 12 "github.com/caarlos0/env/v7" 13 "golang.org/x/sync/errgroup" 14 15 "github.com/grafviktor/keep-my-secret/internal/api/web" 16 "github.com/grafviktor/keep-my-secret/internal/config" 17 "github.com/grafviktor/keep-my-secret/internal/storage" 18 "github.com/grafviktor/keep-my-secret/internal/version" 19 ) 20 21 var ( 22 buildVersion string 23 buildDate string 24 buildCommit string 25 ) 26 27 func main() { 28 // Display application version and build details 29 version.Set(buildVersion, buildDate, buildCommit) 30 version.PrintConsole() 31 32 ec := config.EnvConfig{} 33 if err := env.Parse(&ec); err != nil { 34 log.Printf("%+v\n", err) 35 } 36 37 if ec.DevMode { // To enable dev mode, use 'DEV=true' env variable 38 log.SetFlags(log.LstdFlags | log.Lshortfile) 39 fmt.Println("=============================") 40 fmt.Println("Running in Dev Mode !!!") 41 fmt.Println("CORS is enabled for client connections") 42 fmt.Println("Detailed logging is enabled") 43 fmt.Println("=============================") 44 } 45 46 appConfig := config.New(ec) 47 48 appContext, cancel := context.WithCancel(context.Background()) 49 go func() { 50 c := make(chan os.Signal, 1) // we need to reserve to buffer size 1, so the notifier are not blocked 51 signal.Notify(c, os.Interrupt, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT) 52 53 <-c 54 cancel() 55 }() 56 57 dataStorage, err := storage.GetStorage(appContext, appConfig.StorageType, appConfig.DSN) 58 if err != nil { 59 log.Fatal(err) 60 } 61 62 router := web.NewHTTPRouter(appConfig, dataStorage) 63 httpServer := http.Server{ 64 Addr: appConfig.ServerAddr, 65 Handler: router, 66 } 67 68 g, gCtx := errgroup.WithContext(appContext) 69 g.Go(func() error { 70 log.Printf("HTTP Server is listening on %s in secure mode\n", appConfig.ServerAddr) 71 log.Printf("Client application is available at https://%s%s\n", appConfig.ServerAddr, appConfig.ClientAppURL) 72 73 return httpServer.ListenAndServeTLS(appConfig.HTTPSCertPath, appConfig.HTTPSKeyPath) 74 }) 75 76 g.Go(func() error { 77 <-gCtx.Done() 78 79 log.Println("Graceful shutdown") 80 log.Println("Closing database connection") 81 dataStorage.Close() 82 83 log.Println("Shutting down web-server") 84 return httpServer.Shutdown(appContext) 85 }) 86 87 if err := g.Wait(); err != nil { 88 log.Printf("exit reason: %s \n", err) 89 } 90 91 log.Println("Exited") 92 }