func main()

in api/main.go [88:145]


func main() {
	initLogger()

	ctx := context.Background()

	md, err := getMetadata(ctx)
	if err != nil {
		log.Error().Err(err).Msg("failed to get metadata from metadata server")

		// local environment must raise this error.
		md = &instanceMetadata{
			projectID: os.Getenv("PROJECT_ID"),
		}
	}

	clients, err := client.NewClients(ctx, md.projectID)
	if err != nil {
		panic(err)
	}

	r := router(clients)

	port := os.Getenv("PORT")
	if port == "" {
		port = "8000"
	}

	srv := &http.Server{
		Addr:              ":" + port,
		Handler:           r,
		ReadHeaderTimeout: readHeaderTimeoutSecond * time.Second,
	}

	go func() {
		log.Info().Msgf("starting server with port %s", port)
		if err := srv.ListenAndServe(); err != nil {
			if err == http.ErrServerClosed {
				log.Info().Err(err).Msgf("stopped listening and serving")
			} else {
				log.Fatal().Err(err).Msgf("failed to start server")
			}
		}
	}()

	ch := make(chan os.Signal, 1)
	signal.Notify(ch, syscall.SIGTERM, syscall.SIGINT)
	log.Info().Msgf("received signal: %s", <-ch)

	ctx, cancel := context.WithTimeout(context.Background(), shutdownTimeoutSecond*time.Second)
	defer cancel()

	log.Info().Msg("shutting down server")
	if err := srv.Shutdown(ctx); err != nil {
		log.Error().Err(err).Msgf("shutdown error")
	}

	log.Info().Msg("bye")
}