Salta al contenuto principale
Dal blog

Listmonk su Proxmox/LXC senza Docker: installazione completa con PostgreSQL e SMTP

Guida pratica per installare Listmonk su Proxmox in un container LXC, senza Docker: PostgreSQL, systemd, SMTP, reverse proxy, SPF, DKIM, DMARC e controlli di sicurezza.

Foto profilo di Alessandro IannaconeAlessandro Iannacone

Listmonk è una piattaforma open source, leggera e performante per gestire newsletter, liste contatti e campagne email. In questa guida vediamo come installare Listmonk su Proxmox in un container LXC, senza Docker, usando PostgreSQL come database e un provider SMTP per l'invio reale delle email.

L'obiettivo non è solo "far partire il servizio". L'obiettivo è avere un'installazione pulita, mantenibile, adatta a un ambiente self-hosted o aziendale:

  • Listmonk eseguito come servizio systemd
  • PostgreSQL locale nel container
  • configurazione pronta per SMTP
  • reverse proxy HTTPS davanti al servizio
  • DNS email impostati correttamente con SPF, DKIM e DMARC
  • qualche controllo minimo di sicurezza prima di usarlo in produzione

Se usi Proxmox per centralizzare servizi interni, automazioni, monitoring o strumenti di comunicazione, Listmonk in LXC è una soluzione molto più semplice da gestire rispetto a un deployment Docker completo.


Quando ha senso Listmonk su Proxmox

Listmonk è una buona scelta quando vuoi:

  • evitare piattaforme newsletter troppo costose per liste medio-piccole
  • mantenere il controllo sui dati dei contatti
  • integrare campagne email con strumenti interni
  • usare SMTP esterni come Amazon SES, Mailgun, Brevo, Postmark o un relay aziendale
  • separare il servizio newsletter dal resto dell'infrastruttura

Non è invece la scelta giusta se vuoi "inviare email dal tuo server" senza pensare a reputazione, bounce, DNS e deliverability. Per quello conviene quasi sempre usare un provider SMTP serio e lasciare a Listmonk la parte di gestione liste, template, campagne e segmentazione.

Architettura consigliata

La configurazione che uso è questa:

Internet
  |
  | HTTPS
  v
Reverse proxy / firewall
  |
  | HTTP interno :9000
  v
Container LXC su Proxmox
  |
  | localhost
  v
PostgreSQL

All'interno del container girano:

  • listmonk, come binario installato in /usr/bin
  • PostgreSQL, come database locale
  • un servizio systemd dedicato

Il container non deve esporre direttamente Listmonk su Internet. Meglio pubblicarlo tramite reverse proxy, con TLS, header corretti e accesso limitato all'area amministrativa se possibile.

Requisiti del container LXC

  • Container LXC con Debian/Ubuntu
  • Accesso root
  • Porta 9000 aperta
  • almeno 1 vCPU e 1 GB di RAM per un uso leggero
  • disco sufficiente per database, log e backup
  • IP statico o lease DHCP riservato
  • dominio dedicato, ad esempio newsletter.tuodominio.it

Se il container è non privilegiato, va benissimo: Listmonk non richiede privilegi particolari. L'importante è che abbia connettività verso il provider SMTP scelto.

1. Aggiornare il container

Entra nel container LXC e aggiorna i pacchetti:

apt update
apt dist-upgrade -y
apt install curl ca-certificates tar postgresql -y

Controlla che PostgreSQL sia partito:

systemctl status postgresql

2. Creare database e utente PostgreSQL

Apri la console PostgreSQL:

sudo -u postgres psql

Crea database e utente dedicati:

CREATE DATABASE listmonk;
CREATE USER listmonk WITH PASSWORD 'CAMBIA_QUESTA_PASSWORD';
GRANT ALL PRIVILEGES ON DATABASE listmonk TO listmonk;
\c listmonk
GRANT ALL ON SCHEMA public TO listmonk;
\q

Usa una password lunga e salvala in un password manager. Evita esempi come listmonk/listmonk su installazioni reali.

3. Scaricare Listmonk

mkdir -p /opt/listmonk
cd /opt/listmonk
curl -L https://github.com/knadh/listmonk/releases/latest/download/listmonk.tar.gz | tar -xz

Copia il binario in /usr/bin:

cp listmonk /usr/bin/
chmod +x /usr/bin/listmonk

Verifica che il binario risponda:

/usr/bin/listmonk --version

4. Configurare Listmonk

Modifica il file /opt/listmonk/config.toml.

La parte minima per far ascoltare Listmonk sulla rete interna è:

[app]
address = "0.0.0.0:9000"

[db]
host = "127.0.0.1"
port = 5432
user = "listmonk"
password = "CAMBIA_QUESTA_PASSWORD"
database = "listmonk"
ssl_mode = "disable"

Su un container LXC con database locale, ssl_mode = "disable" è normale. Se invece PostgreSQL è esterno, valuta TLS, firewall e autenticazione con più attenzione.

5. Installare lo schema iniziale

Listmonk deve creare le tabelle nel database:

cd /opt/listmonk
/usr/bin/listmonk --install

Se tutto è corretto, l'installazione termina senza errori. In caso di problema, controlla prima password, permessi sul database e raggiungibilità di PostgreSQL.

6. Creare il servizio systemd

Crea il file:

nano /etc/systemd/system/listmonk.service

Contenuto consigliato:

[Unit]
Description=Listmonk self-hosted newsletter
After=network.target postgresql.service
Requires=postgresql.service

[Service]
Type=simple
User=root
WorkingDirectory=/opt/listmonk
ExecStart=/usr/bin/listmonk --config /opt/listmonk/config.toml
Restart=on-failure
RestartSec=5s

[Install]
WantedBy=multi-user.target

Attiva e avvia:

systemctl daemon-reload
systemctl enable --now listmonk

Verifica:

systemctl status listmonk
journalctl -u listmonk -f

Ora puoi aprire:

http://IP_DEL_CONTAINER:9000

Credenziali predefinite:

  • utente: admin
  • password: listmonk

Cambia subito la password dell'utente amministratore.

7. Configurare SMTP

Listmonk non deve per forza inviare email direttamente dal server. Anzi, per un uso serio consiglio di collegarlo a un provider SMTP esterno.

Nel pannello di amministrazione vai in:

Settings -> SMTP

I campi tipici sono:

  • host SMTP, ad esempio smtp.provider.com
  • porta, spesso 587 con STARTTLS
  • username
  • password o API key
  • email mittente, ad esempio [email protected]
  • nome mittente, ad esempio il nome della tua azienda

Prima di inviare campagne reali, fai sempre un test verso una casella controllata da te e verifica:

  • arrivo in inbox, non in spam
  • mittente corretto
  • link di unsubscribe visibile
  • tracking coerente con la tua privacy policy
  • template leggibile su mobile

8. DNS email: SPF, DKIM e DMARC

La parte che fa davvero la differenza non è il click su "send". È la deliverability.

Per il dominio mittente devi configurare almeno:

SPF   -> autorizza il provider SMTP a inviare per il tuo dominio
DKIM  -> firma crittografica dei messaggi
DMARC -> policy di controllo e report sugli abusi

Esempio concettuale di SPF:

tuodominio.it. TXT "v=spf1 include:provider-smtp.example -all"

Esempio concettuale di DMARC prudente per partire:

_dmarc.tuodominio.it. TXT "v=DMARC1; p=none; rua=mailto:[email protected]"

Non copiare questi record alla cieca: ogni provider SMTP ha valori specifici, soprattutto per DKIM. Usa sempre i record indicati dal provider e poi verifica con strumenti di test DNS e deliverability.

9. Reverse proxy e HTTPS

Listmonk ascolta sulla porta 9000, ma il pubblico dovrebbe arrivare via HTTPS.

Con Nginx, una configurazione base può essere:

server {
    listen 80;
    server_name newsletter.tuodominio.it;

    location / {
        proxy_pass http://IP_DEL_CONTAINER:9000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Poi aggiungi TLS con Certbot, Nginx Proxy Manager, Caddy, Traefik o il reverse proxy che già usi.

Se Listmonk è esposto su Internet, valuta anche:

  • allowlist IP per /admin, se possibile nel tuo reverse proxy
  • rate limit
  • backup automatici
  • aggiornamenti periodici
  • monitoraggio del servizio

10. Backup

Il backup minimo deve includere:

  • database PostgreSQL
  • /opt/listmonk/config.toml
  • eventuali template o asset caricati
  • configurazione del reverse proxy

Esempio di dump PostgreSQL:

sudo -u postgres pg_dump listmonk > /root/listmonk-$(date +%F).sql

Se usi Proxmox Backup Server, puoi proteggere direttamente il container LXC. Io comunque preferisco avere anche un dump logico del database: rende più semplice un ripristino selettivo o una migrazione.

Troubleshooting

Errore di connessione al database

Controlla:

  • password nel config.toml
  • database creato correttamente
  • permessi sullo schema public
  • stato di PostgreSQL
systemctl status postgresql
sudo -u postgres psql -d listmonk

Servizio Listmonk non parte

Leggi i log:

journalctl -u listmonk -n 100 --no-pager

Gli errori più comuni sono:

  • WorkingDirectory errata
  • file config.toml non trovato
  • password database sbagliata
  • porta 9000 già occupata

SMTP configurato ma email non arrivano

Verifica:

  • credenziali SMTP
  • porta e modalità TLS
  • record SPF/DKIM/DMARC
  • dominio mittente verificato nel provider
  • bounce o blocchi lato provider

Le email finiscono in spam

Di solito il problema non è Listmonk, ma reputazione e configurazione email:

  • dominio nuovo senza storico
  • SPF incompleto
  • DKIM mancante
  • DMARC assente
  • contenuto troppo promozionale
  • liste importate senza consenso chiaro

Checklist finale

Prima di usare Listmonk per una newsletter reale, controlla:

  • password admin cambiata
  • SMTP testato
  • SPF configurato
  • DKIM attivo
  • DMARC presente
  • HTTPS attivo
  • backup schedulato
  • privacy policy aggiornata
  • link unsubscribe funzionante
  • consenso dei contatti documentato

Quando conviene farsi aiutare

Installare Listmonk è abbastanza semplice. Farlo diventare un sistema affidabile per comunicazioni aziendali richiede più attenzione: DNS, reputazione del dominio, backup, privacy, sicurezza del pannello admin e integrazione con il resto dell'infrastruttura.

Se devi installare Listmonk su Proxmox, migrare da Mailchimp/Brevo o impostare una newsletter self-hosted con SMTP, backup e HTTPS, posso aiutarti a progettare una configurazione pulita e mantenibile.

Contattami qui

Discussione