Переезд с Marzban
Marzban хранит данные в MySQL или MariaDB, а XLADA — в PostgreSQL. Прямой перенос каталога базы между разными СУБД невозможен: пользователей переносят через API панели, а старые ссылки подписки продолжают работать через режим совместимости страницы подписки. Перенос «одной командой» возможен только для данных пользователей; конфигурацию Xray, ноды и хосты настраивают в XLADA заново.
Что переносится
| Данные Marzban | Как переносятся |
|---|---|
| Имена пользователей | username в POST /api/users |
| Пароли Trojan и Shadowsocks, UUID VLESS | поля trojanPassword, ssPassword, vlessUuid |
| Лимит трафика и период сброса | trafficLimitBytes, trafficLimitStrategy |
| Дата истечения | expireAt в формате ISO 8601 |
Статус (active, disabled, limited, expired) | status |
| Привязка к скводам | internal-squads или массовые операции |
| Старые ссылки подписки | режим MARZBAN_LEGACY_* на странице подписки |
Не переносятся администраторы, история трафика, inbound/outbound и хосты — их заводят в XLADA заново через профили конфигураций и хосты.
- Тип пользователя в Marzban определяется протоколом: для
vlessнуженvlessUuid, дляtrojan—trojanPassword, дляshadowsocks—ssPassword. Если протокол не переносить, пользователю понадобится новый ключ. - Имя пользователя в XLADA — только латиница, цифры,
_и-(в API не короче трёх символов). При разборе старой ссылки недопустимые символы заменяются на_, а имя короче шести символов дополняется до шести. Заводите пользователей сразу в этом виде, иначе старая ссылка не найдёт владельца. - Готового импортёра внутри панели нет: отдельный инструмент миграции живёт в
репозитории организации
xray-panel/migrate, а панель лишь принимает данные через API.
Поддержка legacy-ссылок
Страница подписки умеет принимать старые ссылки Marzban и сопоставлять их с пользователями XLADA по имени. Режим включается переменными окружения:
| Переменная | Назначение |
|---|---|
MARZBAN_LEGACY_LINK_ENABLED | включает модуль совместимости |
MARZBAN_LEGACY_SECRET_KEY | секрет из базы Marzban; несколько ключей — через запятую |
MARZBAN_LEGACY_SUBSCRIPTION_VALID_FROM | отсечка: ссылки, созданные раньше даты, не принимаются |
MARZBAN_LEGACY_DROP_REVOKED_SUBSCRIPTIONS | обрывать соединение для отозванных подписок |
CUSTOM_SUB_PREFIX | префикс ссылки подписки, например sub |
При включённом режиме MARZBAN_LEGACY_SECRET_KEY обязателен — без него
контейнер страницы подписки не стартует.
services:
remnawave-subpage:
image: ghcr.io/xray-panel/subscription-page:latest
restart: unless-stopped
environment:
- APP_PORT=3010
- REMNAWAVE_PANEL_URL=http://remnawave:3000
- REMNAWAVE_API_TOKEN=токен_из_панели
- MARZBAN_LEGACY_LINK_ENABLED=true
- MARZBAN_LEGACY_SECRET_KEY=secret_из_базы_marzban
- CUSTOM_SUB_PREFIX=sub
Секрет лежит в таблице jwt базы Marzban:
SELECT secret_key FROM jwt LIMIT 1;
Поддерживаются обе схемы Marzban: JWT с алгоритмом HS256 и полем
access: subscription, а также base64url-токен с подписью SHA-256. Если
пользователя с таким именем в XLADA нет, старая ссылка не откроется.
Пошаговый план
- Инвентаризация. Выгрузите из Marzban список пользователей и сохраните
secret_keyиз таблицыjwt. Посчитайте число пользователей — это эталон для проверки. - Установка XLADA. Поднимите панель и ноды по инструкциям Установка панели и Установка ноды, создайте API-токен в Настройки → API Tokens.
- Перенос пользователей. Заведите их методом
POST /api/users, сохраняя имя, дату истечения и лимит трафика:
curl -sX POST https://panel.example.com/api/users \
-H "Authorization: Bearer $XLADA_API_TOKEN" \
-H 'Content-Type: application/json' \
-d '{"username": "john_doe", "expireAt": "2026-01-17T15:38:45.065Z", "trafficLimitBytes": 0, "trafficLimitStrategy": "NO_RESET"}'
- Скводы. Распределите перенесённых пользователей по внутренним скводам —
поштучно или массово через
/api/users/bulk/update-squads. - Старые ссылки. Разверните страницу подписки с
MARZBAN_LEGACY_*из примера выше и перезапустите её контейнер. - Проверка. Откройте пару старых ссылок Marzban: страница должна показать данные пользователя XLADA. Затем проверьте свежие ссылки в разделе Пользователи.
Переносите сначала 5–10 пользователей и убеждайтесь, что и вход, и старая ссылка работают. Marzban не выключайте, пока не сверите число пользователей и не убедитесь, что клиенты подключились.
Что дальше
- Переезд с Remnawave — перенос панели на той же базе.
- Страница подписки — установка и переменные окружения.
- Пользователи — лимиты, статусы и подписки.
- API Specification — методы создания и массовых операций.