[2026-09-15] eagle: family/how-to/kraken-access.md family/how-to/truenas-infrastructure.md family/plans/reverse-xray-3xui-kraken.md personal/tech/vless-space-subscription-egress.md personal/tech/xray-outbound-subscription-3xui.md personal/tech/xray-reverse-tunnel-kraken-truenas.md
This commit is contained in:
@@ -524,6 +524,8 @@ Alex восстановил БД из бэкапа. **Проверено фак
|
||||
|
||||
## 🔴 ПОПЫТКА 7 (2026-09-15, финал сессии) — `xui_v7.db`: шаблон БЕЗ инбаунда. НЕ ЗАЛИТА
|
||||
|
||||
> ℹ️ **ИСТОРИЧЕСКИЙ РАЗДЕЛ.** `xui_v7.db` тогда действительно не залили, но **позже в тот же день** она была залита, а после неё — `xui_v7_load.db`, `xui_v8.db` и **`xui_v9.db` (рабочая, egress идёт)**. Актуальное состояние — в шапке дока.
|
||||
|
||||
**Что сделано:** учтён урок 6-й попытки — инбаунд из шаблона **убран**. Собрана `~/tmp-xray-space/xui_v7.db` заново **от оригинала** (`xui_copy.db`), с проверенным diff.
|
||||
|
||||
**Состав `xui_v7.db` (проверено фактами):**
|
||||
@@ -650,6 +652,79 @@ docker logs probe-load 2>&1 | grep -iE 'observatory|detour|non existing'
|
||||
| `docker-compose.yml` | **восстановленный compose `xray-admin`** |
|
||||
| `inbound_settings.json` | снимок инбаунда для финального SQL |
|
||||
|
||||
## 🏁 MILESTONE 2026-09-15 — точная процедура, которая сработала (повторяемо)
|
||||
|
||||
**Задача:** новый клиент 3x-ui с egress через внешнюю подписку, не трогая существующих.
|
||||
|
||||
### Шаг 1 — вытащить и разобрать подписку
|
||||
```bash
|
||||
curl -s "https://go.profilegrid.net/sub/<TOKEN>" | base64 -d > sub_decoded.txt
|
||||
# дедуп по host+publicKey+shortId → 10 уникальных серверов
|
||||
# парсер vless:// → xray-outbound: build_template.py
|
||||
```
|
||||
|
||||
### Шаг 2 — собрать шаблон ЛОКАЛЬНО (на Mac)
|
||||
```bash
|
||||
cp xui_copy.db xui_vN.db # собирать ВСЕГДА от оригинала
|
||||
sqlite3 xui_copy.db "SELECT value FROM settings WHERE key='xrayTemplateConfig';" > /tmp/base_orig.json
|
||||
# ДОБАВИТЬ: 10 outbound space-01…10, правило, balancer, observatory
|
||||
jq --slurpfile sp /tmp/space_outs.json '.outbounds += $sp[0]
|
||||
| .routing.rules += [{"type":"field","user":["vless-space"],
|
||||
"balancerTag":"space-balancer", # ← КЛЮЧ 1
|
||||
"ruleTag":"vless-space-via-subscription"}]
|
||||
| .routing.balancers = [{"tag":"space-balancer","selector":["space-"],
|
||||
"strategy":{"type":"leastLoad"}}] # ← КЛЮЧ 2
|
||||
| .observatory = {"subjectSelector":["space-"],
|
||||
"probeUrl":"https://www.google.com/generate_204",
|
||||
"probeInterval":"30s","enableConcurrency":true,
|
||||
"sampling":3}' # ← КЛЮЧ 3
|
||||
/tmp/base_orig.json > /tmp/tpl_final.json
|
||||
```
|
||||
⛔ **`.inbounds` в шаблоне НЕ трогать** — там остаётся только `api`.
|
||||
|
||||
### Шаг 3 — клиент в таблицы
|
||||
```bash
|
||||
# inbounds.settings JSON (id=1) + clients + client_inbounds, id=5
|
||||
# client_traffics НЕ трогать — 3x-ui заполняет сам
|
||||
sqlite3 xui_vN.db "PRAGMA journal_mode=DELETE;"; rm -f xui_vN.db-wal xui_vN.db-shm
|
||||
sqlite3 xui_vN.db "PRAGMA integrity_check;" # → ok
|
||||
```
|
||||
|
||||
### Шаг 4 — заливка
|
||||
```bash
|
||||
scp xui_vN.db truenas_admin@mallexxx.duckdns.org:/tmp/
|
||||
docker stop xray-admin
|
||||
docker run --rm -v /mnt/RED_2TB/docker/xray-admin:/data -v /mnt/RED_2TB/docker/backups:/b -v /tmp:/src alpine sh -c 'TS=$(date +%Y%m%d-%H%M%S); mkdir -p /b/xray-admin-vN-$TS; cp -av /data/x-ui.db /b/xray-admin-vN-$TS/; rm -f /data/x-ui.db-wal /data/x-ui.db-shm; cp -av /src/xui_vN.db /data/x-ui.db; chown 950:root /data/x-ui.db; echo BACKUP=/b/xray-admin-vN-$TS'
|
||||
docker start xray-admin
|
||||
```
|
||||
|
||||
### Шаг 5 — проверка (все три обязательны)
|
||||
```bash
|
||||
docker exec xray-admin cat /app/bin/config.json | /usr/bin/jq -r '.inbounds[].settings.clients[]?.email'
|
||||
docker exec xray-admin cat /app/bin/config.json | /usr/bin/jq -c '{bal:.routing.balancers[0], ob:.observatory.sampling}'
|
||||
docker logs --since 1m xray-admin 2>&1 | grep -c 'non existing' # → 0
|
||||
```
|
||||
**Плюс end-to-end через Xray-клиент в докере** — `api.ipify.org` должен вернуть НЕ `90.189.160.148`.
|
||||
|
||||
### Диагностика: как отличить три дефекта по симптому
|
||||
|
||||
| Симптом в рантайм-логе | Причина | Фикс |
|
||||
|---|---|---|
|
||||
| `non existing outTag: space-balancer` | правило ссылается через `outboundTag` | → `balancerTag` |
|
||||
| то же, без `alive` в логе | нет `sampling` в observatory | → `"sampling": 3` |
|
||||
| то же, `alive` нет, `sampling` есть | стратегия `leastPing` | → `leastLoad` |
|
||||
| клиент в `config.json` отсутствует | инбаунд лежит **внутри** шаблона | убрать из шаблона |
|
||||
| `in-10095-tcp` **дважды** в `jq` | то же (шаблонная копия + панельная) | то же |
|
||||
| `database disk image is malformed` | копию БД положили рядом со старыми `-wal`/`-shm` | `rm -f *.db-wal *.db-shm` до старта |
|
||||
|
||||
### Откат (любой версии)
|
||||
```bash
|
||||
docker stop xray-admin
|
||||
docker run --rm -v /mnt/RED_2TB/docker/xray-admin:/d -v /mnt/RED_2TB/docker/backups:/b alpine sh -c 'cp -av /b/xray-admin-v9-<TS>/x-ui.db /d/x-ui.db; rm -f /d/x-ui.db-wal /d/x-ui.db-shm; chown 950:root /d/x-ui.db'
|
||||
docker start xray-admin
|
||||
```
|
||||
**Исходное состояние (до всей работы):** `/mnt/RED_2TB/docker/backups/xray-admin-before-vless-space-20260915-012057/`
|
||||
|
||||
## Связанные заметки
|
||||
|
||||
- [[family/plans/reverse-xray-3xui-kraken]] — reverse-туннель к Кра́кену, история compose-инцидента
|
||||
|
||||
Reference in New Issue
Block a user