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.
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
systemddedicato
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
9000aperta - 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
587con 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:
WorkingDirectoryerrata- file
config.tomlnon trovato - password database sbagliata
- porta
9000già 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.
Discussione