feat(proxy-client): добавлен мастер установки системной службы

- Зачем: установка с нуля и переход из ручного Xray одной командой.
- Что: план с подтверждением или --yes, скрытый ввод ссылки, проверка Xray,
  перенос настроек, запуск службы и переключение домашнего профиля;
  безопасное продолжение после сбоя и сохранение существующих настроек.
- Проверка: cross-review Claude и исправление находок; по 108 тестов на
  Python 3.8 и 3.14 под PTY, 18 Bash-проверок. После аудита уточнена
  фикстура повторного запуска и отдельно проверена на обеих версиях Python.
  Настоящие службы и настройки машины не изменялись.
This commit is contained in:
ddadmin committed 2026-11-04 21:15:23 +01:00
1 parent 45938cde98
commit 203e515479
5 files changed
+1250 -56

No files matched your search

@@ -77,17 +77,50 @@ Bash-команды без явного выбора продолжают исп
служебной учётной записи. Пользовательские команды остановки не управляют
системным экземпляром: за него отвечает systemd.
Установка оформляется подкомандой `service install`, в соответствии с
существующим интерфейсом CLI. Она размещает необходимые файлы и регистрирует
службу. Запуск сейчас и автозапуск после загрузки выбираются явно; установщик
может предоставить явные параметры для совмещения этих действий с установкой.
Точное написание параметров определяется при реализации.
Установка оформляется одной подкомандой `service install`. В терминале она
собирает недостающие настройки, показывает план и после подтверждения
выполняет полный переход на службу. `--yes` (`--auto-yes`) принимает план
без вопроса. Без терминала для нового подключения нужен закрытый `--file`;
секрет не передаётся в argv или окружении. В терминале применяется скрытый
ввод. Новый профиль получает адрес `127.0.0.1` и порт `12334` по умолчанию.
Для первоначального заполнения можно скопировать выбранный пользовательский
профиль. Источник должен быть указан однозначно: повышение прав не должно
подменить его домашним каталогом root. Копия становится самостоятельной:
дальнейшие изменения домашнего профиля не меняют службу. Повторная установка
сохраняет существующие настройки и не перезапускает службу скрыто.
Для переноса используются сохранённые `config` и `default.url` выбранного
профиля; `--file` переопределяет ссылку. Xray ищется в `~/.local/bin`, затем
в `PATH` и системной установке. Если его нет, скачивается закреплённая версия
с проверкой SHA-256. Параметр `--xray` позволяет указать бинарник явно.
Полный переход состоит из подготовки снимка, проверки Xray, установки
системных файлов, остановки выбранного ручного процесса и запуска службы.
Домашний `config` меняется на `external` только после проверки активного
состояния службы и доступности её порта; прежний файл сохраняется рядом.
Остановка пользовательского процесса и изменение домашнего профиля
выполняются без повышения прав. Sudo применяется только к системной части.
Закрытый снимок `service-setup.json` в каталоге состояния профиля позволяет
продолжить незавершённый переход. Он содержит исходный домашний config,
подготовленный config, VLESS-ссылку и путь для ручного восстановления;
права файла `600`, каталога `700`. При повторе домашние и системные настройки
сверяются со снимком до остановки процессов. Изменённые настройки не
перезаписываются, исходный файл VLESS-ссылки тоже проверяется. Ошибка конфликта
указывает команду удаления снимка, чтобы начать заново с текущими настройками;
этот сброс не меняет сами настройки и процессы. После успеха снимок удаляется.
Ошибка запуска сохраняет
прежний домашний профиль; восстановление ручного процесса требует явной
команды, прежние соединения не восстанавливаются.
Наличие системных файлов само по себе не означает завершённый переход:
если домашний профиль ещё `xray`, мастер сверяет его с системным и завершает
перенос. Другой профиль не заменяет существующие системные настройки.
После завершённого перехода настройки службы самостоятельны. Обычное
обновление сохраняет их и включает перезапуск в подтверждаемый план;
домашний профиль не меняется и может отсутствовать.
`--install-only`, `--config-dir` и `--root`
сохраняют режим установки файлов без мастера. Он требует готовых настроек
и Xray. Флаги `--enable`, `--start`, `--restart` задают действия явно.
`--root` не допускает действий с systemd. В этом режиме установка сама
домашний профиль не меняет и ручной процесс не останавливает.
Без терминала и без явного выбора режима команда завершается с подсказкой.
Systemd отвечает за запуск, остановку и перезапуск после аварии. Явная
остановка должна оставлять службу остановленной до следующего запуска.
@@ -109,7 +142,8 @@ Systemd отвечает за запуск, остановку и перезап
Если системная служба занимает порт прежнего пользовательского Xray, второй
запуск на этом порту завершается ошибкой. Чтобы использовать системный прокси
через пользовательские команды, подходит профиль типа `external`. Для второго
Xray нужен другой порт. Установка службы не меняет домашний профиль молча.
Xray нужен другой порт. Мастер меняет домашний профиль по подтверждённому
плану; режим установки только файлов его не меняет.
## Устройство модулей
@@ -121,6 +155,12 @@ Xray нужен другой порт. Установка службы не ме
использует готовые значения, без глобального переключателя режима.
Системная установка скрывает размещение, права и взаимодействие с systemd
за небольшим интерфейсом; не копирует разбор VLESS и управление Xray.
Внутри модуль отделяет подготовку плана от его применения: план хранит
снимок настроек и исходного процесса, применение управляет порядком
действий и возобновлением. Проверки проходят через публичный CLI.
Внешние команды подменяются через `PATH`, терминальный ввод, сокеты и загрузка
архива — подменой функций стандартной библиотеки в тестовом `sitecustomize`.
Разбор настроек и работа с файлами выполняются настоящим кодом.
Не вводим обобщённую поддержку других менеджеров служб и дополнительные
слои ради возможного будущего использования. Реально различаются
@@ -151,11 +191,18 @@ Xray нужен другой порт. Установка службы не ме
аварии, явная остановка и одновременная работа ручного экземпляра.
Изменение текущей машины или её перезагрузка не входят в проверку по умолчанию.
Локальный набор прошёл на Python 3.8 и 3.14: 72 теста, проверки Bash-команд
и пользовательского установщика. Дополнительно проверены Bash-команды вместе
Проверка после cross-review 2026-11-04: полный набор под псевдотерминалом
прошёл на Python 3.8 и 3.14 — по 108 тестов, ещё 12 проверок Bash-команд
и 6 проверок пользовательского установщика.
Мастер проверен через CLI: настройка с нуля, перенос, обновление, отмена,
отказы и продолжение перехода. Скрытый ввод проверен в псевдотерминале.
Системные действия и скачивание в этих тестах подменены; настоящие службы
не запускались. Shellcheck в среде отсутствует.
При первоначальной реализации отдельно проверены Bash-команды вместе
с настоящим CLI и двумя локальными тестовыми портами. Unit прошёл статическую
проверку в изолированном корне с тестовыми базовыми target-файлами.
Shellcheck в среде отсутствует. Эти результаты не заменяют проверку загрузки ОС.
Эти результаты не заменяют проверку загрузки ОС.
## Документация и альтернативы