Configura la consegna diretta delle email in entrata per siti self-hosted con Mail-Receiver

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.

  1. Creare il record A per il nuovo sottodominio. Utilizzerà lo stesso indirizzo IP di forums.domain.tld.
  2. 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:

  1. Vai su Cloudflare → My Profile → API Tokens → Create Token
  2. Utilizza il modello “Edit zone DNS”
  3. Autorizzazioni: Zone → DNS → Edit
  4. Risorse di zona: Include → Specific zone → lotuselan.net
  5. Restrizioni IP: imposta solo per consentire l’accesso dall’indirizzo IP del tuo server
  6. 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