2024-06-17 19:42:09 +07:00
package main
import (
"context"
"fmt"
nethttp "net/http"
"os"
"os/signal"
"syscall"
"time"
2024-07-05 20:32:40 +07:00
"github.com/getAlby/hub/http"
"github.com/getAlby/hub/logger"
"github.com/getAlby/hub/service"
2024-06-17 19:42:09 +07:00
"github.com/labstack/echo/v4"
log "github.com/sirupsen/logrus"
)
func main ( ) {
2024-08-28 17:34:50 +02:00
log . Info ( "AlbyHub Starting in HTTP mode" )
2024-06-25 13:30:33 +07:00
// Create a channel to receive OS signals.
osSignalChannel := make ( chan os . Signal , 1 )
2024-09-25 17:31:05 +07:00
// Notify the channel on os.Interrupt, syscall.SIGTERM. os.Kill cannot be caught.
2025-07-23 17:00:00 +07:00
signal . Notify ( osSignalChannel , os . Interrupt , syscall . SIGTERM , syscall . SIGPIPE )
2024-06-25 13:30:33 +07:00
ctx , cancel := context . WithCancel ( context . Background ( ) )
2025-06-26 15:09:27 +05:30
var signal os . Signal
go func ( ) {
2025-07-30 23:42:19 +07:00
for {
// wait for exit signal
signal = <- osSignalChannel
logger . Logger . WithField ( "signal" , signal ) . Info ( "Received OS signal" )
if signal == syscall . SIGPIPE {
logger . Logger . WithField ( "signal" , signal ) . Warn ( "Ignoring SIGPIPE signal" )
continue
}
cancel ( )
break
2025-07-23 17:00:00 +07:00
}
2025-06-26 15:09:27 +05:30
} ( )
2025-06-17 21:07:52 +07:00
svc , err := service . NewService ( ctx )
if err != nil {
log . WithError ( err ) . Fatal ( "Failed to create service" )
return
}
2024-06-17 19:42:09 +07:00
e := echo . New ( )
//register shared routes
httpSvc := http . NewHttpService ( svc , svc . GetEventPublisher ( ) )
httpSvc . RegisterSharedRoutes ( e )
//start Echo server
go func ( ) {
if err := e . Start ( fmt . Sprintf ( ":%v" , svc . GetConfig ( ) . GetEnv ( ) . Port ) ) ; err != nil && err != nethttp . ErrServerClosed {
2024-09-25 17:31:05 +07:00
logger . Logger . WithError ( err ) . Error ( "echo server failed to start" )
2025-03-18 16:02:43 +07:00
cancel ( )
2024-06-17 19:42:09 +07:00
}
} ( )
2024-06-25 13:30:33 +07:00
2024-06-17 19:42:09 +07:00
//handle graceful shutdown
<- ctx . Done ( )
2024-06-25 13:30:33 +07:00
logger . Logger . WithField ( "signal" , signal ) . Info ( "Context Done" )
logger . Logger . Info ( "Shutting down echo server..." )
ctx , cancel = context . WithTimeout ( context . Background ( ) , 10 * time . Second )
2024-06-17 19:42:09 +07:00
defer cancel ( )
2025-06-17 21:07:52 +07:00
err = e . Shutdown ( ctx )
2024-09-03 17:09:26 +07:00
if err != nil {
logger . Logger . WithError ( err ) . Error ( "Failed to shutdown echo server" )
}
2024-06-17 19:42:09 +07:00
logger . Logger . Info ( "Echo server exited" )
2024-07-13 20:01:33 +07:00
svc . Shutdown ( )
2024-06-17 19:42:09 +07:00
logger . Logger . Info ( "Service exited" )
2025-03-05 11:24:10 +07:00
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." )
2024-06-17 19:42:09 +07:00
}