Caso d’uso di CloudFlare
Queste istruzioni sono per forum Discourse self-hosted che utilizzano il Proxy di Cloudflare.
Quando si utilizza il Proxy di Cloudflare, ciò impedisce a tutto il traffico SMTP (Porta 25) di raggiungere mai il server. Ciò richiede di impostare un sottodominio diverso affinché il mail-receiver funzioni.
Ad esempio, se il tuo dominio è forums.domain.tld, dovrai creare un nuovo sottodominio, come mail.domain.tld.
Con Cloudflare, sono necessari i passaggi aggiuntivi seguenti.
- Creare il record A per il nuovo sottodominio. Utilizzerà lo stesso indirizzo IP di
forums.domain.tld. - Creare il record MX per il nuovo sottodominio come fornito nelle istruzioni principali.
Segui gli insiemi di istruzioni principali con questa piccola modifica. Funzionerà perfettamente con la sicurezza TLS disattivata.
Se desideri eseguire la sicurezza TLS, ciò richiederà un lavoro aggiuntivo.
Panoramica dell’impostazione TLS
Queste istruzioni installeranno Certbot e un plugin Certbot di CloudFlare. I comandi otterranno i certificati LetsEncrypt in Standalone tramite il processo di certificazione DNS. Una volta che i certificati sono disponibili, vengono copiati nell’area condivisa del mail-receiver affinché il container li utilizzi. Dobbiamo utilizzare il modello DNS, poiché Discourse ha già la porta 80.
Sfida DNS
Invece di dimostrare la proprietà del dominio tramite HTTP, certbot la dimostra creando un record TXT nel tuo DNS. Poiché il tuo DNS è Cloudflare, questo può essere completamente automatizzato con un token API di Cloudflare: nessuna porta 80, nessun arresto del server web necessario.
Come funziona
Certbot → Crea il record TXT _acme-challenge.mail.lotuselan.net in Cloudflare
Let's Encrypt → Cerca quel record TXT → Convalida → Emette il certificato
Certbot → Elimina il record TXT
Tutto questo viene fatto sul server di base, non all’interno del container di discourse.
Configurazione
1 — Installa cerbot e il plugin certbot di Cloudflare:
bash
apt install certbot python3-certbot-dns-cloudflare -y
2 — Crea un token API di Cloudflare:
- Vai su Cloudflare → My Profile → API Tokens → Create Token
- Utilizza il modello “Edit zone DNS”
- Autorizzazioni:
Zone → DNS → Edit - Risorse di zona:
Include → Specific zone → lotuselan.net - Restrizioni IP: imposta solo per consentire l’accesso dall’indirizzo IP del tuo server
- Copia il token
3 — Salva il token in un file di credenziali:
bash
mkdir -p /etc/letsencrypt/cloudflare
nano /etc/letsencrypt/cloudflare/credentials.ini
Incolla:
dns_cloudflare_api_token = IL_TUO_TOKEN_API_CLOUDFLARE
Blocca il file:
bash
chmod 600 /etc/letsencrypt/cloudflare/credentials.ini
4 — Richiedi il certificato:
Aggiorna il seguente comando con la tua email di amministratore e il nome di dominio.
bash
certbot certonly \
--dns-cloudflare \
--dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini \
--non-interactive \
--agree-tos \
--email tuaindirizzoemail@dominio.tld \
-d mail.domain.tld
Nei risultati, dovrebbe esserci un’istruzione che dice:
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Certbot imposterà un cron per controllare la scadenza del certificato due volte al giorno. Rinnova i certificati quando sono entro 30 giorni dalla scadenza. Puoi verificarlo tramite:
# Controlla se il timer systemd è attivo (sulla maggior parte dei moderni sistemi Ubuntu)
systemctl status certbot.timer
# Oppure controlla se è stata aggiunta un'attività cron
cat /etc/cron.d/certbot
Ora hai i certificati TLS sul server per il nuovo nome di dominio del mail-receiver. Non sono in una posizione utilizzabile.
5 — Imposta uno script di distribuzione per spostare i file
Poiché certbot si rinnova automaticamente, devi solo gestire la tua script per le parti specifiche di Discourse — copiare i certificati rinnovati e ricostruire il mail-receiver. Puoi semplificare notevolmente lo script utilizzando l’hook di distribuzione integrato di certbot, che viene eseguito automaticamente dopo un rinnovo riuscito.
Crea un file di hook di distribuzione:
bash
nano /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
Incolla questo:
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="indirizzo email admin"
LOG_FILE="/var/log/mail-cert-renewal.log"
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a "$LOG_FILE"
}
log "=== Triggered hook di distribuzione Certbot per ${DOMAIN} ==="
# Copia certificati (usa -L per risolvere i collegamenti simbolici)
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 "Certificati copiati in ${DEST}"
done
# Ricostruisci mail-receiver
cd "$DISCOURSE_DIR" || { echo "Impossibile eseguire cd in ${DISCOURSE_DIR}" | mail -s "[FALLIMENTO] Il deploy hook del certificato mail non è riuscito" "$ADMIN_EMAIL"; exit 1; }
log "Ricostruzione di mail-receiver..."
if ./launcher rebuild mail-receiver >> "$LOG_FILE" 2>&1; then
log "mail-receiver ricostruito con successo"
else
log "ERRORE: ricostruzione fallita"
echo "La ricostruzione di mail-receiver è fallita dopo il rinnovo del certificato. Controlla ${LOG_FILE}" | \
mail -s "[FALLIMENTO] Il deploy hook del certificato mail non è riuscito" "$ADMIN_EMAIL"
exit 1
fi
log "=== Deploy hook completato con successo ==="
Nessuna attività cron manuale necessaria — certbot orchestra l’intero processo. L’hook di distribuzione si attiva solo quando avviene effettivamente un rinnovo, quindi il tuo mail-receiver non subirà ricostruzioni non necessarie nei giorni in cui certbot controlla ma non rinnova.
Per testare l’hook di rinnovo, esegui quanto segue:
bash
bash /etc/letsencrypt/renewal-hooks/deploy/mail-receiver-deploy.sh
Se tutto è stato configurato correttamente, questo:
→ copia i certificati nelle directory di Discourse
→ ricostruisce mail-receiver
→ registra tutto
6 — Imposta TLS in mail-receiver.yml