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
@@ -0,0 +1,87 @@
|
||||
# Handoff: `proxy-client` переименован, сетевой маршрут требует диагностики
|
||||
|
||||
Обновлён: 2026-07-21 09:23 EDT.
|
||||
|
||||
## Состояние задачи 05
|
||||
|
||||
Автоматическая часть готова. Публичное имя изменено с `xray-proxy` на
|
||||
`proxy-client`, а ручная приёмка дошла до реального сетевого запроса. Xray
|
||||
запускается и принимает локальные соединения, но удалённый маршрут пока не
|
||||
работает. Статус тикета остаётся `ready-for-human`.
|
||||
|
||||
Тикет: `.scratch/proxy-client/issues/05-package-delivery-and-acceptance.md`.
|
||||
|
||||
## Переименование
|
||||
|
||||
- stow-пакет: `proxy-client/`;
|
||||
- CLI: `~/.local/bin/proxy-client`;
|
||||
- единый пользовательский каталог: `~/.config/proxy-client/`;
|
||||
- служебный каталог: `~/.local/state/proxy-client/`;
|
||||
- машинный конфиг и закрытый профиль теперь лежат рядом как `config` и
|
||||
`default.url`;
|
||||
- примеры называются `config.external` и `config.xray`;
|
||||
- имена тестов, спецификации, задач, README и Bash-модуля приведены к
|
||||
`proxy-client`;
|
||||
- `Xray`, бинарник `xray` и значение `type = xray` сохранены как названия
|
||||
конкретного движка.
|
||||
|
||||
Поддержка старой раскладки в `install.sh` намеренно не добавлена: публичное имя
|
||||
изменено до завершения разработки и выпуска. Текущий HOME уже приведён к новой
|
||||
структуре. Свежая установка заранее создаёт настоящий
|
||||
`~/.config/proxy-client`, поэтому Stow не может свернуть его в ссылку на
|
||||
репозиторий.
|
||||
|
||||
## Автоматическая проверка
|
||||
|
||||
`bash tests/test_proxy_client_full.sh` завершился с кодом 0 после
|
||||
переименования:
|
||||
|
||||
- системный Python 3.14: 79 тестов, `OK`, 61,034 с;
|
||||
- Bash-интеграция: 8 проверок, `PASS`; `shellcheck` не установлен;
|
||||
- установка и миграция: `All install tests passed`;
|
||||
- CPython 3.8 через `uv`: 79 тестов, `OK`, 52,446 с.
|
||||
|
||||
Дополнительно прошли синтаксическая проверка shell-файлов и `git diff --check`.
|
||||
|
||||
## Текущий HOME
|
||||
|
||||
Во время разработки текущий HOME приведён к новой структуре:
|
||||
|
||||
- `~/.config/proxy-client` — настоящий каталог;
|
||||
- `config` и `default.url` — обычные файлы с правами `600`;
|
||||
- профиль содержит одну непустую строку, его содержимое не выводилось;
|
||||
- `shell.bash`, `examples` и CLI указывают в новый stow-пакет;
|
||||
- старые `~/.config/xray-proxy`, `~/.config/proxy/config`,
|
||||
`~/.local/bin/xray-proxy` и `~/.local/state/xray-proxy` отсутствуют.
|
||||
|
||||
## Ручная приёмка
|
||||
|
||||
Подтверждено:
|
||||
|
||||
- установлен Xray 26.3.27;
|
||||
- `proxy-client start` успешно проверяет версию, строит JSON и запускает Xray;
|
||||
- `proxy-client status` видит управляемый процесс на `127.0.0.1:12334`;
|
||||
- `xray run -test` сообщает `Configuration OK`;
|
||||
- после проверки процесс штатно остановлен командой `proxy-client stop`.
|
||||
|
||||
Не прошло:
|
||||
|
||||
- встроенное определение внешнего IP;
|
||||
- HTTP через `127.0.0.1:12334`;
|
||||
- SOCKS5h через тот же порт.
|
||||
|
||||
Оба запроса `curl` завершились кодом 35: TLS-соединение неожиданно закрылось во
|
||||
время рукопожатия. Внешний IP и содержимое профиля в вывод не попадали.
|
||||
|
||||
## Следующий шаг
|
||||
|
||||
Диагностировать сетевой маршрут XHTTP/TLS: сравнить профиль с рабочим клиентом,
|
||||
проверить доступность удалённого узла и выяснить, связан ли EOF с преобразованием
|
||||
профиля, параметрами XHTTP/TLS или удалённой стороной. До этого не отмечать
|
||||
ручную HTTP/SOCKS-приёмку выполненной.
|
||||
|
||||
## Git
|
||||
|
||||
Переименование и текущий handoff ещё не закоммичены. Не включать посторонние
|
||||
неотслеживаемые `agents/.agents/.skill-lock.json` и
|
||||
`scripts/setup-xray-proxy.sh`.
|
||||
@@ -1,54 +0,0 @@
|
||||
# Handoff: владение `~/.config` исправлено, задача 05 готова к приёмке
|
||||
|
||||
Обновлён: 2026-07-21 08:18 EDT.
|
||||
|
||||
## Состояние задачи 05
|
||||
|
||||
Автоматическая часть `headless-xray-proxy` зафиксирована коммитом `fd8210d`.
|
||||
Тикет `.scratch/headless-xray-proxy/issues/05-package-delivery-and-acceptance.md`
|
||||
находится в `ready-for-human`; результаты тестов и команды ручной приёмки уже
|
||||
записаны там. Дальше можно продолжать ручную приёмку по этому тикету.
|
||||
|
||||
## Исправленный дефект stow
|
||||
|
||||
Корневая причина была в сворачивании GNU Stow: в пустом домашнем каталоге пакет
|
||||
`zed` создавал общую ссылку `~/.config -> ~/dotfiles/zed/.config`. После этого
|
||||
рабочие настройки приложений и закрытый профиль Xray физически попадали внутрь
|
||||
репозитория.
|
||||
|
||||
`install.sh` теперь:
|
||||
|
||||
- заранее создаёт настоящий каталог `~/.config`, поэтому свежая установка
|
||||
создаёт только ссылку `~/.config/zed`;
|
||||
- распознаёт старую ссылку лишь при точном совпадении с
|
||||
`$DOTFILES_DIR/zed/.config`;
|
||||
- оставляет управляемый каталог `zed` в пакете, а остальные верхнеуровневые
|
||||
элементы переносит в настоящий `~/.config`;
|
||||
- до первого переноса проверяет, что смог полностью перечислить данные;
|
||||
- при штатной ошибке переноса возвращает уже перемещённые элементы назад;
|
||||
- не раскрывает произвольные ссылки `~/.config`.
|
||||
|
||||
В `tests/test_install.sh` добавлены проверки свежей установки, миграции с
|
||||
вымышленным секретом, сохранения прав `600`, отсутствия секрета в выводе,
|
||||
повторного запуска и неприкосновенности произвольной ссылки.
|
||||
|
||||
## Проверка и живое состояние
|
||||
|
||||
Полный набор `bash tests/test_xray_proxy_full.sh` прошёл на системном Python и
|
||||
Python 3.8 через `uv`: по 79 Python-тестов, 8 проверок командной оболочки и тесты
|
||||
установщика. Синтаксис сценариев командной оболочки и `git diff --check` также
|
||||
прошли.
|
||||
|
||||
Миграция применена к текущему домашнему каталогу:
|
||||
|
||||
- `~/.config` — настоящий каталог;
|
||||
- `~/.config/zed` указывает на пакет Zed;
|
||||
- в `zed/.config` остался только каталог `zed`;
|
||||
- рабочие каталоги приложений находятся в `~/.config`;
|
||||
- `~/.config/xray-proxy/default.url` — обычный файл вне репозитория, сохранил
|
||||
права `600` и одну непустую строку. Содержимое профиля не выводилось.
|
||||
|
||||
## Текущее состояние Git
|
||||
|
||||
Не включать в коммиты посторонние неотслеживаемые
|
||||
`agents/.agents/.skill-lock.json` и `scripts/setup-xray-proxy.sh`.
|
||||
File renamed without changes.
File renamed without changes.
File renamed without changes.
+2
-2
@@ -93,7 +93,7 @@ Ubuntu / РЕД ОС / Astra / Alt.
|
||||
и state не тронуты;
|
||||
- `shutil.which`-проверка: отсутствие каталога в PATH и конкурирующий
|
||||
более ранний `xray` в PATH.
|
||||
- [x] `xray-proxy/README.md` обновлён: одна поддержанная версия 26.3.27
|
||||
- [x] `proxy-client/README.md` обновлён: одна поддержанная версия 26.3.27
|
||||
(упоминания 25.12.8 удалены), использование `install [--replace]`,
|
||||
маппинг x86_64/aarch64, SHA-256-проверка, поведение PATH, отказ при
|
||||
живом managed-экземпляре.
|
||||
@@ -141,4 +141,4 @@ TASK: 3 NIT) → триаж (FIXED 7, REJECTED 0) → узкие перепро
|
||||
`allowInsecure` — 25.12.8, опция удалена в 26.2.6; CLI их не ставит.
|
||||
|
||||
Тесты: 79 OK (baseline 49, +30) + 8 PASS shell-проверок. Затраты — в
|
||||
`.scratch/headless-xray-proxy/token-ledger.md`.
|
||||
`.scratch/proxy-client/token-ledger.md`.
|
||||
+30
-15
@@ -1,6 +1,6 @@
|
||||
# 05 — Доставка пакета и итоговая приёмка
|
||||
|
||||
**What to build:** Поставка `xray-proxy` проверена целиком: корневой обзор
|
||||
**What to build:** Поставка `proxy-client` проверена целиком: корневой обзор
|
||||
соответствует готовым возможностям, автоматические проверки воспроизводимы, а
|
||||
ручная приёмка на доступных системах подготовлена для пользователя.
|
||||
|
||||
@@ -13,13 +13,13 @@
|
||||
Тикеты 03/04/06 уже доставили CLI, Bash-модуль, установку и жизненный цикл.
|
||||
Задача 05 их проверяет, но не переписывает. Источники истины:
|
||||
|
||||
- [`xray-proxy/README.md`](../../../xray-proxy/README.md) — пользовательские
|
||||
- [`proxy-client/README.md`](../../../proxy-client/README.md) — пользовательские
|
||||
команды, настройка и ограничения;
|
||||
- [исходный дизайн](../../../docs/specs/2026-07-15-headless-xray-proxy-design.md)
|
||||
- [исходный дизайн](../../../docs/specs/2026-07-15-proxy-client-design.md)
|
||||
— границы и принятые решения.
|
||||
|
||||
- [x] Корневой `README.md` кратко описывает внешний Hiddify и управляемый Xray,
|
||||
показывает `stow xray-proxy` и ссылается на полную инструкцию.
|
||||
показывает `stow proxy-client` и ссылается на полную инструкцию.
|
||||
- [x] Пакет подключается через stow, ручные ссылки или копирование; общий
|
||||
установщик использует тот же пакет.
|
||||
- [x] Инструкция покрывает две семьи VLESS, Xray 26.3.27, отсутствие systemd,
|
||||
@@ -39,7 +39,7 @@
|
||||
|
||||
## Автоматическая проверка
|
||||
|
||||
- [x] `tests/test_xray_proxy_full.sh` запускает весь Python-набор под системным
|
||||
- [x] `tests/test_proxy_client_full.sh` запускает весь Python-набор под системным
|
||||
`python3` и CPython 3.8 через `uv`, затем Bash-тесты и проверку установки.
|
||||
- [x] Тестовый Xray остаётся отдельным исполняемым файлом и получает доступ к
|
||||
библиотекам исходного Python. Это устраняет ложные падения переносимой сборки
|
||||
@@ -66,13 +66,13 @@
|
||||
|
||||
### 2026-07-21 — автоматическая проверка
|
||||
|
||||
`bash tests/test_xray_proxy_full.sh` завершился с кодом 0:
|
||||
`bash tests/test_proxy_client_full.sh` завершился с кодом 0:
|
||||
|
||||
- системный Python 3.14: 79 тестов, `OK`, 57,276 с;
|
||||
- системный Python 3.14: 79 тестов, `OK`, 61,034 с;
|
||||
- Bash-интеграция: 8 проверок, `PASS`; `shellcheck` отсутствует и явно пропущен;
|
||||
- установка: `All install tests passed`; в `/tmp` не осталось каталогов
|
||||
`dotfiles-install-test.*`;
|
||||
- CPython 3.8.20 через `uv`: 79 тестов, `OK`, 51,412 с.
|
||||
- CPython 3.8 через `uv`: 79 тестов, `OK`, 52,446 с.
|
||||
|
||||
### 2026-07-21 — команды ручной приёмки
|
||||
|
||||
@@ -82,22 +82,37 @@
|
||||
```bash
|
||||
python3 --version
|
||||
cd ~/dotfiles
|
||||
stow xray-proxy
|
||||
source ~/.config/xray-proxy/shell.bash
|
||||
xray-proxy install
|
||||
xray-proxy start
|
||||
stow proxy-client
|
||||
source ~/.config/proxy-client/shell.bash
|
||||
proxy-client install
|
||||
proxy-client start
|
||||
```
|
||||
|
||||
Во второй панели, пока `start` работает:
|
||||
|
||||
```bash
|
||||
xray-proxy status
|
||||
xray run -test -c "${XDG_STATE_HOME:-$HOME/.local/state}/xray-proxy/client.json"
|
||||
proxy-client status
|
||||
xray run -test -c "${XDG_STATE_HOME:-$HOME/.local/state}/proxy-client/client.json"
|
||||
curl --proxy http://127.0.0.1:12334 https://api.ipify.org
|
||||
curl --proxy socks5h://127.0.0.1:12334 https://api.ipify.org
|
||||
xray-proxy stop
|
||||
proxy-client stop
|
||||
```
|
||||
|
||||
Если настроен другой локальный адрес или порт, те же значения подставляются в
|
||||
обе команды `curl`. В отчёт записываются только версии, коды возврата и итог
|
||||
проверки HTTP/SOCKS.
|
||||
|
||||
### 2026-07-21 — переименование и частичная ручная приёмка
|
||||
|
||||
Публичный интерфейс переименован в `proxy-client`, а машинный конфиг и закрытый
|
||||
профиль объединены в `~/.config/proxy-client/`. В ходе разработки текущий HOME
|
||||
приведён к новой структуре; старые пользовательские пути отсутствуют, права
|
||||
файлов `600` сохранены. Поддержка прежнего имени в установщик не добавлялась,
|
||||
поскольку выпуск ещё не состоялся.
|
||||
|
||||
Xray 26.3.27 установился и запустился, `status` подтвердил процесс на
|
||||
`127.0.0.1:12334`, а `xray run -test` завершился сообщением
|
||||
`Configuration OK`. HTTP и SOCKS5h через локальный вход не прошли: оба запроса
|
||||
`curl` завершились кодом 35 с неожиданным закрытием TLS-соединения во время
|
||||
рукопожатия. После проверки Xray штатно остановлен. Пункты ручной приёмки пока
|
||||
не отмечены.
|
||||
+5
-5
@@ -22,9 +22,9 @@ Non-gating замечания ревью приняты как риски мод
|
||||
1. Этот файл целиком, затем `/tmp/xray-simplify-Zeo5/06-simplify/sweep.md` —
|
||||
там точный line-level blast radius каждого пункта (секция 2 — срезы A/B,
|
||||
секция 3 — SIMP-N). Номера строк — ориентир, сверяй с фактическим кодом.
|
||||
2. `docs/specs/2026-07-15-headless-xray-proxy-design.md` — исходная спека.
|
||||
3. `xray-proxy/.local/bin/xray-proxy`, `xray-proxy/.config/xray-proxy/shell.bash`,
|
||||
`tests/test_xray_proxy.py`, `tests/test_xray_proxy_managed.py`.
|
||||
2. `docs/specs/2026-07-15-proxy-client-design.md` — исходная спека.
|
||||
3. `proxy-client/.local/bin/proxy-client`, `proxy-client/.config/proxy-client/shell.bash`,
|
||||
`tests/test_proxy_client.py`, `tests/test_proxy_client_managed.py`.
|
||||
|
||||
Команды проверки (обе обязательны):
|
||||
|
||||
@@ -88,11 +88,11 @@ Non-gating замечания ревью приняты как риски мод
|
||||
|
||||
- [x] `write_private_json`: простая запись файла с правами 0600 внутри
|
||||
уже-0700 каталога; O_EXCL/fsync/`os.replace`/PID-суффиксы удалены.
|
||||
- [x] Валидация `PROXY_PREFLIGHT_TIMEOUT` и `XRAY_PROXY_STOP_TIMEOUT` — один
|
||||
- [x] Валидация `PROXY_PREFLIGHT_TIMEOUT` и `PROXY_CLIENT_STOP_TIMEOUT` — один
|
||||
guard «`float()` успешен и > 0, иначе понятная ошибка»; `math` не
|
||||
импортируется; тесты экстремальных значений (nan/inf/1e-7/1e308)
|
||||
удалены. Для `PROXY_PREFLIGHT_TIMEOUT` оставить один тест «плохое
|
||||
значение → понятный отказ»; для `XRAY_PROXY_STOP_TIMEOUT` отдельного
|
||||
значение → понятный отказ»; для `PROXY_CLIENT_STOP_TIMEOUT` отдельного
|
||||
теста нет и добавлять его не нужно — достаточно guard'а.
|
||||
- [x] `check_reachable` использует `socket.create_connection(timeout=...)`
|
||||
без SIGALRM/setitimer-машинерии. Принятый риск (записан здесь):
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
# Токен-леджер проекта headless-xray-proxy
|
||||
# Токен-леджер проекта proxy-client
|
||||
|
||||
Затраты по этапам конвейера, для калибровки эффорта и планирования лимитов
|
||||
(5-часовые / недельные окна подписок). Прямое сравнение корректно внутри
|
||||
Reference in new issue
Block a user