From 35497aa60e557063b735be83d8e16c5f2d30a02b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=90=D0=BD=D0=B4=D1=80=D0=B5=D0=B9=20=D0=91=D0=BE=D0=B1?= =?UTF-8?q?=D1=8B=D1=80=D0=B5=D0=B2?= Date: Thu, 14 May 2026 19:45:46 +0300 Subject: [PATCH] docs: align README, panel-guide, and installer messages Describe :80 landing vs :HOST_PORT admin; export filename ASCII note. Fix install.sh echoes that still referred to a support footer on landing. Co-authored-by: Cursor --- README.md | 21 ++++++++++++++------- docs/panel-guide.md | 13 +++++++++++++ package.json | 2 +- scripts/install.sh | 4 ++-- 4 files changed, 30 insertions(+), 10 deletions(-) diff --git a/README.md b/README.md index 4bc625f..8f1ba74 100644 --- a/README.md +++ b/README.md @@ -6,7 +6,14 @@ **Безопасность:** контейнер с монтированием `docker.sock` эквивалентен root на хосте — используйте сложный пароль и по возможности ограничьте доступ по IP или TLS. -Поле **About** на странице репозитория GitHub принимает только текст; изображения показываются через README или через прямую ссылку на файл (например после загрузки в Issue). +## Что открывается по какому порту + +| Адрес | Назначение | +|-------|------------| +| **`http://IP:HOST_PORT`** (по умолчанию **`:8080`**) | **Админ-панель:** клиенты AmneziaWG, WARP, каскад, экспорт `.conf`, смена пароля. Внизу страницы — футер со ссылками автора (GitHub, донат, Telegram и т.д.). | +| **`http://IP:LANDING_PORT`** (по умолчанию **`:80`**) | **Публичная страница** для приглашённых: инструкция, кнопка перехода в админку (`landing/admin-port.js` подставляет тот же `HOST_PORT`). Текст «проблемы — администратору сервера» и дисклеймер. **Без** блока доната и личных ссылок автора — они только в админке. | + +Если порт **80** занят другим сервисом, задайте **`LANDING_PORT`** (например `8081`) или **`SKIP_LANDING=1`**. На работу панели по **`HOST_PORT`** это не влияет. ## Скриншоты @@ -66,7 +73,7 @@ cd /opt/amnezia-admin && chmod +x scripts/install.sh && sudo SKIP_DOWNLOAD=1 bas | `ADMIN_PASSWORD` | _(генерируется)_ | Первый пароль вместо файла | | `SKIP_DOWNLOAD` | `0` | `1` — не качать GitHub, собрать из `INSTALL_DIR` | | `ALLOW_DEFAULT_PASSWORD` | `0` | `1` — см. раздел «Пароль» ниже | -| `SKIP_LANDING` | `0` | `1` — не ставить публичную страницу с футером поддержки | +| `SKIP_LANDING` | `0` | `1` — не поднимать nginx-лендинг на `LANDING_PORT` | | `LANDING_PORT` | `80` | Порт nginx-лендинга (если `80` занят — например `8081`) | | `LANDING_CONTAINER` | `amnezia-web-landing` | Имя контейнера лендинга | | `NO_CACHE` | `0` | `1` — `docker build --no-cache` при проблемах с обновлением образа | @@ -114,9 +121,7 @@ chmod +x scripts/warp-amnezia.sh Необязательно передайте в контейнер **amnezia-admin** переменные `WARP_DIR`, `WARP_CONF_PATH`, `WARP_CLIENTS_LIST`, `AMNEZIA_START_SCRIPT` через установщик — см. таблицу выше. -После установки: **админ-панель** `http://IP:8080` (или ваш `HOST_PORT`). **Лендинг** с инструкцией по умолчанию на порту **80** (без блока доната — только текст администратору и дисклеймер); если порт занят, установщик сообщит об ошибке — задайте **`LANDING_PORT=8081`** или **`SKIP_LANDING=1`** (на работу панели это не влияет). Кнопка на лендинге ведёт на админку с тем же `HOST_PORT`. - -Футер с ссылками (**Amnezia Admin WebUI**, Boosty, Ozon СБП, Telegram) в админке находится **внизу страницы** — прокрутите ниже таблицы. +Итоговые URL после установки совпадают с таблицей **«Что открывается по какому порту»** в начале этого файла; установщик записывает выбранный `HOST_PORT` в **`landing/admin-port.js`**, чтобы кнопка на лендинге вела на нужную админку. ### Каскад (свой Endpoint для клиента) @@ -134,11 +139,13 @@ chmod +x scripts/warp-amnezia.sh Для корректного **`Endpoint`** задайте **`CLIENT_CONFIG_ENDPOINT`** при установке (публичный IP или домен VPS), либо убедитесь, что в `last_config` указан **`hostName`**, либо открывайте панель по тому же хосту, который клиенты должны использовать для подключения (не `localhost`). +Имя скачиваемого файла в заголовке **`Content-Disposition`** составляется только из **ASCII** (латиница, цифры, `.`, `_`, `-`). Если имя клиента в приложении на кириллице или с другими символами, в имени файла используется безопасный фрагмент (например префикс `clientId`), чтобы ответ не падал с ошибкой заголовка в Node.js. + ### Обновление до новой версии -Коммиты на GitHub **сами не попадают** в уже запущенный контейнер: нужно заново **скачать код и пересобрать образ**. +Коммиты на GitHub **сами не попадают** в уже запущенный контейнер: нужно заново **скачать код и пересобрать образ** (`amnezia-admin` и, если не отключали лендинг, **`amnezia-web-landing`**). -Проще всего — та же команда, что при установке (данные в `DATA_DIR`, пароль сохранится). Скрипт **подставит прежний внешний порт** контейнера `amnezia-admin`, если вы не передавали `HOST_PORT` и в коде по умолчанию стоит `8080`: +Проще всего — та же команда, что при установке (данные в `DATA_DIR`, пароль и `AWG_PROFILES` сохранятся — профили подтягиваются из файла на VPS или из старого контейнера). Скрипт **подставит прежний внешний порт** контейнера `amnezia-admin`, если вы не передавали `HOST_PORT` и в коде по умолчанию стоит `8080`: ```bash curl -fsSL https://raw.githubusercontent.com/andrey271192/Amnezia_web/main/scripts/install.sh | sudo bash diff --git a/docs/panel-guide.md b/docs/panel-guide.md index 94ab6c8..0383a0f 100644 --- a/docs/panel-guide.md +++ b/docs/panel-guide.md @@ -25,11 +25,24 @@ При ошибке 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`** пересобирается установщиком и задаёт порт админки для кнопки на лендинге. + ## Конфигурации клиентов - **Старые строки без `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`**, если не указано иное. diff --git a/package.json b/package.json index 7b8d720..c43f489 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "amnezia-admin", - "version": "1.1.1", + "version": "1.1.2", "private": true, "description": "Web-панель AmneziaWG: несколько инстансов, WARP, каскад/Endpoint, экспорт .conf (Docker)", "license": "MIT", diff --git a/scripts/install.sh b/scripts/install.sh index b867310..4d5e981 100755 --- a/scripts/install.sh +++ b/scripts/install.sh @@ -175,7 +175,7 @@ if [[ "${SKIP_LANDING:-}" != "1" ]] && [[ -d "${INSTALL_DIR}/landing" ]]; then if docker run -d --name "${LANDING_CONTAINER}" --restart unless-stopped \ -p "${LANDING_PORT}:80" \ "${LANDING_IMAGE}"; then - echo "→ Лендинг с блоком поддержки: http://${IP:-SERVER_IP}:${LANDING_PORT}/" + echo "→ Публичная страница (лендинг): http://${IP:-SERVER_IP}:${LANDING_PORT}/" else echo "⚠ Не удалось запустить лендинг (часто порт ${LANDING_PORT} занят). Поставьте LANDING_PORT=8081 или SKIP_LANDING=1." fi @@ -187,7 +187,7 @@ echo "" echo "=== Готово ===" echo "Админ-панель: http://${IP:-SERVER_IP}:${HOST_PORT}" if [[ "${SKIP_LANDING:-}" != "1" ]]; then - echo "Страница с поддержкой проекта: http://${IP:-SERVER_IP}:${LANDING_PORT}/" + echo "Лендинг для пользователей: http://${IP:-SERVER_IP}:${LANDING_PORT}/ (ссылки доната автора — только в админ-панели)" fi if [[ -f "${PASS_FILE}" ]]; then echo "Первый пароль: $(cat "${PASS_FILE}")"