[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:
@@ -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», ставить 6–12 ч; 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` утрачен — разбор
|
||||
|
||||
|
||||
Reference in New Issue
Block a user