# Состояние и следующий шаг (после /compact) ## Где мы - В `modules/containers/3x-ui.nix`: - `patchScript` (костыльник patcher) **заменён** на `migrateScript` — идемпотентная миграция БД, перемещает `publicKey/fingerprint/serverName/spiderX/mldsa65Verify` из nested `realitySettings.settings` в **top-level** `realitySettings` - systemd-сервис `patch-3xui-xray-config` **заменён** на `migrate-3xui-reality` (oneshot, after=`podman-3xui_app.service`) - **timer удалён** (больше не нужен) - Image остался `v3.8.5` (но v3.8.5 и v3.9.0 имеют один баг — раздельные поля на top-level в БД решают) - Комментарий к image обновлён — объясняет что баг в обоих версиях, лечится миграцией ## Что делать (А → Б → В) ### A. Доразвернуть текущий rebuild Текущая команда зависла с `nixos-rebuild-switch-to-configuration.service was already loaded` (предыдущий прогон не очистился). Что сделать: ```bash sudo systemctl stop nixos-rebuild-switch-to-configuration.service 2>/dev/null sudo pkill -f switch-to-configuration 2>/dev/null sleep 3 sudo nixos-rebuild switch ``` ### Б. Проверить что миграция работает После успешного rebuild и старта контейнера: 1. `sudo systemctl status migrate-3xui-reality` — должен быть `inactive (dead)` (success) 2. `sudo journalctl -u migrate-3xui-reality --since 5m` — должно быть `migrated=0` (idempotent, второй раз) 3. `sudo podman exec 3xui_app python3 -c "import json; c=json.load(open('/app/bin/config.json')); ib=c['inbounds'][1]; rs=ib['streamSettings']['realitySettings']; print(rs.get('publicKey','MISSING')[:25])"` — должно быть `K0Ra5yH4Ll_bB-dBmwZcPvYxr` 4. `sudo podman exec 3xui_app python3 -c "import sqlite3,json; c=sqlite3.connect('/etc/x-ui/x-ui.db'); rs=json.loads(c.execute('SELECT stream_settings FROM inbounds WHERE id=53').fetchone()[0])['realitySettings']; print('top publicKey:', 'YES' if rs.get('publicKey') else 'NO'); print('nested settings:', rs.get('settings','NONE'))"` — должно быть `YES` и `NONE` ### В. Итоговый commit После успешного теста: ```bash cd /etc/nixos sudo git add modules/containers/3x-ui.nix sudo git commit -m "3x-ui: migrate Reality fields to top-level (root-cause fix for panel config-gen bug)" ``` ## Контекст - Container: `ghcr.io/mhsanaei/3x-ui:v3.8.5`, xray 26.9.30 - nginx stream :8443 → podman-proxy :15380 → xray :8443 (ранее подтверждена) - DB уже мигрирована (поля на top-level) — миграция только идемпотентно проверяет на повторе - Тест с 5 регенерациями подтвердил: publicKey/fingerprint/spiderX/mldsa65Verify остаются в config.json - Otreca (VDS) — ssh затянут на tailscale-only, deploy-rs деплоит ## Ключевые файлы - `/etc/nixos/modules/containers/3x-ui.nix` — NixOS-модуль (требует deploy) - `/etc/nixos/configurations/vds.nix` — VDS ssh на tailscale (уже закоммичен и задеплоен) - `/mnt/services/nodes/sapphira/3x-ui/db/x-ui.db` — БД панели (миграция уже применена) - `/etc/nixos/deploy/default.nix` — deploy-rs конфиг (otreca → vds config) ## Известное замечание Внутри podman exec bash tool убивает backgrounded процессы. Для тестов с долгоживущим xray-клиентом используй systemd-run --scope или делай inline тесты (без background). Для проверки config.json хватает быстрого `podman exec python3 -c`.