diff --git a/README.md b/README.md index fdc78bd..c9ed088 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@ # Amnezia Admin WebUI -Веб-панель на вашем VPS для управления клиентами **AmneziaWG**: вкл/выкл, удаление, переименование, дата отключения; при нескольких контейнерах — переключатель **«Инстанс»** (`AWG_PROFILES`); **экспорт .conf** при наличии `last_config`; **новый клиент под каскад** (свой Endpoint и ключи на сервере); **Cloudflare WARP** — выбор клиентов, для которых трафик уходит в интернет через `warp` на сервере. Работает через Docker и `docker exec` в контейнер **Amnezia** (по умолчанию `amnezia-awg2`). +Веб-панель на вашем VPS для управления клиентами **AmneziaWG**: вкл/выкл, удаление, переименование, дата отключения; при нескольких контейнерах — переключатель **«Инстанс»** (`AWG_PROFILES`); **экспорт .conf** при наличии `last_config`; **новый клиент под каскад** (свой Endpoint и ключи на сервере). **Cloudflare WARP** — *необязательное* дополнение: часть клиентов может выходить в интернет через интерфейс `warp` внутри контейнера AWG (ставится отдельно скриптом на хосте). Работает через Docker и `docker exec` в контейнер **Amnezia** (по умолчанию `amnezia-awg2`). Справочник по интерфейсу, типичным сбоям и HTTP API: **[docs/panel-guide.md](docs/panel-guide.md)**. @@ -10,7 +10,7 @@ | Адрес | Назначение | |-------|------------| -| **`http://IP:HOST_PORT`** (по умолчанию **`:8080`**) | **Админ-панель:** клиенты AmneziaWG, WARP, каскад, экспорт `.conf`, смена пароля. Внизу страницы — футер со ссылками автора (GitHub, донат, Telegram и т.д.). | +| **`http://IP:HOST_PORT`** (по умолчанию **`:8080`**) | **Админ-панель:** клиенты AmneziaWG, опциональный блок **Cloudflare WARP**, каскад, экспорт `.conf`, смена пароля. Внизу страницы — футер со ссылками автора (GitHub, донат, Telegram и т.д.). | | **`http://IP:LANDING_PORT`** (по умолчанию **`:80`**) | **Публичная страница** для приглашённых: инструкция, кнопка перехода в админку (`landing/admin-port.js` подставляет тот же `HOST_PORT`). Текст «проблемы — администратору сервера» и дисклеймер. **Без** блока доната и личных ссылок автора — они только в админке. | Если порт **80** занят другим сервисом, задайте **`LANDING_PORT`** (например `8081`) или **`SKIP_LANDING=1`**. На работу панели по **`HOST_PORT`** это не влияет. @@ -102,11 +102,12 @@ curl -fsSL https://raw.githubusercontent.com/andrey271192/Amnezia_web/main/scrip Если в вебе пропал список **«Инстанс»**, смотрите раздел «Если пропал список Инстанс» в **[docs/panel-guide.md](docs/panel-guide.md)**. -### Cloudflare WARP (только AmneziaWG в Docker) +### Cloudflare WARP (необязательно) -На хосте VPS скрипт регистрирует туннель через [wgcf](https://github.com/ViRb3/wgcf) и кладёт `warp.conf` в контейнер AWG (`/opt/warp` по умолчанию). В веб-панели отмечаете, какие клиенты выходят в интернет через интерфейс `warp`. +**Устанавливать не обязательно.** Панель и обычный AmneziaWG работают без WARP. Раздел **Cloudflare WARP** в веб-интерфейсе нужен только если вы хотите, чтобы **выбранные** клиенты (с IPv4 `10.8.x.x/32` в AllowedIPs) выходили в интернет через туннель Cloudflare внутри контейнера AWG. -На **хосте VPS** (root), из каталога с репозиторием: +- **Не нужен WARP** — ничего на хосте не запускайте. В панели будет статус **«Не установлен»** — это нормально, блок можно не трогать. +- **Нужен WARP** — один раз на хосте VPS (root), из каталога с репозиторием (часто `/opt/amnezia-admin`): ```bash cd /opt/amnezia-admin @@ -115,11 +116,23 @@ chmod +x scripts/warp-amnezia.sh ./scripts/warp-amnezia.sh install ``` -Подкоманды: `install`, `start`, `stop`, `status`, `rekey`. Учёт wgcf хранится в `/root/wgcf-account.toml` на хосте. +Скрипт регистрирует туннель через [wgcf](https://github.com/ViRb3/wgcf), создаёт `warp.conf` в контейнере (`/opt/warp` по умолчанию). Дальше в панели отмечаете клиентов и жмёте **«Применить маршрутизацию»** (контейнер AWG перезапустится). -В панели: раздел **Cloudflare WARP** — отметить клиентов (только IPv4 вида `10.8.x.x/32`), **Применить маршрутизацию** (контейнер AWG перезапускается). Маркеры в `start.sh` (`# --- WARP-MANAGER BEGIN ---`) совместимы с прежним `warp-manager`, если вы уже использовали его. +Подкоманды: `install`, `start`, `stop`, `status`, `rekey`, **`uninstall`**. Учёт wgcf на хосте: `/root/wgcf-account.toml` (и бинарник `/root/wgcf`, если скачан). -Необязательно передайте в контейнер **amnezia-admin** переменные `WARP_DIR`, `WARP_CONF_PATH`, `WARP_CLIENTS_LIST`, `AMNEZIA_START_SCRIPT` через установщик — см. таблицу выше. +**Полностью убрать WARP** после установки (интерфейс `warp`, правила маршрутизации/NAT, блок `# --- WARP-MANAGER ---` в `start.sh`, `warp.conf` и список клиентов в каталоге WARP в контейнере; затем перезапуск контейнера AWG): + +```bash +cd /opt/amnezia-admin +./scripts/warp-amnezia.sh uninstall +# нестандартный путь к start.sh в контейнере: AMNEZIA_START_SCRIPT=/путь ./scripts/warp-amnezia.sh uninstall +``` + +Файлы **wgcf** на хосте (`/root/wgcf-account.toml`, `/root/wgcf-profile.conf`, бинарник `wgcf`) скрипт **не** удаляет — при желании удалите вручную. + +Маркеры в `start.sh` (`# --- WARP-MANAGER BEGIN ---`) совместимы с прежним `warp-manager`, если вы уже использовали его. + +Необязательно задавать в контейнере **amnezia-admin** переменные `WARP_DIR`, `WARP_CONF_PATH`, `WARP_CLIENTS_LIST`, `AMNEZIA_START_SCRIPT` через установщик — см. таблицу выше. Итоговые URL после установки совпадают с таблицей **«Что открывается по какому порту»** в начале этого файла; установщик записывает выбранный `HOST_PORT` в **`landing/admin-port.js`**, чтобы кнопка на лендинге вела на нужную админку. diff --git a/docs/panel-guide.md b/docs/panel-guide.md index 0383a0f..9f8dea5 100644 --- a/docs/panel-guide.md +++ b/docs/panel-guide.md @@ -8,7 +8,7 @@ |-------------------|------------| | **Инстанс** | Переключение между профилями из `AWG_PROFILES` (разные контейнеры AmneziaWG / Legacy). Виден только если в контейнере панели задан JSON из **двух и более** профилей. | | **Время** | Отображение часов контейнера и браузера; синхронизация времени хоста VPS по SSH (если доступно). | -| **Cloudflare WARP** | Выбор клиентов (IPv4 `/32`), выход в интернет через интерфейс `warp` в контейнере AWG. | +| **Cloudflare WARP** | *Необязательно.* Вывод части клиентов в интернет через интерфейс `warp` в контейнере AWG. Если WARP не ставили — статус **«Не установлен»** нормален; панель и VPN без этого работают. Установка и удаление — скрипт `scripts/warp-amnezia.sh` на хосте (`install` / **`uninstall`**), подробности в основном [README](../README.md). | | **Новый клиент под каскад** | Создание нового peer на сервере с **вашим Endpoint** (промежуточный узел); выдача готового `.conf`. | | **Пользователи** | Вкл/выкл peer, удаление, переименование, даты отключения; экспорт `.conf` если в записи есть `userData.last_config`. | @@ -32,6 +32,16 @@ Файл **`landing/admin-port.js`** пересобирается установщиком и задаёт порт админки для кнопки на лендинге. +## Cloudflare WARP: нужно ли ставить + +**Нет, если обычного VPN достаточно.** WARP — дополнительная опция «выход в интернет через Cloudflare» для отмеченных в панели клиентов (IPv4 вида `10.8.x.x/32`). + +| Задача | Действие | +|--------|----------| +| WARP не нужен | Ничего не устанавливайте; раздел в вебе с текстом «Не установлен» можно игнорировать. | +| Включить WARP | На VPS под root: `bash scripts/warp-amnezia.sh install` из каталога репозитория, затем настройка галочек в панели и «Применить» — см. [README](../README.md). | +| Полностью убрать WARP | `./scripts/warp-amnezia.sh uninstall` на хосте; учёт wgcf в `/root/` при желании удалите вручную. | + ## Конфигурации клиентов - **Старые строки без `last_config`** — полный `.conf` с сервера собрать нельзя (нет приватного ключа). Используйте приложение Amnezia или блок **«Новый клиент под каскад»** (новый ключ на сервере). diff --git a/package.json b/package.json index f027036..2efcf9b 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amnezia-admin", - "version": "1.1.3", + "version": "1.1.4", "private": true, "description": "Web-панель AmneziaWG: несколько инстансов, WARP, каскад/Endpoint, экспорт .conf (Docker)", "license": "MIT", diff --git a/public/app.js b/public/app.js index f075d29..f684eae 100644 --- a/public/app.js +++ b/public/app.js @@ -634,6 +634,11 @@ function renderWarpPanel(data) { hint.innerHTML = "Один раз на хосте (root): bash scripts/warp-amnezia.sh install — из каталога клона репозитория на VPS. Если контейнер не угадан автоматически: bash scripts/warp-amnezia.sh install amnezia-awg2."; warpActionsEl.appendChild(hint); + const skip = document.createElement("p"); + skip.className = "muted warp-muted"; + skip.textContent = + "Если Cloudflare WARP не нужен, ничего не выполняйте — AmneziaWG и панель работают без него. Полное удаление: bash scripts/warp-amnezia.sh uninstall (см. README)."; + warpActionsEl.appendChild(skip); return; } diff --git a/public/index.html b/public/index.html index bf2336f..59a6a9d 100644 --- a/public/index.html +++ b/public/index.html @@ -96,9 +96,10 @@

- Выход в интернет через Cloudflare WARP для выбранных клиентов AmneziaWG (правила в контейнере: таблица маршрутизации и NAT). + Необязательно. Если достаточно обычного AmneziaWG без выхода части клиентов через Cloudflare — раздел можно не трогать (статус «Не установлен» — норма). + Если WARP нужен: выход в интернет через Cloudflare для выбранных клиентов (правила маршрутизации и NAT в контейнере). Один раз на хосте VPS под root: в каталоге с репозиторием выполните bash scripts/warp-amnezia.sh install. - Затем отметьте клиентов ниже и нажмите «Применить» (контейнер AWG перезапустится). + Затем отметьте клиентов ниже и нажмите «Применить» (контейнер AWG перезапустится). Убрать WARP полностью: bash scripts/warp-amnezia.sh uninstall — см. README.

diff --git a/scripts/warp-amnezia.sh b/scripts/warp-amnezia.sh index 932fa0d..31c9dda 100755 --- a/scripts/warp-amnezia.sh +++ b/scripts/warp-amnezia.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # Cloudflare WARP внутри контейнера AmneziaWG (wgcf → warp.conf → wg-quick). # Запускать на хосте VPS от root: установка и обслуживание туннеля WARP для панели Amnezia Admin. -# После install управление «кто выходит через WARP» — в веб-панели Amnezia Admin (раздел WARP). +# После install управление «кто выходит через WARP» — в веб-панели (раздел WARP). Полное снятие: подкоманда uninstall. set -euo pipefail WGCF_VERSION="${WGCF_VERSION:-2.2.30}" @@ -10,8 +10,8 @@ WGCF_ACCOUNT="${WGCF_ACCOUNT:-/root/wgcf-account.toml}" WGCF_PROFILE="${WGCF_PROFILE:-/root/wgcf-profile.conf}" usage() { - echo "Использование: $0 {install|start|stop|status|rekey} [имя_контейнера]" - echo "Переменные: AWG_CONTAINER, WARP_DIR (по умолчанию /opt/warp)" + echo "Использование: $0 {install|start|stop|status|rekey|uninstall} [имя_контейнера]" + echo "Переменные: AWG_CONTAINER, WARP_DIR (по умолчанию /opt/warp), AMNEZIA_START_SCRIPT (для uninstall, по умолчанию /opt/amnezia/start.sh)" exit 1 } @@ -152,6 +152,33 @@ is_running() { docker exec "$CONTAINER" ip addr show warp >/dev/null 2>&1 } +cmd_uninstall() { + echo "→ Останавливаю WARP и убираю автозапуск в контейнере ${CONTAINER}…" + warp_down || true + local START_SCRIPT="${AMNEZIA_START_SCRIPT:-/opt/amnezia/start.sh}" + docker exec \ + -e START_SCRIPT="$START_SCRIPT" \ + -e WARP_CONF="$AWG_WARP_CONF" \ + -e WARP_DIR="$AWG_WARP_DIR" \ + "$CONTAINER" sh -c ' +set +e +ip rule | awk "/lookup 100/ {print \$1}" | sed "s/://g" | sort -rn | while read -r pr; do ip rule del priority "$pr" 2>/dev/null || true; done +iptables -t nat -S POSTROUTING 2>/dev/null | grep -- "-o warp -j MASQUERADE" | while read -r line; do + rule=$(echo "$line" | sed "s/^-A /-D /") + iptables -t nat $rule 2>/dev/null || true +done +ip route flush table 100 2>/dev/null || true +if [ -f "$START_SCRIPT" ] && grep -qF "# --- WARP-MANAGER BEGIN ---" "$START_SCRIPT" 2>/dev/null; then + sed -i "/# --- WARP-MANAGER BEGIN ---/,/# --- WARP-MANAGER END ---/d" "$START_SCRIPT" +fi +rm -f "$WARP_CONF" "${WARP_DIR}/clients.list" "${WARP_DIR}/wgcf-profile.conf" 2>/dev/null || true +' + echo "→ Перезапускаю контейнер ${CONTAINER}…" + docker restart "$CONTAINER" >/dev/null + echo "Готово: WARP отключён, файлы в контейнере и блок в start.sh убраны." + echo "Учёт wgcf на хосте при желании удалите вручную: $WGCF_ACCOUNT $WGCF_PROFILE (и $WGCF_BIN, если не нужен)." +} + cmd_install() { echo "Бэкап конфигов в контейнере…" docker exec "$CONTAINER" sh -c " @@ -246,6 +273,7 @@ case "$CMD" in warp_down echo "WARP остановлен." ;; + uninstall) cmd_uninstall ;; status) cmd_status ;; rekey) cmd_rekey ;; *) usage ;; diff --git a/server.js b/server.js index ed5e758..30d500e 100644 --- a/server.js +++ b/server.js @@ -1700,7 +1700,7 @@ app.post("/api/warp/start", requireAuth, async (req, res) => { if (!(await warpFileExists(rt, rt.profile.warpConf))) { return res.status(400).json({ error: - "WARP не установлен (нет warp.conf). Один раз выполните на хосте: scripts/warp-amnezia.sh install — см. README.", + "WARP не установлен (нет warp.conf). На хосте: scripts/warp-amnezia.sh install — или игнорируйте раздел, если WARP не нужен (см. README).", }); } try { @@ -1732,7 +1732,7 @@ app.post("/api/warp/routing", requireAuth, async (req, res) => { if (!(await warpFileExists(rt, rt.profile.warpConf))) { return res.status(400).json({ error: - "WARP не установлен. Сначала scripts/warp-amnezia.sh install на хосте VPS (root).", + "WARP не установлен. Сначала scripts/warp-amnezia.sh install на хосте VPS (root), либо не используйте этот раздел.", }); } const raw = req.body?.selectedAllowedIps;