Add listen to Unix websocket

This commit is contained in:
Thomas Miceli
2025-06-04 18:44:17 +02:00
parent 3c0115d829
commit ab9382b8b1
4 changed files with 70 additions and 7 deletions

View File

@ -3,7 +3,7 @@
# https://github.com/thomiceli/opengist/blob/master/docs/configuration/cheat-sheet.md # https://github.com/thomiceli/opengist/blob/master/docs/configuration/cheat-sheet.md
# Set the log level to one of the following: debug, info, warn, error, fatal. Default: warn # Set the log level to one of the following: debug, info, warn, error, fatal. Default: warn
log-level: warn log-level: debug
# Set the log output to one or more of the following: `stdout`, `file`. Default: stdout,file # Set the log output to one or more of the following: `stdout`, `file`. Default: stdout,file
log-output: stdout,file log-output: stdout,file
@ -43,6 +43,7 @@ sqlite.journal-mode: WAL
# HTTP server configuration # HTTP server configuration
# Host to bind to. Default: 0.0.0.0 # Host to bind to. Default: 0.0.0.0
# Use an IP address for network binding. Use a path for Unix socket binding (e.g. /run/opengist.sock)
http.host: 0.0.0.0 http.host: 0.0.0.0
# Port to bind to. Default: 6157 # Port to bind to. Default: 6157

View File

@ -36,11 +36,12 @@ var CmdStart = cli.Command{
Initialize(ctx) Initialize(ctx)
go server.NewServer(os.Getenv("OG_DEV") == "1", path.Join(config.GetHomeDir(), "sessions"), false).Start() server := server.NewServer(os.Getenv("OG_DEV") == "1", path.Join(config.GetHomeDir(), "sessions"), false)
go server.StartUnixSocket()
go ssh.Start() go ssh.Start()
<-stopCtx.Done() <-stopCtx.Done()
shutdown() shutdown(server)
return nil return nil
}, },
} }
@ -130,7 +131,7 @@ func Initialize(ctx *cli.Context) {
} }
} }
func shutdown() { func shutdown(server *server.Server) {
log.Info().Msg("Shutting down database...") log.Info().Msg("Shutting down database...")
if err := db.Close(); err != nil { if err := db.Close(); err != nil {
log.Error().Err(err).Msg("Failed to close database") log.Error().Err(err).Msg("Failed to close database")
@ -141,6 +142,8 @@ func shutdown() {
index.Close() index.Close()
} }
server.StopUnixSocket()
log.Info().Msg("Shutdown complete") log.Info().Msg("Shutdown complete")
} }

View File

@ -2,7 +2,9 @@ package server
import ( import (
"github.com/thomiceli/opengist/internal/validator" "github.com/thomiceli/opengist/internal/validator"
"net"
"net/http" "net/http"
"os"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"github.com/rs/zerolog/log" "github.com/rs/zerolog/log"
@ -54,12 +56,54 @@ func (s *Server) Start() {
} }
} }
func (s *Server) StartUnixSocket() {
socketPath := "/tmp/opengist.sock"
if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) {
log.Warn().Err(err).Str("socket", socketPath).Msg("Failed to remove existing socket file")
}
listener, err := net.Listen("unix", socketPath)
if err != nil {
log.Fatal().Err(err).Msg("Failed to start Unix socket server")
}
s.echo.Listener = listener
log.Info().Msgf("Starting Unix socket server on " + socketPath)
server := new(http.Server)
if err := s.echo.StartServer(server); err != nil && err != http.ErrServerClosed {
log.Fatal().Err(err).Msg("Failed to start Unix socket server")
}
}
func (s *Server) Stop() { func (s *Server) Stop() {
if err := s.echo.Close(); err != nil { if err := s.echo.Close(); err != nil {
log.Fatal().Err(err).Msg("Failed to stop HTTP server") log.Fatal().Err(err).Msg("Failed to stop HTTP server")
} }
} }
func (s *Server) StopUnixSocket() {
log.Info().Msg("Stopping Unix socket server...")
var socketPath string
if s.echo.Listener != nil {
if unixListener, ok := s.echo.Listener.(*net.UnixListener); ok {
socketPath = unixListener.Addr().String()
}
}
if err := s.echo.Close(); err != nil {
log.Error().Err(err).Msg("Failed to stop Unix socket server")
}
if socketPath != "" {
if err := os.Remove(socketPath); err != nil && !os.IsNotExist(err) {
log.Error().Err(err).Str("socket", socketPath).Msg("Failed to remove socket file")
} else {
log.Info().Str("socket", socketPath).Msg("Socket file removed")
}
}
}
func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) { func (s *Server) ServeHTTP(w http.ResponseWriter, r *http.Request) {
s.echo.ServeHTTP(w, r) s.echo.ServeHTTP(w, r)
} }

View File

@ -1,8 +1,23 @@
#!/bin/sh #!/bin/sh
set -euo pipefail set -euo pipefail
# Start background processes
make watch_frontend & make watch_frontend &
make watch_backend & FRONTEND_PID=$!
trap 'kill $(jobs -p)' EXIT make watch_backend &
BACKEND_PID=$!
# Function for graceful shutdown
cleanup() {
echo "Shutting down gracefully..."
kill -TERM $FRONTEND_PID $BACKEND_PID 2>/dev/null || true
wait $FRONTEND_PID $BACKEND_PID 2>/dev/null || true
echo "Shutdown complete"
}
# Set up trap for graceful shutdown
trap cleanup EXIT INT TERM
# Wait for background processes
wait wait