Configurar e-mail de entrada de entrega direta para sites auto-hospedados com Mail-Receiver

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.

  1. Crie o registro A para o novo subdomínio. Ele usará o mesmo endereço de IP que o seu forums.domain.tld.
  2. 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:

  1. Vá para Cloudflare → Meu Perfil → Tokens de API → Criar Token
  2. Use o modelo “Editar DNS da Zona”
  3. Permissões: Zona → DNS → Editar
  4. Recursos da Zona: Incluir → Zona Específica → lotuselan.net
  5. Restrições de IP: Configure apenas para permitir o endereço de IP do seu servidor
  6. 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