Перейти к основному содержимому

Переезд с Remnawave

XLADA — форк Remnawave под AGPL-3.0-only, поэтому переезд сводится к подмене образов: сервисные имена, том базы и сеть остаются прежними, а PostgreSQL поднимается поверх того же каталога данных. Ниже — порядок «на месте», на том же сервере.

Что сохраняется​

Меняются только образы контейнеров. Имена таблиц и столбцов в форке намеренно не переименованы, поэтому живая база остаётся валидной:

МодельТаблица
Пользователиusers
Нодыnodes
Хостыhosts
Администраторыadmin
API-токеныapi_tokens
Устройства HWIDhwid_user_devices
Профили конфигурацийconfig_profiles
Внутренние и внешние скводыinternal_squads, external_squads
Настройкиremnawave_settings

Файл .env переносится без переименования ключей: APP_SECRET, POSTGRES_USER, POSTGRES_PASSWORD, POSTGRES_DB, DATABASE_URL, PANEL_DOMAIN, FRONT_END_DOMAIN, SUB_PUBLIC_DOMAIN и остальные читаются так же. Страница подписки по-прежнему использует переменные с префиксом REMNAWAVE_ (REMNAWAVE_PANEL_URL, REMNAWAVE_API_TOKEN).

Миграции XLADA только аддитивные: добавляются таблица журнала действий администраторов и поля второго фактора. Поэтому переезд обратим — достаточно вернуть прежний образ панели.

Подготовка​

Перед началом сверьте фактические имена и версии — от них зависит, поднимется ли база:

docker volume ls
docker ps --format 'table {{.Names}}\t{{.Image}}'
Том и версия PostgreSQL

Файл переезда сохраняет имя тома старой установки (в штатном compose это remnawave-db-data). Если у вас том назван иначе, не переименовывайте его, а приведите директиву name: в compose к существующему имени.

Каталог данных несовместим между мажорными версиями. Новый compose XLADA рассчитан на PostgreSQL 18, но для переезда берётся та же мажорная версия, что создала ваш том — в готовом файле это postgres:17.6. На 18 переходят позже, отдельным шагом через дамп и восстановление.

Резервная копия​

Сделайте дамп базы и сохраните .env. Дамп держите вне тома с базой, пока переезд не проверен.

docker exec remnawave-db pg_dump -U "$POSTGRES_USER" "$POSTGRES_DB" \
> ~/remnawave-backup-$(date +%F).sql
tail -n 1 ~/remnawave-backup-*.sql # ожидается: -- PostgreSQL database dump complete

cp deploy/.env ~/remnawave-env-backup
chmod 600 ~/remnawave-env-backup

Остановка старого стека​

cd deploy && docker compose down

Останавливайте без флага -v: он удаляет тома вместе с базой.

Запуск XLADA на той же базе​

Возьмите из репозитория XLADA файл docker-compose.migrate-from-remnawave.yml. Он отличается от обычного compose только тем, что сохраняет имена сервисов и том старой установки; обычный compose создал бы пустую базу. В .env добавьте необязательную переменную с тегом образа:

XLADA_VERSION=latest

Запуск:

docker compose -f docker-compose.migrate-from-remnawave.yml up -d
docker logs -f remnawave

Миграции применяются автоматически при старте контейнера: entrypoint выполняет prisma migrate deploy и prisma db seed. В журнале дождитесь строк Migrations deployed successfully! и Nest application successfully started.

Автоматизация

Те же шаги выполняет скрипт migrate-to-xlada.sh: он складывает в backups/<дата-время>/ дамп, .env, compose-файл и списки томов, проверяет дамп на полноту, останавливает стек без -v и поднимает XLADA.

Проверка​

# панель отвечает
curl -s -o /dev/null -w '%{http_code}\n' https://panel.example.com/api/auth/status

# база видит пользователей — число до и после должно совпасть
docker exec remnawave-db psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -tAc "SELECT count(*) FROM users;"

# миграции применились
docker exec remnawave-db psql -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c \
'SELECT migration_name FROM _prisma_migrations ORDER BY finished_at DESC LIMIT 5;'

В списке миграций должны быть 20260912120000_add_admin_audit_log и 20260912130000_add_admin_totp. Затем войдите в панель прежними учётными данными администратора и проверьте, что ноды на странице Nodes подключены.

Чего делать нельзя​

Осторожно
  • docker compose down -v — флаг -v удаляет том вместе с базой. Это единственная команда, которая действительно уничтожает пользователей.
  • Менять APP_SECRET — от него зависят хеши паролей, подпись JWT и шифрование секретов TOTP. После смены никто не войдёт в панель.
  • Переименовывать тома, сервисы и сети — compose создаст новые пустые, а старые останутся висеть рядом. DATABASE_URL ссылается на хост remnawave-db.
  • Поднимать мажорную версию PostgreSQL на существующем томе и править уже применённые миграции — Prisma сверяет контрольные суммы в _prisma_migrations.

Не удаляйте дамп и резервную копию .env, пока не убедились, что вход, ноды и подписки работают.

Что дальше​