Миграция с 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-type | PANEL_TYPE | Тип исходной панели (marzban или marzneshin) | marzban |
--panel-url | PANEL_URL | URL исходной панели (например, https://marzban.example.com) | - |
--panel-username | PANEL_USERNAME | Имя пользователя администратора исходной панели | - |
--panel-password | PANEL_PASSWORD | Пароль администратора исходной панели | - |
--remnawave-url | REMNAWAVE_URL | URL целевой панели (например, https://remnawave.example.com) | - |
--remnawave-token | REMNAWAVE_TOKEN | API-токен целевой панели (используется как Authorization Bearer) | - |
--batch-size | BATCH_SIZE | Количество пользователей для обработки за один пакет | 100 |
--last-users | LAST_USERS | Мигрировать только последних N пользователей (0 = все пользователи) | 0 |
--preferred-strategy | PREFERRED_STRATEGY | Стратегия сброса трафика (NO_RESET, DAY, WEEK, MONTH) | - |
--source-headers | SOURCE_HEADERS | Дополнительные заголовки для исходной панели | - |
--dest-headers | DEST_HEADERS | Дополнительные заголовки для Remnawave (например, X-Api-Key) | - |
--preserve-status | PRESERVE_STATUS | Сохранить статус пользователя из исходной панели | false |
--preserve-subhash | PRESERVE_SUBHASH | Сохранить хеш URL подписки пользователя из исходной панели | false |
--internal-squad | INTERNAL_SQUAD | UUID внутренней группы/групп для назначения (через запятую) | - |
--external-squad | EXTERNAL_SQUAD | UUID внешней группы для назначения всем созданным пользователям | - |
Если вы используете Remnawave с дополнительной защитой через Caddy, выполните следующие шаги:
- Войдите в Auth Portal и перейдите в API Keys
- Выпустите новый API-ключ
- Передайте этот ключ с помощью флага --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:
- Количество пользователей: Убедитесь, что количество мигрированных пользователей совпадает с источником.
- Целостность данных:
- Имена пользователей
- Пароли (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_URL | URL панели Remnawave, может быть http://remnawave:3000 или https://panel.example.com | http://remnawave:3000 |
APP_PORT | Порт, на котором работает сервис страницы подписки. | 3010 |
MARZBAN_LEGACY_LINK_ENABLED | Включает поддержку устаревших ссылок подписки Marzban. Должно быть true для использования параметров ниже. | true |
MARZBAN_LEGACY_SECRET_KEY | Секретный ключ из базы данных Marzban, необходимый для расшифровки устаревших ссылок. | secret |
REMNAWAVE_API_TOKEN | API-токен, сгенерированный в панели управления 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:Например, если ваша база данных Marzban находится в контейнере Docker с именемSELECT secret_key FROM jwt LIMIT 1;marzban-mysql, подключитесь к ней с помощью:Заменитеdocker exec -it marzban-mysql mysql -uroot -pPasswordmarzban-mysqlиPasswordна реальное имя контейнера и пароль root. - Сгенерируйте
REMNAWAVE_API_TOKENв панели управления Remnawave в разделе "API Tokens".
5.3. Проверка поддержки устаревших ссылок
После развёртывания обновлённой конфигурации:
- Перезапустите сервис
remnawave-subscription-page:docker compose up -d --force-recreate - Протестируйте старую ссылку подписки Marzban, чтобы убедиться, что она корректно разрешается и отображает данные пользователя на странице подписки Remnawave.