server-monitor-manager/agents/_salvage-2026-08-18/smm-deliverables/Старые задачи/smm-acceptance-runbook-2026-08-07.md
Ochenstarik 23eb3f5233 chore(agents): разбор рабочих папок с диска на 2026-08-18
Задания, отчёты и патчи, лежавшие в C:\Users\Ochenstarik\projects и в
домашней папке, перенесены в agents/. Разложено по агентам там, где имя
файла позволяло определить автора; остальное — в _salvage-2026-08-18/
и разбирается вручную.

Патчи в notes/salvage-2026-08-18/ — незакоммиченная работа из брошенных
рабочих копий: она существовала только на диске.

Тяжёлое (релизные архивы, инсталляторы, наборы данных) в репозиторий не
попало: оно лежит рядом, в Agent_projects/_archive и Agent_projects/_data.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-08-18 14:19:54 +07:00

9.6 KiB
Raw Permalink Blame History

Установка SMM на три сервера с 3x-ui: предпроверка, установка, откат

Цель — закрыть физическую приёмку tests/acceptance/three-server-mesh.sh, не сломав работающий 3x-ui/Xray.

1. Распределение ролей

Скрипту нужны Hub и три Node-идентичности. На трёх серверах это собирается так — Hub совмещается с одним из Node:

Сервер Роль Node ID Требования
A — с публичным IP Control Hub + Node home свободны TCP 7443 и UDP 51820
B Node, источник ai-agent исходящий доступ к A
C Node, назначение second исходящий доступ к A

Node B и C могут быть за NAT — входящие порты им не нужны.

Скрипт запускается с вашей рабочей машины (нужны curl, jq, openssl, ssh, nc, base64) и ходит по SSH только на A и B.

2. Что SMM создаёт на сервере

Всё именовано с префиксом проекта, чужого не трогает.

Пользователи: ochenstarik-smm-control, ochenstarik-smm-agent — системные, nologin, без пароля.

Каталоги: /etc/ochenstarik-server-monitor-manager, /usr/local/lib/ochenstarik-server-monitor-manager, /var/lib/ochenstarik-server-monitor-manager.

systemd units: ochenstarik-smm-control.service, ochenstarik-smm-agent.service, ochenstarik-smm-provisioning-helper.service, ochenstarik-smm-firewall.service, wg-quick@smm0.service.

Файлы: /usr/local/libexec/ochenstarik-smm-policy-apply, /usr/local/sbin/ochenstarik-smm-emergency, /etc/sudoers.d/ochenstarik-smm-control (разрешает control-пользователю запускать только policy-helper), /etc/wireguard/smm0.conf, /etc/sysctl.d/90-ochenstarik-smm-mesh.conf.

nftables: одна собственная таблица inet ochenstarik_smm. Все операции — только над ней.

Пакеты: wireguard-tools, nftables, iproute2 — ставятся только если отсутствуют.

3. Чего SMM не трогает

  • существующие таблицы nftables и правила iptables;
  • конфигурацию и базу 3x-ui, конфиг Xray, его inbounds и сертификаты;
  • sshd_config и текущий SSH-порт;
  • существующих пользователей, их ключи и sudo;
  • другие интерфейсы WireGuard — создаётся только smm0;
  • маршруты по умолчанию.

Единственное системное изменение вне своего пространства имён — net.ipv4.ip_forward=1. Оно аддитивное: Xray работает в userspace и от этого не зависит, а если форвардинг уже включён, ничего не меняется.

4. Предпроверка — выполнить на каждом сервере до установки

echo "=== ОС и systemd ==="; . /etc/os-release; echo "$ID $VERSION_ID $(uname -m)"; ps -p 1 -o comm=
echo "=== занятые порты 7443 / 51820 ==="; ss -lntup | grep -E ':7443|:51820' || echo "свободны"
echo "=== существующие таблицы nftables ==="; nft list tables 2>/dev/null || echo "nft не установлен"
echo "=== iptables-legacy правила ==="; iptables-legacy -S 2>/dev/null | head -5 || echo "нет"
echo "=== интерфейсы WireGuard ==="; wg show interfaces 2>/dev/null || echo "нет"
echo "=== занята ли подсеть 10.77.0.0/24 ==="; ip -4 route | grep '10\.77\.' || echo "свободна"
echo "=== ip_forward ==="; sysctl -n net.ipv4.ip_forward
echo "=== порт 3x-ui и Xray ==="; ss -lntup | grep -Ei 'x-ui|xray' || echo "не найдено по имени"
echo "=== свободное место ==="; df -h / | tail -1

Поддерживаются Ubuntu 22.04/24.04 и Debian 12/13, amd64/arm64, обязателен systemd как PID 1.

Останавливаться и не ставить, если:

  • 7443 или 51820 заняты — задать другие: HTTPS-порт передаётся третьим аргументом install-control, порт WireGuard — вторым аргументом mesh-init;
  • подсеть 10.77.0.0/24 уже используется — она захардкожена в bootstrap, пересечение придётся разруливать до установки;
  • ОС не из списка — preflight откажет сам.

5. Порядок установки

Сначала снимите снапшот каждого сервера у провайдера. Это дешевле любой отладки и делает весь раздел «откат» ненужным.

Держите открытой вторую SSH-сессию к каждому серверу на всём протяжении работ.

Сервер A:

sha256sum -c ochenstarik-server-monitor-manager.sh.sha256
chmod 700 ochenstarik-server-monitor-manager.sh
sudo ./ochenstarik-server-monitor-manager.sh preflight
sudo ./ochenstarik-server-monitor-manager.sh verify-release ./server-monitor-manager-linux-x64.tar.gz
sudo ./ochenstarik-server-monitor-manager.sh install-control ./server-monitor-manager-linux-x64.tar.gz <публичный-хост-A> 7443
sudo ./ochenstarik-server-monitor-manager.sh mesh-init <публичный-хост-A> 51820

Откройте во внешнем firewall провайдера TCP 7443 и UDP 51820. Проверьте, что 3x-ui и Xray продолжают работать, прежде чем идти дальше.

Дальше на A выпускается код для каждого Node, код вводится на соответствующем сервере, обратный код SMMPEER1 возвращается на A через peer-add. Последовательность подробно описана в docs/linux-bootstrap.md, разделы 24. Сам A тоже регистрируется как Node home.

После каждого сервера — проверка, что 3x-ui жив.

6. Приёмка

export HUB_SSH_HOST=<A> HUB_SSH_USER=<пользователь>
export SOURCE_SSH_HOST=<B> SOURCE_SSH_USER=<пользователь>
export SSH_IDENTITY_FILE="$HOME/.ssh/id_ed25519"
export SOURCE_NODE_ID=ai-agent HOME_NODE_ID=home SECOND_NODE_ID=second
export HOME_WG_IP=10.77.0.2 SECOND_WG_IP=10.77.0.3
export TARGET_PORT=22
bash tests/acceptance/three-server-mesh.sh

Точные адреса HOME_WG_IP и SECOND_WG_IP возьмите из mesh-status на A.

Прогон в таком виде не перезагружает серверы и не восстанавливает бэкапы — он проверяет создание Links, отключение, истечение TTL и фактическую связность. Начните с него.

Полная приёмка добавляет два флага:

SMM_ACCEPT_RESTORE=1 SMM_ACCEPT_REBOOT=1 bash tests/acceptance/three-server-mesh.sh

SMM_ACCEPT_REBOOT=1 перезагружает A и B. Для живого VPN это минуты недоступности — планируйте на низкий трафик. SMM_ACCEPT_RESTORE=1 восстанавливает бэкап Control и перезапускает его; на 3x-ui не влияет.

Успех — строка THREE_SERVER_ACCEPTANCE=PASS.

7. Откат

sudo ochenstarik-server-monitor-manager.sh uninstall-agent --purge
sudo ochenstarik-server-monitor-manager.sh uninstall-control --confirm-destroy-control
sudo systemctl disable --now wg-quick@smm0
sudo rm -f /etc/wireguard/smm0.conf /etc/sysctl.d/90-ochenstarik-smm-mesh.conf
sudo nft delete table inet ochenstarik_smm 2>/dev/null || true
sudo sysctl --system

Аварийная команда, работающая без Control Hub, — на случай если mesh начнёт мешать:

sudo ochenstarik-smm-emergency status
sudo ochenstarik-smm-emergency mesh-disable

mesh-disable останавливает WireGuard и удаляет только таблицу проекта, не трогая Control, Agent, SSH и 3x-ui.

8. Честное предупреждение

Проект в альфе, и физическая приёмка ни разу не выполнялась — именно поэтому она и нужна. Ожидаемо, что что-то всплывёт: это её цель, а не побочный эффект.

Риск для 3x-ui я оцениваю как низкий: пересечений по портам, таблицам nftables, юнитам и конфигам нет, всё именовано префиксом проекта. Но «низкий» не значит «нулевой», и снапшот перед началом снимает вопрос полностью.

Если эти три сервера обслуживают что-то, чей простой недопустим, дешевле поднять три временных VPS на день. Приёмке всё равно, какие это машины.