Gerador docker-compose para wg-easy
Indique o seu servidor e como quer aceder ao painel de administração. Recebe um docker-compose.yml conforme à imagem atual do wg-easy v15, um Caddyfile se quiser HTTPS e os comandos exatos para o arrancar. Tudo é gerado no seu navegador.
Tudo é gerado no seu navegador. Nada do que escreve, incluindo a palavra-passe, é enviado para os nossos servidores.
O endereço a que os clientes WireGuard se ligam.
Um registo A deste nome tem de apontar para o servidor, com as portas 80 e 443 abertas.
- Clique em « Nova » para gerar a palavra-passe de administrador.
- Indique o domínio do painel: o Caddy precisa dele para obter o certificado.
# 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
wg.example.com {
reverse_proxy wg-easy:80
}
# 1. Firewall: primeiro SSH, depois a porta do 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
# Atenção: as portas publicadas pelo Docker contornam o ufw. Abra/feche-as também na firewall do fornecedor.
# 2. Crie a pasta e cole o ou os ficheiros gerados
sudo mkdir -p /etc/docker/containers/wg-easy
cd /etc/docker/containers/wg-easy
sudo nano docker-compose.yml
sudo nano Caddyfile
# 3. Arranque o wg-easy
sudo docker compose up -d
# Acompanhe os registos (Ctrl+C para sair)
sudo docker compose logs -f wg-easy
# 4. Abra o painel: https://wg.example.com
# 5. Depois de entrar, retire as linhas INIT_* e volte a correr docker compose up -d
Este ficheiro precisa de um servidor com IP público
Um VPS Cloud da Contabo oferece um IPv4 dedicado, imagens Linux prontas para Docker e tráfego ilimitado, tudo o que o wg-easy precisa.
Link de afiliado: recebemos uma comissão sem custo adicional para si.
Porque é que o seu antigo ficheiro wg-easy deixou de funcionar
O wg-easy v15 é uma reescrita completa. A maioria das variáveis dos tutoriais v14 é simplesmente ignorada pela nova imagem: o contentor arranca, mas o host, a palavra-passe e os DNS não são aplicados. O guia oficial de migração indica que a maioria das definições passou para o painel. Esta é a correspondência:
| Variável v14 | Equivalente v15 |
|---|---|
| WG_HOST | INIT_HOST (só no primeiro arranque), depois o painel |
| PASSWORD / PASSWORD_HASH | INIT_USERNAME + INIT_PASSWORD, ou o assistente de instalação |
| WG_PORT | INIT_PORT, com o mapeamento UDP correspondente |
| WG_DEFAULT_DNS | INIT_DNS |
| WG_DEFAULT_ADDRESS | INIT_IPV4_CIDR em conjunto com INIT_IPV6_CIDR |
| Painel em HTTP simples | INSECURE=true passou a ser obrigatório |
Três formas de aceder ao painel
O painel pode criar clientes VPN: quem lhe chega controla a sua VPN. Só a porta UDP do WireGuard tem de estar exposta à Internet.
HTTPS com Caddy é a configuração recomendada pela documentação do wg-easy: o Caddy obtém um certificado real para um subdomínio que aponta para o servidor e o painel nunca é servido em HTTP simples. O gerador coloca os dois contentores na mesma rede, dá ao Caddy um endereço fixo e declara-o em TRUSTED_PROXIES, para que as tentativas de início de sessão falhadas fiquem registadas com o IP real do cliente.
O túnel SSH publica o painel apenas em 127.0.0.1. Nada fica exposto; abre-o com ssh -L quando precisar. Sem domínio, é a opção segura mais simples.
O modo rede local destina-se a um servidor doméstico: o painel é publicado em HTTP com INSECURE=true. O Docker publica as portas com regras iptables próprias, por isso o ufw não as filtra; mantenha essa porta fechada no router ou na firewall do fornecedor.