From 623ed8f8717c077195baa31c70ab142eac6d0305 Mon Sep 17 00:00:00 2001 From: Dmitry Dementev Date: Tue, 21 Jul 2026 22:45:28 +0300 Subject: [PATCH] =?UTF-8?q?fix(proxy-client):=20=D1=81=D0=BE=D0=B3=D0=BB?= =?UTF-8?q?=D0=B0=D1=81=D0=BE=D0=B2=D0=B0=D0=BD=D1=8B=20=D0=B8=D0=BD=D1=81?= =?UTF-8?q?=D1=82=D1=80=D1=83=D0=BA=D1=86=D0=B8=D0=B8=20=D1=81=D0=B0=D0=BC?= =?UTF-8?q?=D0=BE=D1=81=D1=82=D0=BE=D1=8F=D1=82=D0=B5=D0=BB=D1=8C=D0=BD?= =?UTF-8?q?=D0=BE=D0=B9=20=D1=83=D1=81=D1=82=D0=B0=D0=BD=D0=BE=D0=B2=D0=BA?= =?UTF-8?q?=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Зачем: - README смешивал пакетный и корневой установщики и оставлял неполные шаги для отдельных сценариев. - Что: - выстроен цельный путь установки и настройки для standalone и полного dotfiles. - дополнена подсказка --no-shell-setup и добавлена регрессионная проверка. - закрыты критерии приёмки тикета и указана дата завершения. - Проверка: - bash tests/test_proxy_client_install.sh. - bash tests/test_install.sh. --- .../issues/01-standalone-install.md | 24 +-- proxy-client/README.md | 140 ++++++++++++------ proxy-client/install.sh | 2 +- tests/test_proxy_client_install.sh | 4 +- 4 files changed, 109 insertions(+), 61 deletions(-) diff --git a/.scratch/proxy-client-installer/issues/01-standalone-install.md b/.scratch/proxy-client-installer/issues/01-standalone-install.md index 2f5c191..676556c 100644 --- a/.scratch/proxy-client-installer/issues/01-standalone-install.md +++ b/.scratch/proxy-client-installer/issues/01-standalone-install.md @@ -10,33 +10,35 @@ **Status:** ready-for-agent -- [ ] При наличии stow установщик использует его, а без stow создаёт напрямую +**Completed:** 2026-07-21 + +- [x] При наличии stow установщик использует его, а без stow создаёт напрямую тот же набор симлинков и явно сообщает выбранный способ. -- [ ] Управляются только CLI, Bash-модуль и шаблоны; машинный конфиг и закрытый +- [x] Управляются только CLI, Bash-модуль и шаблоны; машинный конфиг и закрытый профиль не создаются, не заменяются и не связываются даже при наличии в исходном каталоге. -- [ ] Домашние каталоги остаются обычными каталогами; пакетные README и +- [x] Домашние каталоги остаются обычными каталогами; пакетные README и установщик не раскладываются в домашний каталог. -- [ ] До любых изменений проверяется весь набор назначений. Любой чужой файл, +- [x] До любых изменений проверяется весь набор назначений. Любой чужой файл, каталог или симлинк приводит к отказу без частичной установки и без автоматической замены или резервной копии; пользователю показывается полный список конфликтующих путей. -- [ ] Повторный запуск для уже правильных ссылок ничего не меняет и завершается +- [x] Повторный запуск для уже правильных ссылок ничего не меняет и завершается успешно, а исходный каталог может находиться в произвольном пути, включая путь с пробелами. -- [ ] По умолчанию установщик идемпотентно подключает Bash-модуль и при +- [x] По умолчанию установщик идемпотентно подключает Bash-модуль и при необходимости добавляет пользовательский каталог исполняемых файлов в `PATH`, не дублируя подключение из полного dotfiles. -- [ ] Параметр `--no-shell-setup` полностью отключает изменение настроек Bash. -- [ ] После раскладки проверяется только локальная исправность CLI и +- [x] Параметр `--no-shell-setup` полностью отключает изменение настроек Bash. +- [x] После раскладки проверяется только локальная исправность CLI и Bash-модуля; установка не выбирает режим, не устанавливает Xray, не читает VLESS, не проверяет сеть и не требует существующего корректного конфига. -- [ ] Финальный вывод кратко объясняет, как применить изменения в текущей +- [x] Финальный вывод кратко объясняет, как применить изменения в текущей shell-сессии, предупреждает о постоянном пути исходного каталога и направляет к настройке режимов в основной инструкции, не дублируя её. -- [ ] Автоматические проверки покрывают оба способа создания ссылок, повторный +- [x] Автоматические проверки покрывают оба способа создания ссылок, повторный запуск, все виды конфликтов, защиту машинных файлов, настройку Bash и режим без её изменения. -- [ ] Инструкция пакета описывает новый установщик, зависимость симлинков от +- [x] Инструкция пакета описывает новый установщик, зависимость симлинков от постоянного пути исходного каталога и дальнейшую ручную настройку; общий установщик dotfiles продолжает работать по прежнему контракту. diff --git a/proxy-client/README.md b/proxy-client/README.md index 50933cd..4058a08 100644 --- a/proxy-client/README.md +++ b/proxy-client/README.md @@ -10,30 +10,10 @@ CLI требует Python 3.8+ и использует только станда ## Установка -### В составе dotfiles - -Полная установка подключает пакет и автоматически загружает Bash-функции в -новых интерактивных сессиях: - -```bash -cd ~/dotfiles -./install.sh -``` - -Установщик заранее создаёт `~/.local/bin` и `~/.config/proxy-client`, чтобы Stow -размещал ссылки внутри них, а не превращал сами каталоги в ссылки на -репозиторий. - -После установки откройте новый Bash или выполните: - -```bash -source ~/.bash_custom -``` - ### Только пакет `proxy-client` -Каталог можно скопировать отдельно от остальных dotfiles и запустить его -собственный установщик из любого рабочего каталога: +Скопируйте каталог в постоянное место и запустите пакетный установщик. Текущий +рабочий каталог не важен: ```bash ~/src/proxy-client/install.sh @@ -44,18 +24,54 @@ source ~/.bash_custom нельзя перемещать: домашние ссылки зависят от его постоянного пути. По умолчанию установщик добавляет в `~/.bashrc` помеченный блок для -`~/.local/bin` и Bash-модуля. Чтобы оставить настройки оболочки без изменений: +`~/.local/bin` и Bash-модуля. После установки откройте новый Bash или примените +блок в текущей сессии: + +```bash +source ~/.bashrc +``` + +Чтобы оставить `~/.bashrc` без изменений, запустите: ```bash ~/src/proxy-client/install.sh --no-shell-setup ``` +В этом случае подготовьте только текущую сессию вручную: + +```bash +export PATH="$HOME/.local/bin:$PATH" +source ~/.config/proxy-client/shell.bash +``` + +Для следующих сессий добавьте эти строки в подходящий Bash-конфиг сами. + Установщик не создаёт машинный `config` и закрытый `default.url`, не -устанавливает Xray и не проверяет сеть. После установки примените изменения -через `source ~/.bashrc`; с `--no-shell-setup` подключите модуль напрямую: -`source ~/.config/proxy-client/shell.bash`. Затем выберите режим по разделу -[«Настройка режима»](#настройка-режима). Без машинного конфига продолжает -действовать режим Hiddify по умолчанию. +устанавливает Xray и не проверяет сеть. После подключения команд выберите режим +по разделу [«Настройка режима»](#настройка-режима). Без машинного конфига +действует режим Hiddify по умолчанию. + +### В составе dotfiles + +Корневой установщик dotfiles подключает тот же пакет через Stow и загружает +Bash-функции в новых интерактивных сессиях: + +```bash +cd ~/dotfiles +./install.sh +``` + +Он заранее создаёт `~/.local/bin` и `~/.config/proxy-client`, чтобы Stow +размещал ссылки внутри них, а не превращал сами каталоги в ссылки на +репозиторий. После установки откройте новый Bash или выполните: + +```bash +export PATH="$HOME/.local/bin:$PATH" +source ~/.bash_custom +``` + +Если `~/.local/bin` отсутствует в `PATH` и в новых сессиях, добавьте ту же строку +`export` в свой Bash-конфиг: корневой установщик dotfiles его не изменяет. ## Как выбирается прокси @@ -91,28 +107,46 @@ proxy-client status pclaude --version ``` -В WSL NAT mode IP Windows-шлюза меняется при перезапуске. Интерактивный -`./install.sh` предлагает добавить обновление `hproxy.local` в `/etc/wsl.conf`. -То же можно настроить вручную: +#### WSL NAT mode -```ini -[boot] -command = "/path/to/dotfiles/scripts/setup-hproxy.sh" +IP Windows-шлюза меняется при перезапуске WSL, поэтому `hproxy.local` нужно +обновлять. В отдельно скопированном пакете системных помощников нет. Узнайте +адрес шлюза: + +```bash +ip route show default | awk 'NR == 1 {print $3}' ``` -После изменения выполните `wsl --shutdown` из Windows. Обновить адрес без -перезапуска WSL можно так: +Затем откройте `/etc/hosts` через `sudoedit` и оставьте одну отдельную строку с +полученным адресом: + +```bash +sudoedit /etc/hosts +``` + +```text +<адрес-шлюза> hproxy.local +``` + +Не удаляйте другие имена на той же строке: при необходимости перенесите их на +отдельную строку. Повторяйте обновление после перезапуска WSL. + +С полным dotfiles запустите корневой `~/dotfiles/install.sh` интерактивно: он +предложит автоматическое обновление при старте WSL. Обновить адрес сразу можно +так: ```bash sudo ~/dotfiles/scripts/setup-hproxy.sh -# или после загрузки Bash-функций: +# после настройки автозапуска и загрузки общих Bash-функций: update_hproxy ``` В NAT mode Hiddify должен слушать адрес, доступный через Windows-шлюз, а не только `127.0.0.1`. -В [WSL mirrored mode](https://learn.microsoft.com/windows/wsl/networking#mirrored-mode-networking) +#### WSL mirrored mode + +В [mirrored mode](https://learn.microsoft.com/windows/wsl/networking#mirrored-mode-networking) (`networkingMode=mirrored`) Windows-сервисы доступны из WSL через `127.0.0.1`. Чтобы сохранить адрес по умолчанию, добавьте алиас в Windows hosts: @@ -121,9 +155,9 @@ update_hproxy 127.0.0.1 hproxy.local ``` -Альтернатива — создать `config.external` с `address = 127.0.0.1`. В обоих -случаях проверьте результат через `getent hosts hproxy.local` или -`proxy-client status`. +Альтернатива — настройте внешний режим по следующему разделу и укажите +`address = 127.0.0.1`. Алиас проверяйте через `getent hosts hproxy.local`, а +активный конфиг — через `proxy-client status`. ### Другой внешний прокси @@ -169,7 +203,7 @@ chmod 600 ~/.config/proxy-client/default.url proxy-client install ``` -Запустите Xray в отдельной панели tmux: +Запустите Xray в отдельном терминале или панели tmux: ```bash proxy-client start @@ -260,18 +294,30 @@ export PROXY_PREFLIGHT_TIMEOUT=5 ### Ручное подключение без установщика -Если пакетный установщик запустить нельзя, создайте те же ссылки вручную: +Если пакетный установщик запустить нельзя, выберите постоянный абсолютный путь +к исходному каталогу и создайте те же ссылки вручную. Команды предполагают, что +назначения ещё не заняты: ```bash mkdir -p ~/.local/bin ~/.config/proxy-client -ln -s /path/to/proxy-client/.local/bin/proxy-client ~/.local/bin/proxy-client -ln -s /path/to/proxy-client/.config/proxy-client/shell.bash \ +ln -s /absolute/path/to/proxy-client/.local/bin/proxy-client \ + ~/.local/bin/proxy-client +ln -s /absolute/path/to/proxy-client/.config/proxy-client/shell.bash \ ~/.config/proxy-client/shell.bash -ln -s /path/to/proxy-client/.config/proxy-client/examples \ +ln -s /absolute/path/to/proxy-client/.config/proxy-client/examples \ ~/.config/proxy-client/examples +chmod 755 /absolute/path/to/proxy-client/.local/bin/proxy-client ``` -Исполняемому файлу нужен режим `755`, а `~/.local/bin` должен входить в `PATH`. +Подготовьте текущую Bash-сессию: + +```bash +export PATH="$HOME/.local/bin:$PATH" +source ~/.config/proxy-client/shell.bash +``` + +Для следующих сессий добавьте эти две строки в свой Bash-конфиг. Исходный +каталог после этого нельзя перемещать: созданные ссылки зависят от его пути. ### Машинный конфиг diff --git a/proxy-client/install.sh b/proxy-client/install.sh index e36dda6..133858b 100755 --- a/proxy-client/install.sh +++ b/proxy-client/install.sh @@ -204,7 +204,7 @@ fi if [ "$SETUP_SHELL" -eq 1 ]; then RELOAD_COMMAND='source ~/.bashrc' else - RELOAD_COMMAND='source ~/.config/proxy-client/shell.bash' + RELOAD_COMMAND='export PATH="$HOME/.local/bin:$PATH"; source ~/.config/proxy-client/shell.bash' fi cat <