Saltar al contenido principal

Migrar desde Marzban

Esta guía te lleva paso a paso por la migración de tus datos desde un panel Marzban a un panel Remnawave usando la herramienta de migración de Remnawave.

1. Preparación del servidor

1.1. Instalación de las dependencias necesarias

Asegúrate de que tu servidor tiene las herramientas necesarias instaladas actualizando los paquetes del sistema e instalando Git y wget.

# Actualizar paquetes del sistema
sudo apt-get update

# Instalar Git y wget
sudo apt-get install -y git wget
tip

Ejecuta git --version y wget --version para confirmar la instalación exitosa.

2. Descarga de la herramienta de migración

2.1. Descarga de la última versión

Descarga la herramienta de migración de Remnawave precompilada desde la página de versiones de GitHub.

# Crear y navegar a un directorio de trabajo
mkdir -p /opt/remnawave && cd /opt/remnawave

# Descargar la última versión (v2.1.0 en el momento de esta guía)
wget https://github.com/remnawave/migrate/releases/download/v2.1.0/remnawave-migrate-v2.1.0-linux-amd64.tar.gz

2.2. Extracción de la herramienta

Descomprime el archivo descargado para acceder al binario.

# Extraer el archivo tar
tar -xf remnawave-migrate-v2.1.0-linux-amd64.tar.gz
tip

Después de la extracción, deberías ver el binario remnawave-migrate en tu directorio. Usa ls -l para verificarlo.

3. Configuración

3.1. Configuración de los parámetros de migración

La herramienta de migración usa flags de línea de comandos para la configuración. A continuación se muestra un ejemplo de comando con todos los parámetros necesarios. Reemplaza los valores de marcador de posición con los detalles reales de tu servidor.

./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. Opciones de configuración

La herramienta admite los siguientes flags y sus correspondientes variables de entorno:

FlagVariable de entornoDescripciónPredeterminado
--panel-typePANEL_TYPETipo de panel fuente (marzban o marzneshin)marzban
--panel-urlPANEL_URLURL del panel fuente (p. ej., https://marzban.example.com)-
--panel-usernamePANEL_USERNAMENombre de usuario administrador del panel fuente-
--panel-passwordPANEL_PASSWORDContraseña de administrador del panel fuente-
--remnawave-urlREMNAWAVE_URLURL del panel de destino (p. ej., https://remnawave.example.com)-
--remnawave-tokenREMNAWAVE_TOKENToken de API del panel de destino (usado como Authorization Bearer)-
--batch-sizeBATCH_SIZENúmero de usuarios a procesar por lote100
--last-usersLAST_USERSMigrar solo los últimos N usuarios (0 = todos los usuarios)0
--preferred-strategyPREFERRED_STRATEGYEstrategia de restablecimiento de tráfico (NO_RESET, DAY, WEEK, MONTH)-
--source-headersSOURCE_HEADERSCabeceras adicionales para el panel fuente-
--dest-headersDEST_HEADERSCabeceras adicionales para Remnawave (p. ej., X-Api-Key)-
--preserve-statusPRESERVE_STATUSConservar el estado del usuario del panel fuentefalse
--preserve-subhashPRESERVE_SUBHASHConservar el hash de URL de suscripción del usuario del panel fuentefalse
--internal-squadINTERNAL_SQUADUUID(s) de escuadra(s) interna(s) a asignar (separados por coma)-
--external-squadEXTERNAL_SQUADUUID de la escuadra externa a asignar a todos los usuarios creados-
tip

Si estás usando Remnawave con seguridad adicional proporcionada por Caddy, necesitas seguir estos pasos:

  1. Inicia sesión en el Portal de Auth y navega a Claves de API
  2. Emite una nueva clave de API
  3. Pasa esta clave usando el flag --dest-headers en el siguiente formato:
    --dest-headers="X-Api-Key:api-key-from-auth-portal"
tip
  • Usa --last-users=5 para una migración de prueba con un pequeño subconjunto de usuarios.
  • Obtén tu token de API de Remnawave desde la configuración del panel de Remnawave (p. ej., en API o Integraciones).
  • Si --preferred-strategy no se especifica, se usará la estrategia original de Marzban. La estrategia YEAR se convierte en NO_RESET.

3.3. Asignación de usuarios a escuadras

Puedes asignar automáticamente todos los usuarios migrados a escuadras internas y/o externas:

# Asignar a una única escuadra interna
./remnawave-migrate \
[otros flags...] \
--internal-squad=e5201a6a-c50e-4b58-9ecb-a4c26c5e74c8

# Asignar a múltiples escuadras internas
./remnawave-migrate \
[otros flags...] \
--internal-squad=uuid1,uuid2,uuid3

# Asignar a una escuadra externa
./remnawave-migrate \
[otros flags...] \
--external-squad=f6302b7b-d61f-5c69-0fdc-b5d37d6e85d9

# Asignar a escuadras internas y externas
./remnawave-migrate \
[otros flags...] \
--internal-squad=uuid1,uuid2 \
--external-squad=uuid3

4. Verificación posterior a la migración

4.1. Qué verificar

Después de la migración, verifica lo siguiente en el panel de Remnawave:

  1. Recuento de usuarios: Asegúrate de que el número de usuarios migrados coincide con el origen.
  2. Integridad de los datos:
    • Nombres de usuario
    • Contraseñas (Trojan, UUID VLESS, Shadowsocks)
    • Límites de tráfico y estrategias de restablecimiento
    • Fechas de vencimiento
    • Estados de usuario (si se usó --preserve-status)
    • Hashes de URL de suscripción (si se usó --preserve-subhash)
    • Asignaciones de escuadra (si se usó --internal-squad o --external-squad)
tip

Inicia sesión en el panel de Remnawave y verifica aleatoriamente algunos usuarios para confirmar la precisión de los datos.

5. Soporte de páginas de suscripción heredadas

Después de migrar a Remnawave, la única forma de garantizar el soporte y renderizado de páginas de suscripción heredadas de Marzban es usando el repositorio en https://github.com/remnawave/subscription-page/.

5.1. Configuración predeterminada de Docker Compose

De forma predeterminada, el archivo docker-compose.yml para el servicio de página de suscripción tiene este aspecto:

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. Ajuste para compatibilidad con Marzban

Durante la migración, debes garantizar la compatibilidad con las rutas de suscripción de Marzban y habilitar el descifrado de los enlaces de suscripción de Marzban. Reemplaza la sección environment en la configuración predeterminada con lo siguiente:

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

Opciones de configuración explicadas

VariableDescripciónValor de ejemplo
REMNAWAVE_PANEL_URLURL del panel Remnawave, puede ser http://remnawave:3000 o https://panel.example.comhttp://remnawave:3000
APP_PORTPuerto en el que se ejecuta el servicio de página de suscripción.3010
MARZBAN_LEGACY_LINK_ENABLEDHabilita el soporte para enlaces de suscripción heredados de Marzban. Debe ser true para usar las opciones a continuación.true
MARZBAN_LEGACY_SECRET_KEYLa clave secreta de tu base de datos de Marzban, requerida para descifrar los enlaces heredados.secret
REMNAWAVE_API_TOKENEl token de API generado desde el panel de Remnawave (en "API Tokens").token
CUSTOM_SUB_PREFIXUn prefijo personalizado para las URL de suscripción para coincidir con tu configuración de Marzban (p. ej., sub).sub
tip
  • Si MARZBAN_LEGACY_LINK_ENABLED está configurado en true, todas las variables posteriores (MARZBAN_LEGACY_SECRET_KEY, REMNAWAVE_API_TOKEN y CUSTOM_SUB_PREFIX) deben proporcionarse.
  • Para obtener el MARZBAN_LEGACY_SECRET_KEY, consulta tu base de datos de Marzban con:
    SELECT secret_key FROM jwt LIMIT 1;
    Por ejemplo, si tu base de datos de Marzban está en un contenedor Docker llamado marzban-mysql, conéctate a él usando:
    docker exec -it marzban-mysql mysql -uroot -pPassword
    Reemplaza marzban-mysql y Password con el nombre real de tu contenedor y la contraseña de root.
  • Genera el REMNAWAVE_API_TOKEN desde el panel de Remnawave en la sección "API Tokens".

5.3. Verificación del soporte heredado

Después de implementar la configuración actualizada:

  1. Reinicia el servicio remnawave-subscription-page:
    docker compose up -d --force-recreate
  2. Prueba un antiguo enlace de suscripción de Marzban para asegurarte de que se resuelva correctamente y muestre los datos del usuario en la página de suscripción de Remnawave.