mirror of
https://github.com/andrey271192/amnezia_web-PRO.git
synced 2026-09-20 14:42:00 +00:00
fix: show distinct awg instance labels
This commit is contained in:
@@ -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) от этого не зависит.
|
||||
|
||||
4
package-lock.json
generated
4
package-lock.json
generated
@@ -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"
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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
|
||||
? `<span class="inst-status on">● РАБОТАЕТ</span>`
|
||||
: `<span class="inst-status off">● ОСТАНОВЛЕН</span>`;
|
||||
@@ -1493,14 +1494,14 @@ async function loadInstances() {
|
||||
? ""
|
||||
: `<span class="inst-src" title="Контейнер развёрнут приложением Amnezia">приложение Amnezia</span>`;
|
||||
const delBtn = i.managed
|
||||
? `<button class="btn small warn" data-act="delete" data-id="${i.id}" data-label="${escapeHtmlSafe(m.title)}">Удалить</button>`
|
||||
? `<button class="btn small warn" data-act="delete" data-id="${i.id}" data-label="${escapeHtmlSafe(title)}">Удалить</button>`
|
||||
: "";
|
||||
return `<div class="inst-card">
|
||||
<div class="inst-card-head">
|
||||
<div class="inst-ico">${m.icon}</div>
|
||||
${toggle}
|
||||
</div>
|
||||
<div class="inst-title">${escapeHtmlSafe(m.title)} ${badge} ${srcTag}</div>
|
||||
<div class="inst-title">${escapeHtmlSafe(title)} ${badge} ${srcTag}</div>
|
||||
<div class="inst-desc muted">${escapeHtmlSafe(i.variantMeta?.desc || "")}</div>
|
||||
<div class="inst-status-row">${status}</div>
|
||||
<div class="inst-stats">
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user