diff --git a/family/how-to/truenas-infrastructure.md b/family/how-to/truenas-infrastructure.md index 240e17f7..581c2385 100644 --- a/family/how-to/truenas-infrastructure.md +++ b/family/how-to/truenas-infrastructure.md @@ -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 sh -c "strings "`** — штатный приём чтения бинарных/config-файлов внутри контейнера TrueNAS, где нет `sqlite3`/`jq`/`python3`. > - **`docker run --rm -v /mnt/RED_2TB/docker/...:/d alpine cat ...`** — рабочий приём чтения root-owned конфигов TrueNAS (`docker cp` с копированием БД на хост тоже работает). diff --git a/personal/tech/vless-space-subscription-egress.md b/personal/tech/vless-space-subscription-egress.md index 7176207f..ffde9179 100644 --- a/personal/tech/vless-space-subscription-egress.md +++ b/personal/tech/vless-space-subscription-egress.md @@ -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'а. ## Открытые риски (проверено) diff --git a/personal/tech/xray-outbound-subscription-3xui.md b/personal/tech/xray-outbound-subscription-3xui.md index 9f7899ec..7c52b5df 100644 --- a/personal/tech/xray-outbound-subscription-3xui.md +++ b/personal/tech/xray-outbound-subscription-3xui.md @@ -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`. |