[2026-09-15] eagle: family/how-to/truenas-infrastructure.md family/how-to/truenas-infrastructure.md.bak-before-drop-changelog family/how-to/truenas-infrastructure.md.bak-before-merge-dup-header personal/tech/vault-doc-pruning.md personal/tech/vless-space-subscription-egress.md personal/tech/vless-space-subscription-egress.md.bak-before-squeeze-history personal/tech/vless-space-subscription-egress.md.bak-before-squeeze2 personal/tech/xray-outbound-subscription-3xui.md

This commit is contained in:
Alexey Martemyanov
2026-09-15 17:45:27 +06:00
parent 548bedf3cd
commit 397847b50b
8 changed files with 3428 additions and 349 deletions
@@ -29,6 +29,31 @@ related:
# Xray outbound из внешней подписки в 3x-ui (`vless-space`)
> ## 📱 КЛИЕНТСКАЯ СТОРОНА: как включить авто-обновление (вопрос Alex 2026-09-15)
>
> **Симптом вопроса:** «можно поменять на xray subscription channel (auto), чтобы он автоматом обновлял сервера?» — типичная ошибка: в клиент вбит **готовый `vless://…` ключ** вместо **ссылки подписки**. Ключ — статика, он не обновляется никогда.
>
> **Что отдаёт сервер (проверено HTTP 200):**
>
> | Клиент | Ссылка подписки |
> |---|---|
> | `user1` | `https://vpn-panel.mallexxx.duckdns.org/sub/68c5cy5n5ui138yh` |
> | `kraken-user` | `https://vpn-panel.mallexxx.duckdns.org/sub/f43074a029dc656e` |
> | `vless-space` | `https://vpn-panel.mallexxx.duckdns.org/sub/24df9391356b48ff` |
>
> Отдаётся **base64-список** `vless://` — именно это клиент тянет как «subscription channel».
>
> **Включение авто в клиенте — 3 шага:**
> 1. **Удалить** вручную вбитый профиль/сервер (напр. `vless-ws-user1`).
> 2. **Add subscription / «Подписка»** → вставить **полный URL с `/sub/<subId>`** (без пути `/sub` не сработает).
> 3. В настройках подписки включить **auto update** (v2rayN / Happ / NekoBox — галочка «Auto update interval», ставить 612 ч; Streisand / sing-box — свой путь в меню).
>
> ⚠️ **Три разных «авто» — не путать** (см. таблицу в [[family/how-to/truenas-infrastructure]] §«Sub-канал»): GUI-клиент тянет `/sub/<subId>`; **`xray-admin` (сервер) сам тянет внешнюю `profilegrid` через `outbound_subscriptions` (600 с)**; `vless-proxy` авто не умеет.
>
> 🔴 **Одно неверное утверждение, которое из-за этого убрано из доки:** «Xray в docker подписки не умеет → авто только в GUI» — верно только для **контейнера-клиента** (`vless-proxy`), но **НЕ для сервера `xray-admin`**, у которого штатное авто через `outbound_subscriptions`. Причина путаницы: оба — «Xray в docker».
>
> **Безопасность:** `/sub/<subId>` отдаётся **без авторизации** — кто знает `subId`, получает рабочий ключ. Возможный фикс — подписка по токену/`subUpdates`. Решения нет, вопрос открыт с 2026-09-15.
> ## 🏁 2026-09-15 (ЗАКРЫТО) — EGRESS РАБОТАЕТ через штатную подписку
>
> **Статус:** всё собрано и проверено живым запросом. `space-` вычищен, 28 серверов подписки `sub1-*` работают.
@@ -240,33 +265,21 @@ docker logs --since 3m xray-admin 2>&1 | grep -c "non existing" # ожидае
`/sub/<subId>` отдаётся **без авторизации** (`/sub/abc` тоже 200). Варианты: подписка по токену, ротация `subId`. Задано Alex 2026-09-15, решения нет.
## Статус: ЧТО ОСТАЛОСЬ СДЕЛАТЬ (передать следующей сессии)
## Статус: ✅ ВСЁ ЗАКРЫТО 2026-09-15
**1. `observatory.subjectSelector`: `["space-"]` → `["sub1-"]`**единственная причина, почему egress падает в `direct`.
**1. `observatory.subjectSelector` = `["sub1-"]`****СДЕЛАНО.** Причина «трафика в `direct`» устранена. Факт: `bal == obs == ["sub1-"]`.
> 🔴 **Поправка к формулировке плана:** правило писать не `observatory`, а **`burstObservatory`** (Alex правил в UI, панель создала `burstObservatory` с `pingConfig`). Правка по `$.observatory.subjectSelector` в этом случае **не находит цель**. Проверять оба имени.
Путь через UI: `Xray → Observatory` (или `Settings → Xray Config → observatory`) → поле `subjectSelector` → заменить чип `space-` на `sub1-` → Save → `docker restart xray-admin`.
**2. Дубль балансировщика `vless-space-balancer`** — ✅ **УДАЛЁН Alex'ом в UI.** В конфиге ровно один балансировщик. *(Мой прошлый отчёт о «дубле» строился на устаревшем замере — актуальный факт: дубля нет.)*
Путь через БД (`xrayTemplateConfig`)**строго по порядку**:
**3. Живой тест egress** **ОК:** `vless-proxy:1080``104.28.219.140` / `188.239.191.18`, ≠ `90.189.160.148`.
**Проверка одним запросом (все 4 условия сразу, актуальная):**
```bash
# 1) СНАЧАЛА остановить контейнер (иначе WAL потеряется — см. §КРИТИЧНЫЙ ПИТФОЛЛ)
docker stop xray-admin
# 2) скачать БД на Mac, править ЛОКАЛЬНО, проверить
sqlite3 xui.db "PRAGMA journal_mode=DELETE;"
sqlite3 xui.db "UPDATE settings SET value = json_set(value, '$.observatory.subjectSelector', json('[\"sub1-\"]')) WHERE key='xrayTemplateConfig';"
sqlite3 xui.db "PRAGMA integrity_check;" # → ok
rm -f xui.db-wal xui.db-shm
# 3) залить, chown 950:root, старт
```
**2. Удалить дубль балансировщика** `vless-space-balancer` в `Xray → Balancers` (мусор, ни на что не влияет).
**3. Живой тест egress** — после правки IP должен стать нероссийским, не `90.189.160.148`.
**Проверка одним запросом (все 4 условия сразу):**
```bash
docker exec xray-admin cat /app/bin/config.json | jq -c '{bal:.routing.balancers[0].selector, obs:.observatory.subjectSelector, sub1:([.outbounds[].tag|select(startswith("sub1-"))]|length), rule:[.routing.rules[]|select(.balancerTag!=null)]|length}'
# ожидается: bal==obs==["sub1-"], sub1>=1, rule==1
docker exec xray-admin cat /app/bin/config.json | jq -c '{bal:.routing.balancers[0].selector, obs:(.burstObservatory // .observatory).subjectSelector, sub1:([.outbounds[].tag|select(startswith("sub1-"))]|length), rule:([.routing.rules[]|select(.balancerTag!=null)]|length)}'
# ожидается: bal==obs==["sub1-"], sub1==28, rule==1
```
⚠️ `.burstObservatory // .observatory` в `jq`**обязателен**, иначе на живом конфиге получите `null` и ложный вывод «секции нет».
## Связанные заметки
@@ -274,29 +287,32 @@ docker exec xray-admin cat /app/bin/config.json | jq -c '{bal:.routing.balancers
- [[personal/tech/xray-reverse-tunnel-kraken-truenas]] — reverse-туннель (отдельный механизм)
- [[personal/tech/vless-space-subscription-egress]] — история отладки egress
- [[family/how-to/vps-qentra]] — удалённый VPS (источник мёртвого `v.qentra.top`)
- [[personal/tech/vault-doc-pruning]] — метод чистки устаревших разделов в доках
## 🔴 Попутные находки (2026-09-15)
### 1. `hermes-taiga` ходит НЕ через `xray-admin`, а через `vless-proxy` (мёртвый)
### 1. `hermes-taiga` ходит НЕ через `xray-admin`, а через `vless-proxy` — ✅ **ПОЧИНЕНО**
| | |
|---|---|
| Env `hermes-taiga` | `TELEGRAM_PROXY=socks5://vless-proxy:1080`, `DISCORD_PROXY=socks5://vless-proxy:1080` |
| Сети | `hermes_taiga_net`, `ha_default`с `caddy_default` (`xray-admin`) **не пересекается** |
| `vless-proxy` | `teddysun/xray:latest`, SOCKS `:1080` + HTTP `:1081`, outbound → **`v.qentra.top:443` (мёртв, VPS удалён)** |
| `vless-proxy` | `teddysun/xray:latest`, SOCKS `:1080` + HTTP `:1081` |
| `user1` | `ce320965-…` — клиент `in-10095-tcp`, `hermes-taiga` к нему **не обращается** |
**Следствие:** Telegram/Discord у `hermes-taiga` сейчас без сети. **Как чинить (НЕ выполнено):** переписать outbound `/mnt/RED_2TB/docker/vless-proxy/config.json`:
**✅ ФИНАЛ: `vless-proxy` переключён с мёртвого `v.qentra.top` на `vpn.mallexxx.duckdns.org`.**
| Поле | Сейчас | Станет |
|---|---|---|
| `address` | `v.qentra.top` | `vpn.mallexxx.duckdns.org` |
| `users[0].id` | `2D9F24C4-…` | `ce320965-6956-4759-84bb-7cb71cfc6252` (`user1`) |
| `tlsSettings.serverName` | `v.qentra.top` | `vpn.mallexxx.duckdns.org` |
| `wsSettings.headers.Host` | `v.qentra.top` | `vpn.mallexxx.duckdns.org` |
| `wsSettings.path` | `/qentra` | `/vless` |
| Поле в `/mnt/RED_2TB/docker/vless-proxy/config.json` | Стало |
|---|---|
| `address` | `vpn.mallexxx.duckdns.org` |
| `users[0].id` | `a792c483-07e2-4723-9c50-78054c0abc07`**клиент `vless-space`, НЕ `user1`** |
| `tlsSettings.serverName` | `vpn.mallexxx.duckdns.org` |
| `wsSettings.headers.Host` | `vpn.mallexxx.duckdns.org` |
| `wsSettings.path` | `/vless` |
> ⚠️ Побочный эффект: трафик пойдёт `vless-proxy → vpn.mallexxx.duckdns.org:443 → Caddy → xray-admin` на том же хосте → egress = IP TrueNAS `90.189.160.148`. Петля внутри TrueNAS.
> 🔑 **Решение Alex: брать `vless-space`, а не `user1`** — иначе egress был бы IP TrueNAS `90.189.160.148` (петля внутри TrueNAS). С `vless-space` трафик уходит через подписку (нероссийский IP).
> ⚠️ **Файл агенту недоступен:** `/mnt/RED_2TB/docker/vless-proxy/` — `root:root 755`, `config.json` примонтирован `:ro`. Правку делает **Alex от root**; агент готовит конфиг локально (`~/tmp-xray-space/vless-proxy-config-new.json`).
> ⚠️ **Питфолл проверки:** `wget` **не умеет SOCKS5** — `docker exec vless-proxy wget -qO- https://api.ipify.org` вернёт IP контейнера и даст ложный вывод «direct». Проверять только curl через SOCKS (см. §Проверка в шапке).
### 2. Compose-файл `xray-admin` утрачен — разбор