Remnawave es un panel para gestionar servidores VPN basados en el núcleo Xray. Con él es fácil crear usuarios, repartirles suscripciones, limitar el tráfico y los plazos, y conectar varios servidores (nodos) a un mismo panel. El proyecto es gratuito, de código abierto y cuenta con documentación oficial.
En este artículo hemos reunido la instalación completa, desde la elección de los servidores de F3 Cloud hasta la conexión del primer cliente. Los comandos proceden de la documentación oficial, y hemos hecho toda la instalación nosotros mismos con la versión 3.4.5 del panel, así que los nombres de los botones y las capturas coinciden con lo que verás. La configuración del cortafuegos, las copias de seguridad y los consejos de camuflaje los hemos añadido por nuestra cuenta.
De qué se compone Remnawave
- Panel – la interfaz web y la API, la base de datos PostgreSQL y la caché Valkey. El panel en sí no transporta el tráfico de los usuarios.
- Nodo – un contenedor ligero con el núcleo Xray. Los usuarios se conectan precisamente a los nodos. El panel gestiona los nodos a través de una conexión protegida.
- Página de suscripción – un componente opcional. Muestra al usuario una página cuidada con instrucciones y oculta la dirección del panel.
El orden de instalación importa
Mientras no haya ningún nodo conectado al panel, los usuarios no podrán conectarse. Por eso la instalación sigue siempre el mismo orden – panel, proxy inverso, nodo, perfil, host y usuarios.
Qué necesitas
Dos servidores
Los desarrolladores recomiendan instalar el panel y el nodo en servidores distintos. En un mismo servidor, el panel y el nodo se pelearían por el puerto 443.
Y si se bloquea la dirección IP del nodo, perderías también el acceso al panel.
| Función | Requisitos de Remnawave | Plan de F3 Cloud recomendado |
|---|---|---|
| Panel | desde 2 núcleos y 2 GB de RAM, mejor 4 núcleos y 4 GB, disco de 20 GB | DE-RZ9-2 (2 vCPU, 4 GB de RAM, 60 GB NVMe) |
| Nodo | desde 1 núcleo y 1 GB de RAM | DE-Promo para uso personal, DE-RZ9-1 para un canal de 1 Gbit/s |
Instala Ubuntu o Debian en los dos servidores. Cómo contratar un servidor se explica en el artículo sobre el pedido de un servidor virtual.
Dominio
Necesitarás dos registros A:
panel.tu-dominio.comapunta a la dirección IP del servidor del panel;cdn.tu-dominio.comapunta a la dirección IP del servidor del nodo.
Un nombre aparte para el nodo te permite cambiar más adelante la dirección IP del servidor sin actualizar las suscripciones de los usuarios.
Elige nombres neutros
No uses en el dominio ni en los subdominios palabras como vpn, proxy, xray, vless, reality, remnawave, node y similares. El nombre del servidor se transmite sin cifrar, y esas palabras son fáciles de detectar con una lista. Es mejor cdn.example.com, photos.example.com o el propio dominio sin subdominio.
Sobre Cloudflare
La documentación de Remnawave aconseja pasar el dominio del panel por el proxy de Cloudflare si en tu región funciona de forma estable. Desde Rusia, los servicios de Cloudflare funcionan ahora con cortes, por eso recomendamos dejar el proxy desactivado (nube gris).
Para el dominio del nodo, el proxy debe estar siempre desactivado, ya que Reality solo funciona con una conexión directa al servidor.
1. Prepara los dos servidores
Conéctate a cada servidor por SSH, por ejemplo con Termius, y ejecuta los mismos comandos.
# Actualizamos el sistema
apt update && apt upgrade -y
# Instalamos Docker con el script oficial
curl -fsSL https://get.docker.com | sh
# Comprobamos que Docker y el plugin Compose funcionan
docker --version && docker compose versionSi los dos comandos han mostrado sus versiones, Docker está listo.

Docker y Compose instalados
2. Instala el panel
Todos los comandos de este paso se ejecutan en el servidor del panel.
# Creamos la carpeta y descargamos los archivos oficiales docker-compose.yml y .env
mkdir /opt/remnawave && cd /opt/remnawave
curl -o docker-compose.yml https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/docker-compose-prod.yml
curl -o .env https://raw.githubusercontent.com/remnawave/backend/refs/heads/main/.env.sampleGenera las claves secretas. El comando escribirá por sí solo valores aleatorios en el archivo .env.
sed -i "s/^APP_SECRET=.*/APP_SECRET=$(openssl rand -hex 64)/" .env && sed -i "s/^METRICS_PASS=.*/METRICS_PASS=$(openssl rand -hex 64)/" .env && sed -i "s/^WEBHOOK_SECRET_HEADER=.*/WEBHOOK_SECRET_HEADER=$(openssl rand -hex 64)/" .envCambia la contraseña de la base de datos. Los desarrolladores recomiendan encarecidamente no dejar la contraseña por defecto.
pw=$(openssl rand -hex 24) && sed -i "s/^POSTGRES_PASSWORD=.*/POSTGRES_PASSWORD=$pw/" .env && sed -i "s|^\(DATABASE_URL=\"postgresql://postgres:\)[^\@]*\(@.*\)|\1$pw\2|" .envAbre el archivo .env con el comando nano .env e indica tu dominio en tres líneas.
FRONT_END_DOMAIN=panel.tu-dominio.com
PANEL_DOMAIN=panel.tu-dominio.com
SUB_PUBLIC_DOMAIN=panel.tu-dominio.com/api/subEn SUB_PUBLIC_DOMAIN no escribas https:// ni la barra final. Guarda el archivo con Ctrl + O.
Cierra el editor con Ctrl + X.
Inicia el panel y mira el log de arranque.
docker compose up -d && docker compose logs -f -tCuando en el log aparezca el banner con la versión de Remnawave, el panel ya está en marcha. Sal de la vista del log con Ctrl + C, y los contenedores seguirán funcionando.

El panel se ha iniciado
No expongas los servicios a internet
Todos los servicios de Remnawave escuchan solo en la dirección 127.0.0.1 y no son accesibles directamente desde internet. No cambies esto en docker-compose.yml. Al panel solo se debe acceder a través del proxy inverso del siguiente paso.
Si has cambiado .env
Después de cualquier cambio en .env, recrea los contenedores con docker compose down && docker compose up -d, porque un simple reinicio no basta.
3. Configura Caddy y HTTPS
Remnawave es compatible con Caddy, Nginx y Traefik. Lo más sencillo es configurar Caddy, porque obtiene y renueva por sí solo el certificado de Let's Encrypt.
# Creamos la carpeta y el archivo de configuración de Caddy
mkdir -p /opt/remnawave/caddy && cd /opt/remnawave/caddy && nano CaddyfilePega en el archivo la configuración de abajo, sustituyendo el dominio por el tuyo.
https://panel.tu-dominio.com {
encode
reverse_proxy * http://remnawave:3000
}
:443 {
tls internal
respond 204
}El segundo bloque responde con una página vacía a cualquier petición que no vaya a tu dominio, por ejemplo durante un escaneo por dirección IP.
Crea al lado un archivo docker-compose.yml para Caddy con el comando nano docker-compose.yml y pega en él lo siguiente.
services:
caddy:
image: caddy:2.9
container_name: 'caddy'
hostname: caddy
restart: always
ports:
- '0.0.0.0:443:443'
- '0.0.0.0:80:80'
networks:
- remnawave-network
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile
- caddy-ssl-data:/data
networks:
remnawave-network:
name: remnawave-network
driver: bridge
external: true
volumes:
caddy-ssl-data:
driver: local
external: false
name: caddy-ssl-dataInicia Caddy.
docker compose up -d && docker compose logs -f -tPasado un minuto, abre https://panel.tu-dominio.com en el navegador. Debería aparecer la página de registro del panel con un certificado válido.
4. Registra al administrador
La primera vez que lo abras, el panel te propondrá crear una cuenta de superadministrador. El primer usuario registrado se convierte en el administrador principal, así que regístrate justo después de iniciar Caddy.
Elige un nombre de usuario y pulsa Generate & copy para que el panel cree una contraseña segura, y guárdala enseguida en un gestor de contraseñas. Después pulsa Sign up.

Registro del administrador principal
Si has perdido el acceso al panel
Puedes restablecer el administrador con la utilidad de recuperación integrada. Ejecuta en el servidor del panel el comando docker exec -it remnawave cli.
5. Conecta el nodo
En el servidor del nodo, crea una carpeta para él.
mkdir /opt/remnanode && cd /opt/remnanodeEn el panel, abre la sección Nodes y pulsa +. Rellena el formulario:
- Internal name – cualquier nombre que te resulte claro, por ejemplo
DE-Frankfurt-1; - Country – el país del servidor, cuya bandera verán los usuarios;
- Domain or IP – la dirección del nodo, por ejemplo
cdn.tu-dominio.com; - Node Port – el puerto por el que el panel gestiona el nodo. Por defecto es
2222.

Creación de un nodo
Pulsa Copy docker-compose.yml. El panel copiará un archivo ya preparado, más o menos como este.
services:
remnanode:
container_name: remnanode
hostname: remnanode
image: remnawave/node:latest
network_mode: host
restart: always
cap_add:
- NET_ADMIN
ulimits:
nofile:
soft: 1048576
hard: 1048576
environment:
- NODE_PORT=2222
- SECRET_KEY="clave del panel"En el servidor del nodo, abre el editor con el comando nano docker-compose.yml, pega el contenido copiado, guarda el archivo e inicia el nodo.
docker compose up -d && docker compose logs -f -tEn el log aparecerá una tabla con el puerto de la API, la versión de Xray y las características del servidor. Eso significa que el nodo se ha iniciado y está esperando al panel.

El nodo se ha iniciado
Vuelve al panel y pulsa Next. En el paso Core configuration, pulsa Select y marca de momento el perfil por defecto Default-Profile. El perfil de trabajo lo crearemos en el siguiente paso. Pulsa Create node. Al cabo de unos segundos aparecerá el mensaje «Connection successful. Xray Core is up and running!».

El panel se ha conectado al nodo
Cierra el puerto del nodo a terceros
El puerto del nodo solo lo necesita el panel. Permite conexiones a él únicamente desde la dirección IP del servidor del panel. Tienes los comandos en la sección «Cortafuegos», más abajo.
6. Crea un perfil VLESS Reality
Por defecto, el panel crea el perfil Default-Profile con una única conexión Shadowsocks. Para sortear los bloqueos, añade un perfil VLESS Reality.
- Abre la sección Config Profiles, pulsa +, escribe un nombre para el perfil, por ejemplo
VLESS-Reality, y pulsa Create. Se abrirá el editor del perfil. - Debajo del editor, junto al botón Format, pulsa el botón de menú y elige Load from GitHub.
- Elige la plantilla Example VLESS-TCP-REALITY config y pulsa Load template. Ya incluye la conexión
VLESS_TCP_REALITYen el puerto 443.

Selección de la plantilla del perfil
Nada más cargarla, el panel resaltará el error please fill in a valid value for "target". Es normal, porque la plantilla todavía hay que completarla.

Plantilla cargada, solo falta rellenar los campos de Reality
Lo más sencillo es generar las claves de Reality directamente en el servidor del nodo.
# Creamos un par de claves Reality. Pega el valor PrivateKey en el campo privateKey
docker exec remnanode xray x25519
# Creamos un valor para el array shortIds
openssl rand -hex 8En el bloque realitySettings, rellena estos campos:
privateKey– el valor PrivateKey del primer comando;shortIds– el valor del segundo comando, dentro de los corchetes y las comillas;targetyserverNames– la dirección del sitio de camuflaje y su nombre, tienes más detalles en el aviso de abajo.
En la parte inferior del editor debería aparecer el mensaje Xray config is valid. Pulsa Save.
No te hagas pasar por grandes sitios ajenos
No pongas en target y serverNames sitios como google.com, microsoft.com o apple.com, porque es uno de los principales indicios por los que hoy se bloquean servidores. Lo más fiable es camuflarte con tu propio dominio mediante el esquema self-steal. Para ello, instala nginx en el servidor del nodo con un sitio en tu dominio, pon 127.0.0.1:8443 en target, tu dominio en serverNames y establece xver: 0. Tienes las instrucciones paso a paso en el artículo sobre self-steal para VLESS Reality.
Solo queda activar la nueva conexión para el nodo y los usuarios.
- En la sección Nodes, abre tu nodo, pulsa el botón de edición en el bloque Core configuration, marca el perfil
VLESS-Realityy guarda el nodo. - Abre Users → Internal Squads, haz clic en
Default-Squad, marca la casilla del perfilVLESS-Realityy guarda. Sin esto, los usuarios no recibirán la nueva conexión.

El perfil VLESS-Reality activado en Default-Squad
7. Crea un host
El host determina qué dirección y qué parámetros recibirán los usuarios en su suscripción.
- Abre Subscription → Hosts y pulsa +.
- Activa el interruptor Host visibility. Por defecto está desactivado, y un host así no entra en la suscripción.
- En el campo Remark, escribe un nombre que entiendan los usuarios, por ejemplo «Alemania».
- Haz clic en el bloque No inbound selected, marca
VLESS_TCP_REALITYy confirma la selección. El puerto se rellenará solo. - En el campo Address, indica
cdn.tu-dominio.com. - En el bloque Options, pulsa Add, elige Fingerprint e indica
firefox. - Pulsa Save.

Host con la huella firefox
Por qué firefox y no chrome
Desde finales de 2025, los sistemas de filtrado de tráfico de los proveedores rusos (TSPU) evalúan una conexión TLS por varios indicios a la vez, que son la subred del hosting, el nombre del sitio (SNI) y la huella del cliente. La huella chrome viene por defecto en casi todas las aplicaciones y paneles VPN, por eso la combinación «huella de Chrome y dirección IP de centro de datos» se ha convertido para los filtros en un indicio fiable de proxy. Los usuarios cuentan que, con varias conexiones simultáneas con esa huella, la conexión se «congela» durante unos minutos, y que pasar a firefox lo soluciona.
La huella edge también ayudaba antes, pero desde septiembre de 2026 es incompatible con las nuevas versiones de Xray. A partir de Xray 26.9.8 (incluido, por ejemplo, en 3X-UI 3.8.0 y posteriores), el servidor Reality solo acepta clientes con intercambio de claves poscuántico ML-KEM. El perfil edge de Xray corresponde al antiguo Edge 85 sin ML-KEM, y con él la conexión no llegará a establecerse. El perfil firefox es compatible con ML-KEM si la aplicación lleva el núcleo Xray 26.3.23 o posterior, así que mantén los clientes actualizados. Tampoco uses los valores random y randomized, porque pueden elegir un perfil sin ML-KEM.
8. Crea un usuario y una suscripción
- Abre la sección Users y pulsa +.
- Indica el Username sin espacios. Después no podrás cambiarlo.
- Define el Traffic limit. El valor
0significa sin límite. - Revisa la Expiry date, porque por defecto el panel pone un plazo de un día.
- En el bloque Internal squads, marca
Default-Squad. - Pulsa Create.

Creación de un usuario
Abre el usuario que acabas de crear. En su ficha hay un campo Subscription URL con el formato https://panel.tu-dominio.com/api/sub/identificador y, al lado, un botón para copiarlo. Ese es el enlace que debes enviar al usuario.

Ficha del usuario y enlace de suscripción
Conexión del cliente
Copia el enlace de suscripción de la ficha del usuario e impórtalo en la aplicación, como se muestra en las instrucciones de importación. La suscripción se actualiza sola, así que cuando cambies algo en el servidor, los usuarios no tendrán que volver a configurar nada.
Cortafuegos
La documentación oficial no incluye comandos para el cortafuegos, así que te dejamos nuestra versión basada en UFW. Si has movido SSH a otro puerto, indícalo en lugar de 22.
ufw allow 22/tcp
ufw allow 80/tcp
ufw allow 443/tcp
ufw enable# Sustituye IP_DEL_PANEL por la dirección IP del servidor del panel
ufw allow 22/tcp
ufw allow 443/tcp
ufw allow from IP_DEL_PANEL to any port 2222 proto tcp
ufw enableEl resto de medidas de protección se describen en el artículo sobre cómo proteger el servidor de accesos no autorizados.
Página de suscripción (opcional)
Una página de suscripción aparte oculta a los usuarios la dirección del panel y les muestra las instrucciones de conexión. Puedes instalarla en el mismo servidor que el panel.
- Añade un registro A para el dominio de la suscripción, por ejemplo
sub.tu-dominio.com, e indícalo en la variableSUB_PUBLIC_DOMAINdel archivo/opt/remnawave/.env. Después recrea el contenedor del panel con el comandocd /opt/remnawave && docker compose down remnawave && docker compose up -d. - Crea un token en la sección Remnawave Settings → API tokens.
- Crea la carpeta
/opt/remnawave/subscriptiony, dentro de ella, el archivo.env.
APP_PORT=3010
REMNAWAVE_PANEL_URL=http://remnawave:3000
REMNAWAVE_API_TOKEN=token_del_panel- En la misma carpeta, crea el archivo
docker-compose.yml.
services:
remnawave-subscription-page:
image: remnawave/subscription-page:latest
container_name: remnawave-subscription-page
hostname: remnawave-subscription-page
restart: always
env_file:
- .env
ports:
- '127.0.0.1:3010:3010'
networks:
- remnawave-network
networks:
remnawave-network:
driver: bridge
external: true- Inicia la página con el comando
docker compose up -dy añade un bloque nuevo a/opt/remnawave/caddy/Caddyfile.
https://sub.tu-dominio.com {
encode
reverse_proxy * http://remnawave-subscription-page:3010
}- Reinicia Caddy con el comando
cd /opt/remnawave/caddy && docker compose down && docker compose up -d.
Actualización
Actualiza primero el panel y después los nodos.
# En el servidor del panel
cd /opt/remnawave && docker compose pull && docker compose down && docker compose up -d
docker image prune# En el servidor del nodo
cd /opt/remnanode && docker compose pull && docker compose down && docker compose up -dSi tienes instalada la página de suscripción, actualízala también con el mismo comando desde la carpeta /opt/remnawave/subscription.
Copias de seguridad
Remnawave no tiene instrucciones oficiales para las copias de seguridad. Basta con guardar la base de datos y los archivos de configuración, ya que la caché Valkey no guarda en disco nada importante. Nosotros lo hacemos así.
cd /opt/remnawave
# Guardamos la base de datos en un archivo con la fecha de hoy
docker exec remnawave-db pg_dump -U postgres postgres > backup-$(date +%F).sql
# Guardamos los archivos de configuración en un archivo comprimido
tar czf remnawave-config-$(date +%F).tar.gz .env docker-compose.yml caddy/CaddyfileDescarga las copias a tu ordenador o a otro almacenamiento, porque una copia en el mismo servidor no te servirá de nada si a este le pasa algo. Hablamos de las copias de seguridad con más detalle en un artículo aparte.
Problemas frecuentes
El panel no se abre
Comprueba que el registro A del dominio del panel apunta a la dirección IP del servidor. Después revisa los logs con el comando docker compose logs en las carpetas /opt/remnawave y /opt/remnawave/caddy. Si Caddy no ha podido obtener el certificado, el motivo aparecerá en su log.
El nodo no se conecta al panel
Asegúrate de que el puerto 2222 del servidor del nodo está abierto para la dirección IP del panel y de que SECRET_KEY se ha copiado completo en docker-compose.yml. Puedes ver el log del nodo con el comando docker compose logs en la carpeta /opt/remnanode.
El perfil no se guarda, error sobre target
El mensaje please fill in a valid value for "target" significa que en el bloque realitySettings no se han rellenado los campos de la plantilla. Rellena target, serverNames, privateKey y shortIds como se describe en el paso 6.
Error SPAWN_ERROR: xray
Xray no ha podido arrancar en el nodo con este perfil, casi siempre por un error en la configuración o por un puerto ocupado. Revisa el log de Xray con el comando docker exec remnanode xlogs y corrige el perfil.
El usuario no ve el servidor en la suscripción
Comprueba tres cosas. El perfil está activado en Default-Squad, el usuario pertenece a ese squad y el host tiene activado el interruptor Host visibility. Por defecto, los hosts nuevos se crean desactivados.
Hay conexión, pero las webs no se abren
Comprueba que serverNames, las claves y shortIds del perfil coinciden con lo que recibe el cliente, y que la dirección IP del nodo no está bloqueada por el proveedor.
Nuestros recursos
Canal de Telegram: https://t.me/f3cloud_news
Web del hosting: https://f3cloud.com