feat(backend): web proxy

This commit is contained in:
pycook
2025-07-30 14:22:43 +08:00
parent 45df5761c8
commit 03d1483f9f
15 changed files with 2059 additions and 44 deletions

View File

@@ -5,6 +5,8 @@ import (
swaggerFiles "github.com/swaggo/files"
ginSwagger "github.com/swaggo/gin-swagger"
"strings"
"github.com/veops/oneterm/internal/api/controller"
"github.com/veops/oneterm/internal/api/docs"
"github.com/veops/oneterm/internal/api/middleware"
@@ -12,9 +14,33 @@ import (
func SetupRouter(r *gin.Engine) {
r.SetTrustedProxies([]string{"0.0.0.0/0", "::/0"})
r.MaxMultipartMemory = 32 << 20 // 32MB, match with controller constant
r.MaxMultipartMemory = 1 << 20 // 1MB to prevent memory overflow
r.Use(gin.Recovery(), middleware.LoggerMiddleware())
// Start web session cleanup routine
controller.StartSessionCleanupRoutine()
// Subdomain proxy middleware for asset- subdomains
webProxy := controller.NewWebProxyController()
r.Use(func(c *gin.Context) {
host := c.Request.Host
// Check if this is an asset subdomain request
if strings.HasPrefix(host, "asset-") {
// Handle external redirect requests
if c.Request.URL.Path == "/external" {
webProxy.HandleExternalRedirect(c)
return
}
// Handle normal proxy requests
webProxy.ProxyWebRequest(c)
return
}
c.Next()
})
docs.SwaggerInfo.Title = "ONETERM API"
docs.SwaggerInfo.BasePath = "/api/oneterm/v1"
r.GET("/swagger/*any", ginSwagger.WrapHandler(swaggerFiles.Handler))
@@ -224,5 +250,11 @@ func SetupRouter(r *gin.Engine) {
commandTemplate.GET("/builtin", c.GetBuiltInCommandTemplates)
commandTemplate.GET("/:id/commands", c.GetTemplateCommands)
}
// Web proxy management API routes
webProxyGroup := v1.Group("/web_proxy")
{
webProxyGroup.POST("/start", webProxy.StartWebSession)
}
}
}