从 Marzban 迁移
本指南将引导您使用 Remnawave 迁移工具,将数据从 Marzban 面板迁移到 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. 下载最新版本
从 GitHub 发布页面下载预编译的 Remnawave 迁移工具。
# 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 | - |
提示
如果您使用的是通过 Caddy 提供额外安全性的 Remnawave,需要按照以下步骤操作:
- 登录 Auth Portal 并导航到 API Keys
- 签发一个新的 API 密钥
- 使用 --dest-headers 标志以以下格式传递该密钥:
--dest-headers="X-Api-Key:api-key-from-auth-portal"
提示
- 使用
--last-users=5进行少量用户的测试迁移。 - 从 Remnawave 面板设置(例如在 API 或集成下)获取您的 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 | Remnawave 面板 URL,可以是 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 | 从 Remnawave 面板仪表板("API Tokens" 下)生成的 API 令牌。 | 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 数据库位于名为SELECT secret_key FROM jwt LIMIT 1;marzban-mysql的 Docker 容器中,请使用以下命令连接:将docker exec -it marzban-mysql mysql -uroot -pPasswordmarzban-mysql和Password替换为您的实际容器名称和 root 密码。 - 在 Remnawave 仪表板的 "API Tokens" 部分生成
REMNAWAVE_API_TOKEN。
5.3. 验证旧版支持
部署更新的配置后:
- 重启
remnawave-subscription-page服务:docker compose up -d --force-recreate - 测试旧版 Marzban 订阅链接,确保它能正确解析并在 Remnawave 订阅页面上显示用户数据。