docs(proxy-client): спроектирован самостоятельный установщик

- Зачем:
  - отдельный пакет должен устанавливаться без общего dotfiles и обязательного stow.
- Что:
  - зафиксирована единая раскладка симлинков через stow или ln.
  - отделены файлы пакета от машинного конфига и закрытого профиля.
  - добавлены правила конфликтов, настройки Bash и проверки установки.
- Проверка:
  - git diff --cached --check.
This commit is contained in:
ddadmin committed 2026-07-21 21:42:33 +03:00
1 parent 78aa5f6473
commit 86d63ab2aa
1 file changed
+102 -12
+102 -12
View File
@@ -2,7 +2,8 @@
Дата: 2026-07-15 Дата: 2026-07-15
Статус: реализация готова к ручной приёмке; публичное имя уточнено 2026-07-21 Статус: основная реализация принята вручную; самостоятельный установщик
спроектирован 2026-07-21, но ещё не реализован
## Проблема ## Проблема
@@ -48,8 +49,9 @@ proxy-переменных совместима с локальным Xray бе
JSON Xray. JSON Xray.
- Сохранить совместимость Bash-функций с внешним Hiddify. - Сохранить совместимость Bash-функций с внешним Hiddify.
- Позволить настраивать машинный `NO_PROXY` без правки файлов репозитория. - Позволить настраивать машинный `NO_PROXY` без правки файлов репозитория.
- Поддержать выборочную установку после `git clone`: через stow, ручные - Поддержать самостоятельную установку из отдельно скопированного каталога
симлинки или копирование. `proxy-client/` без зависимости от общего установщика dotfiles и без
обязательного stow.
## Не входит в объём ## Не входит в объём
@@ -89,6 +91,22 @@ Bash нужен только там, где необходимо изменит
требует кода, но не решает основную боль: безопасный запуск `pclaude` и требует кода, но не решает основную боль: безопасный запуск `pclaude` и
`pcodex` из точечной ссылки Hiddify. `pcodex` из точечной ссылки Hiddify.
### Доставка отдельного пакета
Рассмотрены четыре способа подключить отдельно скопированный каталог:
- оставить только инструкции для stow и ручных симлинков — просто, но сохраняет
легко забываемые шаги;
- копировать файлы в домашний каталог — не требует сохранять исходный каталог,
но усложняет обновления и расходится с моделью dotfiles;
- требовать stow — даёт привычное управление ссылками, но добавляет
необязательную зависимость на удалённых серверах;
- дать пакету собственный установщик, который использует stow при наличии и
создаёт те же симлинки напрямую без него.
Выбран последний вариант. Он сохраняет один результат установки при разном
составе машины и не требует второй копии обновляемых файлов.
## Рекомендуемое решение ## Рекомендуемое решение
### Границы компонентов ### Границы компонентов
@@ -376,15 +394,50 @@ CLI раскладывается как `~/.local/bin/proxy-client`. Машин
`~/.config/proxy-client/`. Шаблоны не подменяют настоящие пользовательские `~/.config/proxy-client/`. Шаблоны не подменяют настоящие пользовательские
файлы. файлы.
В корне этого каталога находится самостоятельный `README.md`. Он является В корне этого каталога находятся самостоятельный `README.md` и пакетный
основной инструкцией клиента и исключается из раскладки stow. README остаётся `install.sh`. Оба файла относятся к исходному каталогу и исключаются из
рядом с кодом при выборочном клонировании или копировании каталога. Корневой раскладки stow. README остаётся рядом с кодом при выборочном клонировании или
README репозитория только кратко описывает подсистему и ссылается на него. копировании каталога. Корневой README репозитория только кратко описывает
подсистему и ссылается на него.
После клонирования репозитория пакет можно подключить отдельно от общего Пакетный установщик связывает отдельно скопированный каталог с домашним
`install.sh`. README также должен описывать эквивалентные ручные симлинки и каталогом и не зависит от положения или наличия остальных dotfiles. Если stow
копирование файлов. Полный `install.sh` подключает этот же stow-пакет вместе с доступен, установщик использует его; если нет — создаёт тот же набор симлинков
остальными dotfiles и не имеет отдельной реализации. напрямую. Выбранный механизм явно показывается пользователю, но не меняет
результат. Исходный каталог должен оставаться на прежнем пути всё время
использования ссылок.
Установщик управляет только тремя публичными артефактами: CLI, `shell.bash` и
каталогом шаблонов. Машинный `config` и закрытый `default.url` не входят в
раскладку stow, никогда не создаются, не заменяются и не связываются
установщиком. Их наличие в исходном каталоге также не должно расширять набор
управляемых путей.
Домашние `~/.local/bin` и `~/.config/proxy-client` остаются настоящими
каталогами. Stow не должен сворачивать их или их родителей в одну ссылку на
исходное дерево: ссылками становятся только три перечисленных артефакта. Это
одновременно сохраняет место для машинных файлов и делает результат stow
совпадающим с прямой раскладкой через `ln -s`.
Перед записью установщик проверяет весь набор назначений. Правильная ссылка на
текущий исходный каталог считается уже установленной; любой другой файл,
каталог или симлинк считается конфликтом. При конфликте установщик ничего не
меняет и сообщает все пути, которые пользователь должен разобрать вручную.
Принудительной замены и автоматических резервных копий нет.
По умолчанию установщик идемпотентно подключает Bash-модуль в `~/.bashrc` и при
необходимости добавляет `~/.local/bin` в `PATH`. Уже существующее подключение
через dotfiles не дублируется. Управляемый блок помечается, повторно не
добавляется и может быть полностью отключён параметром `--no-shell-setup`.
Установщик не выбирает режим прокси, не создаёт конфигурацию, не читает VLESS,
не устанавливает Xray и не проверяет сеть. После раскладки он проверяет только
локальные требования и исправность CLI и Bash-модуля, затем печатает краткую
подсказку для текущей shell-сессии и направляет пользователя в README за
настройкой режима. Недоступный прокси не делает установку неуспешной.
Полный корневой `install.sh` продолжает подключать тот же stow-пакет вместе с
остальными dotfiles и не получает отдельной реализации этой логики.
## Решения и отклонённые альтернативы ## Решения и отклонённые альтернативы
@@ -412,6 +465,14 @@ README репозитория только кратко описывает по
автоматическое распределение портов отложены до появления реальной нужды. автоматическое распределение портов отложены до появления реальной нужды.
- Официальный системный установщик отклонён: он требует root и создаёт - Официальный системный установщик отклонён: он требует root и создаёт
systemd-службы. Пользовательская установка соответствует выбранной модели. systemd-службы. Пользовательская установка соответствует выбранной модели.
- Копирование файлов пакета отклонено: оно создаёт отдельные экземпляры,
усложняет обновление и нарушает общую с dotfiles модель симлинков.
- Обязательный stow отклонён как лишняя зависимость. Прямые симлинки дают тот же
результат на машине без stow, а автоматический выбор механизма не меняет
публичное поведение пакета.
- Автоматическая настройка режима, установка Xray и проверка сети отклонены для
установщика пакета. Эти операции зависят от машины, могут требовать секретов
или сети и уже имеют отдельные явные команды и инструкции.
- Готовые JSON и полный импорт Hiddify отклонены как основной интерфейс: точечная - Готовые JSON и полный импорт Hiddify отклонены как основной интерфейс: точечная
VLESS-ссылка проще для пользователя и ограничивает область преобразования. VLESS-ссылка проще для пользователя и ограничивает область преобразования.
@@ -428,6 +489,15 @@ README репозитория только кратко описывает по
истинное значение сопровождается предупреждением. истинное значение сопровождается предупреждением.
- Старые дистрибутивы могут иметь Python ниже 3.8. CLI проверяет версию до - Старые дистрибутивы могут иметь Python ниже 3.8. CLI проверяет версию до
основной работы и сообщает обнаруженную и требуемую версии. основной работы и сообщает обнаруженную и требуемую версии.
- Симлинки зависят от постоянного пути исходного каталога. Установщик явно
сообщает эту зависимость и при повторном запуске принимает только ссылки на
текущий источник.
- Изменение `~/.bashrc` может конфликтовать с пользовательским способом загрузки
оболочки. Установщик распознаёт собственный блок и известное подключение из
dotfiles, не дублирует их и предоставляет `--no-shell-setup`.
- Частичная установка может оставить неоднозначное состояние. Все конфликты
назначений проверяются до изменений; проверки охватывают отсутствие новых
ссылок и правок shell при отказе.
- `NO_PROXY` реализуется программами неодинаково. README рекомендует точные IP - `NO_PROXY` реализуется программами неодинаково. README рекомендует точные IP
и домены, а CIDR описывает как совместимость best-effort. и домены, а CIDR описывает как совместимость best-effort.
- Разные пользователи делят сетевое пространство имён. Настраиваемый порт и - Разные пользователи делят сетевое пространство имён. Настраиваемый порт и
@@ -463,6 +533,22 @@ README репозитория только кратко описывает по
- Регрессионные Bash-тесты подтверждают прежнее поведение Hiddify при отсутствии - Регрессионные Bash-тесты подтверждают прежнее поведение Hiddify при отсутствии
машинного конфига, оба регистра proxy-переменных, настраиваемый `NO_PROXY` и машинного конфига, оба регистра proxy-переменных, настраиваемый `NO_PROXY` и
отсутствие автоматического запроса внешнего IP в `proxy_on`/`proxy_off`. отсутствие автоматического запроса внешнего IP в `proxy_on`/`proxy_off`.
- Проверки самостоятельной установки покрывают путь со stow и без него,
одинаковый набор итоговых ссылок, запуск не из каталога пакета и каталог с
пробелами в пути.
- В обоих путях домашние каталоги остаются обычными каталогами, а пакетные
`README.md` и `install.sh` не появляются в домашнем каталоге через stow.
- Повторный запуск не меняет уже правильную установку. Конфликт любого
назначения обнаруживается до записи; чужие файлы, каталоги и ссылки остаются
неизменными.
- Машинный `config` и закрытый `default.url` не управляются установщиком даже
при их наличии в исходном каталоге или домашнем каталоге.
- Настройка Bash проверяется для нового `~/.bashrc`, уже помеченного блока,
подключения из полного dotfiles и режима `--no-shell-setup`. Добавление
`~/.local/bin` не дублируется.
- Локальная проверка установки не обращается к сети и не требует доступного
прокси. Неисправный или отсутствующий машинный конфиг не отменяет успешную
раскладку пакета.
- Ручная проверка выполняется минимум на Ubuntu с Python 3.10 и на одной целевой - Ручная проверка выполняется минимум на Ubuntu с Python 3.10 и на одной целевой
удалённой системе. РЕД ОС, Astra Linux и Alt Linux проверяются по мере удалённой системе. РЕД ОС, Astra Linux и Alt Linux проверяются по мере
доступности: недоступная среда явно записывается как неподтверждённая, а доступности: недоступная среда явно записывается как неподтверждённая, а
@@ -474,7 +560,11 @@ README репозитория только кратко описывает по
реализацией. Она должна описывать: реализацией. Она должна описывать:
- различие внешнего Hiddify и управляемого Xray; - различие внешнего Hiddify и управляемого Xray;
- выборочная установка через stow, ручные симлинки и копирование; - самостоятельный `install.sh`, его автоматический выбор stow или прямых
симлинков, требование сохранять исходный каталог и режим
`--no-shell-setup`;
- границу между управляемыми файлами пакета и создаваемыми вручную машинным
конфигом и закрытым профилем;
- создание машинного INI из шаблона и отдельного файла VLESS-ссылки; - создание машинного INI из шаблона и отдельного файла VLESS-ссылки;
- команды управления, `proxy_on/off`, `pclaude/pcodex`; - команды управления, `proxy_on/off`, `pclaude/pcodex`;
- настройка `NO_PROXY`, ограничения CIDR и диагностика; - настройка `NO_PROXY`, ограничения CIDR и диагностика;