refactor(proxy-client): упростить клиент до личного инструмента #1

Merged
ddmitry merged 9 commits from proxy-client-simplify into master 2026-09-28 17:58:39 +03:00
4 changed files with 1064 additions and 3271 deletions
Showing only changes of commit a5db265f47 - Show all commits

No files matched your search

File diff suppressed because it is too large. Load diff
+41 -20
View File
@@ -19,13 +19,16 @@ CLI требует Python 3.8+ и использует только станда
~/src/proxy-client/install.sh
```
При наличии Stow установщик использует его, иначе создаёт те же три симлинка
напрямую: CLI, Bash-модуль и каталог шаблонов. Исходный каталог после установки
нельзя перемещать: домашние ссылки зависят от его постоянного пути.
Установщик создаёт три ссылки на исходный каталог: CLI, Bash-модуль и каталог
шаблонов. Поэтому исходный каталог после установки нельзя перемещать. Если
какой-то из путей уже занят чужим файлом или ссылкой, установщик ничего не
меняет и перечисляет все такие пути. Повторный запуск безопасен.
По умолчанию установщик добавляет в `~/.bashrc` помеченный блок для
`~/.local/bin` и Bash-модуля. После установки откройте новый Bash или примените
блок в текущей сессии:
По умолчанию установщик дописывает в `~/.bashrc` блок между строками
`# >>> proxy-client >>>` и `# <<< proxy-client <<<`: он добавляет
`~/.local/bin` в `PATH` и подключает Bash-модуль. Если блок уже есть, файл не
меняется. После установки откройте новый Bash или примените блок в текущей
сессии:
```bash
source ~/.bashrc
@@ -73,6 +76,12 @@ source ~/.bash_custom
Если `~/.local/bin` отсутствует в `PATH` и в новых сессиях, добавьте ту же строку
`export` в свой Bash-конфиг: корневой установщик dotfiles его не изменяет.
Проверить пакет после правок (из корня dotfiles):
```bash
tests/test_proxy_client_full.sh
```
## Как выбирается прокси
Режим определяется только машинным файлом
@@ -253,8 +262,13 @@ proxy-client stop
плане. Systemd, фоновый автозапуск и скрытый запуск из `run` не используются.
Один loopback-порт принимает HTTP CONNECT и SOCKS5.
`stop` завершает управляемые процессы и удаляет созданные служебные файлы. Он
работает и после изменения машинного типа на `external`.
Остановить Xray можно двумя способами: `Ctrl+C` в окне `start` или
`proxy-client stop` из любого терминала. Оба гасят Xray и удаляют служебные
файлы. Если процесс `start` был убит (например, закрыли окно tmux), Xray может
остаться работать: `status` и `env` тогда сообщат об ошибке, а `stop` добьёт его
и уберёт файлы. `stop` работает и после изменения машинного типа на `external`.
Второй `start`, пока первый работает, завершится ошибкой.
## Диагностика
@@ -343,7 +357,8 @@ source ~/.config/proxy-client/shell.bash
Поддерживаются VLESS TCP/RAW с REALITY и VLESS XHTTP с TLS. Неизвестные,
повторные и несовместимые query-параметры отклоняются. XHTTP поддерживает ALPN
`http/1.1`, `h2` и `h3`; `extra` должен быть JSON-объектом без повторных ключей.
`http/1.1`, `h2` и `h3`; `extra` должен быть JSON-объектом, его содержимое
проверяет `xray run -test`.
Кроме `encryption=none`, принимается VLESS-шифрование
`encryption=mlkem768x25519plus.…` из новых ссылок Hiddify; остальную часть
@@ -351,9 +366,9 @@ source ~/.config/proxy-client/shell.bash
`flow=xtls-rprx-vision`. Косая черта перед параметрами (`…:443/?type=…`)
допустима, другой путь в ссылке — нет.
Xray 26.3.27 использует `pcs` и `vcn`, а устаревшие `allowInsecure` и
`insecure` не переносит. Истинное legacy-значение даёт предупреждение, но
обычная проверка сертификата остаётся включённой.
Xray 26.3.27 использует `pcs` и `vcn`. Устаревшие `allowInsecure` и `insecure`
принимаются с любым значением, но не переносятся: при значении `1` или `true`
выводится предупреждение, а сертификат проверяется обычным способом.
Последняя версия Xray, где `allowInsecure` ещё применяется, —
[25.12.8](https://github.com/XTLS/Xray-core/releases/tag/v25.12.8); опция
@@ -366,14 +381,18 @@ Xray 26.3.27 использует `pcs` и `vcn`, а устаревшие `allow
`x86_64`/`amd64` используется `Xray-linux-64.zip`, для `aarch64`/`arm64` —
`Xray-linux-arm64-v8a.zip`; остальные архитектуры отклоняются.
CLI скачивает официальный архив и файл `.dgst`, проверяет SHA-256, ограничения
размера и фактическую версию бинарника, а затем атомарно заменяет назначение.
Корректная уже установленная версия даёт no-op без сети. Другой файл или симлинк
не заменяется без `--replace`; каталог не заменяется никогда.
CLI скачивает официальный архив и файл `.dgst`, сверяет SHA-256 и фактическую
версию бинарника, а затем атомарно заменяет назначение. При любой ошибке старый
файл остаётся на месте. Если нужная версия уже установлена, сеть не нужна и
ничего не меняется. Другой файл или симлинк не заменяется без `--replace`
(симлинк заменяется сам, файл по ссылке не трогается); каталог не заменяется
никогда. Если после установки `PATH` находит другой `xray`, `install` сообщает об
ошибке и подсказывает команду.
Устанавливать можно и при работающем Xray: он продолжит работу со старым файлом,
а `install` напомнит перезапустить `start`.
`start` использует первый `xray` из `PATH` и принимает только версию 26.3.27.
Если `PATH` выбирает другой бинарник, команда сообщает об ошибке. Во время
живого или неподтверждённого управляемого процесса установка запрещена.
### Файлы и безопасность
@@ -385,6 +404,8 @@ CLI скачивает официальный архив и файл `.dgst`, п
| `$XDG_STATE_HOME/proxy-client/` или `~/.local/state/proxy-client/` | Состояние и сгенерированный JSON |
Сводка скрывает UUID и ключи, а для XHTTP показывает только длину `path`.
Служебный каталог закрыт для других пользователей и очищается после штатной
остановки Xray. Сбой определения внешнего IP показывается как предупреждение и
Если файл профиля доступен другим пользователям, `start` не запустится и
покажет готовую команду `chmod 600` для конечного файла (у симлинка — для файла,
на который он указывает). Служебный каталог закрыт для других пользователей
(`700`, файлы в нём — `600`) и очищается после остановки Xray. Сбой определения внешнего IP показывается как предупреждение и
не останавливает уже готовый процесс.
+412 -1159
View File
File diff suppressed because it is too large. Load diff
File diff suppressed because it is too large. Load diff