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  }