Caso de Uso de CloudFlare
Estas instrucciones son para foros de Discourse autohospedados que utilizan el Proxy de Cloudflare.
Cuando utiliza el Proxy de Cloudflare, esto impide que todo el tráfico SMTP (Puerto 25) llegue a su servidor. Esto requiere que configure un subdominio diferente para que el receptor de correo funcione.
Por ejemplo, si su dominio es forums.domain.tld, deberá crear un nuevo subdominio, como mail.domain.tld.
Con Cloudflare, tiene los pasos adicionales a continuación.
- Cree el registro A para el nuevo subdominio. Utilizará la misma dirección IP que su
forums.domain.tld. - Cree el registro MX para el nuevo subdominio, tal como se indica en las instrucciones principales.
Siga los conjuntos de instrucciones principales con este cambio menor. Funcionará perfectamente con la seguridad TLS desactivada.
Si desea ejecutar la seguridad TLS, esto requerirá trabajo adicional.
Visión General de la Configuración TLS
Estas instrucciones instalarán Certbot y un complemento de Certbot para CloudFlare. Los comandos obtendrán certificados LetsEncrypt en modo independiente a través del proceso de certificación DNS. Una vez que los certificados estén disponibles, se copian al área compartida del receptor de correo para que el contenedor los utilice. Tenemos que usar el modelo DNS, ya que Discourse ya tiene el puerto 80.
Desafío DNS
En lugar de probar la propiedad del dominio a través de HTTP, certbot lo demuestra creando un registro TXT en su DNS. Dado que su DNS es Cloudflare, esto se puede automatizar completamente con un token de API de Cloudflare: no se necesita el puerto 80 ni el apagado del servidor web.
Cómo funciona
Certbot → Crea el registro TXT _acme-challenge.mail.lotuselan.net en Cloudflare
Let's Encrypt → Busca ese registro TXT → Valida → Emite el certificado
Certbot → Elimina el registro TXT
Todo esto se realiza en su servidor base, no dentro del contenedor de Discourse.
Configuración
1 — Instalar cerbot y el complemento de Certbot para Cloudflare:
bash
apt install certbot python3-certbot-dns-cloudflare -y
2 — Crear un token de API de Cloudflare:
- Vaya a Cloudflare → Mi Perfil → Tokens de API → Crear Token
- Use la plantilla “Editar DNS de zona”
- Permisos:
Zona → DNS → Editar - Recursos de Zona:
Incluir → Zona específica → lotuselan.net - Restricciones de IP: configure solo para permitir desde la dirección IP de su servidor
- Copie el token
3 — Guardar el token en un archivo de credenciales:
bash
mkdir -p /etc/letsencrypt/cloudflare
nano /etc/letsencrypt/cloudflare/credentials.ini
Pegue:
dns_cloudflare_api_token = SU_TOKEN_DE_API_DE_CLOUDFLARE
Bloquee el archivo:
bash
chmod 600 /etc/letsencrypt/cloudflare/credentials.ini
4 — Solicitar el certificado:
Actualice el siguiente comando con su correo electrónico de administrador y el nombre de dominio.
bash
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
--non-interactive \
--agree-tos \
--email su-email@dominio.tld \
-d mail.domain.tld
En sus resultados, debería haber una declaración que diga:
Certbot ha configurado una tarea programada para renovar automáticamente este certificado en segundo plano.
Certbot configurará un cron para verificar la caducidad del certificado dos veces al día. Renovará los certificados cuando estén a menos de 30 días de caducar. Puede validarlo mediante:
# Comprobar si el temporizador de systemd está activo (la mayoría de los sistemas Ubuntu modernos)
systemctl status certbot.timer
# O comprobar si se ha añadido un trabajo cron
cat /etc/cron.d/certbot
Ahora tiene los certificados TLS en su servidor para el nuevo nombre de dominio del receptor de correo. No están en un lugar donde puedan ser utilizados.
5 — Configurar un script de implementación para mover archivos
Dado que certbot se renueva automáticamente, solo necesita que su script maneje las partes específicas de Discourse: copiar los certificados renovados y reconstruir el receptor de correo. Puede simplificar significativamente el script utilizando el hook de implementación incorporado de certbot, que se ejecuta automáticamente después de una renovación exitosa.
Cree un archivo de hook de implementación:
bash
nano /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
Pegue esto:
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="dirección de correo electrónico de administrador"
LOG_FILE="/var/log/mail-cert-renewal.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Activado el hook de implementación de Certbot para ${DOMAIN} ==="
# Copiar certificados (usar -L para resolver enlaces 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 a ${DEST}"
done
# Reconstruir receptor de correo
cd "$DISCOURSE_DIR" || { echo "No se puede cd a ${DISCOURSE_DIR}" | mail -s "[FALLO] El hook de implementación de certificado de correo falló" "$ADMIN_EMAIL"; exit 1; }
log "Reconstruyendo receptor de correo..."
if ./launcher rebuild mail-receiver >> "$LOG_FILE" 2>&1; then
log "receptor de correo reconstruido con éxito"
else
log "ERROR: la reconstrucción falló"
echo "La reconstrucción del receptor de correo falló después de la renovación del certificado. Consulte ${LOG_FILE}" | \
mail -s "[FALLO] El hook de implementación de certificado de correo falló" "$ADMIN_EMAIL"
exit 1
fi
log "=== El hook de implementación se completó con éxito ==="
No se necesita ningún trabajo cron manual; certbot orquesta todo el proceso. El hook de implementación solo se activa cuando realmente se realiza una renovación, por lo que su receptor de correo no tendrá reconstrucciones innecesarias en los días en que certbot comprueba pero no renueva.
Para probar el hook de renovación, ejecute lo siguiente:
bash
bash /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
Si todo se configuró correctamente, esto hará:
→ copia los certificados a los directorios de Discourse
→ reconstruye el receptor de correo
→ registra todo
6 — Configurar TLS en mail-receiver.yml