feat(proxy-client): добавлен мастер установки системной службы
- Зачем: установка с нуля и переход из ручного Xray одной командой. - Что: план с подтверждением или --yes, скрытый ввод ссылки, проверка Xray, перенос настроек, запуск службы и переключение домашнего профиля; безопасное продолжение после сбоя и сохранение существующих настроек. - Проверка: cross-review Claude и исправление находок; по 108 тестов на Python 3.8 и 3.14 под PTY, 18 Bash-проверок. После аудита уточнена фикстура повторного запуска и отдельно проверена на обеих версиях Python. Настоящие службы и настройки машины не изменялись.
This commit is contained in:
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 в среде отсутствует. Эти результаты не заменяют проверку загрузки ОС.
|
||||
Эти результаты не заменяют проверку загрузки ОС.
|
||||
|
||||
## Документация и альтернативы
|
||||
|
||||
|
||||
Reference in new issue
Block a user