Caso de Uso do CloudFlare
Estas instruções são para fóruns Discourse auto-hospedados que usam o Proxy do Cloudflare.
Quando você usa o Proxy do Cloudflare, isso impede que todo o tráfego SMTP (Porta 25) chegue ao seu servidor. Isso exige que você configure um subdomínio diferente para o mail-receiver funcionar.
Por exemplo, se o seu domínio for forums.domain.tld, você precisará criar um novo subdomínio, como mail.domain.tld.
Com o Cloudflare, você tem as etapas adicionais abaixo.
- Crie o registro A para o novo subdomínio. Ele usará o mesmo endereço de IP que o seu
forums.domain.tld. - Crie o registro MX para o novo subdomínio, conforme fornecido nas instruções principais.
Siga os conjuntos de instruções principais com esta pequena alteração. Funcionará perfeitamente com a segurança TLS desativada.
Se você deseja executar a segurança TLS, isso exigirá um trabalho adicional.
Visão Geral da Configuração TLS
Estas instruções instalarão o Certbot e um plugin Certbot do CloudFlare. Os comandos obterão Certificados Let’s Encrypt no Modo Autônomo (Standalone) através do processo de certificação DNS. Assim que os Certificados estiverem disponíveis, eles serão copiados para a área compartilhada do mail-receiver para que o contêiner os utilize. Temos que usar o modelo DNS, já que o Discourse já possui a porta 80.
Desafio DNS
Em vez de comprovar a propriedade do domínio via HTTP, o certbot comprova criando um registro TXT no seu DNS. Como seu DNS é o Cloudflare, isso pode ser totalmente automatizado com um token de API do Cloudflare — sem porta 80, sem necessidade de desligar o servidor web.
Como funciona
Certbot → Cria o registro TXT _acme-challenge.mail.lotuselan.net no Cloudflare
Let's Encrypt → Procura por esse registro TXT → Valida → Emite o certificado
Certbot → Exclui o registro TXT
Tudo isso é feito no seu servidor base, não dentro do contêiner do discourse.
Configuração
1 — Instale o certbot e o plugin certbot do Cloudflare:
bash
apt install certbot python3-certbot-dns-cloudflare -y
2 — Crie um token de API do Cloudflare:
- Vá para Cloudflare → Meu Perfil → Tokens de API → Criar Token
- Use o modelo “Editar DNS da Zona”
- Permissões:
Zona → DNS → Editar - Recursos da Zona:
Incluir → Zona Específica → lotuselan.net - Restrições de IP: Configure apenas para permitir o endereço de IP do seu servidor
- Copie o token
3 — Salve o token em um arquivo de credenciais:
bash
mkdir -p /etc/letsencrypt/cloudflare
nano /etc/letsencrypt/cloudflare/credentials.ini
Cole:
dns_cloudflare_api_token = SEU_TOKEN_DE_API_CLOUDFLARE
Bloqueie o arquivo:
bash
chmod 600 /etc/letsencrypt/cloudflare/credentials.ini
4 — Solicite o certificado:
Atualize o seguinte comando com seu e-mail de administrador e nome de domínio.
bash
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
--non-interactive \
--agree-tos \
--email seuemail@dominio.tld \
-d mail.domain.tld
Nos seus resultados, deve haver uma declaração que diz:
Certbot has set up a scheduled task to automatically renew this certificate in the background.
O Certbot configurará um cron para verificar a expiração do certificado duas vezes por dia. Ele renovará os certificados quando estiverem a menos de 30 dias de expirar. Você pode validar isso por:
# Verifique se o temporizador systemd está ativo (a maioria dos sistemas Ubuntu modernos)
systemctl status certbot.timer
# Ou verifique se um job cron foi adicionado
cat /etc/cron.d/certbot
Agora você tem os certificados TLS no seu servidor para o novo nome de domínio do mail-receiver. Eles não estão em um local que possa ser usado.
5 — Configure um script de implantação para mover os arquivos
Como o certbot se renova automaticamente, você só precisa que seu script lide com as partes específicas do Discourse — copiando os certificados renovados e reconstruindo o mail-receiver. Você pode simplificar significativamente o script usando o gancho de implantação (deploy hook) integrado do certbot, que é executado automaticamente após uma renovação bem-sucedida.
Crie um arquivo de gancho de implantação:
bash
nano /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
Cole isto:
bash
#!/bin/bash
DOMAIN="mail.domain.tld"
DISCOURSE_DIR="/var/discourse"
CERT_SRC="/etc/letsencrypt/live/${DOMAIN}"
CERT_DEST_1="${DISCOURSE_DIR}/shared/mail-receiver/letsencrypt/${DOMAIN}"
CERT_DEST_2="${DISCOURSE_DIR}/shared/mail-receiver/letsencrypt/${DOMAIN}_ecc"
ADMIN_EMAIL="endereço de email do administrador"
LOG_FILE="/var/log/mail-cert-renewal.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Gancho de implantação do Certbot acionado para ${DOMAIN} ==="
# Copia os certificados (use -L para resolver links simbólicos)
for DEST in "$CERT_DEST_1" "$CERT_DEST_2"; do
mkdir -p "$DEST"
cp -L "${CERT_SRC}/fullchain.pem" "${DEST}/fullchain.pem"
cp -L "${CERT_SRC}/privkey.pem" "${DEST}/privkey.pem"
cp -L "${CERT_SRC}/cert.pem" "${DEST}/cert.pem"
cp -L "${CERT_SRC}/chain.pem" "${DEST}/chain.pem"
chmod 644 "${DEST}/fullchain.pem" "${DEST}/cert.pem" "${DEST}/chain.pem"
chmod 600 "${DEST}/privkey.pem"
log "Certificados copiados para ${DEST}"
done
# Reconstrói o mail-receiver
cd "$DISCOURSE_DIR" || { echo "Não foi possível cd para ${DISCOURSE_DIR}" | mail -s "[FALHA] Falha no gancho de implantação do certificado de email" "$ADMIN_EMAIL"; exit 1; }
log "Reconstruindo o mail-receiver..."
if ./launcher rebuild mail-receiver >> "$LOG_FILE" 2>&1; then
log "mail-receiver reconstruído com sucesso"
else
log "ERRO: falha na reconstrução"
echo "A reconstrução do mail-receiver falhou após a renovação do certificado. Verifique ${LOG_FILE}" | \
mail -s "[FALHA] Falha no gancho de implantação do certificado de email" "$ADMIN_EMAIL"
exit 1
fi
log "=== Gancho de implantação concluído com sucesso ==="
Nenhum cron job manual é necessário — o certbot orquestra todo o processo. O gancho de implantação só é acionado quando uma renovação realmente acontece, então seu mail-receiver não terá reconstruções desnecessárias em dias em que o certbot verifica, mas não renova.
Para testar o gancho de renovação, execute o seguinte:
bash
bash /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
Se tudo foi configurado corretamente, isso irá
→ copiar os certificados para os diretórios do Discourse
→ reconstruir o mail-receiver
→ logar tudo
6 — Configure TLS no mail-receiver.yml