Единый VLESS-шлюз (xray-core): один не-RU egress со smart-routing для проброса прокси в любой проект/сервис; обход гео-блокировок и РКН-DPI. Импорт подписки, авто-обновление, пинг/выбор лучших нод, self-heal, autostart; фасад Gateway + адаптеры httpx/requests/playwright/telethon.
Project description
sh-xray — единый VPN-шлюз (skill-hub xray) для всех AI-навыков
Один общий SOCKS5-прокси (xray-core) с НЕ-российской нодой и smart-routing
(РУ/CN → напрямую, остальное → за рубеж). Пишет общий указатель
~/.sh-xray.json, который читают ВСЕ навыки (паттерн open_client._apply_proxy).
Системный трафик НЕ трогает (только opt-in инструменты через ALL_PROXY) — РУ-сервисы не ломаются.
Команды
CLI xray-gate — на clikit (даёт --json/--help/--version):
xray-gate install # xray binary + geoip/geosite (качает с GitHub-релиза XTLS/Xray-core)
xray-gate test # выбрать рабочую НЕ-RU ноду (проверка реального выхода через ipinfo.io)
xray-gate start [--port N] # поднять + записать ~/.sh-xray.json (порт по умолч. 10810)
xray-gate status # alive + live exit country
xray-gate stop
xray-gate ensure # self-heal: поднять, если процесс умер (после reboot/краша)
xray-gate autostart # Windows Task Scheduler: ensure каждые 10 мин (переживает reboot)
xray-gate autostart --remove
xray-gate add-sub <url> # своя VLESS-подписка (vless/base64; авто-обновление по интервалу подписки)
Без установки китов (свежая машина, handoff-бандл) — тот же набор через dep-free ядро:
python xray_gate/_core.py <команда> (чистый stdlib, никаких зависимостей). Именно его
дёргает watchdog (ensure каждые 10 мин), чтобы self-heal не зависел от китов.
Построен на Китах (S-kits)
sh-xray — НЕ кит, а супернавык/сервис, который строится на китах:
clikit даёт человеческий CLI (xray_gate/cli.py), librarykit.config_util — атомарную
запись общих указателей (~/.sh-xray.json, ~/.sh-gateway.json). Ядро-движок
(xray_gate/_core.py, бывший top-level gateway.py) намеренно остаётся на чистом stdlib —
у обоих kit-обращений есть stdlib-фолбэк, поэтому self-heal работает даже без китов.
gateway-роутер потребляет egress sh-xray через свой ProxyProvider (читает ~/.sh-xray.json).
Переживает перезагрузку
autostart ставит задачу планировщика (ensure каждые 10 мин, StartWhenAvailable). После reboot
старый pid мёртв → ensure поднимает xray заново (при старте/в течение ~10 мин). ~/.sh-xray.json
обновляется новым pid, все навыки снова ходят через прокси. Без autostart — поднимать вручную start.
Общий указатель ~/.xray-gate/state.json
{"http_proxy": "http://127.0.0.1:10811", "all_proxy": "socks5h://127.0.0.1:10810", "node": "...", "backend": "xray-gate"}
Потребители читают его и ходят через ОДИН egress (важно: один IP для логина И API, иначе Google убивает сессию).
Всё хозяйство рантайма — под ~/.xray-gate/ (state.json/routing.json/byedpi/zapret/бинарь).
Потребление в проектах (egress «из коробки»)
xray-gate — источник пути (его знает он, не нейтральный librarykit-корень). Потребитель ставит его как egress-расширение и берёт прокси у его адаптеров. Установка (на PyPI НЕТ — из git):
uv add --optional egress "s-xray-gate @ git+https://gitlab.com/s-skills/s-xray-gate.git" # запишет в pyproject+lock
uv sync --extra egress # или: pip install git+https://gitlab.com/s-skills/s-xray-gate.git
4 способа взять прокси (нет указателя/шлюз не поднят → None → проект идёт напрямую):
import xray_gate.adapters as eg
httpx.Client(proxy=eg.httpx_proxy()) # socks5h://127.0.0.1:10810
sess = eg.requests_session() # requests.Session с прокси
browser.launch(proxy=eg.playwright_proxy()) # {"server":"socks5://..."}
TelegramClient(s, api_id, api_hash, proxy=eg.telethon_proxy())
# через нейтральный librarykit-транспорт (проект на китах):
from librarykit import HttpClient, HttpxTransport
HttpClient(HttpxTransport(proxy=eg.httpx_proxy()), auth, errmap)
# env-wide (subprocess/curl/любой ALL_PROXY-клиент):
from xray_gate import apply_to_env; apply_to_env("notebooklm") # по карте ~/.xray-gate/routing.json
# zero-dep (без установки пакета — просто JSON):
import json, pathlib
proxy = json.loads((pathlib.Path.home()/".xray-gate"/"state.json").read_text())["all_proxy"]
Реальный пример-потребитель — bublictr (adapters/_common/browser.py): BUBLICTR_BROWSER_PROXY=shxray
→ xray_gate.adapters.playwright_proxy().
Портативность / другие устройства
install качает xray-core сам. add-sub <url> + test подберёт не-RU ноду. Так работает на любой машине/агенте.
Замечание по нодам
Качество зависит от подписки. Нестабильная нода → таймауты (xray ретраит, но лучше иметь несколько не-RU нод).
status показывает live exit; test перевыбирает рабочую.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file s_xray_gate-0.2.0.tar.gz.
File metadata
- Download URL: s_xray_gate-0.2.0.tar.gz
- Upload date:
- Size: 65.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
73f3d72f16c4a3ed2d69d2660ca49bb7f250be8f96615ed4aa147d8774f92ea4
|
|
| MD5 |
03c50cc921773a06ac0163717371af9f
|
|
| BLAKE2b-256 |
9996f3ba4a992f4bee0aaf9e32f3949e7806c50f193106ddecc66efcb4296f02
|
File details
Details for the file s_xray_gate-0.2.0-py3-none-any.whl.
File metadata
- Download URL: s_xray_gate-0.2.0-py3-none-any.whl
- Upload date:
- Size: 55.4 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.26 {"installer":{"name":"uv","version":"0.11.26","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
aee6912e43c67b43a3f5382c3307f1a70b5b8c638c19146b109ca3adc6366b8c
|
|
| MD5 |
121f6de233da845c4ba84b9a1d8ad265
|
|
| BLAKE2b-256 |
8f275423b570663b0a83d7033626dfab8baa48abe0744d930c3c7357d14d2d30
|