From 27c13d6c47c9004225b33c1c8e78e219d03da484 Mon Sep 17 00:00:00 2001 From: sagitchu Date: Fri, 20 Mar 2026 22:15:51 +0800 Subject: [PATCH] chore: release 2.1.9-beta7 --- AGENTS.md | 6 +-- README.md | 8 ++-- go-backend/AGENTS.md | 5 +++ go-backend/internal/http/handler/AGENTS.md | 5 ++- .../internal/http/handler/monitoring.go | 24 ++++++++++++ go-backend/internal/store/repo/repository.go | 19 ++++++++++ go-gost/AGENTS.md | 5 ++- go-gost/x/AGENTS.md | 5 +++ go-gost/x/api/AGENTS.md | 5 +++ go-gost/x/config/AGENTS.md | 5 +++ go-gost/x/connector/AGENTS.md | 5 ++- go-gost/x/dialer/AGENTS.md | 5 +++ go-gost/x/handler/AGENTS.md | 5 +++ go-gost/x/listener/AGENTS.md | 5 +++ go-gost/x/registry/AGENTS.md | 5 ++- go-gost/x/socket/AGENTS.md | 5 ++- plans/058-sync-main-and-push-tag.md | 13 +++++++ vite-frontend/AGENTS.md | 6 +-- vite-frontend/src/api/index.ts | 17 +++++++-- vite-frontend/src/pages/node/monitor-view.tsx | 38 +++++++++---------- 20 files changed, 154 insertions(+), 37 deletions(-) create mode 100644 plans/058-sync-main-and-push-tag.md diff --git a/AGENTS.md b/AGENTS.md index 31e81de..530e7eb 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -1,9 +1,9 @@ # PROJECT KNOWLEDGE BASE -**Generated:** Thu Mar 19 2026 -**Commit:** 6458b5a +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 **Branch:** main -**Tag:** 2.1.9-alpha5 +**Tag:** 2.1.9-beta6 ## OVERVIEW FLVX (formerly Flux Panel) is a traffic forwarding management system built on a forked GOST v3 stack. It ships as a Go-based admin API (SQLite/PostgreSQL) + Vite/React UI + Go forwarding agent, with optional mobile WebView wrappers. diff --git a/README.md b/README.md index 8a9efe2..4ef46ab 100644 --- a/README.md +++ b/README.md @@ -33,13 +33,13 @@ curl -L https://raw.githubusercontent.com/Sagit-chu/flux-panel/main/install.sh - #### 安装特定版本 从 [Releases](https://github.com/Sagit-chu/flux-panel/releases) 页面复制对应版本的安装命令,脚本会自动安装该版本而非最新版。 -面板端(以 2.1.0 为例): +面板端(以 2.1.9-beta6 为例): ```bash -curl -L https://github.com/Sagit-chu/flux-panel/releases/download/2.1.0/panel_install.sh -o panel_install.sh && chmod +x panel_install.sh && ./panel_install.sh +curl -L https://github.com/Sagit-chu/flux-panel/releases/download/2.1.9-beta6/panel_install.sh -o panel_install.sh && chmod +x panel_install.sh && ./panel_install.sh ``` -节点端(以 2.1.0 为例): +节点端(以 2.1.9-beta6 为例): ```bash -curl -L https://github.com/Sagit-chu/flux-panel/releases/download/2.1.0/install.sh -o install.sh && chmod +x install.sh && ./install.sh +curl -L https://github.com/Sagit-chu/flux-panel/releases/download/2.1.9-beta6/install.sh -o install.sh && chmod +x install.sh && ./install.sh ``` #### PostgreSQL 部署(Docker Compose) diff --git a/go-backend/AGENTS.md b/go-backend/AGENTS.md index 44975dd..8425da5 100644 --- a/go-backend/AGENTS.md +++ b/go-backend/AGENTS.md @@ -1,5 +1,10 @@ # GO BACKEND KNOWLEDGE BASE +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 + ## OVERVIEW Go-based Admin API for FLVX. Replaced legacy Spring Boot backend. **Stack:** Go 1.24, net/http (std lib), GORM + SQLite/PostgreSQL (glebarez/sqlite - CGO-free). diff --git a/go-backend/internal/http/handler/AGENTS.md b/go-backend/internal/http/handler/AGENTS.md index 0438ab9..6f4b9c1 100644 --- a/go-backend/internal/http/handler/AGENTS.md +++ b/go-backend/internal/http/handler/AGENTS.md @@ -1,6 +1,9 @@ # BACKEND HTTP HANDLER KNOWLEDGE BASE -**Generated:** Thu Feb 26 2026 +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 ## OVERVIEW HTTP request handlers for FLVX Admin API. Core business logic layer. diff --git a/go-backend/internal/http/handler/monitoring.go b/go-backend/internal/http/handler/monitoring.go index 99c309d..86ed755 100644 --- a/go-backend/internal/http/handler/monitoring.go +++ b/go-backend/internal/http/handler/monitoring.go @@ -695,6 +695,30 @@ func (h *Handler) monitorServiceResultsHandler(w http.ResponseWriter, r *http.Re return } + // If start/end time range is provided, use time-based query (mirrors node metrics / tunnel quality pattern). + startStr := r.URL.Query().Get("start") + endStr := r.URL.Query().Get("end") + if startStr != "" && endStr != "" { + startMs, err1 := strconv.ParseInt(startStr, 10, 64) + endMs, err2 := strconv.ParseInt(endStr, 10, 64) + if err1 != nil || err2 != nil || startMs <= 0 || endMs <= 0 || endMs < startMs { + response.WriteJSON(w, response.ErrDefault("无效的时间范围")) + return + } + if endMs-startMs > maxMetricsRangeMs { + response.WriteJSON(w, response.ErrDefault("时间范围过大")) + return + } + results, err := h.repo.GetServiceMonitorResultsByTimeRange(monitorID, startMs, endMs) + if err != nil { + response.WriteJSON(w, response.Err(-2, err.Error())) + return + } + response.WriteJSON(w, response.OK(results)) + return + } + + // Fallback: count-based limit query (backward compat). limit := 100 if l := r.URL.Query().Get("limit"); l != "" { if v, err := strconv.Atoi(l); err == nil && v > 0 && v <= 1000 { diff --git a/go-backend/internal/store/repo/repository.go b/go-backend/internal/store/repo/repository.go index a0a6de3..1f9b179 100644 --- a/go-backend/internal/store/repo/repository.go +++ b/go-backend/internal/store/repo/repository.go @@ -3568,6 +3568,25 @@ func (r *Repository) GetServiceMonitorResults(monitorID int64, limit int) ([]mod return results, err } +// GetServiceMonitorResultsByTimeRange returns results for a monitor within [startMs, endMs]. +// Mirrors GetNodeMetrics / GetTunnelMetrics pattern for time-range based charting. +func (r *Repository) GetServiceMonitorResultsByTimeRange(monitorID int64, startMs, endMs int64) ([]model.ServiceMonitorResult, error) { + if r == nil || r.db == nil { + return nil, nil + } + var results []model.ServiceMonitorResult + err := r.db.Where("monitor_id = ? AND timestamp >= ? AND timestamp <= ?", monitorID, startMs, endMs). + Order("timestamp DESC"). + Limit(5000). + Find(&results).Error + if len(results) > 1 { + for i, j := 0, len(results)-1; i < j; i, j = i+1, j-1 { + results[i], results[j] = results[j], results[i] + } + } + return results, err +} + // GetLatestServiceMonitorResults returns the newest result per monitor_id. // This is intended for list rendering (avoid N+1 queries). func (r *Repository) GetLatestServiceMonitorResults() ([]model.ServiceMonitorResult, error) { diff --git a/go-gost/AGENTS.md b/go-gost/AGENTS.md index dcf330e..e881dfa 100644 --- a/go-gost/AGENTS.md +++ b/go-gost/AGENTS.md @@ -1,6 +1,9 @@ # GO-GOST SERVICE KNOWLEDGE BASE -**Generated:** Thu Feb 26 2026 +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 ## OVERVIEW Forwarding agent built on GOST v3 with a local fork of `github.com/go-gost/x` under `x/`. diff --git a/go-gost/x/AGENTS.md b/go-gost/x/AGENTS.md index 6d81366..66762cd 100644 --- a/go-gost/x/AGENTS.md +++ b/go-gost/x/AGENTS.md @@ -1,5 +1,10 @@ # GO-GOST/X KNOWLEDGE BASE +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 + ## OVERVIEW Local fork of `github.com/go-gost/x` used by `go-gost/` via `replace github.com/go-gost/x => ./x`. Most protocol/runtime behavior changes happen here. 30+ top-level packages - framework-style layout. diff --git a/go-gost/x/api/AGENTS.md b/go-gost/x/api/AGENTS.md index 00d0811..07a12bb 100644 --- a/go-gost/x/api/AGENTS.md +++ b/go-gost/x/api/AGENTS.md @@ -1,5 +1,10 @@ # GO-GOST/X API KNOWLEDGE BASE +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 + ## OVERVIEW Gin-based management API for reading/writing config and controlling services at runtime. diff --git a/go-gost/x/config/AGENTS.md b/go-gost/x/config/AGENTS.md index 3f109ba..918e53e 100644 --- a/go-gost/x/config/AGENTS.md +++ b/go-gost/x/config/AGENTS.md @@ -1,5 +1,10 @@ # GO-GOST/X CONFIG KNOWLEDGE BASE +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 + ## OVERVIEW Config model + parsing/loading pipeline for the `go-gost/x` runtime. This is the bridge between `gost.json`/`gost.yaml` and in-memory registries/services. diff --git a/go-gost/x/connector/AGENTS.md b/go-gost/x/connector/AGENTS.md index 581fbe8..5b56bad 100644 --- a/go-gost/x/connector/AGENTS.md +++ b/go-gost/x/connector/AGENTS.md @@ -1,6 +1,9 @@ # GOST CONNECTOR KNOWLEDGE BASE -**Generated:** Fri Feb 13 2026 +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 ## OVERVIEW Connection initiators (clients) for various protocols in GOST forwarding. diff --git a/go-gost/x/dialer/AGENTS.md b/go-gost/x/dialer/AGENTS.md index f62543c..995e0cc 100644 --- a/go-gost/x/dialer/AGENTS.md +++ b/go-gost/x/dialer/AGENTS.md @@ -1,5 +1,10 @@ # GO-GOST/X DIALERS KNOWLEDGE BASE +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 + ## OVERVIEW Outbound dialers (client-side connection establishment) used by connectors/handlers. diff --git a/go-gost/x/handler/AGENTS.md b/go-gost/x/handler/AGENTS.md index 9caac7a..54c76a1 100644 --- a/go-gost/x/handler/AGENTS.md +++ b/go-gost/x/handler/AGENTS.md @@ -1,5 +1,10 @@ # GO-GOST/X HANDLERS KNOWLEDGE BASE +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 + ## OVERVIEW Protocol handlers (server-side request handling) used by services defined in the GOST config. diff --git a/go-gost/x/listener/AGENTS.md b/go-gost/x/listener/AGENTS.md index 53f3cfe..a9a34b7 100644 --- a/go-gost/x/listener/AGENTS.md +++ b/go-gost/x/listener/AGENTS.md @@ -1,5 +1,10 @@ # GO-GOST/X LISTENERS KNOWLEDGE BASE +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 + ## OVERVIEW Inbound listeners (transport-level accept loops) used by services defined in the GOST config. diff --git a/go-gost/x/registry/AGENTS.md b/go-gost/x/registry/AGENTS.md index 10f5ab1..3c74027 100644 --- a/go-gost/x/registry/AGENTS.md +++ b/go-gost/x/registry/AGENTS.md @@ -1,6 +1,9 @@ # GO-GOST REGISTRY KNOWLEDGE BASE -**Generated:** Wed Feb 04 2026 +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 ## OVERVIEW Central registration point for all pluggable GOST components (handlers, listeners, dialers, etc.). diff --git a/go-gost/x/socket/AGENTS.md b/go-gost/x/socket/AGENTS.md index 388730d..052bf14 100644 --- a/go-gost/x/socket/AGENTS.md +++ b/go-gost/x/socket/AGENTS.md @@ -1,6 +1,9 @@ # GOST SOCKET KNOWLEDGE BASE -**Generated:** Sun Feb 15 2026 +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 +**Branch:** main +**Tag:** 2.1.9-beta6 ## OVERVIEW WebSocket reporter and socket utilities for panel integration. diff --git a/plans/058-sync-main-and-push-tag.md b/plans/058-sync-main-and-push-tag.md new file mode 100644 index 0000000..f6b6f5f --- /dev/null +++ b/plans/058-sync-main-and-push-tag.md @@ -0,0 +1,13 @@ +# Plan 058: Sync Main and Push Tag + +Sync current changes to `main`, merge to `master` (if needed) or just PR/merge on `main` (if that's the flow), and push a new tag `2.1.9-beta7`. + +## Tasks + +- [ ] Determine the next tag version (`2.1.9-beta7`). +- [ ] Create a feature branch `release/2.1.9-beta7`. +- [ ] Commit all current changes to the feature branch. +- [ ] Push the feature branch to remote. +- [ ] Create a PR to `main`. +- [ ] Merge the PR to `main`. +- [ ] Create and push tag `2.1.9-beta7`. diff --git a/vite-frontend/AGENTS.md b/vite-frontend/AGENTS.md index 7786736..b18db80 100644 --- a/vite-frontend/AGENTS.md +++ b/vite-frontend/AGENTS.md @@ -1,9 +1,9 @@ # VITE FRONTEND KNOWLEDGE BASE -**Generated:** Thu Feb 26 2026 -**Commit:** 21008cc +**Generated:** Fri Mar 20 2026 +**Commit:** f45f960 **Branch:** main -**Tag:** 2.1.5-rc15 +**Tag:** 2.1.9-beta6 ## OVERVIEW Web management console for FLVX. diff --git a/vite-frontend/src/api/index.ts b/vite-frontend/src/api/index.ts index ee824a0..8e00a47 100644 --- a/vite-frontend/src/api/index.ts +++ b/vite-frontend/src/api/index.ts @@ -486,11 +486,22 @@ export const updateServiceMonitor = (data: ServiceMonitorMutationPayload) => export const deleteServiceMonitor = (id: number) => Network.post("/monitor/services/delete", { id }); -export const getServiceMonitorResults = (monitorId: number, limit = 100) => - Network.get( +export const getServiceMonitorResults = ( + monitorId: number, + options?: { limit?: number; start?: number; end?: number }, +) => { + const params: Record = {}; + if (options?.start != null && options?.end != null) { + params.start = String(options.start); + params.end = String(options.end); + } else if (options?.limit != null) { + params.limit = String(options.limit); + } + return Network.get( `/monitor/services/${monitorId}/results`, - { limit: String(limit) }, + params, ); +}; export const getServiceMonitorLatestResults = () => Network.get( diff --git a/vite-frontend/src/pages/node/monitor-view.tsx b/vite-frontend/src/pages/node/monitor-view.tsx index d25e0bb..38af4e5 100644 --- a/vite-frontend/src/pages/node/monitor-view.tsx +++ b/vite-frontend/src/pages/node/monitor-view.tsx @@ -314,7 +314,7 @@ export function MonitorView({ nodeMap, viewMode = "grid" }: MonitorViewProps) { }); const [submitLoading, setSubmitLoading] = useState(false); const [activeServiceMonitorId, setActiveServiceMonitorId] = useState(null); - const [serviceMonitorRangeLimit, setServiceMonitorRangeLimit] = useState(50); + const [serviceMonitorRangeMs, setServiceMonitorRangeMs] = useState(60 * 60 * 1000); const [accessDenied, setAccessDenied] = useState(null); const [resultsModalOpen, setResultsModalOpen] = useState(false); @@ -526,9 +526,12 @@ export function MonitorView({ nodeMap, viewMode = "grid" }: MonitorViewProps) { }, []); const loadMonitorResults = useCallback( - async (monitorId: number, limit = 20) => { + async (monitorId: number, options?: { rangeMs?: number; limit?: number }) => { try { - const response = await getServiceMonitorResults(monitorId, limit); + const apiOptions = options?.rangeMs != null + ? { start: Date.now() - options.rangeMs, end: Date.now() } + : { limit: options?.limit ?? 100 }; + const response = await getServiceMonitorResults(monitorId, apiOptions); if (response.code === 0 && response.data) { setMonitorResults((prev) => ({ @@ -600,7 +603,7 @@ export function MonitorView({ nodeMap, viewMode = "grid" }: MonitorViewProps) { if (!resultsMonitorId) return; setResultsLoading(true); try { - await loadMonitorResults(resultsMonitorId, resultsLimit); + await loadMonitorResults(resultsMonitorId, { limit: resultsLimit }); } finally { setResultsLoading(false); } @@ -641,11 +644,11 @@ export function MonitorView({ nodeMap, viewMode = "grid" }: MonitorViewProps) { void loadResultsForModal(); }, [resultsModalOpen, resultsMonitorId, resultsLimit, loadResultsForModal]); - // Reload results for the active service monitor chart when range limit changes + // Reload results for the active service monitor chart when time range changes useEffect(() => { if (!activeServiceMonitorId) return; - void loadMonitorResults(activeServiceMonitorId, serviceMonitorRangeLimit); - }, [activeServiceMonitorId, serviceMonitorRangeLimit, loadMonitorResults]); + void loadMonitorResults(activeServiceMonitorId, { rangeMs: serviceMonitorRangeMs }); + }, [activeServiceMonitorId, serviceMonitorRangeMs, loadMonitorResults]); const chartData = metrics.map((m) => ({ time: formatTimestamp(m.timestamp, metricsRangeMs), @@ -1322,10 +1325,8 @@ export function MonitorView({ nodeMap, viewMode = "grid" }: MonitorViewProps) { const activeStale = resolvedActiveMonitor ? isResultStale(resolvedActiveMonitor, activeLatestResult) : false; const activeResults = resolvedActiveMonitorId != null ? (monitorResults[resolvedActiveMonitorId] || []) : []; const activeLatencyData = [...activeResults] - .slice(0, serviceMonitorRangeLimit) - .reverse() .map((r) => ({ - time: formatTimestamp(r.timestamp), + time: formatTimestamp(r.timestamp, serviceMonitorRangeMs), latency: r.success === 1 ? r.latencyMs : null, success: r.success, })); @@ -1336,24 +1337,23 @@ export function MonitorView({ nodeMap, viewMode = "grid" }: MonitorViewProps) {

服务监控图表

{resolvedActiveMonitorId != null && (