sources/de-vds-3xui-setup-2026-07-14.md (new) — session chronicle capturing
the 3x-ui 3.5.0 troubleshooting: login 403 = CSRFMiddleware (X-CSRF-Token,
GET {BP}csrf-token), direct DB insert into inbounds no longer renders
(client model split across clients/client_inbounds/client_traffics → use
panel API add with stringified settings), wrapper `x-ui setting` doesn't
persist creds (binary only). Reference JSON lifted from working nl-vds 32030.
Entity sources: bound. +index.md sources line, +log.md ingest entry.
gitignore: .tmp/ (cred-bearing local throwaway, like .scratch/) and
.tasks/.lock (runtime). .tmp/ removed from disk.
Co-Authored-By: Claude <noreply@anthropic.com>
7.4 KiB
title, type, tags, ingested, raw_path, sources, updated
| title | type | tags | ingested | raw_path | sources | updated | |||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| DE VDS 3x-UI — setup session 2026-07-14 | source |
|
2026-07-14 | (live session, no raw file) | 2026-07-14 |
DE VDS 3x-UI — сессия настройки 2026-07-14
Хроника заведения прокси-VDS de-vds-3xui (Fornex, Германия). Аналог nl-vds-3xui — повторены только proven-working решения, маскированные протоколы НЕ поднимались.
Закуп / стартовая точка
Заказ: VPS Custom 1-2-20, Ubuntu 24.04, без панели, Германия, 300 Мбит/с, 1 vCPU / 2 ГБ / 20 ГБ NVMe. Провайдер по факту — Fornex (335555.fornex.cloud), IP 130.17.17.158. Свежая машина: только :22, ufw inactive, swap 0. Креды → pass de-vds-3xui/full-env (host-key SHA256:1AQ5…cmdE).
Подход (по урокам NL-сессии nl-vds-3xui-setup-2026-06-05):
- только plain VLESS
security=none(Reality/MTProto/SOCKS5 у боевых клиентов из РФ не заработали); - проверять на реальном клиенте, не на своих curl-тестах (
proxy-debugging-test-the-real-client); - креды сразу в
pass.
Что сделано
- Recon +
pass. SSH черезplink -m <script>(инлайн-кавычки PowerShell корёжит — тот же урок, что на NL). Креды вpass de-vds-3xui/full-env. - Установка 3x-ui v3.5.0 официальным
install.sh(нативный systemd, плюс автоставка fail2ban3x-ipl). v3.5.0 автогенерит рандомные panel user/pass/port/webBasePath (hasDefaultCredential:false) — лучше старых версий, НО plaintext пароля недоступен (bcrypt). - Panel-креды перевыставлены на свои (random user/pass) — см. гоча ниже про wrapper.
- Plain VLESS 32030
security=noneсоздан — см. ниже, не напрямую, а через panel API (борьба с 3.5.0). - Server-side e2e: xray-клиент на сервере → 32030 → exit = IP сервера (IPv4
130.17.17.158, IPv62a02:6b40:2000:3505::1). - Real-client из РФ — подтверждён: user подключён через этот узел прямо во время сессии. ✅
Борьба с 3x-ui 3.5.0 (главное знание сессии)
На NL стояла 3.2.7; тут 3.5.0, и API/DB-модель поменялись. Это и заняло основное время.
Гоча 1 — login 403 (CSRF, не креды)
POST {webBasePath}login возвращал 403 Forbidden с пустым телом + CSP-nonce заголовками. Выглядело как «битые креды», но:
/login→ 404 (роут только подwebBasePath);{BP}login→ 403 (роут есть, но режется middleware);- x-ui лог молчит (запрос до хендлера не доходит);
- Referer/Origin/UA/X-Requested-With — не помогали.
Root cause (найден через source на GitHub): internal/web/middleware/security.go → CSRFMiddleware — на всех unsafe-методах (POST) без валидного CSRF-токена → c.AbortWithStatus(403) (пустое тело, а SecurityHeaders уже навесил CSP). Логин-хендлер тут ни при чём (он даже при неудаче отдаёт 200+JSON). Токен: GET {webBasePath}csrf-token (публичный, кладёт CSRF_TOKEN в session-cookie) → вернуть тем же заголовком X-CSRF-Token.
Гоча 2 — прямой INSERT в inbounds не рендерит инбаунд
Первые две попытки — INSERT INTO inbounds ... с валидным JSON (вторая — с эталонным settings/stream_settings/sniffing, скопированным 1:1 с рабочего nl-vds 32030). x-ui стартовал, логировал Normalized sub_sort_index on 1 inbound(s), но в /usr/local/x-ui/bin/config.json инбаунд не попадал, xray :32030 не слушал. Никакой ошибки в логе.
Root cause: в 3.5.0 клиентская модель разнесена по таблицам clients / client_inbounds / client_traffics; эти записи заполняются только сервисом AddInbound (пути panel API/UI), а не raw-SQL. Инбаунд без клиентских строк x-ui в xray-конфиг не рендерит.
Лекарство: panel API POST {BP}panel/api/inbounds/add — body = model.Inbound (camelCase: remark,enable,port,protocol,listen,tag,settings,streamSettings,sniffing,shareAddrStrategy,...), причём settings/streamSettings/sniffing — stringified JSON (строки, не вложенные объекты). После API-add xray сразу начал слушать 32030 (3.5.0 hot-applies к работающему xray), а после x-ui restart — конфиг персистентен.
Гоча 3 — wrapper x-ui setting не применяет креды
x-ui setting -username … -password … (shell-wrapper) печатает меню, но users-таблицу не меняет → логин падает «Invalid username or password». Работает только бинарник напрямую: systemctl stop x-ui; /usr/local/x-ui/x-ui setting -username … -password … → «Username and password updated successfully».
Эталон JSON (снят с рабочего nl-vds 32030)
settings(vless):{"clients":[{auth,comment,created_at,email,enable,expiryTime,id(uuid),limitIp,password,reset,security:"auto",subId,tgId,totalGB,updated_at}], "decryption":"none","encryption":"none","testseed":[900,500,900,256]}streamSettings:{"network":"tcp","tcpSettings":{"acceptProxyProtocol":false,"header":{"type":"none"}},"security":"none"}—tcpSettings, неtcp, сheader.type:none.sniffing:{"enabled":false}(простой, безdestOverride).
Рабочее решение для друзей
vless://f3a0dda0-947b-4a11-b3f5-ca973640f843@130.17.17.158:32030?type=tcp&security=none&encryption=none#de-vless-32030 — Hiddify/v2rayN/v2rayNG. При включённом VPN в Telegram прокси не настраивать. Ключи/uuid — pass de-vds-3xui/full-env.
Открытые хвосты
- Per-friend UUID (сейчас один —
vitya): заводить через панель при раздаче, для возможности отзыва. - DPI-стойкий канал (не plain VLESS) — отдельная нерешённая задача (на NL Reality у боевых клиентов так и не поднялся).
- Panel на http:37601 — random path + fail2ban компенсируют; при желании — SSH-tunnel-only или LE-серт (опция 20 меню).
- Бэкап
x-ui.dbв pipeline (какbackup-inventory-2026-06для nl-vds) — не заведён.