Переезд с Remnawave
XLADA — форк Remnawave под AGPL-3.0-only, поэтому переезд сводится к подмене образов: сервисные имена, том базы и сеть остаются прежними, а PostgreSQL поднимается поверх того же каталога данных. Ниже — порядок «на месте», на том же сервере.
Что сохраняется
Меняются только образы контейнеров. Имена таблиц и столбцов в форке намеренно не переименованы, поэтому живая база остаётся валидной:
| Модель | Таблица |
|---|---|
| Пользователи | users |
| Ноды | nodes |
| Хосты | hosts |
| Администраторы | admin |
| API-токены | api_tokens |
| Устройства HWID | hwid_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}}'
Файл переезда сохраняет имя тома старой установки (в штатном 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, пока не убедились, что вход, ноды и
подписки работают.
Что дальше
- Переезд с Marzban — когда исходная панель была другой.
- Обновление — как выкатывать новые версии после переезда.
- Панель безопасности — второй фактор и ограничение попыток входа.
- Переменные окружения — включая
AUDIT_LOG_RETENTION_DAYS.