VPNSmith
Herramienta gratis - wg-easy v15

Generador docker-compose de wg-easy

Indica tu servidor y cómo quieres acceder al panel de administración. Obtienes un docker-compose.yml acorde con la imagen actual de wg-easy v15, un Caddyfile si quieres HTTPS y los comandos exactos para arrancarlo. Todo se construye en tu navegador.

Todo se genera en tu navegador. Nada de lo que escribes, contraseña incluida, se envía a nuestros servidores.

La dirección a la que se conectan los clientes WireGuard.

¿Cómo accederás al panel?

Un registro A de este nombre debe apuntar al servidor, con los puertos 80 y 443 abiertos.

Tráfico de los clientes
  • Pulsa « Nueva » para generar la contraseña de administrador.
  • Indica el dominio del panel: Caddy lo necesita para obtener el certificado.
docker-compose.yml
# wg-easy v15 - generated on vpnsmith.com/en/tools/wg-easy-compose-generator
# Host: vpn.example.com - WireGuard port: 51820/udp - panel: https://wg.example.com

volumes:
  etc_wireguard:
  caddy_data:
  caddy_config:

services:
  wg-easy:
    image: ghcr.io/wg-easy/wg-easy:15
    container_name: wg-easy
    environment:
      - PORT=80
      - TRUSTED_PROXIES=10.42.42.43,fdcc:ad94:bacf:61a3::2b
      - INIT_ENABLED=true
      - INIT_USERNAME=admin
      - INIT_PASSWORD=GENERATE-A-PASSWORD
      - INIT_HOST=vpn.example.com
      - INIT_PORT=51820
      - INIT_DNS=1.1.1.1,9.9.9.9
    networks:
      wg:
        ipv4_address: 10.42.42.42
        ipv6_address: fdcc:ad94:bacf:61a3::2a
    volumes:
      - etc_wireguard:/etc/wireguard
      - /lib/modules:/lib/modules:ro
    ports:
      - "51820:51820/udp"   # WireGuard: the only port clients need
    restart: unless-stopped
    cap_add:
      - NET_ADMIN
      - SYS_MODULE
    sysctls:
      - net.ipv4.ip_forward=1
      - net.ipv4.conf.all.src_valid_mark=1
      - net.ipv6.conf.all.disable_ipv6=0
      - net.ipv6.conf.all.forwarding=1
      - net.ipv6.conf.default.forwarding=1

  caddy:
    image: caddy:2-alpine
    container_name: caddy
    ports:
      - "80:80/tcp"
      - "443:443/tcp"
      - "443:443/udp"
    networks:
      wg:
        ipv4_address: 10.42.42.43
        ipv6_address: fdcc:ad94:bacf:61a3::2b
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile:ro
      - caddy_data:/data
      - caddy_config:/config
    restart: unless-stopped

networks:
  wg:
    driver: bridge
    enable_ipv6: true
    ipam:
      driver: default
      config:
        - subnet: 10.42.42.0/24
        - subnet: fdcc:ad94:bacf:61a3::/64
Caddyfile
wg.example.com {
	reverse_proxy wg-easy:80
}
install.sh
# 1. Cortafuegos: primero SSH, luego el puerto de WireGuard
sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw allow 443/udp
sudo ufw enable
# Ojo: los puertos publicados por Docker saltan ufw. Ábrelos/ciérralos también en el cortafuegos del proveedor.

# 2. Crea la carpeta y pega el o los archivos generados
sudo mkdir -p /etc/docker/containers/wg-easy
cd /etc/docker/containers/wg-easy
sudo nano docker-compose.yml
sudo nano Caddyfile

# 3. Arranca wg-easy
sudo docker compose up -d
# Sigue los registros (Ctrl+C para salir)
sudo docker compose logs -f wg-easy

# 4. Abre el panel: https://wg.example.com

# 5. Una vez dentro, quita las líneas INIT_* y vuelve a ejecutar docker compose up -d

Este archivo necesita un servidor con IP pública

Un VPS Cloud de Contabo ofrece una IPv4 dedicada, imágenes Linux listas para Docker y tráfico ilimitado, todo lo que necesita wg-easy.

Enlace de afiliado: cobramos una comisión sin coste adicional para ti.

Ver la oferta VPS de Contabo

Por qué tu antiguo archivo de wg-easy dejó de funcionar

wg-easy v15 es una reescritura completa. La mayoría de las variables de los tutoriales de la v14 se ignoran en la nueva imagen: el contenedor arranca, pero no se aplican tu host, tu contraseña ni tus DNS. La guía oficial de migración indica que la mayoría de los ajustes pasaron al panel de administración. Esta es la correspondencia:

Variable v14Equivalente v15
WG_HOSTINIT_HOST (solo en el primer arranque), luego el panel
PASSWORD / PASSWORD_HASHINIT_USERNAME + INIT_PASSWORD, o el asistente de instalación
WG_PORTINIT_PORT, con el mapeo UDP correspondiente
WG_DEFAULT_DNSINIT_DNS
WG_DEFAULT_ADDRESSINIT_IPV4_CIDR junto con INIT_IPV6_CIDR
Panel por HTTP simpleahora es obligatorio INSECURE=true

Tres formas de acceder al panel

El panel puede crear clientes VPN: quien llega a él controla tu VPN. Solo el puerto UDP de WireGuard tiene que estar expuesto a Internet.

HTTPS con Caddy es la configuración que recomienda la documentación de wg-easy: Caddy obtiene un certificado real para un subdominio que apunta a tu servidor y el panel nunca se sirve por HTTP simple. El generador pone ambos contenedores en la misma red, da a Caddy una dirección fija y la declara en TRUSTED_PROXIES, para que los inicios de sesión fallidos se registren con la IP real del cliente.

El túnel SSH publica el panel solo en 127.0.0.1. No se expone nada; lo abres con ssh -L cuando lo necesitas. Es la opción segura más sencilla si no tienes dominio.

El modo red local es para un servidor doméstico: el panel se publica por HTTP con INSECURE=true. Docker publica los puertos con sus propias reglas iptables, así que ufw no los filtra; mantén ese puerto cerrado en el router o en el cortafuegos del proveedor.

Guía completa de wg-easy: instalación, seguridad y alternativas →

Preguntas frecuentes

¿wg-easy v15 sigue usando WG_HOST y PASSWORD_HASH?
No. La v15 es una reescritura y esas variables ya no se leen. El host, el puerto, los DNS y la cuenta de administrador se configuran en el asistente en el primer arranque, o sin interacción con las variables INIT_* (INIT_ENABLED, INIT_USERNAME, INIT_PASSWORD, INIT_HOST, INIT_PORT). Después se cambian en el panel.
¿Las variables INIT_ se aplican en cada reinicio?
No. Solo se usan en el primer arranque y después la instalación queda desactivada. La documentación de wg-easy recomienda quitarlas del archivo una vez terminada la instalación, para que la contraseña no quede en claro en el servidor.
¿Por qué hay que definir INIT_IPV4_CIDR e INIT_IPV6_CIDR juntas?
La instalación desatendida funciona por grupos: si defines una variable de un grupo, tienes que definirlas todas. Los dos rangos de direcciones forman un grupo, por eso el generador añade siempre el rango IPv6 (el predeterminado de wg-easy) cuando cambias el IPv4.
¿Qué contraseña acepta wg-easy?
El código actual exige al menos 2 caracteres para el usuario y 12 para la contraseña. El generador crea en tu navegador una contraseña aleatoria de 24 caracteres, sin el carácter $, que Docker Compose intentaría interpretar.
¿Qué servidor necesito para wg-easy?
Un host Linux con Docker, una IPv4 pública y un procesador x86_64 o arm64. WireGuard es ligero: un VPS pequeño basta para un hogar. Nuestro host de ejemplo es Contabo, cuyo VPS de entrada incluye una IPv4 pública y tráfico ilimitado.