mirror of
https://github.com/andrey271192/amnezia_web.git
synced 2026-09-20 14:41:59 +00:00
feat: open community panel (read-only clients only)
Ship full install stack with .amnezia-panel-edition=community; docs and footer point to Boosty/PRO. Managing peers, export, cascade and WARP require private PRO build. Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
93
docs/panel-guide.md
Normal file
93
docs/panel-guide.md
Normal file
@@ -0,0 +1,93 @@
|
||||
# Руководство по Amnezia Admin WebUI
|
||||
|
||||
Краткий справочник по функциям, типичным проблемам и HTTP API.
|
||||
|
||||
## Возможности
|
||||
|
||||
| Блок в интерфейсе | Назначение |
|
||||
|-------------------|------------|
|
||||
| **Инстанс** | Переключение между профилями из `AWG_PROFILES` (разные контейнеры AmneziaWG / Legacy). Виден только если в контейнере панели задан JSON из **двух и более** профилей. |
|
||||
| **Время** | Отображение часов контейнера и браузера; синхронизация времени хоста VPS по SSH (если доступно). |
|
||||
| **Cloudflare WARP** | *Необязательно.* Вывод части клиентов в интернет через интерфейс `warp` в контейнере AWG. Если WARP не ставили — статус **«Не установлен»** нормален; панель и VPN без этого работают. Установка и удаление — скрипт `scripts/warp-amnezia.sh` на хосте (`install` / **`uninstall`**), подробности в основном [README](../README.md). |
|
||||
| **Новый клиент под каскад** | Создание нового peer на сервере с **вашим Endpoint** (промежуточный узел); выдача готового `.conf`. |
|
||||
| **Пользователи** | Вкл/выкл peer, удаление, переименование, даты отключения; экспорт `.conf` если в записи есть `userData.last_config`. |
|
||||
|
||||
## Переключатель «Инстанс» не отображается
|
||||
|
||||
1. Проверьте переменную контейнера панели:
|
||||
```bash
|
||||
docker inspect amnezia-admin --format '{{range .Config.Env}}{{println .}}{{end}}' | grep '^AWG_PROFILES='
|
||||
```
|
||||
2. Если строки нет — один раз задайте JSON при установке (пример см. в основном [README](../README.md)) или восстановите файл **`/root/amnezia-admin.awg-profiles.json`** на VPS и снова запустите `install.sh` **без** своего `AWG_PROFILES` — установщик подставит значение из файла или из старого контейнера перед удалением.
|
||||
3. После правок обновите страницу с **жёстким сбросом кэша** (Ctrl+Shift+R).
|
||||
|
||||
## Лендинг не поднимается (порт 80 занят)
|
||||
|
||||
При ошибке bind `:80` используйте при установке **`SKIP_LANDING=1`** или **`LANDING_PORT=8081`** — админка на `HOST_PORT` (например 8080) от этого не зависит.
|
||||
|
||||
## Публичная страница и админка
|
||||
|
||||
- **`http://IP:LANDING_PORT`** (часто **80**) — статический nginx из каталога **`landing/`**: инструкция, переход в админку, напоминание написать **администратору вашего сервера**, дисклеймер. Ссылок на донат и автора репозитория здесь нет.
|
||||
- **`http://IP:HOST_PORT`** (часто **8080**) — сама панель (`public/`). Футер со ссылками автора (GitHub, Boosty и т.д.) только здесь, внизу после таблицы клиентов.
|
||||
|
||||
Файл **`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/` при желании удалите вручную. |
|
||||
|
||||
## Скрытие разделов в панели (`UI_HIDE_*`)
|
||||
|
||||
Переменные контейнера **`amnezia-admin`**: **`UI_HIDE_SECTIONS`** (список `users`, `warp`, `cascade`) или отдельно **`UI_HIDE_USERS`**, **`UI_HIDE_WARP`**, **`UI_HIDE_CASCADE`** (`1` / `true`). Подробности и пример — в таблице установки и разделе README про **`UI_HIDE_*`**.
|
||||
|
||||
- **`warp`** — скрывает блок WARP; **`POST /api/warp/*`** → 403.
|
||||
- **`cascade`** — скрывает каскад; **`POST /api/clients/create-cascade`** → 403.
|
||||
- **`users`** — скрывает таблицу «Пользователи» и отладку **awg show**; **`GET /api/clients`** и остальные операции с клиентами **остаются** (скрыт только UI таблицы).
|
||||
|
||||
## Конфигурации клиентов
|
||||
|
||||
- **Старые строки без `last_config`** — полный `.conf` с сервера собрать нельзя (нет приватного ключа). Используйте приложение Amnezia или блок **«Новый клиент под каскад»** (новый ключ на сервере).
|
||||
- **Экспорт по кнопкам** — только если в `clientsTable` есть **`userData.last_config`** с полем `config` или `client_priv_key`.
|
||||
|
||||
### Экспорт: имя файла и прямая ссылка
|
||||
|
||||
Ответ **`GET /api/clients/export-config`** отдаёт заголовок **`Content-Disposition: attachment; filename="…"`**. В Node.js значение заголовка должно быть в **ASCII**: кириллическое имя клиента в приложении не попадает в имя файла как есть — используется безопасная подстановка (латиница из имени или короткий префикс от `clientId`), чтобы не было ошибки вида `Invalid character in header content`. Содержимое `.conf` при этом остаётся полным UTF-8 текстом.
|
||||
|
||||
Прямая ссылка в браузере работает при активной **cookie-сессии** после входа или с **`?token=…`**, если задан **`EXPORT_CONFIG_SECRET`**.
|
||||
|
||||
## HTTP API (все маршруты под `/`, кроме статики)
|
||||
|
||||
Требуют cookie-сессии после **`POST /api/login`**, если не указано иное.
|
||||
|
||||
| Метод | Путь | Назначение |
|
||||
|-------|------|------------|
|
||||
| GET | `/health` | Проверка живости |
|
||||
| GET | `/api/session` | Есть ли действующая сессия |
|
||||
| POST | `/api/login` | `{ "password": "…" }` |
|
||||
| POST | `/api/logout` | Выход |
|
||||
| POST | `/api/change-password` | Смена пароля |
|
||||
| GET | `/api/protocols` | Текущий профиль, список инстансов, подсказка если профиль один |
|
||||
| POST | `/api/protocol` | `{ "profileId": "…" }` — смена инстанса |
|
||||
| GET | `/api/clients` | Таблица клиентов и метаданные WARP |
|
||||
| POST | `/api/clients/disable` | Выключить peer |
|
||||
| POST | `/api/clients/enable` | Включить peer |
|
||||
| POST | `/api/clients/delete` | Удалить |
|
||||
| POST | `/api/clients/rename` | Переименовать |
|
||||
| POST | `/api/clients/disconnect-date` | Даты отключения / расписание |
|
||||
| GET/POST | `/api/clients/export-config` | Скачать `.conf`; GET — прямая ссылка (сессия); опционально `?token=…` если задан `EXPORT_CONFIG_SECRET` |
|
||||
| POST | `/api/clients/create-cascade` | `{ "endpointHost", "endpointPort?", "tunnelIp?", "clientName?", "profileId?" }` — новый peer и файл `.conf` |
|
||||
| POST | `/api/warp/host-setup` | Установка/удаление WARP на хосте по SSH: `{ "rootPassword", "cmd": "install" \| "uninstall" }` (как синхронизация времени; каталог скрипта — `WARP_SSH_INSTALL_DIR`) |
|
||||
| POST | `/api/warp/start` | Поднять WARP |
|
||||
| POST | `/api/warp/stop` | Остановить WARP |
|
||||
| POST | `/api/warp/routing` | Политика по клиентам |
|
||||
| GET | `/api/server-time` | Время и подсказки по поясам |
|
||||
| GET | `/api/time-sync-capabilities` | Доступность синхронизации по SSH |
|
||||
| POST | `/api/sync-host-time` | Запись времени на хост через SSH |
|
||||
|
||||
Подробности переменных окружения — в таблице установки в [README](../README.md).
|
||||
Reference in New Issue
Block a user