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

+116 -18
View File
@@ -330,20 +330,116 @@ Linux, до входа пользователя. Требуются systemd, `sy
администратора для установки. Служба одна; именованные профили остаются
пользовательскими.
Сначала подготовьте и проверьте профиль Xray обычным ручным запуском. Перед
запуском службы остановите ручной экземпляр, если он занимает тот же порт.
Установите службу, указав каталог настроек и уже установленный Xray:
### Установка и переход из tmux
Запустите от своего пользователя, без `sudo`:
```bash
sudo "$HOME/.local/bin/proxy-client" service install \
--config-dir "$HOME/.config/proxy-client" \
--xray "$HOME/.local/bin/xray" --enable --start
proxy-client service install
```
В качестве `--config-dir` можно указать каталог именованного профиля.
Пути должны быть абсолютными. `--enable` включает запуск при загрузке,
`--start` запускает сейчас. Без этих параметров команда только устанавливает
файлы и регистрирует службу.
В терминале команда показывает план и просит одно подтверждение.
Если настроек нет, она запросит VLESS-ссылку скрытым вводом и предложит
локальный порт `12334`. Если Xray отсутствует, скачает закреплённую версию
и проверит контрольную сумму. Ссылка не попадает в аргументы процессов и журнал.
Если профиль уже настроен, используются его `config` и `default.url`.
После подтверждения команда проверяет конфигурацию Xray, устанавливает
системные файлы через `sudo`, останавливает свой ручной Xray и запускает службу
с автозапуском. Текущие соединения при переходе прервутся. Чужой процесс,
занимающий порт, команда не останавливает.
Когда служба активна и локальный порт доступен, домашний `config` переключается
на `type=external`. Поэтому `proxy_on`, `status` и `run` сразу работают со
службой. Прежний файл сохраняется рядом как `config.before-service.*`.
Готовность локального порта не гарантирует доступность удалённого сервера.
Если файлы службы уже установлены через `--install-only`, но домашний профиль
ещё имеет `type=xray`, мастер завершит перенос. Сначала он проверит совпадение
настроек с системными; другой профиль не заменит уже настроенную службу.
Для именованного профиля:
```bash
proxy-client --profile work service install
```
Для принятия плана без вопроса есть `--yes` и его синоним `--auto-yes`:
```bash
proxy-client service install --yes
```
При настройке с нуля без терминала передайте закрытый файл со ссылкой:
```bash
chmod 600 ~/connection.url
proxy-client service install --auto-yes --file ~/connection.url --port 12334
```
`--file` также подходит, если ручной Xray запускался с разовой ссылкой
через `start -f`. Без него берётся сохранённый `default.url`.
`--yes` принимает план, но не заменяет ввод недостающей ссылки и не отменяет
проверки или запрос пароля `sudo`.
### Ошибка или прерывание
До успешной установки системных файлов ручной Xray продолжает работать.
Если запуск службы не удался после его остановки, домашний профиль остаётся
прежним. Команда пытается отключить неудачно запущенную службу и показывает,
как вернуть ручной запуск. Восстановить прежние соединения и процесс в tmux
автоматически нельзя.
Повторите `proxy-client service install`: незавершённый переход продолжится
по закрытому снимку `service-setup.json` в каталоге состояния выбранного
профиля. Снимок содержит VLESS-ссылку, имеет права `600` в каталоге `700`
и удаляется после успеха. Если домашние или системные настройки успели
измениться, команда остановится, чтобы их не затереть. Проверяется также
исходный `default.url` или файл, переданный через `--file`, до остановки
ручного Xray. После запуска служба использует свою копию ссылки; позднее
изменение исходной ссылки не отменяет завершение перехода.
Чтобы отказаться от старого снимка и прочитать текущие настройки заново,
удалите только `service-setup.json`: точную команду `rm -- …` CLI печатает
при конфликте. Для профиля по умолчанию без переопределения XDG это:
```bash
rm -- ~/.local/state/proxy-client/service-setup.json
proxy-client service install
```
Сброс снимка не меняет домашние файлы, настройки службы и работающие процессы.
Если системные настройки уже отличаются от желаемых, их нужно изменить
отдельно в `/etc/proxy-client` — мастер их не перезаписывает.
### Только установка файлов
Для прежнего режима без мастера и переключения домашнего профиля:
```bash
proxy-client service install --install-only
```
Без терминала явно выберите `--yes` для полного перехода или `--install-only`
для установки файлов; команда без выбора режима завершится с подсказкой.
Режим установки файлов требует готовые
настройки и Xray, а при их отсутствии выдаёт подсказку до вызова `sudo`.
`--enable`, `--start` и `--restart` явно включают автозапуск, запуск сейчас
или перезапуск с проверкой готовности. Без этих флагов служба не запускается.
Xray ищется в `~/.local/bin`, затем в `PATH` и системной установке.
Параметр `--xray FILE` переопределяет выбор. Для установки из произвольного
каталога есть `--config-dir DIR`: он тоже выбирает режим установки файлов.
Пути должны быть абсолютными; `--config-dir` несовместим с именованным
`--profile`. Прямой запуск через `sudo` подходит для `--install-only`;
нестандартный каталог XDG в этом случае задавайте через `--config-dir`.
### Доступ к прокси
Xray слушает только числовой loopback-адрес: `127.0.0.1` или `::1`.
Проверка выполняется при установке и каждом запуске. Адреса всех интерфейсов
(`0.0.0.0`, `::`) и локальной сети не принимаются. Другие процессы на этой же
машине могут пользоваться прокси.
Установщик копирует настройки в `/etc/proxy-client/`, а CLI и Xray — в
`/usr/local/lib/proxy-client/`. Служба больше не зависит от домашнего каталога.
@@ -381,18 +477,20 @@ sudo systemctl disable --now proxy-client
sudo systemctl enable --now proxy-client
```
При обновлении повторите установку из актуальной копии пакета. Существующие
системные настройки сохраняются; исходный домашний профиль уже не нужен:
При обновлении повторите команду из актуальной копии пакета:
```bash
sudo "$HOME/.local/bin/proxy-client" service install \
--config-dir /etc/proxy-client --xray "$HOME/.local/bin/xray"
sudo systemctl restart proxy-client
proxy-client service install
```
Работающий процесс сам не перезапускается. Чужие или вручную изменённые
исполняемые файлы и unit-файл установщик не заменяет; изменения параметров
systemd делайте через `sudo systemctl edit proxy-client`. Файлы заменяются
Мастер предложит обновить и перезапустить службу. Настройки в
`/etc/proxy-client` сохраняются, домашний профиль не меняется и может
отсутствовать. Без терминала используйте `--yes` для этого же действия.
Режим `--install-only` по-прежнему не перезапускает службу без явного флага.
Чужие или вручную изменённые исполняемые файлы и unit-файл установщик
не заменяет; изменения параметров systemd делайте через
`sudo systemctl edit proxy-client`. Файлы заменяются
по одному атомарно, общего отката всей установки при сбое нет. После
устранения причины сбоя повторите установку: журнал незавершённой установки
позволяет продолжить её, сохраняя проверку принадлежности файлов.