lightweight-server/docs/runbooks/ru-hub-add-exit.md
ochenstarik 2388fe4a6e
All checks were successful
Bash syntax / syntax (pull_request) Successful in 19s
Bash syntax / syntax (push) Successful in 21s
docs: document family RU hub exit lifecycle
2026-10-23 12:20:10 +00:00

134 lines
13 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Добавление и удаление выхода семейного RU-хаба
Область: RU 3x-ui, существующая единая HTTPS-подписка человека. Адреса, пути,
UUID, subId и ключи брать из защищённых операторских файлов 0600. В команды,
Git, терминальный вывод и журналы значения не вставлять. Панель открывается
через существующий SSH-туннель; её bind остаётся loopback.
## Модель и исходное состояние
Один человек — одна глобальная запись Client в панели, один UUID, один subId,
одни лимиты и срок. Запись прикреплена ко всем семейным inbound. Не создавать
копии человека с суффиксами `-de`, `-ru`, `-auto` или с новыми subId.
| Строка подписки | Inbound RU | sort index | Действие |
|---|---:|---:|---|
| ⚡ Авто | TCP24444 | 10 | RU-направления direct, остальные family-auto |
| 🇩🇪 Германия | TCP443 | 20 | RU-направления direct, остальные vpn-de |
| 🇷🇺 Россия | TCP24443 | 30 | весь трафик direct |
Фиксированные строки нужны, когда важен постоянный выход. `family-auto` использует
`leastLoad`, selector `vpn-`, fallback `blocked`; observatory также выбирает `vpn-`.
Сейчас выход один, поэтому сравнительная скорость нескольких серверов не проверена.
Подписки: TLS на публичном TCP2096 домена `sub.ochenstarik.ru`, случайный путь
длиной не менее 32 символов, `subUpdates=12`; ответ содержит
`profile-update-interval: 12`. В реальном URL обязателен `:2096`: TCP443 занят Reality.
Ссылка человека сохранена в `family_subscriptions.txt` и при добавлении выхода не меняется.
## Перед изменением
1. Согласовать одного оператора на время работы. Если клиентские имена или
привязки меняются параллельно, остановить записи и свой откат к устаревшему
снимку; сделать новый checkpoint, сохраняющий правки владельца.
2. Через SQLite backup API сохранить согласованную БД панели и integrity check.
Копии конфигурации, UFW, managed-ports и runtime evidence — root-only, каталог
0700, файлы 0600. Не копировать работающую SQLite простым `cp`.
3. Зафиксировать UUID/subId глобальных клиентов, членство inbound и существующие
routing/outbounds. До применения проверить кандидат штатным Xray `run -test`.
Подготовить независимый ограниченный таймер отката; восстановление БД — только
при остановленной панели, с учётом WAL/SHM и последующим штатным запуском.
4. Проверить свежие входы и подписки до изменения. Не использовать проверку
другого сервера или старого SHA как подтверждение текущего состояния.
## Добавить выход X
1. На сервере X создать отдельный VLESS+Reality TCP inbound для RU-хаба с
самостоятельными ключами. Firewall X разрешает его порт только с RU-адреса;
публичный домашний inbound X, если есть, к этой схеме не относится.
Проверить TLS1.3 и сертификат camouflage target. Разрешённый SNI должен быть
согласован с этим target: случайный список посторонних имён в подписке недопустим.
2. На RU в штатных **Xray Configs** панели добавить outbound `vpn-x` с реквизитами
из файла 0600. Рабочий сгенерированный `config.json` вручную не править.
Существующие `vpn-de`, `direct`, `blocked`, API и RU-domain/geoip правила сохранить.
3. Создать на RU новый VLESS+Reality TCP inbound на проверенном свободном порту,
с собственными ключами и согласованным SNI. Включить Vision и нужный remark X.
Сначала сохранить правила прямого RU-трафика; после них добавить правило
`inboundTag` нового входа → `vpn-x`. Не менять фиксированные DE/RU строки.
4. В **Clients** выбрать существующих глобальных клиентов и прикрепить к новому
inbound. UUID/subId и настройки клиентов сохранить. В установленной версии
изменение `settings.clients` в форме существующего inbound не заменяет штатные
операции глобальных Clients.
5. `vpn-x` автоматически попадает под selector `vpn-` балансировщика и observatory.
Проверить, что выбран именно транспорт к X и что `fallbackTag` по-прежнему
`blocked`. При недоступности всех выходов автоматическая строка не должна
уходить через `direct` или неявный первый outbound.
6. Открыть новый TCP-порт RU в UFW для семейных клиентов, сохранив старые правила.
Вписать его в root-owned 0600 `/etc/ochenstarik-server/ufw-managed-ports.conf`.
Списки под этот installer — строки `порт/tcp`; не оставлять литеральные `\n`.
7. Выставить порядок: «Авто» первым, затем фиксированные зарубежные выходы,
«Россия» последней. Менять только sort index (доступен отдельный endpoint),
не пересоздавать inbound ради сортировки. HTTPS-путь и subId не ротировать.
## Проверки и применение
- Через API получить новый generated config и проверить его штатным Xray до
окончательного применения. Settings сохранять через панель/API, а не SQL-UPDATE
или редактор generated config. `getConfigJson` может быть свежее старого файла
после hot-add; подтвердить настоящий listener и аутентифицированный трафик.
- На каждом человеке загрузить ту же HTTPS-ссылку: валидная TLS chain, HTTP200,
старые строки и ровно одна новая, правильные remarks/порядок, update interval12.
Тело и заголовки со ссылками хранить только в защищённом каталоге.
- Из каждой строки временным клиентом проверить зарубежный IP и российский сайт.
Для сопоставления с учтёнными IPv4 использовать явно IPv4. В текущей сети
Интернетометр Яндекса показывает адрес в странице; его `/api/v0/ip` в день
проверки возвращал loopback даже при прямом запросе с RU и был исключён как IP-echo.
- Проверить UFW, bind панели на loopback, публичные только разрешённые VPN/TLS
listeners, сохранность всех пользовательских UUID/subId и отсутствие дублей.
- При двух и более выходах отдельно измерить выбор при близких задержках,
заметной разнице и отказе. Текущие параметры: burst interval30s, sampling2,
timeout3s; leastLoad expected1, maxRTT2s, tolerance0.2, baseline150ms.
Это фильтр качества и дисперсии, а не строгий sticky-IP или гарантированный
throughput benchmark. После добавления FI/DK нужна отдельная многосерверная приёмка.
- Для отказа использовать отдельную nft-таблицу на RU, блокирующую только
транспорт RU→выход (для DE TCP24443). Независимое удаление через 60 секунд
включить **до** добавления правила. Подтвердить отказ зарубежного «Авто»,
отсутствие тихого RU-egress, сохранность RU-исключений и строки «Россия»,
автоматическое удаление правила и восстановление «Авто» через доступный выход.
Домашний DE443 и SSH не блокировать.
- Только после положительных проверок отменить откат. Оставить snapshots и
санитизированные доказательства; законченные собственные timers остановить.
Сертификат проверять `certbot renew --dry-run --no-random-sleep-on-renew`:
временный HTTP80 открывают/закрывают renewal hooks, deploy hook штатно
перезапускает x-ui. Публичный доступ к панели не требуется.
## Особенности API установленной 3x-ui
Доступ через сохранённые реквизиты/локальный SSH management tunnel; секреты
передавать из файла/STDIN. Для session auth получить CSRF token и cookie,
передавать `X-CSRF-Token`, включая login. Token/cookie не публиковать.
Namespace — `panel/api/`: `xray/update`, `setting/all`, `setting/update`,
`inbounds`, `clients`. Часть API принимает form, часть JSON; проверять текущую
схему и `success`, а для bulk — также `errors` и фактический результат.
Например, `subUpdates` в JSON settings — число; `settings` в ответе inbound
может уже быть объектом. ClientRecord (`id` числовой, `uuid` строковый,
`allowedIPs` может быть строкой) не является готовым DTO обновления VPN-клиента:
использовать форму Clients или документированную модель, не слать запись БД целиком.
Скрипт установки не добавлен: на пяти общих клиентах операторский runbook проще
проверять; установленный API существенно различает формы и DTO. Отдельная
автоматизация потребует собственной задачи, совместимости и тестов.
## Удалить выход
Убрать правило фиксированного inbound и `vpn-x` из шаблона, проверить selector
и работу оставшихся выходов. Открепить существующих клиентов только от удаляемого
inbound, затем удалить этот inbound и только его UFW/managed-port записи.
Глобальных людей, UUID/subId, HTTPS-путь и остальные подключения не удалять.
На X закрыть и удалить только RU-hub inbound после проверки, что он больше не
используется. Повторить проверку тех же ссылок: исчезла только удалённая строка.
Сверка DE выполняется без изменений: существующий `vpn-de`, фиксированный вход
RU443, RU-direct правила и exit DE24443 с firewall только от RU. Фактический
итог сверки и испытаний записывается в отчёт выполнения, а не предполагается из runbook.