main.go raw

   1  package main
   2  
   3  import (
   4  	"context"
   5  	"fmt"
   6  	nethttp "net/http"
   7  	"os"
   8  	"os/signal"
   9  	"syscall"
  10  	"time"
  11  
  12  	"github.com/getAlby/hub/http"
  13  	"github.com/getAlby/hub/logger"
  14  	"github.com/getAlby/hub/service"
  15  	"github.com/labstack/echo/v4"
  16  	log "github.com/sirupsen/logrus"
  17  )
  18  
  19  func main() {
  20  	log.Info("AlbyHub Starting in HTTP mode")
  21  
  22  	// Create a channel to receive OS signals.
  23  	osSignalChannel := make(chan os.Signal, 1)
  24  	// Notify the channel on os.Interrupt, syscall.SIGTERM. os.Kill cannot be caught.
  25  	signal.Notify(osSignalChannel, os.Interrupt, syscall.SIGTERM, syscall.SIGPIPE)
  26  
  27  	ctx, cancel := context.WithCancel(context.Background())
  28  
  29  	var signal os.Signal
  30  	go func() {
  31  		for {
  32  			// wait for exit signal
  33  			signal = <-osSignalChannel
  34  			logger.Logger.WithField("signal", signal).Info("Received OS signal")
  35  
  36  			if signal == syscall.SIGPIPE {
  37  				logger.Logger.WithField("signal", signal).Warn("Ignoring SIGPIPE signal")
  38  				continue
  39  			}
  40  
  41  			cancel()
  42  			break
  43  		}
  44  	}()
  45  
  46  	svc, err := service.NewService(ctx)
  47  	if err != nil {
  48  		log.WithError(err).Fatal("Failed to create service")
  49  		return
  50  	}
  51  
  52  	e := echo.New()
  53  
  54  	//register shared routes
  55  	httpSvc := http.NewHttpService(svc, svc.GetEventPublisher())
  56  	httpSvc.RegisterSharedRoutes(e)
  57  	//start Echo server
  58  	go func() {
  59  		if err := e.Start(fmt.Sprintf(":%v", svc.GetConfig().GetEnv().Port)); err != nil && err != nethttp.ErrServerClosed {
  60  			logger.Logger.WithError(err).Error("echo server failed to start")
  61  			cancel()
  62  		}
  63  	}()
  64  
  65  	//handle graceful shutdown
  66  	<-ctx.Done()
  67  	logger.Logger.WithField("signal", signal).Info("Context Done")
  68  	logger.Logger.Info("Shutting down echo server...")
  69  	ctx, cancel = context.WithTimeout(context.Background(), 10*time.Second)
  70  	defer cancel()
  71  	err = e.Shutdown(ctx)
  72  	if err != nil {
  73  		logger.Logger.WithError(err).Error("Failed to shutdown echo server")
  74  	}
  75  	logger.Logger.Info("Echo server exited")
  76  	svc.Shutdown()
  77  	logger.Logger.Info("Service exited")
  78  	logger.Logger.Info("Alby Hub needs to stay online to send and receive transactions. Channels may be closed if your hub stays offline for an extended period of time.")
  79  }
  80