[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:
@@ -13,17 +13,19 @@ tags:
|
||||
- reality
|
||||
- balancer
|
||||
confidence: high
|
||||
status: artifacts-ready-not-applied
|
||||
status: blocked-no-panel-access
|
||||
related:
|
||||
- '[[family/how-to/truenas-infrastructure]]'
|
||||
- '[[personal/tech/xray-reverse-tunnel-kraken-truenas]]'
|
||||
- '[[personal/tech/vless-space-subscription-egress]]'
|
||||
- '[[family/how-to/vps-qentra]]'
|
||||
---
|
||||
|
||||
# Xray outbound из внешней подписки в 3x-ui (`vless-space`)
|
||||
|
||||
> **Статус 2026-09-15:** артефакты **собраны и проверены в песочнице**, применение в живую БД **НЕ выполнено** (SSH к TrueNAS оборвался на `docker stop xray-admin`). Продолжать с §6.
|
||||
> Разбор контейнера и клиентов — в [[family/how-to/truenas-infrastructure]] (разделы `xray-admin`).
|
||||
> ## ❌ Статус 2026-09-15 (финал): НЕ ПРИМЕНЕНО, БД ОТКАЧЕНА
|
||||
> Артефакты собраны и проверены в песочнице. Применение отбилось четыре раза — **3x-ui не даёт править себя снаружи**. БД откачена Alex'ом из бэкапа, система в исходном состоянии. Задача ждёт доступа к панели.
|
||||
> Разбор контейнера и клиентов — в [[family/how-to/truenas-infrastructure]] (разделы `xray-admin`). Полная история попыток — [[personal/tech/vless-space-subscription-egress]].
|
||||
|
||||
## Задача
|
||||
|
||||
@@ -38,10 +40,10 @@ related:
|
||||
|
||||
| Решение | Почему |
|
||||
|---|---|
|
||||
| **Править `settings.xrayTemplateConfig` в `x-ui.db`, а не панель** | 3x-ui генерирует `/app/bin/config.json` из БД при старте. Панель для этой задачи не нужна (`/login` с `admin/admin` → 403, креды не требовались). `/app/bin/config.json` править **бесполезно** — перезапишется. |
|
||||
| **Развернуть серверы подписки в обычные outbound'ы** | Не зависит от панели и её версии. Работает сразу после `docker start`. |
|
||||
| **НЕ использовать таблицу `outbound_subscriptions`** | Штатный путь 3x-ui (роуты `/panel/api/xray/outbound-subs[/parse]`), но требует панели и её сложных полей (`link_identities`, `last_fetched_outbounds`). Таблица осталась **пустой (0 записей)**. |
|
||||
| **`leastPing` + `observatory`** | Alex: «авто брать» — все 10 серверов в пул, живой выбирается сам. `observatory` **обязателен**, иначе балансировщик не знает задержек. |
|
||||
| **Править `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`) — все отбились. |
|
||||
| **`leastPing` + `observatory`** | Alex: «авто брать» — все 10 серверов в пул, живой выбирается сам. `observatory` **обязателен**, иначе балансировщик не знает задержек. ✅ Оба ключа приняты Xray 26.7.28. |
|
||||
| **Правило по `user`, а не по клиентскому id** | Образец взят с рабочего `kraken-user-via-reverse`: Xray матчит клиента inbound'а по `email`. |
|
||||
|
||||
## Питфоллы (все проверены фактом)
|
||||
@@ -108,39 +110,55 @@ related:
|
||||
| `subId` | `24df9391356b48ff` |
|
||||
| sub-ссылка | `https://vpn-panel.mallexxx.duckdns.org/sub/24df9391356b48ff` |
|
||||
|
||||
## §6 Применение — СЛЕДУЮЩИЙ ШАГ
|
||||
## 🔴 Почему внешняя правка НЕ работает (главный урок сессии)
|
||||
|
||||
```bash
|
||||
# 1) залить SQL на TrueNAS
|
||||
# (apply_space.sql лежит в ~/tmp-xray-space/ на Mac)
|
||||
scp ~/tmp-xray-space/apply_space.sql truenas_admin@mallexxx.duckdns.org:/tmp/
|
||||
Проверено четырьмя подходами, все отбились:
|
||||
|
||||
# 2) ОДНОЙ командой: стоп → чистка WAL → SQL → старт
|
||||
ssh truenas_admin@mallexxx.duckdns.org '
|
||||
cd /mnt/RED_2TB/docker/xray-admin &&
|
||||
docker stop xray-admin &&
|
||||
rm -f x-ui.db-shm x-ui.db-wal &&
|
||||
sqlite3 x-ui.db < /tmp/apply_space.sql &&
|
||||
docker start xray-admin'
|
||||
| # | Подход | Результат |
|
||||
|---|---|---|
|
||||
| 1 | SQL в **копию** БД → копия на место старых `-wal`/`-shm` | `database disk image is malformed` |
|
||||
| 2 | SQL v2 напрямую (`PRAGMA journal_mode=DELETE`, `rm -wal` до правки) | SQL прошёл, БД корректна → в `config.json` клиента нет |
|
||||
| 3 | Фикс `auth`/`reverse` (NULL → `''`) | применено → клиента нет |
|
||||
| 4 | Дописать `security:"auto"` в `inbounds.settings` | применено (`3 × security:auto`) → клиента нет |
|
||||
|
||||
**Что закрыло вопрос:**
|
||||
|
||||
```
|
||||
ls -la /app/bin/config.json /etc/x-ui/x-ui.db
|
||||
→ config.json = 2978 б (16:06) ← схлопнулся с 11 990
|
||||
→ x-ui.db = 262144 б (15:00) ← СТАРАЯ дата, правки не попали
|
||||
```
|
||||
|
||||
**Проверка (шаг 6):**
|
||||
```bash
|
||||
# клиент в конфиге
|
||||
docker exec xray-admin sh -c "cat /app/bin/config.json" | jq -r '.inbounds[].settings.clients[]?.email'
|
||||
# ожидаем: user1, kraken-user, vless-space
|
||||
1. **`x-ui.db` не обновлялся** — правки, применённые в 15:53/16:02/16:06, в основной файл **не попадали**. 3x-ui держит базу и пишет в `-wal`; удаление `-wal` перед правкой уничтожало актуальные данные, после правки он перезаписывал файл из своего состояния.
|
||||
2. **`config.json` перегенерирован из внутренней памяти** 3x-ui, а не из файла — отсюда парадокс: **13 outbound'ов применились** (шаблон `settings` он читает), **третий клиент исчез** (список клиентов берёт из своей памяти).
|
||||
|
||||
# outbound'ы и балансировщик
|
||||
docker exec xray-admin sh -c "cat /app/bin/config.json" | jq -r '.outbounds|length' # 13
|
||||
docker exec xray-admin sh -c "cat /app/bin/config.json" | jq -c '.routing.balancers'
|
||||
```
|
||||
```bash
|
||||
# end-to-end: временный xray-клиент с id vless-space → curl api.ipify.org
|
||||
# ожидаем egress НЕ 90.189.160.148 (TrueNAS) и НЕ 92.62.70.41 (Kraken),
|
||||
# а IP сервера из подписки (DE/LV/NL/…)
|
||||
```
|
||||
> 🔴 **ВЫВОД: `inbounds` и клиентов 3x-ui через SQLite снаружи править НЕЛЬЗЯ.** Работает только `settings.xrayTemplateConfig` (outbound'ы/правила/балансировщики). Всё, что касается клиентов инбаунда, идёт **исключительно через панель** (`/panel/api/inbounds/update/:id`) — а для API нужен **API-токен**.
|
||||
|
||||
**Откат:** бэкап `/mnt/RED_2TB/docker/backups/xray-admin-before-vless-space-20260915-012057/` → скопировать `x-ui.db` обратно (при остановленном контейнере) → `docker start xray-admin`.
|
||||
> **Как это делали раньше:** `kraken-user` добавлен 2026-09-02 **при участии панели** — в Zulip-записи прямо сказано «Temporary full-admin API token **не создавался**; `api_tokens` осталась пустой» + «Verified with the local `xray-test-client`». Это и есть подтверждение, что путь был через API панели, а не через SQL.
|
||||
|
||||
## §6 Как довести до конца — ждёт доступа к панели
|
||||
|
||||
**Блокер:** логин панели `vpn-admin`, пароль — bcrypt-хэш (нечитаем). `secret` из БД (`RuERf2DTzPTw3CoMcVjk7tGXKCQOk0Z4`) для логина дал 403, API-путь — 404.
|
||||
|
||||
**Вариант А — панель вручную** (2 минуты):
|
||||
|
||||
```
|
||||
https://vpn-panel.mallexxx.duckdns.org/ (логин vpn-admin)
|
||||
→ Inbounds → vless-ws (10095) → Edit
|
||||
→ Clients → Add Client:
|
||||
Email: vless-space
|
||||
ID: a792c483-07e2-4723-9c50-78054c0abc07
|
||||
Sub ID: 24df9391356b48ff
|
||||
Enable: ✅
|
||||
→ Save → Restart Xray (в шапке)
|
||||
```
|
||||
Затем routing-правило на `space-balancer` — тоже через панель (Xray → Routing).
|
||||
|
||||
**Вариант Б — API-токен:** Settings → API Tokens → Create, отдать агенту → он делает всё сам через `/panel/api/inbounds/update/1`.
|
||||
|
||||
**Готовый SQL на Mac (не применён):** `~/tmp-xray-space/apply_final.sql` (13 447 б) — делает 4 операции одной транзакцией: клиент в `clients`, клиент в `inbounds.settings`, шаблон с 10 серверами + правило + балансировщик, запись в `outbound_subscriptions`. ⚠️ Учитывая урок сессии, **сработавшей будет только 3-я операция** (шаблон) — клиента всё равно придётся добавлять через панель.
|
||||
|
||||
**Откат:** `/mnt/RED_2TB/docker/backups/xray-admin-before-vless-space-20260915-012057/` → скопировать `x-ui.db` при остановленном контейнере → `docker start xray-admin`.
|
||||
|
||||
## Ограничение: «auto» здесь НЕ автоматическое
|
||||
|
||||
|
||||
Reference in New Issue
Block a user