[2026-09-15] eagle: family/how-to/truenas-infrastructure.md family/plans/reverse-xray-3xui-kraken.md personal/tech/vless-space-subscription-egress.md

This commit is contained in:
Alexey Martemyanov
2026-09-15 15:04:42 +06:00
parent 8364013988
commit 86ffda93d4
3 changed files with 158 additions and 12 deletions
+20 -6
View File
@@ -13,7 +13,7 @@
> - **⚠️ «Камера на TrueNAS» — ИСПРАВЛЕНО (2026-09-14, вечер-10) + ✅ РЕШЕНО ОКОНЧАТЕЛЬНО (вечер-13):** прежняя запись «камера = USB-вебка на t610, upstream `cam.*:8090` к камере отношения не имеет» — **❌ НЕВЕРНА**. Поиск в `Caddyfile.bak` доказал: **`cam.mallexxx.duckdns.org → 192.168.2.197:8090` — ЭТО И БЫЛА камера** на TrueNAS: отдельный HTTP-MJPEG-сервис (`ustreamer`/`mjpg-streamer`, порт 8090 — канон для «USB-вебка → MJPEG»). **Контейнер УТРАЧЕН** при пересоздании пула (локальный образ не пережил `.ix-apps`; из живого Caddyfile строка удалена — `cam.*` больше нет). **✅ ФИНАЛ (вечер-13):** вебка `046d:0825` физически в **t610**, работает через **аддон `a889bffc_go2rtc-hardware`** → RTSP H.264 `rtsp://192.168.2.176:8554/usb_camera_h264` → **Generic Camera** `camera.192_168_2_176` (зона `kotelnaia`, `unique_id`, **WebRTC работает**, поворот `#rotate=90`). Схема `camera: platform: ffmpeg` в Core — **❌ ОТВЕРГНУТА** (`Resource busy` + нет `unique_id`). Подробно — [[family/how-to/home-automation]] §5-кватер-И-3/И-6.
> - **Не перенесено с TrueNAS:** ~~погашение TrueNAS-стека (Этап 4 п.6 — заблокировано: Caddy на TrueNAS держит точку входа)~~ → **✅ ЗАКРЫТО 2026-09-14 (ночь): стек автоматизации ПОГАШЕН, Caddy остался на TrueNAS (так и задумано).** См. §5-кватер-Л в [[family/how-to/home-automation]].
> Обновлено: 2026-09-15 (ночь-3: **`vless-space` — попытка 1 применения на живую БД ПРОВАЛИЛАСЬ (`database disk image is malformed`), причина найдена и исправлена.** Причина: SQL применялся к **копии** `x-ui.db`, созданной без её `-wal`/`-shm`, и копия клалась рядом со **старыми** WAL/SHM → SQLite применяла чужой журнал. 🔴 **ПИТФОЛЛ:** для WAL-базы нельзя копировать только `.db`; либо работать напрямую при остановленном процессе, либо удалять `-wal`/`-shm` до открытия. Исправленная процедура — в `~/tmp-xray-space/apply_space_v2.sql` (с `PRAGMA journal_mode=DELETE` в начале и `WAL` в конце, запись НАПРЯМУЮ в `/data/x-ui.db`). **✅ Также в этой сессии: compose-файл `xray-admin` ВОССТАНОВЛЕН** из `docker inspect` (утрачен 2026-09-01, см. [[family/plans/reverse-xray-3xui-kraken]]). Полный разбор задачи — [[personal/tech/vless-space-subscription-egress]]. Ранее 2026-09-15 (ночь-2: артефакты `vless-space` собраны и проверены в песочнице; путь через БД подтверждён рабочим, шаг «нужны креды панели» **снят как неверный**). Ранее 2026-09-15 (вечер: черновой план `vless-space`, подписка проверена). Ранее: 2026-09-15 (subscription-канал 3x-ui: ссылки `/sub/<subId>` работают, base64 vless-список). Ранее: 2026-09-02 (vpn.mallexxx:443 = РАБОЧИЙ Xray-сервер, проверено end-to-end; vless-proxy outbound мёртв)
> Обновлено: 2026-09-15 (ночь-4: **`vless-space` — ПОПЫТКА 2: SQL применён, БД полностью корректна, но Xray клиента не видит.** Корень найден: `auth`/`reverse` = `NULL` вместо `''` (SQLite ставит `NULL` в колонки, не указанные в `INSERT`; Xray молча выкидывает такого клиента из `config.json`). Шаблон при этом применился — **13 outbound + балансировщик `space-balancer` (leastPing) работают**, гипотеза «`leastPing`/`observatory` не поддерживаются» **опровергнута**. Исправление (4 команды) готово, ждёт выполнения. 🔴 **НОВЫЕ ПИТФОЛЛЫ:** (1) ручной `INSERT` в `clients` — заполнять все текстовые колонки `''`; (2) команды для Alex давать **без `ssh truenas_admin@… '…'`-обёртки** — вложенные кавычки ломают `sh -c` (`unrecognized token`), Alex выполняет сам на хосте. **✅ Compose-файл `xray-admin` ВОССТАНОВЛЕН** из `docker inspect`. Полный разбор — [[personal/tech/vless-space-subscription-egress]]. Ранее 2026-09-15 (ночь-3: попытка 1 провалилась с `database disk image is malformed` — SQL применялся к копии `.db` без `-wal`/`-shm`, копия клалась рядом со старыми WAL/SHM → чужой журнал. 🔴 **ПИТФОЛЛ:** для WAL-базы нельзя копировать только `.db`; либо работать напрямую при остановленном процессе, либо удалять `-wal`/`-shm` до открытия. Исправлено в `~/tmp-xray-space/apply_space_v2.sql`. Также в этой сессии: compose-файл `xray-admin` **восстановлен** из `docker inspect` (утрачен 2026-09-01, см. [[family/plans/reverse-xray-3xui-kraken]]). Ранее 2026-09-15 (ночь-2: артефакты `vless-space` собраны и проверены в песочнице; путь через БД подтверждён рабочим, шаг «нужны креды панели» **снят как неверный**). Ранее 2026-09-15 (вечер: черновой план `vless-space`, подписка проверена; subscription-канал 3x-ui: ссылки `/sub/<subId>` работают, base64 vless-список). Ранее: 2026-09-02 (vpn.mallexxx:443 = РАБОЧИЙ Xray-сервер, проверено end-to-end; vless-proxy outbound мёртв)
> ## ⚠️ ПРИОРИТЕТ 2026-09-01: VPS qentra.top УДАЛЁН → vless-proxy и сетевые туннели сломаны
> - **VPS `91.207.28.205` больше НЕ существует** (вся его Xray/OpenVPN/WG-инфраструктура утрачена). Подробно: [[family/how-to/vps-qentra]].
@@ -438,12 +438,24 @@ arr, caddy, cups, filebrowser, gitea, hermes, immich, inpx-web, inpxer, library,
| Образ | `ghcr.io/mhsanaei/3x-ui:latest` (3.7.0, Xray 26.7.28) |
| Volume | `/mnt/RED_2TB/docker/xray-admin:/etc/x-ui` (там `x-ui.db`) |
| Сеть | `caddy_default` (внешняя) |
| Панель | `https://vpn-panel.mallexxx.duckdns.org/` (Caddy → xray-admin:2053) |
| Inbound | `vless-ws` port `10095`, tag `in-10095-tcp`, path `/vless`, host `vpn.mallexxx.duckdns.org`; clients: `user1` (direct TrueNAS), `kraken-user` (reverse via Kraken), **`vless-space`** (egress через внешнюю подписку `profilegrid.net` — ⏳ SQL собран и проверен, **в БД не применён**) |
| Панель | `https://vpn-panel.mallexxx.duckdns.org/` (Caddy → `xray-admin:2053`) |
| Inbound | `vless-ws` port `10095`, tag `in-10095-tcp`, path `/vless`, host `vpn.mallexxx.duckdns.org`; clients: `user1` (direct TrueNAS), `kraken-user` (reverse via Kraken), `vless-space` (подписка profilegrid — см. ниже) |
| Sub-сервер | `[::]:443` (path /sub), панель `[::]:2053` |
| Env | `TZ=Asia/Novosibirsk`, `PUID=950`, `PGID=950` |
| Env | `TZ=Asia/Novosibirsk`, `PUID=950`, `PGID=950`, `XUI_IN_DOCKER=true`, `XUI_MAIN_FOLDER=/app`, `XUI_ENABLE_FAIL2BAN=true`, `XUI_DB_TYPE=`, `XUI_DB_DSN=` |
| Ports (host) | `54321:54321` (не используется панелью — внутри панель на 2053, можно убрать) |
| **Точка правки Xray-конфига** | таблица `settings` → ключ **`xrayTemplateConfig`** в `/etc/x-ui/x-ui.db`. **⚠️ `/app/bin/config.json` — генерируемый, не править (перезапишется).** `sqlite3` внутри контейнера отсутствует — работать хостовым бинарём или `alpine`-контейнером |
| **Compose** | `/mnt/RED_2TB/docker/xray-admin/docker-compose.yml`**✅ ВОССТАНОВЛЕН 2026-09-15** из `docker inspect` (был утрачен 2026-09-01, см. [[family/plans/reverse-xray-3xui-kraken]]). `docker compose config` валиден, `docker compose ps` распознаёт контейнер. |
> 🔴 **ПИТФОЛЛ `xray-admin` (bind-mount `/etc-x-ui`):** правка/удаление файлов внутри контейнера в пути `/etc/x-ui/` **бьёт прямо по хосту** — это тот же самый каталог. Именно так 2026-09-01 был уничтожен `docker-compose.yml` (`docker exec xray-admin rm -f /etc/x-ui/docker-compose.yml`). Никогда не делать `rm`/`mv` в `/etc/x-ui` изнутри контейнера. Файлы складывать на хост через `docker run --rm -v /tmp:/src -v /mnt/RED_2TB/docker/xray-admin:/dst alpine cp …`.
> 🔴 **ПИТФОЛЛ правки SQLite `x-ui.db` (WAL):** база работает в WAL-режиме. Нельзя копировать только `.db` и класть рядом со старыми `-wal`/`-shm` → `database disk image is malformed`. Правильно: `docker stop xray-admin` → `rm -f x-ui.db-wal x-ui.db-shm` → SQL напрямую в `/data/x-ui.db` → `chown 950:root` → `docker start`. Лучше всего — вообще править через панель.
> 🔴 **ПИТФОЛЛ ручного `INSERT` в таблицу `clients`:** SQLite ставит `NULL` в колонки, не указанные в `INSERT`. 3x-ui/Xray при генерации `/app/bin/config.json` **молча выкидывает** клиента с `auth=NULL`/`reverse=NULL` — панель его показывает, в конфиге его нет, в логах ни слова. Заполнять все текстовые колонки (`auth`, `reverse`, `flow`, `password`, `group_name`) пустой строкой `''`.
> ⚠️ **Панель на `/login` отдаёт 403** — это не поломка и не отсутствие доступа, просто другой путь у API. Логина/пароля панели у агента нет и подбирать не нужно: всё нужное читается через `docker exec`/SQLite.
> 📌 **Как генерируется `config.json`:** 3x-ui собирает `/app/bin/config.json` из БД. **Outbound'ы и routing берутся из `xrayTemplateConfig`** (таблица `settings`, ключ `xrayTemplateConfig` — правится целиком), **а список клиентов — из `inbounds.settings` + таблицы `clients`**. Правка БД требует `docker restart xray-admin` (или «Restart Xray» в панели) — иначе Xray работает на старом файле.
>
> **Точка правки Xray-конфига:** таблица `settings` → ключ **`xrayTemplateConfig`** в `/etc/x-ui/x-ui.db`. **⚠️ `/app/bin/config.json` — генерируемый, не править (перезапишется).** `sqlite3` внутри контейнера отсутствует — работать хостовым бинарём или `alpine`-контейнером.
**Статус (2026-09-02):** контейнер **Up**, панель HTTP 200. Reverse portal развёрнут отдельным контейнером `xray-reverse-portal`; per-user egress работает end-to-end.
@@ -471,12 +483,14 @@ arr, caddy, cups, filebrowser, gitea, hermes, immich, inpx-web, inpxer, library,
|---|---|---|---|
| `user1` | `68c5cy5n5ui138yh` | `https://vpn-panel.mallexxx.duckdns.org/sub/68c5cy5n5ui138yh` | TrueNAS `90.189.160.148` |
| `kraken-user` | `f43074a029dc656e` | `https://vpn-panel.mallexxx.duckdns.org/sub/f43074a029dc656e` | Kraken `92.62.70.41` |
| `vless-space` | `24df9391356b48ff` | `https://vpn-panel.mallexxx.duckdns.org/sub/24df9391356b48ff` | подписка `profilegrid.net` (10 серверов, `space-balancer` leastPing) — ⏳ клиент в БД есть, в `config.json` пока нет |
- Sub-сервер отдаёт **base64-список** `vless://…` (проверено: HTTP 200, `text/plain`). Пример тела: `vless://ce320965-…@vpn.mallexxx.duckdns.org:443?encryption=none&host=vpn.mallexxx.duckdns.org&path=%2Fvless&security=tls&type=ws#vless-ws-user1`.
- **`/sub/<subId>` отдаётся БЕЗ авторизации** — любой, кто знает `subId`, получает рабочий ключ. Открытый вопрос безопасности.
- **Авто-обновление подписки — функция GUI-клиента** (Happ / v2rayN / NekoBox / sing-box: «Add subscription» + auto-update interval). Xray в docker (и `vless-proxy`, и HA-аддон) подписки **не умеет** — там только статический `config.json`; «auto» реализуется внешним cron-скриптом, который тянет `/sub/<subId>` → генерит `config.json` → рестартит контейнер.
- Панель: `/login` с `admin/admin`**403** (не подбирать; креды не записаны).
**`vless-space`подготовлен, НЕ применён (2026-09-15):** третий клиент, чей egress идёт через внешнюю Xray-подписку `profilegrid.net` (10 серверов, `leastPing`). `user1` и `kraken-user` не трогаются. Артефакты собраны и проверены в песочнице, применение в живую БД не выполнено. Полный разбор — [[personal/tech/xray-outbound-subscription-3xui]].
**`vless-space`SQL применён, клиент не в конфиге (2026-09-15):** третий клиент, чей egress идёт через внешнюю Xray-подписку `profilegrid.net` (10 серверов, `leastPing`). `user1` и `kraken-user` **не тронуты** — подтверждено фактом. Шаблон применился (13 outbound + `space-balancer`), клиент есть во всех таблицах БД, но в `config.json` не попадает из-за `auth`/`reverse` = `NULL`. Исправление — 4 команды. Полный разбор — [[personal/tech/vless-space-subscription-egress]].
> ⚠️ База `x-ui.db` была **уже настроена** под эту Caddy-интеграцию (inbound vless-ws:10095, subDomain vpn-panel), поэтому панель заработала «из коробки». Бэкап базы/Caddyfile до изменений: `/mnt/RED_2TB/docker/backups/reverse-xray-3xui-20260901-113625/`.