mirror of
https://github.com/ditatompel/xmr-remote-nodes.git
synced 2024-11-17 01:17:37 +00:00
5496692c5d
I hope it will be less discoverable by other users and less likely to be used unintentionally in other projects.
103 lines
2.4 KiB
Go
103 lines
2.4 KiB
Go
package cmd
|
|
|
|
import (
|
|
"fmt"
|
|
"os"
|
|
"os/signal"
|
|
"syscall"
|
|
"xmr-remote-nodes/frontend"
|
|
"xmr-remote-nodes/handler"
|
|
"xmr-remote-nodes/internal/config"
|
|
"xmr-remote-nodes/internal/database"
|
|
"xmr-remote-nodes/internal/repo"
|
|
|
|
"github.com/gofiber/fiber/v2"
|
|
"github.com/gofiber/fiber/v2/middleware/cors"
|
|
"github.com/gofiber/fiber/v2/middleware/encryptcookie"
|
|
"github.com/gofiber/fiber/v2/middleware/filesystem"
|
|
"github.com/gofiber/fiber/v2/middleware/logger"
|
|
"github.com/gofiber/fiber/v2/middleware/recover"
|
|
"github.com/spf13/cobra"
|
|
)
|
|
|
|
var serveCmd = &cobra.Command{
|
|
Use: "serve",
|
|
Short: "Serve the WebUI",
|
|
Long: `This command will run HTTP server for APIs and WebUI.`,
|
|
Run: func(_ *cobra.Command, _ []string) {
|
|
serve()
|
|
},
|
|
}
|
|
|
|
func init() {
|
|
rootCmd.AddCommand(serveCmd)
|
|
}
|
|
|
|
func serve() {
|
|
appCfg := config.AppCfg()
|
|
// connect to DB
|
|
if err := database.ConnectDB(); err != nil {
|
|
panic(err)
|
|
}
|
|
|
|
// Define Fiber config & app.
|
|
app := fiber.New(fiberConfig())
|
|
|
|
// recover
|
|
app.Use(recover.New(recover.Config{EnableStackTrace: appCfg.Debug}))
|
|
|
|
// logger middleware
|
|
if appCfg.Debug {
|
|
app.Use(logger.New(logger.Config{
|
|
Format: "[${time}] ${status} - ${latency} ${method} ${path} ${queryParams} ${ip} ${ua}\n",
|
|
}))
|
|
}
|
|
|
|
app.Use(cors.New(cors.Config{
|
|
AllowOrigins: appCfg.AllowOrigin,
|
|
AllowHeaders: "Origin, Content-Type, Accept",
|
|
AllowCredentials: true,
|
|
}))
|
|
|
|
// cookie
|
|
app.Use(encryptcookie.New(encryptcookie.Config{Key: appCfg.SecretKey}))
|
|
|
|
handler.AppRoute(app)
|
|
handler.V1Api(app)
|
|
app.Use("/", filesystem.New(filesystem.Config{
|
|
Root: frontend.SvelteKitHandler(),
|
|
// NotFoundFile: "index.html",
|
|
}))
|
|
|
|
// signal channel to capture system calls
|
|
sigCh := make(chan os.Signal, 1)
|
|
signal.Notify(sigCh, syscall.SIGTERM, syscall.SIGINT, syscall.SIGQUIT)
|
|
|
|
// start a cleanup cron-job
|
|
if !fiber.IsChild() {
|
|
cronRepo := repo.NewCron(database.GetDB())
|
|
go cronRepo.RunCronProcess()
|
|
}
|
|
|
|
// start shutdown goroutine
|
|
go func() {
|
|
// capture sigterm and other system call here
|
|
<-sigCh
|
|
fmt.Println("Shutting down HTTP server...")
|
|
_ = app.Shutdown()
|
|
}()
|
|
|
|
// start http server
|
|
serverAddr := fmt.Sprintf("%s:%d", appCfg.Host, appCfg.Port)
|
|
if err := app.Listen(serverAddr); err != nil {
|
|
fmt.Printf("Server is not running! error: %v", err)
|
|
}
|
|
}
|
|
|
|
func fiberConfig() fiber.Config {
|
|
return fiber.Config{
|
|
Prefork: config.AppCfg().Prefork,
|
|
ProxyHeader: config.AppCfg().ProxyHeader,
|
|
AppName: "ditatompel's XMR Nodes HTTP server " + AppVer,
|
|
}
|
|
}
|