[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:
@@ -396,9 +396,17 @@ arr, caddy, cups, filebrowser, gitea, hermes, immich, inpx-web, inpxer, library,
|
||||
> | 6 | Проверка фактом: egress = IP из подписки | ⏳ не начат |
|
||||
> | 7 | Обновить доки | ⏳ не начат |
|
||||
>
|
||||
> ### 🔴 ИСПРАВЛЕНИЕ (2026-09-15, финал): «панель не нужна» — НЕВЕРНО. Панель нужна.
|
||||
>
|
||||
> Прежний вывод «панель 3x-ui не нужна для этой задачи» — **благополучно опровергнут шестью попытками.** Через БД работает **только** `xrayTemplateConfig` (outbound'ы + правила + балансировщик — они применились фактом). **Клиентов инбаунда через SQLite добавить нельзя** — 3x-ui рендерит их из внутреннего состояния.
|
||||
>
|
||||
> **🔴 ЕЩЁ ОДИН ПИТФОЛЛ (6-я попытка):** попытка положить **существующий** инбаунд `in-10095-tcp` (с тремя клиентами) **внутрь** `xrayTemplateConfig` **сломала `kraken-user`**. 3x-ui мёржит шаблон с таблицей `inbounds`, и шаблонная версия того же тега **перебивает** панельную. В шаблоне — только `outbounds`/`routing.rules`/`balancers`/`observatory`. **Инбаунды — эксклюзив панели.**
|
||||
>
|
||||
> **Итог:** БД откачена Alex'ом, система в исходном состоянии (`user1` + `kraken-user`, 3 outbound'а). Задача ждёт доступа к панели: (А) Alex добавляет клиента через UI; (Б) Alex выдаёт API-токен (Settings → API Tokens). Подробный разбор — [[personal/tech/vless-space-subscription-egress]] §«ПИТФОЛЛ: инбаунд внутри xrayTemplateConfig».
|
||||
>
|
||||
> ### ⚠️ Питфоллы, выявленные в этой сессии
|
||||
> - **🔴 SSH к TrueNAS обрывается на `docker stop xray-admin`.** Первое выполнение `docker stop` завершилось `closed by remote host` — контейнер при этом **перезапустился сам** (`restart: unless-stopped`). Длинные операции с остановкой контейнеров делать **одной короткой командой**, а не серией вызовов.
|
||||
> - **Панель 3x-ui не нужна для этой задачи.** `/login` с `admin/admin` → **403**; но правка идёт через `settings.xrayTemplateConfig`, доступного по БД. Не подбирать пароль, не требовать креды.
|
||||
> - **~~Панель 3x-ui не нужна~~ → ❌ ОПРОВЕРГНУТО (см. выше).** Для клиентов инбаунда панель **обязательна**.
|
||||
> - **Xray-сервер ≠ Xray-клиент.** `vless-proxy` — клиент (SOCKS → наружу), `xray-admin` — сервер (принимает). `xray-admin` ходит наружу только через свои **outbound'ы**; подписка превращается в набор outbound'ов внутри `xrayTemplateConfig`.
|
||||
> - **`docker exec <c> sh -c "strings <file>"`** — штатный приём чтения бинарных/config-файлов внутри контейнера TrueNAS, где нет `sqlite3`/`jq`/`python3`.
|
||||
> - **`docker run --rm -v /mnt/RED_2TB/docker/...:/d alpine cat ...`** — рабочий приём чтения root-owned конфигов TrueNAS (`docker cp` с копированием БД на хост тоже работает).
|
||||
|
||||
@@ -410,7 +410,35 @@ Alex восстановил БД из бэкапа. **Проверено фак
|
||||
|
||||
**Пережило откат (единственный полезный артефакт в системе):** `/mnt/RED_2TB/docker/xray-admin/docker-compose.yml` — восстановленный compose, `docker compose config` валиден, `docker compose ps` распознаёт контейнер.
|
||||
|
||||
> 🔴 **Хард-вывод для будущих сессий: НЕ тратить попытки на правку клиентов 3x-ui через SQLite. Сразу просить доступ к панели (пароль или API-токен).** Пять подходов в этой сессии (копия БД, прямой SQL, `auth`/`reverse`, `security`, `password`) — все отбились, при том что БД каждый раз была полностью корректна. Провал не в данных, а в архитектуре 3x-ui.
|
||||
> 🔴 **Хард-вывод для будущих сессий: НЕ тратить попытки на правку клиентов 3x-ui через SQLite. Сразу просить доступ к панели (пароль или API-токен).** Шесть подходов в этой сессии (копия БД, прямой SQL, `auth`/`reverse`, `security`, `password`, инбаунд-в-шаблоне) — все отбились, при том что БД каждый раз была полностью корректна. Провал не в данных, а в архитектуре 3x-ui.
|
||||
|
||||
## 🔴 ПИТФОЛЛ 2026-09-15 (найден на 6-й попытке): инбаунд ВНУТРИ `xrayTemplateConfig` ломает своих клиентов
|
||||
|
||||
**Что делалось:** собрана БД `xui_v6.db`, где `vless-space` положен в **существующий** `in-10095-tcp` — но не в таблицу `inbounds`, а **в сам `settings.xrayTemplateConfig`** (инбаунд `in-10095-tcp` объявлен внутри шаблона рядом с `api`, с тремя клиентами).
|
||||
|
||||
**Симптом у Alex после заливки:** `kraken-user` отвалился. Вывод `jq` показывал `in-10095-tcp` **дважды** — с `user1,kraken-user,vless-space` (из шаблона) и с `user1,kraken-user` (из таблицы `inbounds`).
|
||||
|
||||
**Причина:** 3x-ui **мёржит** шаблон с таблицей `inbounds`. Инбаунд с тем же тегом (`in-10095-tcp`) из шаблона **перебивает** тот, которым управляет панель: панель рендерит клиентов из своего кэша (`client_traffics`/`client_inbounds`), а шаблонная версия инбаунда их **перетирает** — egress-правила привязываются к email, которых в активном инбаунде не остаётся.
|
||||
|
||||
**Как выглядела рабочая (живая) БД — эталон:**
|
||||
|
||||
```
|
||||
шаблон (xrayTemplateConfig): api + 13 outbounds + 5 routing-rules + balancer + observatory
|
||||
⛔ in-10095-tcp В ШАБЛОНЕ НЕТ ВООБЩЕ
|
||||
таблица inbounds (id=1): in-10095-tcp port=10095 clients=user1,kraken-user
|
||||
```
|
||||
|
||||
**Вывод — как правильно:**
|
||||
|
||||
| Что | Где держать |
|
||||
|---|---|
|
||||
| `space-01…10`, правило `vless-space-via-subscription`, `space-balancer`, `observatory` | ✅ **в `xrayTemplateConfig`** (работает) |
|
||||
| `in-10095-tcp` **сам инбаунд** | ⛔ **НЕ в шаблоне** — только в таблице `inbounds`, которой владеет панель |
|
||||
| клиент `vless-space` | ⛔ извне не добавляется (см. выше) — **только панель/API** |
|
||||
|
||||
> 🔴 **Сухой остаток сессии: не мешать два механизма.** Шаблон = только «дополнение» (outbound'ы/правила). Всё, что касается инбаундов и их клиентов, — эксклюзивно панель. Попытка протащить инбаунд через шаблон ломает чужих клиентов (`kraken-user`), а не решает задачу.
|
||||
|
||||
**Откат:** Alex восстановил БД из бэкапа; система вернулась к `user1` + `kraken-user`, 3 outbound'а.
|
||||
|
||||
## Открытые риски (проверено)
|
||||
|
||||
|
||||
@@ -43,6 +43,7 @@ related:
|
||||
| **Править `settings.xrayTemplateConfig` в `x-ui.db`, а не `config.json`** | ✅ **Подтверждено фактом:** 3x-ui генерирует `/app/bin/config.json` из БД. `/app/bin/config.json` править бесполезно (перезапишется). Из шаблона применились все 13 outbound'ов + балансировщик. |
|
||||
| **Развернуть серверы подписки в обычные outbound'ы** | Не зависит от версии панели. Работает сразу после `docker start`. |
|
||||
| **НЕ полагаться на `inbounds` в SQL — только панель** | 🔴 **Урок сессии:** клиенты инбаунда через SQLite снаружи **не применяются**. 3x-ui держит БД открытой, пишет в `-wal`, и при рестарте берёт список клиентов из своей внутренней памяти, а не из файла. Четыре подхода (INSERT в `clients`, правка `inbounds.settings`, фикс `NULL`, дописать `security`) — все отбились. |
|
||||
| **НЕ класть существующий инбаунд в `xrayTemplateConfig`** | 🔴 **Урок 6-й попытки (2026-09-15):** попытка протащить `in-10095-tcp` с тремя клиентами внутрь шаблона **сломала `kraken-user`** — 3x-ui мёржит шаблон с таблицей `inbounds`, и шаблонная версия того же тега перебивает панельную (клиенты исчезают, egress-правило по email не срабатывает). В шаблоне — **только outbound'ы/правила/балансировщик**. Инбаунды — эксклюзив панели. |
|
||||
| **`leastPing` + `observatory`** | Alex: «авто брать» — все 10 серверов в пул, живой выбирается сам. `observatory` **обязателен**, иначе балансировщик не знает задержек. ✅ Оба ключа приняты Xray 26.7.28. |
|
||||
| **Правило по `user`, а не по клиентскому id** | Образец взят с рабочего `kraken-user-via-reverse`: Xray матчит клиента inbound'а по `email`. |
|
||||
|
||||
|
||||
Reference in New Issue
Block a user