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

Миграция с Marzban

Это руководство проведёт вас через процесс миграции данных с панели Marzban на панель Remnawave с помощью инструмента миграции Remnawave.

1. Подготовка сервера

1.1. Установка необходимых зависимостей

Убедитесь, что на вашем сервере установлены необходимые инструменты, обновив системные пакеты и установив Git и wget.

# Update system packages
sudo apt-get update

# Install Git and wget
sudo apt-get install -y git wget
подсказка

Запустите git --version и wget --version для подтверждения успешной установки.

2. Загрузка инструмента миграции

2.1. Загрузка последней версии

Загрузите предварительно скомпилированный инструмент миграции Remnawave со страницы релизов GitHub.

# Create and navigate to a working directory
mkdir -p /opt/remnawave && cd /opt/remnawave

# Download the latest version (v2.1.0 as of this guide)
wget https://github.com/remnawave/migrate/releases/download/v2.1.0/remnawave-migrate-v2.1.0-linux-amd64.tar.gz

2.2. Распаковка инструмента

Распакуйте скачанный архив для получения доступа к бинарному файлу.

# Extract the tarball
tar -xf remnawave-migrate-v2.1.0-linux-amd64.tar.gz
подсказка

После распаковки в вашем каталоге должен появиться бинарный файл remnawave-migrate. Используйте ls -l для проверки.

3. Настройка конфигурации

3.1. Настройка параметров миграции

Инструмент миграции использует флаги командной строки для настройки. Ниже приведён пример команды со всеми необходимыми параметрами. Замените значения-заглушки реальными данными вашего сервера.

./remnawave-migrate \
--panel-type=marzban \
--panel-url=https://your-marzban-server \
--panel-username=admin \
--panel-password=your-admin-password \
--remnawave-url=https://your-remnawave-server \
--remnawave-token=your-remnawave-token \
--preserve-status

3.2. Параметры конфигурации

Инструмент поддерживает следующие флаги и соответствующие переменные окружения:

ФлагПеременная окруженияОписаниеПо умолчанию
--panel-typePANEL_TYPEТип исходной панели (marzban или marzneshin)marzban
--panel-urlPANEL_URLURL исходной панели (например, https://marzban.example.com)-
--panel-usernamePANEL_USERNAMEИмя пользователя администратора исходной панели-
--panel-passwordPANEL_PASSWORDПароль администратора исходной панели-
--remnawave-urlREMNAWAVE_URLURL целевой панели (например, https://remnawave.example.com)-
--remnawave-tokenREMNAWAVE_TOKENAPI-токен целевой панели (используется как Authorization Bearer)-
--batch-sizeBATCH_SIZEКоличество пользователей для обработки за один пакет100
--last-usersLAST_USERSМигрировать только последних N пользователей (0 = все пользователи)0
--preferred-strategyPREFERRED_STRATEGYСтратегия сброса трафика (NO_RESET, DAY, WEEK, MONTH)-
--source-headersSOURCE_HEADERSДополнительные заголовки для исходной панели-
--dest-headersDEST_HEADERSДополнительные заголовки для Remnawave (например, X-Api-Key)-
--preserve-statusPRESERVE_STATUSСохранить статус пользователя из исходной панелиfalse
--preserve-subhashPRESERVE_SUBHASHСохранить хеш URL подписки пользователя из исходной панелиfalse
--internal-squadINTERNAL_SQUADUUID внутренней группы/групп для назначения (через запятую)-
--external-squadEXTERNAL_SQUADUUID внешней группы для назначения всем созданным пользователям-
подсказка

Если вы используете Remnawave с дополнительной защитой через Caddy, выполните следующие шаги:

  1. Войдите в Auth Portal и перейдите в API Keys
  2. Выпустите новый API-ключ
  3. Передайте этот ключ с помощью флага --dest-headers в следующем формате:
    --dest-headers="X-Api-Key:api-key-from-auth-portal"
подсказка
  • Используйте --last-users=5 для тестовой миграции с небольшой группой пользователей.
  • Получите API-токен Remnawave из настроек панели Remnawave (например, в разделе API или Интеграции).
  • Если --preferred-strategy не указан, будет использована оригинальная стратегия из Marzban. Стратегия YEAR преобразуется в NO_RESET.

3.3. Назначение пользователей группам

Вы можете автоматически назначить всех мигрированных пользователей внутренним и/или внешним группам:

# Assign to a single internal squad
./remnawave-migrate \
[other flags...] \
--internal-squad=e5201a6a-c50e-4b58-9ecb-a4c26c5e74c8

# Assign to multiple internal squads
./remnawave-migrate \
[other flags...] \
--internal-squad=uuid1,uuid2,uuid3

# Assign to an external squad
./remnawave-migrate \
[other flags...] \
--external-squad=f6302b7b-d61f-5c69-0fdc-b5d37d6e85d9

# Assign to both internal and external squads
./remnawave-migrate \
[other flags...] \
--internal-squad=uuid1,uuid2 \
--external-squad=uuid3

4. Проверка после миграции

4.1. Что проверить

После миграции проверьте следующее в панели Remnawave:

  1. Количество пользователей: Убедитесь, что количество мигрированных пользователей совпадает с источником.
  2. Целостность данных:
    • Имена пользователей
    • Пароли (Trojan, VLESS UUID, Shadowsocks)
    • Лимиты трафика и стратегии сброса
    • Даты истечения срока действия
    • Статусы пользователей (если использовался --preserve-status)
    • Хеши URL подписки (если использовался --preserve-subhash)
    • Назначения в группы (если использовались --internal-squad или --external-squad)
подсказка

Войдите в панель Remnawave и выборочно проверьте несколько пользователей для подтверждения точности данных.

5. Поддержка устаревших страниц подписки Marzban

После миграции на Remnawave единственный способ обеспечить поддержку и отображение устаревших страниц подписки Marzban — использование репозитория по адресу https://github.com/remnawave/subscription-page/.

5.1. Стандартная конфигурация Docker Compose

По умолчанию файл docker-compose.yml для сервиса страницы подписки выглядит следующим образом:

services:
remnawave-subscription-page:
image: remnawave/subscription-page:latest
container_name: remnawave-subscription-page
hostname: remnawave-subscription-page
restart: always
environment:
- APP_PORT=3010
- REMNAWAVE_PANEL_URL=http://remnawave:3000
ports:
- '127.0.0.1:3010:3010'
networks:
- remnawave-network
networks:
remnawave-network:
driver: bridge
external: true

5.2. Настройка для совместимости с Marzban

В процессе миграции необходимо обеспечить совместимость с путями подписок Marzban и включить расшифровку ссылок подписок Marzban. Замените раздел environment в конфигурации по умолчанию на следующий:

services:
remnawave-subscription-page:
image: remnawave/subscription-page:latest
container_name: remnawave-subscription-page
hostname: remnawave-subscription-page
restart: always
environment:
- APP_PORT=3010
- REMNAWAVE_PANEL_URL=http://remnawave:3000
- MARZBAN_LEGACY_LINK_ENABLED=true
- MARZBAN_LEGACY_SECRET_KEY=secret
- REMNAWAVE_API_TOKEN=token
- CUSTOM_SUB_PREFIX=sub
ports:
- '127.0.0.1:3010:3010'
networks:
- remnawave-network
networks:
remnawave-network:
driver: bridge
external: true

Описание параметров конфигурации

ПеременнаяОписаниеПример значения
REMNAWAVE_PANEL_URLURL панели Remnawave, может быть http://remnawave:3000 или https://panel.example.comhttp://remnawave:3000
APP_PORTПорт, на котором работает сервис страницы подписки.3010
MARZBAN_LEGACY_LINK_ENABLEDВключает поддержку устаревших ссылок подписки Marzban. Должно быть true для использования параметров ниже.true
MARZBAN_LEGACY_SECRET_KEYСекретный ключ из базы данных Marzban, необходимый для расшифровки устаревших ссылок.secret
REMNAWAVE_API_TOKENAPI-токен, сгенерированный в панели управления Remnawave (в разделе "API Tokens").token
CUSTOM_SUB_PREFIXПользовательский префикс для URL подписок, соответствующий вашей настройке Marzban (например, sub).sub
подсказка
  • Если MARZBAN_LEGACY_LINK_ENABLED установлено в true, необходимо указать все последующие переменные (MARZBAN_LEGACY_SECRET_KEY, REMNAWAVE_API_TOKEN и CUSTOM_SUB_PREFIX).
  • Для получения MARZBAN_LEGACY_SECRET_KEY выполните запрос к базе данных Marzban:
    SELECT secret_key FROM jwt LIMIT 1;
    Например, если ваша база данных Marzban находится в контейнере Docker с именем marzban-mysql, подключитесь к ней с помощью:
    docker exec -it marzban-mysql mysql -uroot -pPassword
    Замените marzban-mysql и Password на реальное имя контейнера и пароль root.
  • Сгенерируйте REMNAWAVE_API_TOKEN в панели управления Remnawave в разделе "API Tokens".

5.3. Проверка поддержки устаревших ссылок

После развёртывания обновлённой конфигурации:

  1. Перезапустите сервис remnawave-subscription-page:
    docker compose up -d --force-recreate
  2. Протестируйте старую ссылку подписки Marzban, чтобы убедиться, что она корректно разрешается и отображает данные пользователя на странице подписки Remnawave.