Prometheus on a node; panel under a URL prefix; open ports on migrate import
A panel without VPN (e.g. after the move) can use a Prometheus that lives on a node, such as the one with history left on the old server (node #0). Both directions go through the agent's WSS: the node's Prometheus scrapes 127.0.0.1:AGENT_METRICS_PORT/metrics, the agent checks its token and asks core (metrics → metrics_res, the same exposition as /metrics, at most once per 5 s per connection); the monitor tab reads it back through the agent, which forwards only GET /-/ready and /api/v1/query[_range]. The panel finds it by itself (local first, then the lowest-id node), and the install/remove buttons work on a panel without VPN. `monitor install` on a node without its own panel picks AGENT_METRICS_PORT, writes it to cli.env and restarts the agent; on the old server it keeps the collected data. The panel works behind nginx in a subfolder: relative asset and API paths, relative directory redirects, and the client address from X-Forwarded-For / X-Real-IP only from trusted proxies (loopback, TRUST_PROXY). migrate import opens the moved SUB_PORT/NODE_PORT in UFW when it is active.
This commit is contained in:
@@ -14,6 +14,7 @@ import (
|
||||
"net/http"
|
||||
"net/url"
|
||||
"os"
|
||||
"path"
|
||||
"path/filepath"
|
||||
"regexp"
|
||||
"sort"
|
||||
@@ -908,7 +909,9 @@ func (a *App) static(c *Ctx) bool {
|
||||
if st, err := os.Stat(f); err == nil && !hidden {
|
||||
if st.IsDir() {
|
||||
if !strings.HasSuffix(c.R.URL.Path, "/") {
|
||||
http.Redirect(c.W, c.R, c.R.URL.Path+"/", http.StatusMovedPermanently)
|
||||
// Относительный адрес: за прокси в подпапке абсолютный увёл бы из неё.
|
||||
c.W.Header().Set("Location", path.Base(c.R.URL.Path)+"/")
|
||||
c.W.WriteHeader(http.StatusMovedPermanently)
|
||||
return false
|
||||
}
|
||||
f = filepath.Join(f, "index.html")
|
||||
|
||||
Reference in New Issue
Block a user