docs(proxy-client): спроектирован самостоятельный установщик
- Зачем: - отдельный пакет должен устанавливаться без общего dotfiles и обязательного stow. - Что: - зафиксирована единая раскладка симлинков через stow или ln. - отделены файлы пакета от машинного конфига и закрытого профиля. - добавлены правила конфликтов, настройки Bash и проверки установки. - Проверка: - git diff --cached --check.
This commit is contained in:
1 parent
78aa5f6473
commit
86d63ab2aa
1 file changed
+102
-12
@@ -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 и диагностика;
|
||||||
|
|||||||
Reference in new issue
Block a user