refactor(proxy-client): переименован интерфейс прокси
- Зачем: - прежнее имя выпячивало Xray, хотя клиент поддерживает также внешний прокси, а два каталога конфигурации были неочевидны. - Что: - пакет, CLI, конфигурация, состояние, тесты и документация переименованы в proxy-client. - машинный конфиг, профиль и два явных примера собраны в одном пользовательском каталоге. - свежая установка защищена от сворачивания каталога конфигурации внутрь репозитория. - Проверка: - bash tests/test_proxy_client_full.sh. - bash tests/test_install.sh. - ручные start, status и xray run -test; незавершённая сетевая приёмка записана в handoff.
This commit is contained in:
1 parent
e5323284a8
commit
6e431d875e
25 files changed
+310
-227
No files matched your search
+37
-26
@@ -1,8 +1,8 @@
|
||||
# Headless Xray-прокси для агентских CLI
|
||||
# `proxy-client` для агентских CLI
|
||||
|
||||
Дата: 2026-07-15
|
||||
|
||||
Статус: дизайн утверждён, реализация не начата
|
||||
Статус: реализация готова к ручной приёмке; публичное имя уточнено 2026-07-21
|
||||
|
||||
## Проблема
|
||||
|
||||
@@ -93,9 +93,12 @@ Bash нужен только там, где необходимо изменит
|
||||
|
||||
### Границы компонентов
|
||||
|
||||
`xray-proxy` — один исполняемый файл на Python 3.8+ без внешних библиотек. Он
|
||||
`proxy-client` — один исполняемый файл на Python 3.8+ без внешних библиотек. Он
|
||||
отвечает за установку Xray, запуск и остановку процесса, диагностику,
|
||||
преобразование VLESS и запуск произвольной дочерней команды через прокси.
|
||||
Нейтральное публичное имя описывает клиентскую прокси-подсистему целиком:
|
||||
внешний прокси и управляемый Xray. Название `xray` остаётся у конкретного
|
||||
движка и значения `type = xray`, где оно действительно важно.
|
||||
|
||||
Переносимый `shell.bash` — единственный владелец `proxy_on`, `proxy_off`,
|
||||
`pclaude`, `pcodex`, `myip` и внутренних proxy-помощников. При реализации они
|
||||
@@ -105,18 +108,18 @@ Bash нужен только там, где необходимо изменит
|
||||
машинный конфиг самостоятельно:
|
||||
|
||||
- `pclaude` и `pcodex` делегируют запуск форме
|
||||
`xray-proxy run -- COMMAND ARG...`, где `--` отделяет параметры клиента;
|
||||
- `proxy_on` получает от `xray-proxy env` проверенный набор proxy-переменных и
|
||||
`proxy-client run -- COMMAND ARG...`, где `--` отделяет параметры клиента;
|
||||
- `proxy_on` получает от `proxy-client env` проверенный набор proxy-переменных и
|
||||
применяет его к текущей Bash-сессии;
|
||||
- `proxy_off` очищает верхний и нижний регистр proxy-переменных.
|
||||
|
||||
Общий `bash/.bash_functions` и модуль Xray не зависят друг от друга. В составе
|
||||
Общий `bash/.bash_functions` и модуль клиента не зависят друг от друга. В составе
|
||||
dotfiles `.bash_custom` подключает их двумя независимыми строками. Без
|
||||
остальных dotfiles пользователь добавляет только один `source` модуля Xray в
|
||||
остальных dotfiles пользователь добавляет только один `source` модуля клиента в
|
||||
`.bashrc`. Для неинтерактивных сценариев и других оболочек остаётся прямой
|
||||
`xray-proxy run`.
|
||||
`proxy-client run`.
|
||||
|
||||
`xray-proxy env` сначала выполняет ту же проверку доступности, что и `run`, а
|
||||
`proxy-client env` сначала выполняет ту же проверку доступности, что и `run`, а
|
||||
затем печатает восемь строк `KEY=value`: HTTP, HTTPS, ALL и NO_PROXY в верхнем
|
||||
и нижнем регистре. `shell.bash` сначала целиком получает успешный ответ, затем
|
||||
разбирает строки по первому `=`, принимает только известные ключи и лишь после
|
||||
@@ -131,17 +134,17 @@ dotfiles `.bash_custom` подключает их двумя независим
|
||||
набора переменных, fail-fast перед `pclaude`/`pcodex` и изоляции окружения
|
||||
дочернего процесса. Автоматический запрос внешнего IP из `proxy_on` и
|
||||
`proxy_off` удаляется: он замедляет переключение и смешивает изменение
|
||||
окружения с диагностикой. Для проверки остаются `myip` и `xray-proxy status`.
|
||||
окружения с диагностикой. Для проверки остаются `myip` и `proxy-client status`.
|
||||
|
||||
### Два независимых файла настройки
|
||||
|
||||
Машинный файл `~/.config/proxy/config` хранит несекретное описание активного
|
||||
прокси: явный тип `xray` или `external`, отображаемое имя, адрес, порт и
|
||||
добавку к `NO_PROXY`. Формат — INI из стандартной библиотеки Python. Если файла
|
||||
нет, прокси-подсистема сохраняет прежний внешний адрес
|
||||
Машинный файл `~/.config/proxy-client/config` хранит несекретное описание
|
||||
активного прокси: явный тип `xray` или `external`, отображаемое имя, адрес, порт
|
||||
и добавку к `NO_PROXY`. Формат — INI из стандартной библиотеки Python. Если
|
||||
файла нет, прокси-подсистема сохраняет прежний внешний адрес
|
||||
`hproxy.local:12334` ради обратной совместимости.
|
||||
|
||||
Секретный `~/.config/xray-proxy/default.url` содержит одну VLESS-ссылку.
|
||||
Секретный `~/.config/proxy-client/default.url` содержит одну VLESS-ссылку.
|
||||
Команда запуска принимает другой файл через `-f`. Профили можно хранить в
|
||||
нескольких файлах, но активным у пользователя бывает только один.
|
||||
CLI следует за симлинком, но проверяет права конечного файла: доступ группы или
|
||||
@@ -156,8 +159,8 @@ CLI следует за симлинком, но проверяет права
|
||||
### Явная семантика прокси
|
||||
|
||||
Тип `xray` означает, что `pclaude` и `pcodex` требуют запущенный процесс,
|
||||
которым управляет `xray-proxy`. Если его нет, агент не запускается, а сообщение
|
||||
предлагает выполнить `xray-proxy start`.
|
||||
которым управляет `proxy-client`. Если его нет, агент не запускается, а сообщение
|
||||
предлагает выполнить `proxy-client start`.
|
||||
|
||||
Тип `external` означает внешний процесс, например Hiddify. Проверяется только
|
||||
доступность явно заданного адреса и порта. Ни один тип не переходит на другой
|
||||
@@ -264,7 +267,7 @@ Hiddify Manager может добавлять `allowInsecure=true` и `insecure=
|
||||
|
||||
### Установка Xray
|
||||
|
||||
`xray-proxy install` — отдельная явная операция. Она устанавливает Xray в
|
||||
`proxy-client install` — отдельная явная операция. Она устанавливает Xray в
|
||||
`~/.local/bin`, скачивает официальный архив и файл контрольной суммы, затем
|
||||
проверяет SHA-256. Поддерживается только зафиксированный релиз 26.3.27;
|
||||
параметра версии нет. Официальные релизы публикуют необходимые файлы `.dgst`:
|
||||
@@ -301,7 +304,7 @@ Start-lock берётся до проверки назначения и удер
|
||||
из содержимого VLESS-ссылки.
|
||||
|
||||
`start` никогда не скачивает бинарник. Если `xray` отсутствует в `PATH`, команда
|
||||
завершается с подсказкой выполнить `xray-proxy install`.
|
||||
завершается с подсказкой выполнить `proxy-client install`.
|
||||
|
||||
### Жизненный цикл
|
||||
|
||||
@@ -317,7 +320,7 @@ CLI предоставляет `install`, `start`, `stop`, `status`, `env` и `r
|
||||
достаточно истории tmux.
|
||||
|
||||
Супервизор на всё время работы удерживает неблокирующую эксклюзивную блокировку
|
||||
`fcntl.flock` в служебном каталоге `~/.local/state/xray-proxy/`. Второй `start`
|
||||
`fcntl.flock` в служебном каталоге `~/.local/state/proxy-client/`. Второй `start`
|
||||
отказывает до запуска процессов и изменения state или сгенерированного
|
||||
конфига. `state.json` нужен для восстановления после сбоя, но не служит
|
||||
блокировкой.
|
||||
@@ -364,12 +367,14 @@ UUID, ключи, short ID и другие уникальные секретны
|
||||
|
||||
### Доставка
|
||||
|
||||
Компоненты образуют отдельный stow-совместимый каталог `xray-proxy/`. Он
|
||||
доставляет CLI, Bash-модуль и два шаблона: машинного INI и файла VLESS-ссылки.
|
||||
Компоненты образуют отдельный stow-совместимый каталог `proxy-client/`. Он
|
||||
доставляет CLI, Bash-модуль и три шаблона: машинного INI для внешнего прокси,
|
||||
машинного INI для Xray и файла VLESS-ссылки.
|
||||
Реальные пользовательские файлы не управляются stow и не входят в Git.
|
||||
CLI раскладывается как `~/.local/bin/xray-proxy`, а модуль — как
|
||||
`~/.config/xray-proxy/shell.bash`. Шаблоны лежат рядом с модулем в подкаталоге
|
||||
`examples/` и не подменяют настоящие пользовательские файлы.
|
||||
CLI раскладывается как `~/.local/bin/proxy-client`. Машинный конфиг, профиль,
|
||||
модуль `shell.bash` и каталог `examples/` находятся вместе в
|
||||
`~/.config/proxy-client/`. Шаблоны не подменяют настоящие пользовательские
|
||||
файлы.
|
||||
|
||||
В корне этого каталога находится самостоятельный `README.md`. Он является
|
||||
основной инструкцией клиента и исключается из раскладки stow. README остаётся
|
||||
@@ -391,6 +396,12 @@ README репозитория только кратко описывает по
|
||||
Python 3.11, что исключило бы штатный Python 3.10 в Ubuntu 22.04.
|
||||
- Bash оставлен отдельным тонким модулем, потому что дочерний Python-процесс не
|
||||
может изменить окружение родительской shell-сессии.
|
||||
- Выбрано публичное имя `proxy-client`, потому что подсистема обслуживает и
|
||||
внешний прокси, и управляемый Xray. `xray-proxy` отклонено как имя,
|
||||
выпячивающее одну реализацию, а `proxyctl` — как менее понятное пользователю.
|
||||
- Все пользовательские файлы собраны в `~/.config/proxy-client/`. Разделение
|
||||
между общим машинным конфигом и Xray-профилем остаётся логическим, но не
|
||||
требует помнить два каталога.
|
||||
- Машинный прокси и VLESS-ссылка разделены: первый файл описывает локальную
|
||||
политику shell, второй содержит секрет и меняется независимо.
|
||||
- Выбран один порт, потому что SOCKS-вход Xray совместим с HTTP и не требует
|
||||
@@ -459,7 +470,7 @@ README репозитория только кратко описывает по
|
||||
|
||||
## Влияние на документацию
|
||||
|
||||
Основная инструкция создаётся как `xray-proxy/README.md` одновременно с
|
||||
Основная инструкция находится в `proxy-client/README.md` рядом с
|
||||
реализацией. Она должна описывать:
|
||||
|
||||
- различие внешнего Hiddify и управляемого Xray;
|
||||
Reference in new issue
Block a user