diff --git a/docs/panel-guide.md b/docs/panel-guide.md index 26a29d4..48fd0fe 100644 --- a/docs/panel-guide.md +++ b/docs/panel-guide.md @@ -32,6 +32,8 @@ После переустановки старый `AWG_PROFILES` и сохранённые managed-инстансы могли указывать на один и тот же контейнер/конфиг с разными `id`. Начиная с **v1.2.32** панель дедуплицирует профили по `container + confPath + iface + clientsPath`, а также чистит дубли при чтении/сохранении `instances.json`. Обновите панель из GitHub и сделайте жёсткое обновление страницы. +Если проверка на сервере показывает два разных контейнера, например `amnezia-awg2` и `amnezia-awg`, с разными портами и разным числом клиентов — это не дубль, а два инстанса. Начиная с **v1.2.33** карточки используют реальное имя профиля (`label`), чтобы `AmneziaWG 2.0` и `AmneziaWG` не выглядели одинаково. + ## Лендинг не поднимается (порт 80 занят) При ошибке bind `:80` используйте при установке **`SKIP_LANDING=1`** или **`LANDING_PORT=8081`** — админка на `HOST_PORT` (например 8080) от этого не зависит. diff --git a/package-lock.json b/package-lock.json index 4185e97..9e218e5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "amnezia-admin", - "version": "1.2.32", + "version": "1.2.33", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "amnezia-admin", - "version": "1.2.32", + "version": "1.2.33", "license": "MIT", "dependencies": { "express": "^4.21.2" diff --git a/package.json b/package.json index 892c91c..140faf3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amnezia-admin", - "version": "1.2.32", + "version": "1.2.33", "private": false, "description": "amnezia_web-PRO — веб-панель AmneziaWG: несколько инстансов, WARP, каскад/Endpoint, экспорт .conf (Docker)", "license": "MIT", diff --git a/public/app.js b/public/app.js index 591abcf..df20fa3 100644 --- a/public/app.js +++ b/public/app.js @@ -1482,6 +1482,7 @@ async function loadInstances() { } grid.innerHTML = list.map((i) => { const m = VARIANT_META[i.variant] || { icon: "🛡", title: i.variant, badge: "" }; + const title = i.label || m.title || i.variant || i.id; const status = i.running ? `● РАБОТАЕТ` : `● ОСТАНОВЛЕН`; @@ -1493,14 +1494,14 @@ async function loadInstances() { ? "" : `приложение Amnezia`; const delBtn = i.managed - ? `` + ? `` : ""; return `
${m.icon}
${toggle}
-
${escapeHtmlSafe(m.title)} ${badge} ${srcTag}
+
${escapeHtmlSafe(title)} ${badge} ${srcTag}
${escapeHtmlSafe(i.variantMeta?.desc || "")}
${status}
diff --git a/server.js b/server.js index c2f9319..7d765d7 100644 --- a/server.js +++ b/server.js @@ -2900,6 +2900,13 @@ function detectVariantFromHead(head, iface) { return "awg"; } +function inferVariantFromProfile(prof) { + const raw = `${prof.variant || ""} ${prof.id || ""} ${prof.container || ""} ${prof.label || ""}`.toLowerCase(); + if (raw.includes("legacy") || prof.iface === "wg0") return "legacy"; + if (raw.includes("awg2") || raw.includes("2.0")) return "awg2"; + return "awg"; +} + app.get("/api/instances", requireAuth, async (_req, res) => { const managedIds = new Set(loadManagedProfiles().map((m) => m.id)); const profiles = getProfiles(); @@ -2912,7 +2919,7 @@ app.get("/api/instances", requireAuth, async (_req, res) => { let runningNow = false; let peers = null; let port = prof.port || null; - let variant = prof.variant || "awg2"; + let variant = prof.variant || inferVariantFromProfile(prof); try { const rt = createRuntime(prof); container = await rt.resolveContainer();