fix(proxy-client): согласованы инструкции самостоятельной установки

- Зачем:
  - README смешивал пакетный и корневой установщики и оставлял неполные шаги для отдельных сценариев.
- Что:
  - выстроен цельный путь установки и настройки для standalone и полного dotfiles.
  - дополнена подсказка --no-shell-setup и добавлена регрессионная проверка.
  - закрыты критерии приёмки тикета и указана дата завершения.
- Проверка:
  - bash tests/test_proxy_client_install.sh.
  - bash tests/test_install.sh.
This commit is contained in:
ddadmin committed 2026-07-21 22:45:28 +03:00
1 parent f679515a8f
commit 623ed8f871
4 files changed
+109 -61

No files matched your search

@@ -10,33 +10,35 @@
**Status:** ready-for-agent **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. `PATH`, не дублируя подключение из полного dotfiles.
- [ ] Параметр `--no-shell-setup` полностью отключает изменение настроек Bash. - [x] Параметр `--no-shell-setup` полностью отключает изменение настроек Bash.
- [ ] После раскладки проверяется только локальная исправность CLI и - [x] После раскладки проверяется только локальная исправность CLI и
Bash-модуля; установка не выбирает режим, не устанавливает Xray, не читает Bash-модуля; установка не выбирает режим, не устанавливает Xray, не читает
VLESS, не проверяет сеть и не требует существующего корректного конфига. VLESS, не проверяет сеть и не требует существующего корректного конфига.
- [ ] Финальный вывод кратко объясняет, как применить изменения в текущей - [x] Финальный вывод кратко объясняет, как применить изменения в текущей
shell-сессии, предупреждает о постоянном пути исходного каталога и направляет shell-сессии, предупреждает о постоянном пути исходного каталога и направляет
к настройке режимов в основной инструкции, не дублируя её. к настройке режимов в основной инструкции, не дублируя её.
- [ ] Автоматические проверки покрывают оба способа создания ссылок, повторный - [x] Автоматические проверки покрывают оба способа создания ссылок, повторный
запуск, все виды конфликтов, защиту машинных файлов, настройку Bash и режим запуск, все виды конфликтов, защиту машинных файлов, настройку Bash и режим
без её изменения. без её изменения.
- [ ] Инструкция пакета описывает новый установщик, зависимость симлинков от - [x] Инструкция пакета описывает новый установщик, зависимость симлинков от
постоянного пути исходного каталога и дальнейшую ручную настройку; общий постоянного пути исходного каталога и дальнейшую ручную настройку; общий
установщик dotfiles продолжает работать по прежнему контракту. установщик dotfiles продолжает работать по прежнему контракту.
+93 -47
View File
@@ -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` ### Только пакет `proxy-client`
Каталог можно скопировать отдельно от остальных dotfiles и запустить его Скопируйте каталог в постоянное место и запустите пакетный установщик. Текущий
собственный установщик из любого рабочего каталога: рабочий каталог не важен:
```bash ```bash
~/src/proxy-client/install.sh ~/src/proxy-client/install.sh
@@ -44,18 +24,54 @@ source ~/.bash_custom
нельзя перемещать: домашние ссылки зависят от его постоянного пути. нельзя перемещать: домашние ссылки зависят от его постоянного пути.
По умолчанию установщик добавляет в `~/.bashrc` помеченный блок для По умолчанию установщик добавляет в `~/.bashrc` помеченный блок для
`~/.local/bin` и Bash-модуля. Чтобы оставить настройки оболочки без изменений: `~/.local/bin` и Bash-модуля. После установки откройте новый Bash или примените
блок в текущей сессии:
```bash
source ~/.bashrc
```
Чтобы оставить `~/.bashrc` без изменений, запустите:
```bash ```bash
~/src/proxy-client/install.sh --no-shell-setup ~/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`, не Установщик не создаёт машинный `config` и закрытый `default.url`, не
устанавливает Xray и не проверяет сеть. После установки примените изменения устанавливает Xray и не проверяет сеть. После подключения команд выберите режим
через `source ~/.bashrc`; с `--no-shell-setup` подключите модуль напрямую: по разделу [«Настройка режима»](#настройка-режима). Без машинного конфига
`source ~/.config/proxy-client/shell.bash`. Затем выберите режим по разделу действует режим Hiddify по умолчанию.
[«Настройка режима»](#настройка-режима). Без машинного конфига продолжает
действовать режим 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 pclaude --version
``` ```
В WSL NAT mode IP Windows-шлюза меняется при перезапуске. Интерактивный #### WSL NAT mode
`./install.sh` предлагает добавить обновление `hproxy.local` в `/etc/wsl.conf`.
То же можно настроить вручную:
```ini IP Windows-шлюза меняется при перезапуске WSL, поэтому `hproxy.local` нужно
[boot] обновлять. В отдельно скопированном пакете системных помощников нет. Узнайте
command = "/path/to/dotfiles/scripts/setup-hproxy.sh" адрес шлюза:
```bash
ip route show default | awk 'NR == 1 {print $3}'
``` ```
После изменения выполните `wsl --shutdown` из Windows. Обновить адрес без Затем откройте `/etc/hosts` через `sudoedit` и оставьте одну отдельную строку с
перезапуска WSL можно так: полученным адресом:
```bash
sudoedit /etc/hosts
```
```text
<адрес-шлюза> hproxy.local
```
Не удаляйте другие имена на той же строке: при необходимости перенесите их на
отдельную строку. Повторяйте обновление после перезапуска WSL.
С полным dotfiles запустите корневой `~/dotfiles/install.sh` интерактивно: он
предложит автоматическое обновление при старте WSL. Обновить адрес сразу можно
так:
```bash ```bash
sudo ~/dotfiles/scripts/setup-hproxy.sh sudo ~/dotfiles/scripts/setup-hproxy.sh
# или после загрузки Bash-функций: # после настройки автозапуска и загрузки общих Bash-функций:
update_hproxy update_hproxy
``` ```
В NAT mode Hiddify должен слушать адрес, доступный через Windows-шлюз, а не В NAT mode Hiddify должен слушать адрес, доступный через Windows-шлюз, а не
только `127.0.0.1`. только `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`. (`networkingMode=mirrored`) Windows-сервисы доступны из WSL через `127.0.0.1`.
Чтобы сохранить адрес по умолчанию, добавьте алиас в Windows hosts: Чтобы сохранить адрес по умолчанию, добавьте алиас в Windows hosts:
@@ -121,9 +155,9 @@ update_hproxy
127.0.0.1 hproxy.local 127.0.0.1 hproxy.local
``` ```
Альтернатива — создать `config.external` с `address = 127.0.0.1`. В обоих Альтернатива — настройте внешний режим по следующему разделу и укажите
случаях проверьте результат через `getent hosts hproxy.local` или `address = 127.0.0.1`. Алиас проверяйте через `getent hosts hproxy.local`, а
`proxy-client status`. активный конфиг — через `proxy-client status`.
### Другой внешний прокси ### Другой внешний прокси
@@ -169,7 +203,7 @@ chmod 600 ~/.config/proxy-client/default.url
proxy-client install proxy-client install
``` ```
Запустите Xray в отдельной панели tmux: Запустите Xray в отдельном терминале или панели tmux:
```bash ```bash
proxy-client start proxy-client start
@@ -260,18 +294,30 @@ export PROXY_PREFLIGHT_TIMEOUT=5
### Ручное подключение без установщика ### Ручное подключение без установщика
Если пакетный установщик запустить нельзя, создайте те же ссылки вручную: Если пакетный установщик запустить нельзя, выберите постоянный абсолютный путь
к исходному каталогу и создайте те же ссылки вручную. Команды предполагают, что
назначения ещё не заняты:
```bash ```bash
mkdir -p ~/.local/bin ~/.config/proxy-client mkdir -p ~/.local/bin ~/.config/proxy-client
ln -s /path/to/proxy-client/.local/bin/proxy-client ~/.local/bin/proxy-client ln -s /absolute/path/to/proxy-client/.local/bin/proxy-client \
ln -s /path/to/proxy-client/.config/proxy-client/shell.bash \ ~/.local/bin/proxy-client
ln -s /absolute/path/to/proxy-client/.config/proxy-client/shell.bash \
~/.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 ~/.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-конфиг. Исходный
каталог после этого нельзя перемещать: созданные ссылки зависят от его пути.
### Машинный конфиг ### Машинный конфиг
+1 -1
View File
@@ -204,7 +204,7 @@ fi
if [ "$SETUP_SHELL" -eq 1 ]; then if [ "$SETUP_SHELL" -eq 1 ]; then
RELOAD_COMMAND='source ~/.bashrc' RELOAD_COMMAND='source ~/.bashrc'
else else
RELOAD_COMMAND='source ~/.config/proxy-client/shell.bash' RELOAD_COMMAND='export PATH="$HOME/.local/bin:$PATH"; source ~/.config/proxy-client/shell.bash'
fi fi
cat <<EOF cat <<EOF
+2 -2
View File
@@ -69,8 +69,8 @@ test_installs_same_public_artifacts_without_stow() {
printf '%s' "$output" | grep -Fq 'без Stow' \ printf '%s' "$output" | grep -Fq 'без Stow' \
|| fail "Expected direct-symlink method in output" || fail "Expected direct-symlink method in output"
printf '%s' "$output" | grep -Fq \ printf '%s' "$output" | grep -Fq \
'source ~/.config/proxy-client/shell.bash' \ 'export PATH="$HOME/.local/bin:$PATH"; source ~/.config/proxy-client/shell.bash' \
|| fail "Expected direct shell-module hint with --no-shell-setup" || fail "Expected complete current-session hint with --no-shell-setup"
[ -d "$home_dir/.local/bin" ] && [ ! -L "$home_dir/.local/bin" ] \ [ -d "$home_dir/.local/bin" ] && [ ! -L "$home_dir/.local/bin" ] \
|| fail "Expected ~/.local/bin to be a real directory" || fail "Expected ~/.local/bin to be a real directory"
[ -d "$home_dir/.config/proxy-client" ] \ [ -d "$home_dir/.config/proxy-client" ] \