[2026-09-15] eagle: family/how-to/truenas-infrastructure.md personal/tech/vless-space-subscription-egress.md personal/tech/xray-outbound-subscription-3xui.md
This commit is contained in:
@@ -18,7 +18,7 @@ tags:
|
||||
- balancerTag
|
||||
- sampling
|
||||
confidence: high
|
||||
status: blocked-egress-direct-observatory-mismatch
|
||||
status: done-egress-via-subscription-working
|
||||
related:
|
||||
- '[[family/plans/reverse-xray-3xui-kraken]]'
|
||||
- '[[personal/tech/xray-reverse-tunnel-kraken-truenas]]'
|
||||
@@ -28,23 +28,50 @@ related:
|
||||
|
||||
# `vless-space` — клиент 3x-ui, egress через внешнюю подписку
|
||||
|
||||
> # 🔴 2026-09-15 (финал сессии) — EGRESS `direct`. НЕ ЗАКРЫТО.
|
||||
> # 🏁 2026-09-15 (ЗАКРЫТО) — РАБОТАЕТ на штатной подписке. `space-` вычищен.
|
||||
>
|
||||
> **Живая проверка Alex: IP = `90.189.160.148` (TrueNAS)** → трафик `vless-space` НЕ идёт через подписку.
|
||||
> **Итог сессии:** статика `space-01…10` удалена, egress идёт через 28 серверов штатной подписки `sub1-*`.
|
||||
>
|
||||
> **Причина найдена:** `observatory.subjectSelector` = `["space-"]`, а outbound'ы теперь `sub1-*`.
|
||||
> | Проверка (факт) | Результат |
|
||||
> |---|---|
|
||||
> | `vless-proxy:1080` egress | ✅ `104.28.219.140` / `188.239.191.18` — НЕ `90.189.160.148` |
|
||||
> | `outbounds` | 31 = `direct`+`blocked`+`via-kraken` + **28 × `sub1-*`** |
|
||||
> | `space-*` | ❌ 0 — вычищено |
|
||||
> | `routing.balancers` | `space-balancer`, `selector: ["sub1-"]`, `leastLoad` |
|
||||
> | `burstObservatory.subjectSelector` | `["sub1-"]` |
|
||||
> | `routing.rules` | `{"user":["vless-space"], "balancerTag":"space-balancer"}` |
|
||||
> | ошибки `non existing outTag` | 0 |
|
||||
> | `in-10095-tcp` clients | `user1`, `kraken-user`, `vless-space` — целы |
|
||||
>
|
||||
> ```jsonc
|
||||
> "balancers": [ { "tag":"space-balancer", "selector":["sub1-"], "strategy":{"type":"leastLoad"} } ] // ✅
|
||||
> "observatory": { "subjectSelector":["space-"], ... "sampling":3 } // ❌ ПУСТО
|
||||
> "outbounds": 31 (3 + 28 × sub1-*) // ✅
|
||||
> ---
|
||||
>
|
||||
> ## 🔴 ПИТФОЛЛ (стоил сессии): поле observatory в UI = `burstObservatory`, НЕ `observatory`
|
||||
>
|
||||
> Xray 26.x принимает **обе** секции, но ведут они себя по-разному, и панель путает:
|
||||
>
|
||||
> | Что | Где живёт | Примечание |
|
||||
> |---|---|---|
|
||||
> | `observatory` | `xrayTemplateConfig.observatory` | классическая секция, требует `sampling: 3` |
|
||||
> | `burstObservatory` | `xrayTemplateConfig.burstObservatory` | `pingConfig{sampling, interval, destination}` — **рабочий вариант** |
|
||||
>
|
||||
> **Симптом ошибки:** правка секции в UI **удалила** `observatory` целиком (`jq 'has("observatory")'` → `false`), а `subjectSelector` остался `["space-"]` → балансировщик не пингует никого → **трафик молча падает в `direct`, ошибок в логе НЕТ**.
|
||||
>
|
||||
> **Как диагностировать правильно (3 команды, без остановки контейнера):**
|
||||
> ```bash
|
||||
> docker exec xray-admin cat /app/bin/config.json | jq -r 'keys[]' # ищем observatory ИЛИ burstObservatory
|
||||
> docker exec xray-admin cat /app/bin/config.json | jq -c '.burstObservatory // .observatory'
|
||||
> docker exec xray-admin cat /app/bin/config.json | jq -c '.routing.balancers' # selector должен матчить префикс подписки
|
||||
> ```
|
||||
> ⚠️ Я искал `observatory` и объявил секцию отсутствующей — она была, но под именем `burstObservatory`. **Проверять оба имени.**
|
||||
>
|
||||
> `subjectSelector` матчит `space-*` → после удаления статики **не пингуется ни один сервер** → `leastLoad` без живых кандидатов → трафик в первый outbound = `direct`. **Ошибок в логе НЕТ.**
|
||||
> ## 🔴 ПИТФОЛЛ: селектор балансировщика И `subjectSelector` observatory надо менять ПАРОЙ
|
||||
>
|
||||
> **ЧТО ОСТАЛОСЬ:** заменить `subjectSelector` → `["sub1-"]` (UI `Xray → Observatory` либо `xrayTemplateConfig` при остановленном контейнере), затем живой тест. Полный порядок — в [[personal/tech/xray-outbound-subscription-3xui]] §«Статус: ЧТО ОСТАЛОСЬ».
|
||||
> При переходе `space-` → `sub1-` недостаточно поменять `routing.balancers[].selector`. `observatory/burstObservatory.subjectSelector` — **отдельное поле**, и если его забыть, балансировщик не находит живых кандидатов.
|
||||
>
|
||||
> > ⚠️ Блок «ЗАДАЧА ВЫПОЛНЕНА» ниже относится к `xui_v9.db` со **статическими** `space-01…10` — та конфигурация работала. Она заменена штатной подпиской (`sub1-*`), где egress пока нет.
|
||||
> ## 🔴 ПИТФОЛЛ: подмена `x-ui.db` при живом контейнере ТЕРЯЕТ панельные данные
|
||||
>
|
||||
> Скачал БД при работающем контейнере → UI-правки жили в `-wal` → `cp` перезаписал файл → **запись `outbound_subscriptions` потеряна**. Alex восстанавливал подписку в UI заново.
|
||||
> **Правило:** `docker stop` ДО скачивания БД. Либо читать WAL через `strings x-ui.db-wal` (а не `sqlite3` на файле).
|
||||
|
||||
> # 🏁 ИСТОРИЯ: 2026-09-15 22:30 — на статике `space-01…10` egress РАБОТАЛ (`xui_v9.db`)
|
||||
>
|
||||
|
||||
@@ -19,7 +19,7 @@ tags:
|
||||
- subjectSelector
|
||||
- wal
|
||||
confidence: high
|
||||
status: blocked-egress-direct-observatory-mismatch
|
||||
status: done-egress-via-subscription-working
|
||||
related:
|
||||
- '[[family/how-to/truenas-infrastructure]]'
|
||||
- '[[personal/tech/xray-reverse-tunnel-kraken-truenas]]'
|
||||
@@ -29,29 +29,29 @@ related:
|
||||
|
||||
# Xray outbound из внешней подписки в 3x-ui (`vless-space`)
|
||||
|
||||
> ## 🔴 2026-09-15 (финал сессии) — EGRESS ВСЁ ЕЩЁ `direct`. НЕ ЗАКРЫТО.
|
||||
> ## 🏁 2026-09-15 (ЗАКРЫТО) — EGRESS РАБОТАЕТ через штатную подписку
|
||||
>
|
||||
> **Статус на конец сессии:** архитектура собрана, но трафик `vless-space` уходит в `direct`, а не через подписку. Подтверждено Alex живым запросом — **IP = `90.189.160.148` (TrueNAS)**, т.е. egress НЕ работает.
|
||||
> **Статус:** всё собрано и проверено живым запросом. `space-` вычищен, 28 серверов подписки `sub1-*` работают.
|
||||
>
|
||||
> **Что осталось (одна правка, не выполнена):** `observatory.subjectSelector` = `["space-"]`, а должен быть `["sub1-"]`.
|
||||
> | Проверка (факт) | Результат |
|
||||
> |---|---|
|
||||
> | `vless-proxy:1080` egress | ✅ `104.28.219.140` / `188.239.191.18` — НЕ `90.189.160.148` |
|
||||
> | `outbounds` | 31 = 3 базовых + **28 × `sub1-*`** |
|
||||
> | `balancers` | `space-balancer`, `selector: ["sub1-"]`, `leastLoad` |
|
||||
> | `burstObservatory.subjectSelector` | `["sub1-"]` |
|
||||
> | `non existing outTag` в логе | 0 |
|
||||
> | клиенты 10095 | `user1`, `kraken-user`, `vless-space` — целы |
|
||||
>
|
||||
> ```jsonc
|
||||
> // ФАКТИЧЕСКОЕ состояние config.json на момент завершения сессии:
|
||||
> "balancers": [ { "tag": "space-balancer", "selector": ["sub1-"], "strategy": {"type":"leastLoad"} } ] // ✅ верно
|
||||
> "observatory": { "subjectSelector": ["space-"], ... "sampling": 3 } // ❌ ПУСТО — space-* удалены
|
||||
> "routing.rules": [ { "user":["vless-space"], "balancerTag":"space-balancer" } ] // ✅ верно
|
||||
> "outbounds": 31 (3 базовых + 28 × sub1-*) // ✅ верно
|
||||
> ```
|
||||
>
|
||||
> **Механизм отказа:** `observatory.subjectSelector` матчит `space-*` → после удаления статики **ни один сервер не пингуется** → `leastLoad` не находит живых кандидатов → трафик падает в **первый outbound списка** (`direct`). **Молча: ошибок в логе нет, `non existing outTag` не появляется.**
|
||||
>
|
||||
> **Правка:** в панели `Xray → Observatory` (или Settings → Xray Config) заменить `subjectSelector` `space-` → `sub1-`. Либо через `xrayTemplateConfig` в БД — **обязательно** по безопасному порядку (см. §WAL ниже).
|
||||
>
|
||||
> 🔑 **ПРАВИЛО:** selector балансировщика и `observatory.subjectSelector` — **ДВА РАЗНЫХ ПОЛЯ, менять ВМЕСТЕ.** Сменил префикс подписки — проверь ОБА. Проверка:
|
||||
> 🔴 **ГЛАВНЫЙ ПИТФОЛЛ СЕССИИ — имя поля:** в UI правится **`burstObservatory`**, а не `observatory`. Я искал `observatory`, получил `has("observatory")` → `false` и **ошибочно объявил секцию отсутствующей** — она была под другим именем. Диагностика:
|
||||
> ```bash
|
||||
> docker exec xray-admin cat /app/bin/config.json | jq -c '{bal:.routing.balancers[0].selector, obs:.observatory.subjectSelector}'
|
||||
> # оба должны быть одинаковы, напр. ["sub1-"]
|
||||
> docker exec xray-admin cat /app/bin/config.json | jq -r 'keys[]'
|
||||
> docker exec xray-admin cat /app/bin/config.json | jq -c '.burstObservatory // .observatory'
|
||||
> ```
|
||||
> ⚠️ **Обе секции валидны для Xray 26.x.** `observatory` требует `sampling: 3`; `burstObservatory` использует `pingConfig{sampling, interval, destination}`. Панель при сохранении может удалить `observatory` и создать `burstObservatory` — проверять ОБА.
|
||||
>
|
||||
> 🔴 **Правило:** `routing.balancers[].selector` и `observatory|burstObservatory.subjectSelector` — **ДВА разных поля, менять ПАРОЙ.**
|
||||
>
|
||||
> **Историческая формулировка (до фикса) — оставлена ниже для контекста.**
|
||||
|
||||
> ## 🏁 Архитектура (собрана и подтверждена; egress — см. блок выше)
|
||||
>
|
||||
|
||||
Reference in New Issue
Block a user