diff --git a/frpc.log b/frpc.log index 130a726..d792ca2 100644 --- a/frpc.log +++ b/frpc.log @@ -63,3 +63,756 @@ 2026-07-23 20:14:24.096 [W] [client/control.go:163] [83ea7405ffa3e73d] [podux] start error: proxy [podux] already exists 2026-07-23 20:14:24.096 [W] [client/control.go:163] [83ea7405ffa3e73d] [sun-panel] start error: proxy [sun-panel] already exists 2026-07-23 20:14:24.096 [W] [client/control.go:163] [83ea7405ffa3e73d] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:14:57.053 [W] [client/control.go:163] [83ea7405ffa3e73d] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:14:57.053 [W] [client/control.go:163] [83ea7405ffa3e73d] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:14:57.053 [W] [client/control.go:163] [83ea7405ffa3e73d] [podux] start error: proxy [podux] already exists +2026-07-23 20:14:57.053 [W] [client/control.go:163] [83ea7405ffa3e73d] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:14:57.053 [W] [client/control.go:163] [83ea7405ffa3e73d] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:14:57.119 [W] [client/control.go:163] [83ea7405ffa3e73d] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:15:30.060 [W] [client/control.go:163] [83ea7405ffa3e73d] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [podux] start error: proxy [podux] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:15:30.126 [W] [client/control.go:163] [83ea7405ffa3e73d] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:16:03.064 [W] [client/control.go:163] [83ea7405ffa3e73d] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:16:03.065 [W] [client/control.go:163] [83ea7405ffa3e73d] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:16:03.065 [W] [client/control.go:163] [83ea7405ffa3e73d] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:16:03.065 [W] [client/control.go:163] [83ea7405ffa3e73d] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:16:03.065 [W] [client/control.go:163] [83ea7405ffa3e73d] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [podux] start error: proxy [podux] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:16:03.132 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:16:36.066 [W] [client/control.go:163] [83ea7405ffa3e73d] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:16:36.066 [W] [client/control.go:163] [83ea7405ffa3e73d] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:16:36.066 [W] [client/control.go:163] [83ea7405ffa3e73d] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:16:36.066 [W] [client/control.go:163] [83ea7405ffa3e73d] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:16:36.066 [W] [client/control.go:163] [83ea7405ffa3e73d] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [podux] start error: proxy [podux] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:16:36.133 [W] [client/control.go:163] [83ea7405ffa3e73d] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:17:09.068 [W] [client/control.go:163] [83ea7405ffa3e73d] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:17:09.068 [W] [client/control.go:163] [83ea7405ffa3e73d] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:17:09.068 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:17:09.068 [W] [client/control.go:163] [83ea7405ffa3e73d] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [podux] start error: proxy [podux] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:17:09.120 [W] [client/control.go:163] [83ea7405ffa3e73d] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:17:42.073 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:17:42.073 [W] [client/control.go:163] [83ea7405ffa3e73d] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:17:42.073 [W] [client/control.go:163] [83ea7405ffa3e73d] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:17:42.073 [W] [client/control.go:163] [83ea7405ffa3e73d] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:17:42.073 [W] [client/control.go:163] [83ea7405ffa3e73d] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [podux] start error: proxy [podux] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:17:42.139 [W] [client/control.go:163] [83ea7405ffa3e73d] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:18:18.028 [I] [sub/root.go:201] start frpc service for config file [./frpc.toml] with aggregated configuration +2026-07-23 20:18:18.036 [I] [client/service.go:308] try to connect to server... +2026-07-23 20:18:18.255 [I] [client/service.go:328] [bbd5daddff44caee] login to server success, get run id [bbd5daddff44caee] +2026-07-23 20:18:18.255 [I] [proxy/proxy_manager.go:180] [bbd5daddff44caee] proxy added: [1panel-1 Gitea Grafana Halo SMB SSH immich-APP napcat napcat-2 navidrome openlist podux sun-panel] +2026-07-23 20:18:18.325 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:18:18.326 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:18:18.369 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:18:51.327 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:18:51.327 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:18:51.327 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:18:51.327 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:18:51.327 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:18:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:19:24.334 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:19:24.334 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:19:24.334 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:19:24.334 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:19:24.334 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:19:24.403 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:19:57.336 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:19:57.336 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:19:57.336 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:19:57.336 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:19:57.336 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:19:57.407 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:20:30.338 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:20:30.338 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:20:30.339 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:20:30.339 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:20:30.339 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:20:30.339 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:20:30.339 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:20:30.339 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:20:30.409 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:20:30.409 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:20:30.409 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:20:30.409 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:20:30.409 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:21:03.341 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:21:03.341 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:21:03.341 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:21:03.341 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:21:03.397 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:21:36.342 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:21:36.342 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:21:36.342 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:21:36.342 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:21:36.342 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:21:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:22:09.351 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:22:09.352 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:22:09.352 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:22:09.352 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:22:09.352 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:22:09.421 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:22:42.352 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:22:42.353 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:22:42.353 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:22:42.353 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:22:42.353 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:22:42.421 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:23:15.354 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:23:15.354 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:23:15.354 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:23:15.355 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:23:15.355 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:23:15.355 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:23:15.428 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:23:15.428 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:23:15.428 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:23:15.428 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:23:15.428 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:23:15.428 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:23:15.428 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:23:48.360 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:23:48.360 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:23:48.360 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:23:48.360 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:23:48.406 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:24:21.363 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:24:21.363 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:24:21.363 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:24:21.363 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:24:21.363 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:24:21.434 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:24:54.367 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:24:54.367 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:24:54.367 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:24:54.367 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:24:54.367 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:24:54.435 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:25:27.366 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:25:27.367 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:25:27.367 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:25:27.369 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:25:27.369 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:25:27.437 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:26:00.371 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:26:00.371 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:26:00.371 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:26:00.371 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:26:00.371 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:26:00.441 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:26:33.374 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:26:33.374 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:26:33.374 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:26:33.374 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:26:33.403 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:27:06.376 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:27:06.376 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:27:06.376 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:27:06.376 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:27:06.376 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:27:06.446 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:27:39.450 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:27:39.450 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:27:39.450 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:27:39.451 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:28:12.387 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:28:12.387 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:28:12.387 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:28:12.387 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:28:12.387 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:28:12.457 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:28:45.388 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:28:45.388 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:28:45.388 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:28:45.388 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:28:45.388 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:28:45.458 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:29:18.393 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:29:18.393 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:29:18.393 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:29:18.393 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:29:18.408 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:29:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:29:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:29:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:29:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:29:51.396 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:29:51.466 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:30:24.406 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:30:24.406 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:30:24.406 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:30:24.406 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:30:24.406 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:30:24.476 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:30:57.400 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:30:57.400 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:30:57.400 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:30:57.400 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:30:57.400 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:30:57.469 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:31:30.410 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:31:30.410 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:31:30.410 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:31:30.410 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:31:30.410 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:31:30.514 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:32:03.407 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:32:03.407 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:32:03.407 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:32:03.407 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:32:03.411 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:32:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:32:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:32:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:32:36.412 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:32:36.413 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:32:36.482 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:33:09.414 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:33:09.414 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:33:09.414 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:33:09.414 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:33:09.414 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:33:09.484 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:33:42.419 [W] [client/control.go:163] [bbd5daddff44caee] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:33:42.419 [W] [client/control.go:163] [bbd5daddff44caee] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:33:42.419 [W] [client/control.go:163] [bbd5daddff44caee] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:33:42.419 [W] [client/control.go:163] [bbd5daddff44caee] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:33:42.419 [W] [client/control.go:163] [bbd5daddff44caee] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [podux] start error: proxy [podux] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:33:42.489 [W] [client/control.go:163] [bbd5daddff44caee] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:34:02.384 [I] [sub/root.go:201] start frpc service for config file [./frpc.toml] with aggregated configuration +2026-07-23 20:34:02.393 [I] [client/service.go:308] try to connect to server... +2026-07-23 20:34:02.627 [I] [client/service.go:328] [921c9d10d9283545] login to server success, get run id [921c9d10d9283545] +2026-07-23 20:34:02.627 [I] [proxy/proxy_manager.go:180] [921c9d10d9283545] proxy added: [1panel-1 Gitea Grafana Halo SMB SSH immich-APP napcat napcat-2 navidrome openlist podux sun-panel] +2026-07-23 20:34:02.694 [W] [client/control.go:163] [921c9d10d9283545] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:34:02.694 [W] [client/control.go:163] [921c9d10d9283545] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:34:02.694 [W] [client/control.go:163] [921c9d10d9283545] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:34:02.694 [W] [client/control.go:163] [921c9d10d9283545] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:34:02.694 [W] [client/control.go:163] [921c9d10d9283545] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:34:02.694 [W] [client/control.go:163] [921c9d10d9283545] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:34:02.694 [W] [client/control.go:163] [921c9d10d9283545] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:34:02.735 [W] [client/control.go:163] [921c9d10d9283545] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:34:02.735 [W] [client/control.go:163] [921c9d10d9283545] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:34:02.735 [W] [client/control.go:163] [921c9d10d9283545] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:34:02.735 [W] [client/control.go:163] [921c9d10d9283545] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:34:02.735 [W] [client/control.go:163] [921c9d10d9283545] [podux] start error: proxy [podux] already exists +2026-07-23 20:34:02.735 [W] [client/control.go:163] [921c9d10d9283545] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:34:35.697 [W] [client/control.go:163] [921c9d10d9283545] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:34:35.698 [W] [client/control.go:163] [921c9d10d9283545] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:34:35.698 [W] [client/control.go:163] [921c9d10d9283545] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:34:35.698 [W] [client/control.go:163] [921c9d10d9283545] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:34:35.698 [W] [client/control.go:163] [921c9d10d9283545] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:34:35.764 [W] [client/control.go:163] [921c9d10d9283545] [podux] start error: proxy [podux] already exists +2026-07-23 20:35:08.703 [W] [client/control.go:163] [921c9d10d9283545] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:35:08.703 [W] [client/control.go:163] [921c9d10d9283545] [podux] start error: proxy [podux] already exists +2026-07-23 20:35:08.703 [W] [client/control.go:163] [921c9d10d9283545] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:35:08.703 [W] [client/control.go:163] [921c9d10d9283545] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:35:08.703 [W] [client/control.go:163] [921c9d10d9283545] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:35:08.768 [W] [client/control.go:163] [921c9d10d9283545] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:35:41.703 [W] [client/control.go:163] [921c9d10d9283545] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:35:41.703 [W] [client/control.go:163] [921c9d10d9283545] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:35:41.703 [W] [client/control.go:163] [921c9d10d9283545] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:35:41.703 [W] [client/control.go:163] [921c9d10d9283545] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:35:41.703 [W] [client/control.go:163] [921c9d10d9283545] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [podux] start error: proxy [podux] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:35:41.768 [W] [client/control.go:163] [921c9d10d9283545] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:36:14.706 [W] [client/control.go:163] [921c9d10d9283545] [podux] start error: proxy [podux] already exists +2026-07-23 20:36:14.706 [W] [client/control.go:163] [921c9d10d9283545] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:36:14.706 [W] [client/control.go:163] [921c9d10d9283545] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:36:14.709 [W] [client/control.go:163] [921c9d10d9283545] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:36:14.709 [W] [client/control.go:163] [921c9d10d9283545] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:36:14.775 [W] [client/control.go:163] [921c9d10d9283545] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:36:47.709 [W] [client/control.go:163] [921c9d10d9283545] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:36:47.709 [W] [client/control.go:163] [921c9d10d9283545] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:36:47.710 [W] [client/control.go:163] [921c9d10d9283545] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:36:47.710 [W] [client/control.go:163] [921c9d10d9283545] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:36:47.761 [W] [client/control.go:163] [921c9d10d9283545] [podux] start error: proxy [podux] already exists +2026-07-23 20:37:20.715 [W] [client/control.go:163] [921c9d10d9283545] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:37:20.715 [W] [client/control.go:163] [921c9d10d9283545] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:37:20.716 [W] [client/control.go:163] [921c9d10d9283545] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:37:20.716 [W] [client/control.go:163] [921c9d10d9283545] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:37:20.716 [W] [client/control.go:163] [921c9d10d9283545] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [podux] start error: proxy [podux] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:37:20.781 [W] [client/control.go:163] [921c9d10d9283545] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:37:49.036 [I] [sub/root.go:201] start frpc service for config file [./frpc.toml] with aggregated configuration +2026-07-23 20:37:49.046 [I] [client/service.go:308] try to connect to server... +2026-07-23 20:37:49.202 [I] [client/service.go:328] [926f05bb8cbbd6b8] login to server success, get run id [926f05bb8cbbd6b8] +2026-07-23 20:37:49.202 [I] [proxy/proxy_manager.go:180] [926f05bb8cbbd6b8] proxy added: [1panel-1 Gitea Grafana Halo SMB SSH immich-APP napcat napcat-2 navidrome openlist podux sun-panel] +2026-07-23 20:37:49.269 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:37:49.269 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:37:49.269 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:37:49.269 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:37:49.269 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:37:49.315 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:38:22.268 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:38:22.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:38:22.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:38:22.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:38:22.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:38:22.331 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:38:55.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:38:55.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:38:55.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:38:55.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:38:55.270 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:38:55.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:39:28.274 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:39:28.274 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:39:28.274 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:39:28.274 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:39:28.274 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:39:28.337 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:40:01.277 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:40:01.277 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:40:01.277 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:40:01.277 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:40:01.277 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:40:01.338 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:40:34.281 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:40:34.281 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:40:34.281 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:40:34.281 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:40:34.332 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:41:07.284 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:41:07.284 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:41:07.284 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:41:07.284 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:41:07.284 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:41:07.345 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:41:40.288 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:41:40.288 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:41:40.288 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:41:40.288 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:41:40.288 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:41:40.351 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:42:13.289 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:42:13.289 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:42:13.289 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:42:13.289 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:42:13.289 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:42:13.352 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:42:46.293 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:42:46.356 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:43:19.296 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:43:19.296 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:43:19.296 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:43:19.296 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:43:19.296 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:43:19.296 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:43:19.336 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:43:19.336 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:43:19.336 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:43:19.336 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:43:19.336 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:43:19.336 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:43:19.336 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:43:52.303 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:43:52.303 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:43:52.303 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:43:52.303 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:43:52.303 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:43:52.368 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:44:25.304 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:44:25.304 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:44:25.304 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:44:25.304 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:44:25.304 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:44:25.365 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:44:58.311 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:44:58.311 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:44:58.311 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:44:58.311 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:44:58.311 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists +2026-07-23 20:44:58.373 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:45:31.313 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat] start error: proxy [napcat] already exists +2026-07-23 20:45:31.313 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Grafana] start error: proxy [Grafana] already exists +2026-07-23 20:45:31.313 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Halo] start error: proxy [Halo] already exists +2026-07-23 20:45:31.313 [W] [client/control.go:163] [926f05bb8cbbd6b8] [immich-APP] start error: proxy [immich-APP] already exists +2026-07-23 20:45:31.313 [W] [client/control.go:163] [926f05bb8cbbd6b8] [Gitea] start error: proxy [Gitea] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SSH] start error: proxy [SSH] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [1panel-1] start error: proxy [1panel-1] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [SMB] start error: proxy [SMB] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [openlist] start error: proxy [openlist] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [sun-panel] start error: proxy [sun-panel] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [navidrome] start error: proxy [navidrome] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [napcat-2] start error: proxy [napcat-2] already exists +2026-07-23 20:45:31.375 [W] [client/control.go:163] [926f05bb8cbbd6b8] [podux] start error: proxy [podux] already exists diff --git a/static/app.js b/static/app.js index 15481e0..b3b81f3 100644 --- a/static/app.js +++ b/static/app.js @@ -1,389 +1,170 @@ -const { createApp, ref, reactive, computed, onMounted } = Vue; +// app.js +import { createApp, ref, reactive, computed, onMounted } from 'vue'; + +// 导入各模块 +import { apiFetch } from './modules/api.js'; +import { login, loadAuthState, clearAuthState, saveAuthState } from './modules/auth.js'; +import { loadConfig, saveConfig as saveConfigApi } from './modules/config.js'; +import { loadProxies, createProxy, updateProxy, deleteProxy, filterProxies } from './modules/proxies.js'; +import { getFrpcStatus, reloadFrpc, startFrpc, stopFrpc } from './modules/frpc.js'; +import { + activeTab, switchTab, + dialogVisible, dialogMode, dialogForm, + openAddDialog, openEditDialog, closeDialog, + searchKeyword, +} from './modules/ui.js'; +import { importToml, exportToml } from './modules/import.js'; // 如果有的话 const app = createApp({ setup() { // ===== 登录态 ===== - const transitioning = ref(false); // 旋转圈显示 - const contentVisible = ref(false); // 主内容淡入 const loggedIn = ref(false); const loading = ref(false); - const loginError = ref(""); - const loginForm = reactive({ - username: "", - password: "", - }); + const loginError = ref(''); + const loginForm = reactive({ username: '', password: '' }); + const token = ref(''); + const tokenExpireTime = ref(0); + const transitioning = ref(false); + const contentVisible = ref(false); + let expireTimer = null; - // ===== Token ===== - const token = ref(""); - - // ===== Tab ===== - const activeTab = ref("proxies"); - - // ===== 全局配置 ===== - const globalConfig = reactive({ - serverAddr: "frp.whitetop.xyz", - serverPort: 9358, - token: "Lxh10020328", - logLevel: "info", - logMaxDays: 3, - tcpMux: true, - tcpMuxKeepalive: 30, - heartbeatInterval: 15, - heartbeatTimeout: 70, - poolCount: 8, - }); - const showDetail = ref(false); - - // ===== 隧道列表 ===== + // ===== 数据 ===== + const globalConfig = reactive({}); const proxies = ref([]); - const searchKeyword = ref(""); - - // ===== frpc 状态 ===== const frpcRunning = ref(false); - // ===== 弹窗 ===== - const dialogVisible = ref(false); - const dialogMode = ref("add"); // 'add' | 'edit' - const dialogForm = reactive({ - id: null, - name: "", - type: "tcp", - localIP: "", - localPort: 0, - remotePort: 0, + // ===== 初始化 ===== + onMounted(() => { + const saved = loadAuthState(); + if (saved.valid) { + token.value = saved.token; + tokenExpireTime.value = saved.expire; + loginForm.username = saved.username; + loggedIn.value = true; + loadAllData().then(() => { + contentVisible.value = true; + startExpireTimer(); + }); + } }); - // ===== 计算属性 ===== - const filteredProxies = computed(() => { - if (!searchKeyword.value) return proxies.value; - const kw = searchKeyword.value.toLowerCase(); - return proxies.value.filter( - (p) => - p.name.toLowerCase().includes(kw) || - p.localIP.includes(kw) || - String(p.remotePort).includes(kw), - ); - }); - - // ===== API 基础 ===== - const apiHeaders = () => ({ - "Content-Type": "application/json", - Authorization: "Bearer " + token.value, - }); - - const apiFetch = async (url, opts = {}) => { - const res = await fetch(url, { - ...opts, - headers: { ...apiHeaders(), ...opts.headers }, - }); - return res.json(); + const startExpireTimer = () => { + if (expireTimer) clearInterval(expireTimer); + expireTimer = setInterval(() => { + if (Date.now() >= tokenExpireTime.value) { + doLogout(); + alert('登录已超时,请重新登录'); + } + }, 5000); }; - // ===== 登录 ===== + const loadAllData = async () => { + const [cfg, list, running] = await Promise.all([ + loadConfig(), + loadProxies(), + getFrpcStatus(), + ]); + Object.assign(globalConfig, cfg); + proxies.value = list; + frpcRunning.value = running; + }; + + // ===== 登录/退出 ===== const doLogin = async () => { - // 1. 校验输入 if (!loginForm.username || !loginForm.password) { - loginError.value = "请输入用户名和密码"; + loginError.value = '请输入用户名和密码'; return; } - - // 2. 开始登录 loading.value = true; - loginError.value = ""; - - try { - const res = await fetch("/api/login", { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify(loginForm), - }); - const data = await res.json(); - - if (data.code === 0) { - // 3. 保存 token - token.value = data.data.token; - - // 4. 显示旋转圈 - transitioning.value = true; - - // 5. 切换登录态 → 触发容器放大动画(0.5s) - loggedIn.value = true; - - // 6. 等待放大动画完成(0.5s) - setTimeout(async () => { - // 7. 隐藏旋转圈 - transitioning.value = false; - - // 8. 加载数据 - await loadAllData(); - - // 9. 关闭 loading 状态 - loading.value = false; - - // 10. 再等 0.3s 让内容淡入 - setTimeout(() => { - contentVisible.value = true; - }, 300); - }, 500); // 与 CSS 动画时间一致 - } else { - // 登录失败 - loginError.value = data.msg || "登录失败"; + loginError.value = ''; + const result = await login(loginForm.username, loginForm.password); + if (result.success) { + token.value = result.token; + tokenExpireTime.value = result.expire; + transitioning.value = true; + loggedIn.value = true; + setTimeout(async () => { + transitioning.value = false; + await loadAllData(); loading.value = false; - } - } catch (e) { - loginError.value = "网络错误,请重试"; + setTimeout(() => { + contentVisible.value = true; + startExpireTimer(); + }, 300); + }, 500); + } else { + loginError.value = result.error; loading.value = false; } }; const doLogout = () => { - contentVisible.value = false; // 先隐藏内容 + if (expireTimer) clearInterval(expireTimer); + contentVisible.value = false; loggedIn.value = false; token.value = ''; + tokenExpireTime.value = 0; loginForm.username = ''; loginForm.password = ''; loading.value = false; transitioning.value = false; - }; - - // ===== 加载数据 ===== - const loadAllData = async () => { - await Promise.all([loadConfig(), loadProxies(), loadFrpcStatus()]); - }; - - const loadConfig = async () => { - try { - const data = await apiFetch("/api/config"); - if (data.code === 0) { - Object.assign(globalConfig, data.data); - } - } catch (e) { - console.warn("加载配置失败", e); - } - }; - - const loadProxies = async () => { - try { - const data = await apiFetch("/api/proxies"); - if (data.code === 0) { - proxies.value = data.data || []; - } - } catch (e) { - console.warn("加载隧道列表失败", e); - } - }; - - const loadFrpcStatus = async () => { - try { - const data = await apiFetch("/api/frpc/status"); - if (data.code === 0) { - frpcRunning.value = data.data.running || false; - } - } catch (e) { - console.warn("获取 frpc 状态失败", e); - } + clearAuthState(); }; // ===== 保存配置 ===== const saveConfig = async () => { - try { - const data = await apiFetch("/api/config", { - method: "PUT", - body: JSON.stringify(globalConfig), - }); - if (data.code === 0) { - await loadFrpcStatus(); - alert("配置已更新并热加载"); - } else { - alert("保存失败: " + data.msg); - } - } catch (e) { - alert("网络错误"); + const result = await saveConfigApi(globalConfig); + if (result.code === 0) { + frpcRunning.value = await getFrpcStatus(); + alert('配置已更新并热加载'); + } else { + alert('保存失败: ' + result.msg); } }; // ===== 隧道操作 ===== const toggleProxy = async (p) => { - try { - const data = await apiFetch("/api/proxy/" + p.id, { - method: "PUT", - body: JSON.stringify(p), - }); - if (data.code !== 0) { - alert("更新失败: " + data.msg); - await loadProxies(); - } else { - await loadFrpcStatus(); - } - } catch (e) { - alert("网络错误"); - await loadProxies(); + const result = await updateProxy(p); + if (result.code !== 0) { + alert('更新失败: ' + result.msg); + proxies.value = await loadProxies(); + } else { + frpcRunning.value = await getFrpcStatus(); } }; - const deleteProxy = async (id) => { - if (!confirm("确定要删除这条隧道吗?")) return; - try { - const data = await apiFetch("/api/proxy/" + id, { - method: "DELETE", - }); - if (data.code === 0) { - await loadProxies(); - await loadFrpcStatus(); - } else { - alert("删除失败: " + data.msg); - } - } catch (e) { - alert("网络错误"); + const removeProxy = async (id) => { + if (!confirm('确定要删除这条隧道吗?')) return; + const result = await deleteProxy(id); + if (result.code === 0) { + proxies.value = await loadProxies(); + frpcRunning.value = await getFrpcStatus(); + } else { + alert('删除失败: ' + result.msg); } }; - // ===== 弹窗 ===== - const openAddDialog = () => { - dialogMode.value = "add"; - dialogForm.id = null; - dialogForm.name = ""; - dialogForm.type = "tcp"; - dialogForm.localIP = ""; - dialogForm.localPort = 0; - dialogForm.remotePort = 0; - dialogVisible.value = true; - }; - - const openEditDialog = (p) => { - dialogMode.value = "edit"; - Object.assign(dialogForm, p); - dialogVisible.value = true; - }; - const confirmDialog = async () => { - if ( - !dialogForm.name || - !dialogForm.localIP || - !dialogForm.localPort || - !dialogForm.remotePort - ) { - alert("请填写完整信息"); + const form = dialogForm.value; + if (!form.name || !form.localIP || !form.localPort || !form.remotePort) { + alert('请填写完整信息'); return; } - const url = - dialogMode.value === "add" - ? "/api/proxy" - : "/api/proxy/" + dialogForm.id; - const method = dialogMode.value === "add" ? "POST" : "PUT"; - try { - const data = await apiFetch(url, { - method: method, - body: JSON.stringify(dialogForm), - }); - if (data.code === 0) { - dialogVisible.value = false; - await loadProxies(); - await loadFrpcStatus(); - } else { - alert("操作失败: " + data.msg); - } - } catch (e) { - alert("网络错误"); + const result = dialogMode.value === 'add' + ? await createProxy(form) + : await updateProxy(form); + if (result.code === 0) { + closeDialog(); + proxies.value = await loadProxies(); + frpcRunning.value = await getFrpcStatus(); + } else { + alert('操作失败: ' + result.msg); } }; - // ===== 导入 TOML ===== - const triggerImport = () => { - document.getElementById("tomlFileInput").click(); - }; + // ===== 计算属性 ===== + const filteredProxies = computed(() => filterProxies(proxies.value, searchKeyword.value)); - const handleImport = async (e) => { - const file = e.target.files[0]; - if (!file) return; - - const formData = new FormData(); - formData.append('file', file); - - try { - const res = await fetch('/api/import/toml', { - method: 'POST', - headers: { - 'Authorization': 'Bearer ' + token.value, - // 不要设置 Content-Type,浏览器会自动加上 boundary - }, - body: formData, - }); - const data = await res.json(); - if (data.code === 0) { - alert(data.msg); - await loadAllData(); - } else { - alert('导入失败: ' + data.msg); - } - } catch (err) { - alert('网络错误: ' + err.message); - } - e.target.value = ''; - }; - - // ===== 导出 TOML ===== - const exportToml = async () => { - try { - const configData = await apiFetch("/api/config"); - if (configData.code !== 0) { - alert("获取配置失败"); - return; - } - const proxyData = await apiFetch("/api/proxies"); - if (proxyData.code !== 0) { - alert("获取隧道列表失败"); - return; - } - const cfg = configData.data; - const proxyList = proxyData.data || []; - - const tomlObj = { - serverAddr: cfg.serverAddr, - serverPort: cfg.serverPort, - auth: { token: cfg.token }, - log: { - to: "./frpc.log", - level: cfg.logLevel, - maxDays: cfg.logMaxDays, - }, - transport: { - tcpMux: cfg.tcpMux, - tcpMuxKeepaliveInterval: cfg.tcpMuxKeepalive, - heartbeatInterval: cfg.heartbeatInterval, - heartbeatTimeout: cfg.heartbeatTimeout, - poolCount: cfg.poolCount, - }, - proxies: proxyList.map((p) => ({ - name: p.name, - type: p.type, - localIP: p.localIP, - localPort: p.localPort, - remotePort: p.remotePort, - })), - }; - const tomlStr = TOML.stringify(tomlObj); - const blob = new Blob([tomlStr], { type: "text/plain" }); - const a = document.createElement("a"); - a.href = URL.createObjectURL(blob); - a.download = "frpc.toml"; - a.click(); - URL.revokeObjectURL(a.href); - } catch (e) { - alert("导出失败: " + e.message); - } - }; - - // ===== 键盘快捷键 ===== - onMounted(() => { - document.addEventListener("keydown", (e) => { - if (e.key === "Escape" && dialogVisible.value) { - dialogVisible.value = false; - } - }); - }); - - // ===== 返回所有 ===== return { loggedIn, loading, @@ -392,28 +173,26 @@ const app = createApp({ doLogin, doLogout, activeTab, + switchTab, globalConfig, - showDetail, saveConfig, proxies, - searchKeyword, filteredProxies, toggleProxy, - deleteProxy, + removeProxy, frpcRunning, dialogVisible, dialogMode, dialogForm, openAddDialog, openEditDialog, + closeDialog, confirmDialog, - triggerImport, - handleImport, - exportToml, + searchKeyword, transitioning, contentVisible, }; }, }); -app.mount("#app"); +app.mount('#app'); \ No newline at end of file diff --git a/static/index.html b/static/index.html index 5a8b286..3b8fe78 100644 --- a/static/index.html +++ b/static/index.html @@ -13,7 +13,9 @@ - + + + diff --git a/static/modules/api.js b/static/modules/api.js new file mode 100644 index 0000000..5728c73 --- /dev/null +++ b/static/modules/api.js @@ -0,0 +1,26 @@ +// modules/api.js +const API_BASE = '/api'; + +export function getToken() { + return localStorage.getItem('frpc_token') || ''; +} + +export function getHeaders() { + return { + 'Content-Type': 'application/json', + 'Authorization': 'Bearer ' + getToken(), + }; +} + +export async function apiFetch(endpoint, options = {}) { + const url = API_BASE + endpoint; + const headers = options.body instanceof FormData + ? { 'Authorization': 'Bearer ' + getToken() } + : getHeaders(); + + const res = await fetch(url, { + ...options, + headers: { ...headers, ...(options.headers || {}) }, + }); + return res.json(); +} \ No newline at end of file diff --git a/static/modules/auth.js b/static/modules/auth.js new file mode 100644 index 0000000..75f0e2e --- /dev/null +++ b/static/modules/auth.js @@ -0,0 +1,49 @@ +// modules/auth.js +import { apiFetch } from './api.js'; + +export function parseJwtExpire(token) { + try { + const payload = JSON.parse(atob(token.split('.')[1])); + return payload.exp * 1000; + } catch { + return Date.now() + 7 * 24 * 60 * 60 * 1000; + } +} + +export function saveAuthState(token, username) { + const expire = parseJwtExpire(token); + localStorage.setItem('frpc_token', token); + localStorage.setItem('frpc_token_expire', String(expire)); + localStorage.setItem('frpc_username', username); + return expire; +} + +export function loadAuthState() { + const token = localStorage.getItem('frpc_token'); + const expire = parseInt(localStorage.getItem('frpc_token_expire') || '0', 10); + const username = localStorage.getItem('frpc_username') || ''; + if (token && expire > Date.now()) { + return { token, expire, username, valid: true }; + } + clearAuthState(); + return { token: '', expire: 0, username: '', valid: false }; +} + +export function clearAuthState() { + localStorage.removeItem('frpc_token'); + localStorage.removeItem('frpc_token_expire'); + localStorage.removeItem('frpc_username'); +} + +export async function login(username, password) { + const data = await apiFetch('/login', { + method: 'POST', + body: JSON.stringify({ username, password }), + }); + if (data.code === 0) { + const token = data.data.token; + const expire = saveAuthState(token, username); + return { success: true, token, expire }; + } + return { success: false, error: data.msg || '登录失败' }; +} \ No newline at end of file diff --git a/static/modules/config.js b/static/modules/config.js new file mode 100644 index 0000000..b8074f6 --- /dev/null +++ b/static/modules/config.js @@ -0,0 +1,35 @@ +// modules/config.js +import { apiFetch } from './api.js'; + +const defaultConfig = { + serverAddr: 'frp.whitetop.xyz', + serverPort: 9358, + token: '', + logLevel: 'info', + logMaxDays: 3, + tcpMux: true, + tcpMuxKeepalive: 30, + heartbeatInterval: 15, + heartbeatTimeout: 70, + poolCount: 8, +}; + +export async function loadConfig() { + try { + const data = await apiFetch('/config'); + if (data.code === 0) { + return { ...defaultConfig, ...data.data }; + } + } catch (e) { + console.warn('加载配置失败', e); + } + return { ...defaultConfig }; +} + +export async function saveConfig(config) { + const data = await apiFetch('/config', { + method: 'PUT', + body: JSON.stringify(config), + }); + return data; +} \ No newline at end of file diff --git a/static/modules/frpc.js b/static/modules/frpc.js new file mode 100644 index 0000000..792709b --- /dev/null +++ b/static/modules/frpc.js @@ -0,0 +1,29 @@ +// modules/frpc.js +import { apiFetch } from './api.js'; + +export async function getFrpcStatus() { + try { + const data = await apiFetch('/frpc/status'); + if (data.code === 0) { + return data.data.running || false; + } + } catch (e) { + console.warn('获取 frpc 状态失败', e); + } + return false; +} + +export async function reloadFrpc() { + const data = await apiFetch('/frpc/reload', { method: 'POST' }); + return data; +} + +export async function startFrpc() { + const data = await apiFetch('/frpc/start', { method: 'POST' }); + return data; +} + +export async function stopFrpc() { + const data = await apiFetch('/frpc/stop', { method: 'POST' }); + return data; +} \ No newline at end of file diff --git a/static/modules/proxies.js b/static/modules/proxies.js new file mode 100644 index 0000000..e902bd1 --- /dev/null +++ b/static/modules/proxies.js @@ -0,0 +1,47 @@ +// modules/proxies.js +import { apiFetch } from './api.js'; + +export async function loadProxies() { + try { + const data = await apiFetch('/proxies'); + if (data.code === 0) { + return data.data || []; + } + } catch (e) { + console.warn('加载隧道失败', e); + } + return []; +} + +export async function createProxy(proxy) { + const data = await apiFetch('/proxy', { + method: 'POST', + body: JSON.stringify(proxy), + }); + return data; +} + +export async function updateProxy(proxy) { + const data = await apiFetch('/proxy/' + proxy.id, { + method: 'PUT', + body: JSON.stringify(proxy), + }); + return data; +} + +export async function deleteProxy(id) { + const data = await apiFetch('/proxy/' + id, { + method: 'DELETE', + }); + return data; +} + +export function filterProxies(list, keyword) { + if (!keyword) return list; + const kw = keyword.toLowerCase(); + return list.filter(p => + p.name.toLowerCase().includes(kw) || + p.localIP.includes(kw) || + String(p.remotePort).includes(kw) + ); +} \ No newline at end of file diff --git a/static/modules/ui.js b/static/modules/ui.js new file mode 100644 index 0000000..88d0540 --- /dev/null +++ b/static/modules/ui.js @@ -0,0 +1,39 @@ +// modules/ui.js +import { ref } from 'vue'; + +// Tab 切换 +export const activeTab = ref('proxies'); +export function switchTab(tab) { + activeTab.value = tab; +} + +// 弹窗控制 +export const dialogVisible = ref(false); +export const dialogMode = ref('add'); +export const dialogForm = ref({ + id: null, + name: '', + type: 'tcp', + localIP: '', + localPort: 0, + remotePort: 0, +}); + +export function openAddDialog() { + dialogMode.value = 'add'; + dialogForm.value = { id: null, name: '', type: 'tcp', localIP: '', localPort: 0, remotePort: 0 }; + dialogVisible.value = true; +} + +export function openEditDialog(proxy) { + dialogMode.value = 'edit'; + dialogForm.value = { ...proxy }; + dialogVisible.value = true; +} + +export function closeDialog() { + dialogVisible.value = false; +} + +// 搜索 +export const searchKeyword = ref(''); \ No newline at end of file diff --git a/static/style-1.css b/static/style-1.css new file mode 100644 index 0000000..a4f9728 --- /dev/null +++ b/static/style-1.css @@ -0,0 +1,184 @@ +/* ===== style-1.css - 全局基础 ===== */ + +/* ---------- 字体定义 ---------- */ +@font-face { + font-family: 'HarmonyOS Sans SC'; + src: local('HarmonyOS Sans SC'), + local('PingFang SC'), + local('Microsoft YaHei'), + local('Helvetica Neue'); + font-weight: 400; + font-display: swap; +} +@font-face { + font-family: 'HarmonyOS Sans SC'; + src: local('HarmonyOS Sans SC Medium'), + local('PingFang SC Medium'); + font-weight: 500; + font-display: swap; +} +@font-face { + font-family: 'HarmonyOS Sans SC'; + src: local('HarmonyOS Sans SC Bold'), + local('PingFang SC Semibold'); + font-weight: 700; + font-display: swap; +} + +/* ---------- 重置 ---------- */ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +body { + font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif; + background: #0a0a0f; + height: 100vh; + overflow: hidden; + color: #e0e0e0; +} + +/* ---------- 数字专用字体(加粗) ---------- */ +.digit, +.big-number, +.remote-port, +.proxy-addr, +.metric-value .digit, +.metric-value .big-number, +.login-header h1, +.login-btn, +.save-btn, +.btn-confirm { + font-weight: 600 !important; + letter-spacing: 0.02em; +} + +/* 数字特别加粗(适用于大数字展示) */ +.big-number { + font-weight: 700 !important; + letter-spacing: -0.01em; +} + +/* 代码/端口类数字使用等宽字体,但保持加粗 */ +.digit, +.remote-port, +.proxy-addr { + font-family: 'HarmonyOS Sans SC', 'JetBrains Mono', monospace; + font-weight: 600 !important; +} + +/* ---------- 全局颜色变量 ---------- */ +:root { + --primary-blue: #4a7cff; + --primary-blue-dim: rgba(74, 124, 255, 0.15); + --primary-blue-glow: rgba(74, 124, 255, 0.3); + --primary-blue-border: rgba(74, 124, 255, 0.2); + --bg-deep: #0a0a18; + --bg-card: rgba(13, 13, 26, 0.6); + --bg-metric: rgba(255, 255, 255, 0.03); + --border-subtle: rgba(255, 255, 255, 0.04); + --text-dim: rgba(255, 255, 255, 0.25); + --text-muted: rgba(255, 255, 255, 0.35); + --text-secondary: rgba(255, 255, 255, 0.6); + --text-primary: rgba(255, 255, 255, 0.85); +} + +/* ---------- 滚动条 ---------- */ +::-webkit-scrollbar { + width: 4px; + height: 4px; +} +::-webkit-scrollbar-track { + background: rgba(255, 255, 255, 0.02); + border-radius: 4px; +} +::-webkit-scrollbar-thumb { + background: rgba(74, 124, 255, 0.25); + border-radius: 4px; +} +::-webkit-scrollbar-thumb:hover { + background: rgba(74, 124, 255, 0.4); +} + +/* ---------- 背景磨砂层 ---------- */ +.app-backdrop { + position: fixed; + top: 0; + left: 0; + width: 100vw; + height: 100vh; + background: + radial-gradient(ellipse at 20% 50%, rgba(30, 60, 120, 0.3) 0%, transparent 60%), + radial-gradient(ellipse at 80% 50%, rgba(80, 30, 120, 0.2) 0%, transparent 60%), + #0a0a0f; + z-index: 0; +} + +/* ---------- 主容器 ---------- */ +.app-container { + position: fixed; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + z-index: 1; + background: rgba(255, 255, 255, 0.04); + backdrop-filter: blur(40px) saturate(1.2); + -webkit-backdrop-filter: blur(40px) saturate(1.2); + border: 1px solid rgba(255, 255, 255, 0.06); + border-radius: 32px; + box-shadow: 0 40px 80px rgba(0, 0, 0, 0.8), inset 0 1px 0 rgba(255, 255, 255, 0.05); + transition: all 0.5s cubic-bezier(0.22, 1, 0.36, 1); + overflow: hidden; +} + +/* 登录态尺寸 */ +.app-container:not(.is-logged-in) { + width: 600px; + height: 450px; +} + +/* 登录后尺寸 */ +.app-container.is-logged-in { + width: min(1600px, 92vw); + height: min(900px, 88vh); +} + +/* ---------- 旋转圈 ---------- */ +.loading-ring { + position: absolute; + top: 50%; + left: 50%; + transform: translate(-50%, -50%); + width: 48px; + height: 48px; + border: 3px solid rgba(255, 255, 255, 0.04); + border-top: 3px solid var(--primary-blue); + border-radius: 50%; + animation: spin 0.8s linear infinite; + opacity: 0; + pointer-events: none; + transition: opacity 0.3s; + z-index: 5; +} +.loading-ring.visible { + opacity: 1; +} +@keyframes spin { + to { transform: translate(-50%, -50%) rotate(360deg); } +} + +/* ---------- 主内容淡入 ---------- */ +.main-panel { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + padding: 20px 28px; /* ← 补上内边距 */ + opacity: 0; + transition: opacity 0.3s ease; +} +.main-panel.visible { + opacity: 1; +} \ No newline at end of file diff --git a/static/style-2.css b/static/style-2.css new file mode 100644 index 0000000..d7afcf2 --- /dev/null +++ b/static/style-2.css @@ -0,0 +1,100 @@ +/* ===== style-2.css - 登录页 ===== */ + +.login-card { + width: 100%; + height: 100%; + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + padding: 32px 48px; +} + +.login-header { + display: flex; + align-items: center; + gap: 12px; + margin-bottom: 24px; +} +.login-icon { + font-size: 28px; +} +.login-header h1 { + font-size: 22px; + font-weight: 300; + letter-spacing: 4px; + color: var(--text-primary); + text-transform: lowercase; +} + +.login-form { + width: 100%; + max-width: 340px; + display: flex; + flex-direction: column; + gap: 14px; +} + +.input-group { + display: flex; + flex-direction: column; + gap: 4px; +} +.input-group label { + font-size: 12px; + text-transform: uppercase; + letter-spacing: 2px; + color: var(--text-dim); +} +.input-group input { + height: 44px; + padding: 0 20px; + background: rgba(255, 255, 255, 0.04); + border: 1px solid rgba(255, 255, 255, 0.08); + border-radius: 12px; + color: #fff; + font-size: 14px; + outline: none; + transition: border-color 0.3s; +} +.input-group input:focus { + border-color: var(--primary-blue-border); +} +.input-group input::placeholder { + color: var(--text-dim); +} + +.login-btn { + height: 44px; + margin-top: 6px; + background: linear-gradient(135deg, var(--primary-blue), #2a5adf); + border: none; + border-radius: 12px; + font-size: 14px; + font-weight: 600; + color: #0a0a0f; + cursor: pointer; + transition: transform 0.2s, box-shadow 0.2s; +} +.login-btn:hover:not(:disabled) { + transform: scale(1.02); + box-shadow: 0 8px 24px var(--primary-blue-glow); +} +.login-btn:disabled { + opacity: 0.5; + cursor: not-allowed; +} + +.login-error { + color: #f87171; + font-size: 14px; + text-align: center; + margin-top: 4px; + min-height: 24px; +} +.login-form .hint { + font-size: 12px; + color: var(--text-dim); + text-align: center; + margin-top: -6px; +} \ No newline at end of file diff --git a/static/style.css b/static/style-3.css similarity index 56% rename from static/style.css rename to static/style-3.css index 2b6368a..a32df41 100644 --- a/static/style.css +++ b/static/style-3.css @@ -1,192 +1,23 @@ -/* ===== 全局重置 ===== */ -* { - margin: 0; - padding: 0; - box-sizing: border-box; -} +/* ===== style-3.css - 主界面 ===== */ -body { - font-family: 'Segoe UI', 'PingFang SC', 'Microsoft YaHei', sans-serif; - background: #0a0a0f; - height: 100vh; - overflow: hidden; - color: #e0e0e0; -} - -/* ===== 背景磨砂层 ===== */ -.app-backdrop { - position: fixed; - top: 0; - left: 0; - width: 100vw; - height: 100vh; - background: - radial-gradient(ellipse at 20% 50%, rgba(30, 60, 120, 0.3) 0%, transparent 60%), - radial-gradient(ellipse at 80% 50%, rgba(80, 30, 120, 0.2) 0%, transparent 60%), - #0a0a0f; - z-index: 0; -} - -/* ===== 主容器 ===== */ -.app-container { - position: fixed; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - z-index: 1; - background: rgba(255, 255, 255, 0.04); - backdrop-filter: blur(40px) saturate(1.2); - -webkit-backdrop-filter: blur(40px) saturate(1.2); - border: 1px solid rgba(255, 255, 255, 0.06); - border-radius: 32px; - box-shadow: 0 40px 80px rgba(0, 0, 0, 0.8), inset 0 1px 0 rgba(255, 255, 255, 0.05); - transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94); - overflow: hidden; -} - -/* 登录态尺寸:800x650 */ -.app-container:not(.is-logged-in) { - width: 600px; - height: 450px; -} - -/* 登录后尺寸:1600x900(响应式) */ -.app-container.is-logged-in { - width: min(1600px, 92vw); - height: min(900px, 88vh); -} - -/* ===== 登录卡片 ===== */ -.login-card { - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - justify-content: center; - align-items: center; - padding: 32px 48px; -} - -.login-header { - display: flex; - align-items: center; - gap: 12px; - margin-bottom: 24px; -} - -.login-icon { - font-size: 28px; -} - -.login-header h1 { - font-size: 22px; - font-weight: 300; - letter-spacing: 4px; - color: rgba(255, 255, 255, 0.85); - text-transform: lowercase; -} - -.login-form { - width: 100%; - max-width: 340px; - display: flex; - flex-direction: column; - gap: 14px; -} - -.input-group { - display: flex; - flex-direction: column; - gap: 4px; -} - -.input-group label { - font-size: 12px; - text-transform: uppercase; - letter-spacing: 2px; - color: rgba(255, 255, 255, 0.3); -} - -.input-group input { - height: 44px; - padding: 0 20px; - background: rgba(255, 255, 255, 0.04); - border: 1px solid rgba(255, 255, 255, 0.08); - border-radius: 12px; - color: #fff; - font-size: 14px; - transition: border-color 0.3s; - outline: none; -} - -.input-group input:focus { - border-color: rgba(99, 226, 183, 0.4); -} - -.input-group input::placeholder { - color: rgba(255, 255, 255, 0.2); -} - -.login-btn { - height: 44px; - margin-top: 6px; - background: linear-gradient(135deg, #63e2b7, #3b9e8a); - border: none; - border-radius: 12px; - font-size: 14px; - font-weight: 600; - color: #0a0a0f; - cursor: pointer; - transition: transform 0.2s, box-shadow 0.2s; -} - -.login-btn:hover:not(:disabled) { - transform: scale(1.02); - box-shadow: 0 8px 24px rgba(99, 226, 183, 0.3); -} - -.login-btn:disabled { - opacity: 0.5; - cursor: not-allowed; -} - -.login-error { - color: #f87171; - font-size: 14px; - text-align: center; - margin-top: 4px; - min-height: 24px; -} - -/* ===== 主界面 ===== */ -.main-panel { - width: 100%; - height: 100%; - display: flex; - flex-direction: column; - padding: 20px 28px; -} - -/* 顶部导航 */ +/* ---------- 顶部导航 ---------- */ .top-bar { display: flex; justify-content: space-between; align-items: center; padding-bottom: 16px; - border-bottom: 1px solid rgba(255, 255, 255, 0.04); + border-bottom: 1px solid var(--border-subtle); flex-shrink: 0; } - .top-left { display: flex; align-items: center; gap: 16px; } - .logo { font-size: 18px; font-weight: 500; - color: rgba(255, 255, 255, 0.9); + color: var(--text-primary); } .status-dot { @@ -196,15 +27,13 @@ body { background: #444; transition: background 0.3s; } - .status-dot.active { background: #63e2b7; box-shadow: 0 0 12px rgba(99, 226, 183, 0.4); } - .status-text { font-size: 13px; - color: rgba(255, 255, 255, 0.4); + color: var(--text-muted); } .top-right { @@ -212,57 +41,51 @@ body { align-items: center; gap: 16px; } - .user-name { font-size: 13px; - color: rgba(255, 255, 255, 0.6); + color: var(--text-secondary); } - .logout-btn { padding: 6px 16px; background: rgba(255, 255, 255, 0.06); - border: 1px solid rgba(255, 255, 255, 0.08); + border: 1px solid var(--border-subtle); border-radius: 8px; - color: rgba(255, 255, 255, 0.6); + color: var(--text-secondary); font-size: 12px; cursor: pointer; transition: background 0.2s; } - .logout-btn:hover { background: rgba(255, 70, 70, 0.15); border-color: rgba(255, 70, 70, 0.3); color: #f87171; } -/* Tab 栏 */ +/* ---------- Tab 栏 ---------- */ .tab-bar { display: flex; gap: 32px; padding: 14px 0 12px; flex-shrink: 0; - border-bottom: 1px solid rgba(255, 255, 255, 0.04); + border-bottom: 1px solid var(--border-subtle); } - .tab-item { font-size: 14px; - color: rgba(255, 255, 255, 0.35); + color: var(--text-muted); cursor: pointer; padding: 4px 0; transition: color 0.3s, border-color 0.3s; border-bottom: 2px solid transparent; } - .tab-item:hover { - color: rgba(255, 255, 255, 0.7); + color: var(--text-secondary); } - .tab-item.active { - color: #63e2b7; - border-bottom-color: #63e2b7; + color: var(--primary-blue); + border-bottom-color: var(--primary-blue); } -/* 内容区 */ +/* ---------- 内容区 ---------- */ .content-area { flex: 1; overflow-y: auto; @@ -270,85 +93,287 @@ body { scrollbar-width: thin; scrollbar-color: rgba(255, 255, 255, 0.06) transparent; } - .content-area::-webkit-scrollbar { width: 4px; } - .content-area::-webkit-scrollbar-track { background: transparent; } - .content-area::-webkit-scrollbar-thumb { - background: rgba(255, 255, 255, 0.1); + background: rgba(255, 255, 255, 0.06); border-radius: 4px; } - .tab-content { height: 100%; } -/* ===== 全局配置页 ===== */ +/* ---------- 全局配置页 ---------- */ .config-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 16px; margin-bottom: 20px; } - .metric-card { - background: rgba(255, 255, 255, 0.03); + background: var(--bg-metric); border-radius: 16px; padding: 16px 20px; - border: 1px solid rgba(255, 255, 255, 0.04); + border: 1px solid var(--border-subtle); } - .metric-label { font-size: 12px; - color: rgba(255, 255, 255, 0.3); + color: var(--text-dim); text-transform: uppercase; letter-spacing: 1px; margin-bottom: 8px; } - .metric-value { display: flex; align-items: center; gap: 12px; } - .big-number { font-size: 28px; font-weight: 600; color: #fff; } - .unit { font-size: 14px; - color: rgba(255, 255, 255, 0.3); + color: var(--text-dim); } - .digit { font-family: 'JetBrains Mono', monospace; font-size: 18px; color: #fff; } - .sep { - color: rgba(255, 255, 255, 0.15); + color: var(--text-dim); } -.status-text { +/* ---------- 展开详情 ---------- */ +.detail-collapse { + padding: 12px 0; + color: var(--text-dim); font-size: 13px; - color: rgba(255, 255, 255, 0.3); + cursor: pointer; + user-select: none; transition: color 0.3s; } - -.status-text.active { - color: #63e2b7; +.detail-collapse:hover { + color: var(--text-secondary); +} +.detail-panel { + background: rgba(255, 255, 255, 0.02); + border-radius: 12px; + padding: 16px 20px; + border: 1px solid var(--border-subtle); + display: grid; + grid-template-columns: 1fr 1fr; + gap: 12px 24px; + margin-bottom: 16px; +} +.detail-panel .form-row { + display: flex; + flex-direction: column; + gap: 4px; +} +.detail-panel .form-row label { + font-size: 11px; + text-transform: uppercase; + letter-spacing: 0.5px; + color: var(--text-dim); +} +.detail-panel .form-row input, +.detail-panel .form-row select { + padding: 8px 12px; + background: rgba(255, 255, 255, 0.04); + border: 1px solid var(--border-subtle); + border-radius: 8px; + color: #fff; + font-size: 14px; + outline: none; + transition: border-color 0.3s; +} +.detail-panel .form-row input:focus, +.detail-panel .form-row select:focus { + border-color: var(--primary-blue-border); } -/* 开关 */ +.save-btn { + grid-column: 1 / -1; + padding: 10px 24px; + background: linear-gradient(135deg, var(--primary-blue), #2a5adf); + border: none; + border-radius: 10px; + font-size: 14px; + font-weight: 600; + color: #0a0a0f; + cursor: pointer; + transition: transform 0.2s, box-shadow 0.2s; + margin-top: 4px; +} +.save-btn:hover { + transform: scale(1.01); + box-shadow: 0 4px 16px var(--primary-blue-glow); +} + +/* ---------- 隧道列表 ---------- */ +.toolbar { + display: flex; + justify-content: space-between; + align-items: center; + margin-bottom: 16px; + flex-wrap: wrap; + gap: 12px; +} +.toolbar-left { + display: flex; + gap: 10px; + flex-wrap: wrap; +} +.toolbar-left button { + padding: 8px 18px; + border-radius: 10px; + border: 1px solid var(--border-subtle); + background: rgba(255, 255, 255, 0.03); + color: var(--text-secondary); + font-size: 13px; + cursor: pointer; + transition: background 0.2s, border-color 0.2s; +} +.toolbar-left button:hover { + background: rgba(255, 255, 255, 0.06); +} +.btn-import:hover { + border-color: var(--primary-blue-border); + color: var(--primary-blue); +} +.btn-export:hover { + border-color: rgba(99, 150, 255, 0.3); + color: #6a9fff; +} +.btn-add { + background: var(--primary-blue-dim) !important; + border-color: var(--primary-blue-border) !important; + color: var(--primary-blue) !important; +} +.btn-add:hover { + background: rgba(74, 124, 255, 0.2) !important; +} + +.toolbar-right .search-input { + padding: 8px 16px; + background: rgba(255, 255, 255, 0.04); + border: 1px solid var(--border-subtle); + border-radius: 10px; + color: #fff; + font-size: 13px; + outline: none; + width: 200px; + transition: border-color 0.3s; +} +.toolbar-right .search-input:focus { + border-color: var(--primary-blue-border); +} +.toolbar-right .search-input::placeholder { + color: var(--text-dim); +} + +/* ---------- 隧道卡片 ---------- */ +.proxy-list { + display: grid; + grid-template-columns: repeat(3, 1fr); + gap: 12px; +} + +.proxy-card { + background: rgba(255, 255, 255, 0.02); + border: 1px solid var(--border-subtle); + border-radius: 14px; + padding: 12px 16px; + transition: border-color 0.3s; +} +.proxy-card:hover { + border-color: rgba(255, 255, 255, 0.08); +} +.proxy-row { + display: flex; + justify-content: space-between; + align-items: center; +} +.proxy-left { + display: flex; + align-items: center; + gap: 12px; +} +.proxy-name { + font-size: 15px; + font-weight: 500; + color: #fff; +} +.proxy-addr { + font-size: 13px; + color: var(--text-dim); + font-family: 'JetBrains Mono', monospace; +} +.proxy-tag { + font-size: 10px; + padding: 2px 10px; + background: rgba(255, 255, 255, 0.04); + border-radius: 10px; + color: var(--text-muted); + text-transform: uppercase; + letter-spacing: 0.5px; +} +.proxy-right { + display: flex; + align-items: center; + gap: 12px; +} +.remote-port { + font-family: 'JetBrains Mono', monospace; + font-size: 14px; + color: var(--text-secondary); +} +.icon-btn { + background: none; + border: none; + color: var(--text-dim); + font-size: 16px; + cursor: pointer; + padding: 4px 6px; + transition: color 0.2s; + border-radius: 6px; +} +.icon-btn:hover { + color: var(--text-secondary); + background: rgba(255, 255, 255, 0.04); +} +.icon-btn.danger:hover { + color: #f87171; + background: rgba(248, 113, 113, 0.1); +} + +.proxy-footer { + margin-top: 8px; + padding-top: 8px; + border-top: 1px solid var(--border-subtle); + display: flex; + align-items: center; + gap: 10px; +} +.status-label { + font-size: 12px; + color: var(--text-dim); +} +.empty-state { + padding: 48px 0; + text-align: center; + color: var(--text-dim); + font-size: 14px; +} + +/* ---------- 开关 ---------- */ .switch { position: relative; width: 44px; @@ -356,13 +381,11 @@ body { display: inline-block; cursor: pointer; } - .switch input { opacity: 0; width: 0; height: 0; } - .switch .slider { position: absolute; top: 0; @@ -373,7 +396,6 @@ body { border-radius: 24px; transition: background 0.3s; } - .switch .slider::before { content: ''; position: absolute; @@ -385,205 +407,28 @@ body { border-radius: 50%; transition: transform 0.3s; } - -.switch input:checked+.slider { - background: #63e2b7; +.switch input:checked + .slider { + background: var(--primary-blue); } - -.switch input:checked+.slider::before { +.switch input:checked + .slider::before { transform: translateX(20px); background: #0a0a0f; } - .switch.small { width: 32px; height: 18px; } - .switch.small .slider::before { height: 12px; width: 12px; left: 3px; bottom: 3px; } - -.switch.small input:checked+.slider::before { +.switch.small input:checked + .slider::before { transform: translateX(14px); } -/* 展开详情 */ -.detail-collapse { - padding: 12px 0; - color: rgba(255, 255, 255, 0.3); - font-size: 13px; - cursor: pointer; - user-select: none; - transition: color 0.3s; -} - -.detail-collapse:hover { - color: rgba(255, 255, 255, 0.6); -} - -.detail-panel { - background: rgba(255, 255, 255, 0.02); - border-radius: 12px; - padding: 16px 20px; - border: 1px solid rgba(255, 255, 255, 0.04); - display: grid; - grid-template-columns: 1fr 1fr; - gap: 12px 24px; - margin-bottom: 16px; -} - -.detail-panel .form-row { - display: flex; - flex-direction: column; - gap: 4px; -} - -.detail-panel .form-row label { - font-size: 11px; - text-transform: uppercase; - letter-spacing: 0.5px; - color: rgba(255, 255, 255, 0.25); -} - -.detail-panel .form-row input, -.detail-panel .form-row select { - padding: 8px 12px; - background: rgba(255, 255, 255, 0.04); - border: 1px solid rgba(255, 255, 255, 0.06); - border-radius: 8px; - color: #fff; - font-size: 14px; - outline: none; - transition: border-color 0.3s; -} - -.detail-panel .form-row input:focus, -.detail-panel .form-row select:focus { - border-color: rgba(99, 226, 183, 0.3); -} - -.save-btn { - grid-column: 1 / -1; - padding: 10px 24px; - background: linear-gradient(135deg, #63e2b7, #3b9e8a); - border: none; - border-radius: 10px; - font-size: 14px; - font-weight: 600; - color: #0a0a0f; - cursor: pointer; - transition: transform 0.2s, box-shadow 0.2s; - margin-top: 4px; -} - -.save-btn:hover { - transform: scale(1.01); - box-shadow: 0 4px 16px rgba(99, 226, 183, 0.25); -} - -/* ===== 隧道列表页 ===== */ -.toolbar { - display: flex; - justify-content: space-between; - align-items: center; - margin-bottom: 16px; - flex-wrap: wrap; - gap: 12px; -} - -.toolbar-left { - display: flex; - gap: 10px; - flex-wrap: wrap; -} - -.toolbar-left button { - padding: 8px 18px; - border-radius: 10px; - border: 1px solid rgba(255, 255, 255, 0.06); - background: rgba(255, 255, 255, 0.03); - color: rgba(255, 255, 255, 0.7); - font-size: 13px; - cursor: pointer; - transition: background 0.2s, border-color 0.2s; -} - -.toolbar-left button:hover { - background: rgba(255, 255, 255, 0.06); -} - -.btn-import:hover { - border-color: rgba(99, 226, 183, 0.3); - color: #63e2b7; -} -.btn-export:hover { - border-color: rgba(99, 150, 255, 0.3); - color: #6a9fff; -} -.btn-add { - background: rgba(99, 226, 183, 0.12) !important; - border-color: rgba(99, 226, 183, 0.2) !important; - color: #63e2b7 !important; -} -.btn-add:hover { - background: rgba(99, 226, 183, 0.2) !important; -} - -.toolbar-right .search-input { - padding: 8px 16px; - background: rgba(255, 255, 255, 0.04); - border: 1px solid rgba(255, 255, 255, 0.06); - border-radius: 10px; - color: #fff; - font-size: 13px; - outline: none; - width: 200px; - transition: border-color 0.3s; -} - -.toolbar-right .search-input:focus { - border-color: rgba(99, 226, 183, 0.3); -} - -.toolbar-right .search-input::placeholder { - color: rgba(255, 255, 255, 0.2); -} - -/* 隧道卡片列表 */ -.proxy-list { - display: flex; - flex-direction: column; - gap: 8px; -} - -.proxy-card { - background: rgba(255, 255, 255, 0.02); - border: 1px solid rgba(255, 255, 255, 0.04); - border-radius: 14px; - padding: 12px 18px; - transition: border-color 0.3s; -} - -.proxy-card:hover { - border-color: rgba(255, 255, 255, 0.08); -} - -.proxy-row { - display: flex; - justify-content: space-between; - align-items: center; -} - -.proxy-left { - display: flex; - align-items: center; - gap: 12px; -} - +/* ---------- 状态点(只读展示) ---------- */ .status-dot { width: 8px; height: 8px; @@ -591,89 +436,12 @@ body { background: #333; transition: background 0.3s; } - .status-dot.active { background: #63e2b7; box-shadow: 0 0 10px rgba(99, 226, 183, 0.3); } -.proxy-name { - font-size: 15px; - font-weight: 500; - color: #fff; -} - -.proxy-addr { - font-size: 13px; - color: rgba(255, 255, 255, 0.3); - font-family: 'JetBrains Mono', monospace; -} - -.proxy-tag { - font-size: 10px; - padding: 2px 10px; - background: rgba(255, 255, 255, 0.04); - border-radius: 10px; - color: rgba(255, 255, 255, 0.3); - text-transform: uppercase; - letter-spacing: 0.5px; -} - -.proxy-right { - display: flex; - align-items: center; - gap: 12px; -} - -.remote-port { - font-family: 'JetBrains Mono', monospace; - font-size: 14px; - color: rgba(255, 255, 255, 0.4); -} - -.icon-btn { - background: none; - border: none; - color: rgba(255, 255, 255, 0.2); - font-size: 16px; - cursor: pointer; - padding: 4px 6px; - transition: color 0.2s; - border-radius: 6px; -} - -.icon-btn:hover { - color: rgba(255, 255, 255, 0.7); - background: rgba(255, 255, 255, 0.04); -} - -.icon-btn.danger:hover { - color: #f87171; - background: rgba(248, 113, 113, 0.1); -} - -.proxy-footer { - margin-top: 8px; - padding-top: 8px; - border-top: 1px solid rgba(255, 255, 255, 0.04); - display: flex; - align-items: center; - gap: 10px; -} - -.status-label { - font-size: 12px; - color: rgba(255, 255, 255, 0.2); -} - -.empty-state { - padding: 48px 0; - text-align: center; - color: rgba(255, 255, 255, 0.15); - font-size: 14px; -} - -/* ===== 弹窗 ===== */ +/* ---------- 弹窗 ---------- */ .dialog-overlay { position: fixed; top: 0; @@ -687,65 +455,56 @@ body { justify-content: center; align-items: center; } - .dialog-card { background: #1a1a24; - border: 1px solid rgba(255, 255, 255, 0.06); + border: 1px solid var(--border-subtle); border-radius: 20px; padding: 28px 32px; width: 480px; max-width: 90vw; box-shadow: 0 32px 64px rgba(0, 0, 0, 0.6); } - .dialog-card h3 { font-size: 18px; font-weight: 500; color: #fff; margin-bottom: 20px; } - .dialog-form { display: flex; flex-direction: column; gap: 14px; } - .dialog-form .form-row { display: flex; flex-direction: column; gap: 4px; } - .dialog-form .form-row label { font-size: 12px; - color: rgba(255, 255, 255, 0.3); + color: var(--text-dim); } - .dialog-form .form-row input, .dialog-form .form-row select { padding: 8px 14px; background: rgba(255, 255, 255, 0.04); - border: 1px solid rgba(255, 255, 255, 0.06); + border: 1px solid var(--border-subtle); border-radius: 10px; color: #fff; font-size: 14px; outline: none; transition: border-color 0.3s; } - .dialog-form .form-row input:focus, .dialog-form .form-row select:focus { - border-color: rgba(99, 226, 183, 0.3); + border-color: var(--primary-blue-border); } - .dialog-actions { display: flex; gap: 12px; margin-top: 20px; justify-content: flex-end; } - .dialog-actions button { padding: 8px 24px; border-radius: 10px; @@ -754,61 +513,72 @@ body { cursor: pointer; transition: background 0.2s, transform 0.2s; } - .btn-cancel { background: rgba(255, 255, 255, 0.04); - color: rgba(255, 255, 255, 0.5); + color: var(--text-secondary); } - .btn-cancel:hover { background: rgba(255, 255, 255, 0.08); } - .btn-confirm { - background: linear-gradient(135deg, #63e2b7, #3b9e8a); + background: linear-gradient(135deg, var(--primary-blue), #2a5adf); color: #0a0a0f; font-weight: 600; } - .btn-confirm:hover { transform: scale(1.02); - box-shadow: 0 4px 16px rgba(99, 226, 183, 0.2); + box-shadow: 0 4px 16px var(--primary-blue-glow); } -/* ===== 旋转圈过渡 ===== */ -.loading-ring { - position: absolute; - top: 50%; - left: 50%; - transform: translate(-50%, -50%); - width: 48px; - height: 48px; - border: 3px solid rgba(255, 255, 255, 0.04); - border-top: 3px solid #63e2b7; - border-radius: 50%; - animation: spin 0.8s linear infinite; - opacity: 0; +/* ---------- 自定义 Select(墨蓝风格) ---------- */ +select { + appearance: none; + -webkit-appearance: none; + -moz-appearance: none; + background: rgba(13, 13, 26, 0.85) !important; + backdrop-filter: blur(4px); + -webkit-backdrop-filter: blur(4px); + border: 1px solid var(--primary-blue-border) !important; + border-radius: 10px !important; + color: #e0e0e0 !important; + padding: 10px 14px !important; + font-size: 14px; + font-family: inherit; + cursor: pointer; + outline: none; + transition: border-color 0.25s ease, box-shadow 0.25s ease, background 0.25s ease; + width: 100%; + background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='8' viewBox='0 0 12 8'%3E%3Cpath d='M1 1l5 5 5-5' stroke='%234a7cff' stroke-width='1.5' fill='none' stroke-linecap='round' stroke-linejoin='round'/%3E%3C/svg%3E"); + background-repeat: no-repeat; + background-position: right 14px center; + padding-right: 40px !important; +} +select:hover { + border-color: rgba(74, 124, 255, 0.4) !important; + background: rgba(20, 20, 40, 0.9) !important; +} +select:focus { + border-color: var(--primary-blue) !important; + box-shadow: 0 0 0 3px rgba(74, 124, 255, 0.15), inset 0 0 0 1px rgba(74, 124, 255, 0.05); +} +select option { + background: #0d0d1a !important; + color: #e0e0e0 !important; + padding: 8px 14px !important; + border: none !important; +} +select option:hover, +select option:checked, +select option:focus { + background: rgba(74, 124, 255, 0.2) !important; + color: #ffffff !important; +} +select:-moz-focusring { + color: transparent; + text-shadow: 0 0 0 #e0e0e0; +} +select:disabled { + opacity: 0.4; + cursor: not-allowed; pointer-events: none; - transition: opacity 0.3s; - z-index: 5; -} - -.loading-ring.visible { - opacity: 1; -} - -@keyframes spin { - to { - transform: translate(-50%, -50%) rotate(360deg); - } -} - -/* 主内容默认透明,登录后淡入 */ -.main-panel { - opacity: 0; - transition: opacity 0.3s ease; -} - -.main-panel.visible { - opacity: 1; } \ No newline at end of file