Instalei o 1Panel em meu VPS, instalei o Discourse (implantação em container) e usei o OpenResty (implantação em container) como proxy reverso. O domínio está hospedado na Cloudflare, com o CDN (nuvem amarela) ativado. Abaixo está a solução para o problema de o IP do usuário aparecer como vindo da Cloudflare, em vez do IP real do navegador do usuário.
1. No 1Panel, crie uma tarefa agendada para baixar semanalmente a lista mais recente de IPs da Cloudflare e salvá-la no diretório de configuração do OpenResty.
-
No menu lateral esquerdo do 1Panel, clique em “Tarefas Agendadas”.
-
Clique em “Criar Tarefa Agendada” no canto superior direito.
-
Preencha conforme os parâmetros abaixo (copie e cole diretamente):
-
Tipo de Tarefa: Selecione Script Shell.
-
Nome da Tarefa: Por exemplo,
Atualização Automática de Intervalos de IP da Cloudflare. -
Ciclo de Execução: Recomenda-se Semanalmente (por exemplo, todo sábado às 03:00).
-
Conteúdo do Script: Copie e cole o código completo abaixo (Atenção: modifique primeiro o nome do container e o caminho do diretório de configuração no topo do código):
#!/bin/bash
# Área de Configuração
CONTAINER_NAME="Nome do container do openresty no 1Panel"
# Modifique para o diretório proxy do site especificado
CONF_DIR="/opt/1panel/www/sites/www.seu-dominio.club/proxy"
echo "[$(date)] Iniciando download dos intervalos de IP mais recentes da Cloudflare..."
TEMP_DIR=$(mktemp -d)
# Baixa e converte a lista de IPs para o formato reconhecido pelo Nginx
curl -fsS https://www.cloudflare.com/ips-v4 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v4.conf
curl -fsS https://www.cloudflare.com/ips-v6 | sed 's/.*/set_real_ip_from \&;/' > $TEMP_DIR/cf-ips-v6.conf
# Verifica e move os arquivos
if [[ -s $TEMP_DIR/cf-ips-v4.conf ]] && [[ -s $TEMP_DIR/cf-ips-v6.conf ]]; then
mv $TEMP_DIR/cf-ips-v4.conf $CONF_DIR/
mv $TEMP_DIR/cf-ips-v6.conf $CONF_DIR/
echo "[$(date)] Arquivos de configuração atualizados com sucesso em $CONF_DIR."
else
echo "[$(date)] Erro: Falha ao baixar os IPs da Cloudflare!"
rm -rf $TEMP_DIR
exit 1
fi
rm -rf $TEMP_DIR
# Testa e recarrega o Nginx
echo "[$(date)] Realizando teste de configuração do Nginx..."
if docker exec $CONTAINER_NAME nginx -t; then
docker exec $CONTAINER_NAME nginx -s reload
echo "[$(date)] Sucesso! Recarga da configuração do OpenResty concluída."
else
echo "[$(date)] Falha! O teste de configuração do Nginx não passou."
exit 1
fi
Após criar a tarefa, não é necessário esperar até sábado; você pode testar imediatamente: localize a tarefa criada na lista de “Tarefas Agendadas”.
Clique no botão “Relatório” à direita. Verifique a janela de log que aparecer. Se as últimas linhas exibirem Sucesso! Recarga da configuração do OpenResty concluída, isso indica que todo o processo foi executado perfeitamente dentro do 1Panel!
2. Configuração adicional de realip no OpenResty
No diretório do host /opt/1panel/www/sites/www.seu-dominio/proxy/, crie um novo arquivo (o nome pode ser qualquer um, desde que termine em .conf, pois será carregado automaticamente pelo include *.conf da configuração principal): realip.conf
# Use o caminho dentro do container
include /www/sites/www.seu-dominio/proxy/cf-ips-v4.conf;
include /www/sites/www.seu-dominio/proxy/cf-ips-v6.conf;
real_ip_header CF-Connecting-IP;
real_ip_recursive on;
3. Recarregar o OpenResty
docker exec Nome do container do openresty no 1Panel nginx -t
docker exec Nome do container do openresty no 1Panel nginx -s reload
4. Verificar se o OpenResty está obtendo o IP real
Verifique o log de acesso do OpenResty:
tail -f /opt/1panel/www/sites/www.seu-dominio/log/access.log
Se a configuração estiver correta, o primeiro IP no log deve mudar para seu IP público real, em vez dos intervalos da Cloudflare como 173.245.x.x.
5. Lado do Discourse
Edite o app.yml e adicione o seguinte conteúdo dentro do bloco run::
# Após implantar o Discourse via docker, é necessário adicionar as três seções abaixo para garantir a passagem do IP real dos usuários do fórum
- file:
path: /etc/nginx/conf.d/outlets/server/set-real-ip-from-docker.conf
chmod: 644
contents: |
set_real_ip_from 172.16.0.0/12;
set_real_ip_from 127.0.0.1;
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-header.conf
chmod: 644
contents: |
real_ip_header x-forwarded-for;
- file:
path: /etc/nginx/conf.d/outlets/server/real-ip-recursive.conf
chmod: 644
contents: |
real_ip_recursive on;
Dessa forma, o Nginx interno do Discourse irá:
- Confiar na sub-rede do Docker (
172.16.0.0/12) - Ler o IP real de
x-forwarded-for - Analisar recursivamente múltiplas camadas de proxy
6. Notas
Adicionar - "templates/cloudflare.template.yml" ao app.yml do Discourse só é eficaz quando o Discourse está diretamente exposto à Cloudflare. Como há um proxy reverso OpenResty no meio, o IP de origem visto pelo container do Discourse é na verdade o gateway do Docker (como 172.17.0.1 ou 172.18.0.1), portanto o set_real_ip_from <CloudflareIP> dentro desse modelo não corresponderá.
Portanto, não é necessário adicionar - "templates/cloudflare.template.yml" ao app.yml do Discourse.
Atualização em 03-07-2026