SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor

Stalwart: server mail completo su un VPS

Scopri cosa sostituisce il singolo binario Rust di Stalwart in Postfix e Dovecot, cosa non risolve e quando mailcow resta la scelta migliore.

Cosa riunisce Stalwart in un unico binario

Stalwart è un mail server che si esegue su un solo VPS come unico binario Rust. Gestisce SMTP, IMAP, POP3, JMAP, CalDAV, CardDAV e WebDAV dallo stesso processo e include un filtro antispam, un message store e un client ACME propri. Uno stack convenzionale svolge le stesse funzioni con Postfix, Dovecot, Rspamd, un database per gli account e uno strumento separato per i certificati. Stalwart sostituisce tutti questi componenti con una sola unità di servizio e un solo file di configurazione in /etc/stalwart/config.json.

Ogni valore, nome di impostazione e comando riportato di seguito è tratto dalla documentazione ufficiale di Stalwart, dalle pagine delle release e dallo script di installazione. La prima verifica è stata eseguita il 28 agosto 2026 sulla release v0.16.19, pubblicata il 24 agosto 2026. Il contenuto è stato verificato nuovamente il 12 ottobre 2026, quando la release più recente era v0.16.26, pubblicata l'11 ottobre 2026. Sono comandi da eseguire sul proprio server. Dopo ogni comando è riportato il controllo che indica se l'operazione è riuscita.

Stalwart è distribuito con doppia licenza: GNU Affero General Public License v3.0 (AGPL-3.0) e Stalwart Enterprise License v2. Alcune funzionalità sono disponibili solo nell'edizione enterprise. L'elenco documentato degli endpoint HTTP le contrassegna con /scim/v2/*. Leggere i termini di licenza prima di pianificare un'installazione che dipenda da una funzionalità non ancora verificata direttamente.

Un unico binario riduce davvero il numero di componenti da gestire. Non riduce però i due fattori da cui dipende la consegna dei messaggi.

La porta 25 e la reputazione DNS non dipendono dal software in esecuzione

La porta TCP 25 in uscita è il primo controllo. Molti provider VPS la bloccano per impostazione predefinita sui nuovi account. Quando la porta 25 è bloccata, il server non può consegnare direttamente i messaggi ai server di posta di altri destinatari. Verificatela prima di installare qualsiasi componente.

sudo apt update && sudo apt install -y netcat-openbsd
nc -vz -w 5 alt1.aspmx.l.google.com 25

Un risultato corretto stampa Connection to alt1.aspmx.l.google.com ... 25 port [tcp/smtp] succeeded! in circa un secondo. Un blocco si manifesta in uno di due modi. Se i pacchetti vengono scartati a monte, nessuno invia un reset al server. nc resta quindi in attesa per tutti i cinque secondi e poi stampa nc: connect to alt1.aspmx.l.google.com port 25 (tcp) failed: Connection timed out. Se invece il firewall rifiuta i pacchetti, restituisce un errore ICMP. Il rifiuto di netfilter invia port unreachable, a meno che non sia configurato per inviare un altro errore, ad esempio administratively prohibited. In questo caso il fallimento viene segnalato subito, in genere come Connection refused o No route to host. In entrambi i casi, aprite un ticket con il provider.

Se il provider non sblocca la porta, l'unica soluzione è usare un relay. Stalwart può inoltrare tutta la posta in uscita a uno smarthost tramite una route Relay. La porta predefinita è 25, ma sono accettati valori da 1 a 65535. L'opzione implicitTls abilita l'autenticazione; i campi authUsername e authSecret consentono di configurare un relay autenticato sulla porta 465 o 587. I messaggi usciranno quindi con la reputazione del relay, non con la vostra.

Il secondo controllo riguarda il modo in cui le reti riceventi valutano il vostro indirizzo IP e il vostro dominio. Sono inclusi il reverse DNS dell'indirizzo IP, SPF, DKIM, DMARC e la cronologia di invio del blocco di indirizzi a cui appartenete. La pagina di configurazione DNS di Stalwart, nella versione consultata il 28 agosto 2026, indicava chiaramente dove viene svolto questo lavoro: i record reverse DNS «sono in genere configurati dal provider di hosting, non da Stalwart». Lo stesso vale per il resto della configurazione. Questa risiede nella vostra zona DNS e nel pannello di controllo del provider, non nel server di posta.

Per questo motivo, questa pagina non spiega nuovamente quei record. Esiste una guida specifica: Configurare una volta SPF, DKIM e DMARC per tutto ciò che invia posta. Se non avete ancora deciso se gestire direttamente il servizio di posta, iniziate da la nostra valutazione onesta sull'utilità attuale della posta elettronica self-hosted. La scelta di Stalwart non modifica nessuno di questi aspetti.

Cosa serve a un piccolo VPS per eseguire un server di posta Stalwart

La pagina dei requisiti di sistema di Stalwart, consultata il 12 ottobre 2026, riporta questi valori. Il consumo di memoria a riposo è di circa 100 MB. Una distribuzione ridotta, con 5-10 utenti, funziona su 1 GB di RAM. Una configurazione con traffico ridotto e circa 5 utenti funziona con un singolo core della CPU. La pagina aggiunge che «con l'aumento della concorrenza e dell'attività, saranno necessari più core della CPU per mantenere una bassa latenza e un throughput elevato». Il limite predefinito è di 8,192 connessioni simultanee complessive per tutti i servizi ed è configurabile.

La pagina non indica una dimensione minima del disco. Dimensionate quindi il disco in base alla quantità di posta che prevedete di conservare, lasciando inoltre spazio sufficiente per la compattazione dello store.

Devono funzionare tre percorsi in uscita. In caso contrario, il server può sembrare guasto per motivi che non hanno nulla a che fare con la posta. Scarica il bundle dell'interfaccia web da https://github.com/stalwartlabs/webui/releases/latest/. Raggiunge https://acme-v02.api.letsencrypt.org/directory per ottenere i certificati. Richiede DNS sulle porte UDP e TCP 53 per le ricerche dei record MX e dei record di autenticazione. Un firewall per il traffico in uscita configurato in modo restrittivo che blocca il primo percorso lascia un server di posta in esecuzione, ma senza interfaccia di amministrazione.

Installare una release fissata, non "latest"

L'installer ufficiale è uno script shell. Leggetelo prima di eseguirlo.

curl --proto '=https' --tlsv1.2 -sSf https://get.stalw.art/install.sh -o install.sh
less install.sh
sudo sh install.sh

La lettura dello script il 12 October 2026 mostra esattamente quali operazioni esegue. Crea un account di servizio stalwart e le directory necessarie. Scarica quindi da https://github.com/stalwartlabs/stalwart/releases/latest/download. Il binario viene installato in /usr/local/bin/stalwart con modalità 0755. La configurazione viene salvata in /etc/stalwart/config.json, i dati in /var/lib/stalwart e i log in /var/log/stalwart; tutte e tre le directory hanno modalità 0750 e appartengono a stalwart. Un file d'ambiente viene scritto in /etc/stalwart/stalwart.env con modalità 0640 e appartiene a root:stalwart. Lo script accetta un prefisso di installazione opzionale e un flag --fdb per la build di FoundationDB. Non accetta alcun argomento per la versione.

Questo ultimo punto è importante. Lo script scarica sempre la release più recente, quindi due server configurati a una settimana di distanza non eseguono lo stesso codice. Fissate manualmente il binario subito dopo l'installazione. Questa è anche la procedura di aggiornamento indicata nelle note di rilascio di v0.16.26: "If you are upgrading from v0.16.x, replace the binary (or run docker pull)." Tra il 24 August e l'11 October 2026 sono state pubblicate sette patch release, diverse delle quali includevano correzioni di sicurezza. Fissate quindi la release più recente e aggiornate il pin in modo intenzionale.

STALWART_TAG=v0.16.26
curl -fsSLO "https://github.com/stalwartlabs/stalwart/releases/download/${STALWART_TAG}/stalwart-x86_64-unknown-linux-gnu.tar.gz"
tar zxf stalwart-x86_64-unknown-linux-gnu.tar.gz
sudo systemctl stop stalwart
sudo install -m 0755 -o root -g root stalwart /usr/local/bin/stalwart
sudo systemctl start stalwart
systemctl is-active stalwart

systemctl is-active stalwart dovrebbe stampare active. In caso contrario, consultate journalctl -u stalwart -n 50. Ogni release include un bundle .sigstore.json corrispondente, quindi la firma del download può essere verificata prima dell'installazione.

L'unità scritta dallo script viene eseguita come User=stalwart e imposta AmbientCapabilities=CAP_NET_BIND_SERVICE. Questa capability consente a un account senza privilegi di associare porte come 25, 443, 465 e 993. Se in seguito scrivete una unità personalizzata e omettete quella riga, il servizio non si avvia perché un utente normale non può associare una porta inferiore a 1024.

Dove viene stampata la prima password di amministrazione

Stalwart viene avviato in modalità bootstrap e scrive una password temporanea di 16 caratteri nel log del servizio una sola volta.

sudo journalctl -u stalwart -n 200 | grep -A8 'bootstrap mode'

La procedura guidata di configurazione è disponibile tramite HTTP non cifrato sulla porta 8080. Non esporre quindi questa porta. Inoltrala dal laptop tramite SSH:

ssh -N -L 8080:127.0.0.1:8080 you@your-vps

Apri quindi http://127.0.0.1:8080/admin e accedi come admin usando la password riportata nel log. La procedura guidata richiede il nome host del server, il dominio di posta predefinito, TLS, lo storage, la directory degli account, la gestione dei log e quella del DNS. Al termine, riavvia il servizio e da quel momento usa https://<your-host>/admin.

Se la password non è più visibile nel log, impostane una fissa. /etc/stalwart/stalwart.env contiene voci commentate specifiche per questo scopo, tra cui STALWART_RECOVERY_ADMIN=admin:changeme, STALWART_RECOVERY_MODE=true e STALWART_RECOVERY_MODE_PORT (predefinita: 8080). Rimuovi i commenti, riavvia il servizio, accedi e aggiungi nuovamente i commenti. La pagina di hardening di Stalwart indica di conservare questa credenziale solo per le emergenze e di non accedere a IMAP, JMAP o WebDAV con un account di amministrazione.

La stessa pagina indica quali listener mantenere: la porta 25 per SMTP in ingresso, la 465 per l'invio con TLS implicito, la 993 per IMAPS e la 443 per tutti i servizi HTTP. Considera non essenziali le porte 587, 143, 4190, 110, 995 e 8080 e indica di disabilitare 8080 al termine della configurazione.

Eseguirlo in Docker con un tag bloccato

L’immagine documentata è stalwartlabs/stalwart. Il tag v0.16.26 era presente su Docker Hub il 12 ottobre 2026, insieme a una variante -alpine. La pagina Docker di Stalwart suggerisce il tag minor v0.16 per la produzione. Blocca invece la versione patch, per lo stesso motivo indicato sopra per il binario.

services:
  stalwart:
    image: stalwartlabs/stalwart:v0.16.26
    container_name: stalwart
    restart: unless-stopped
    ports:
      - "25:25"
      - "465:465"
      - "993:993"
      - "443:443"
      - "127.0.0.1:8080:8080"
    volumes:
      - stalwart-etc:/etc/stalwart
      - stalwart-data:/var/lib/stalwart
volumes:
  stalwart-etc:
  stalwart-data:

Questo file contiene il comando docker run documentato, espresso in formato Compose, con i listener non essenziali rimossi e la porta di configurazione associata a localhost. Avvia lo stack e leggi la stessa riga di bootstrap:

docker compose up -d
docker compose logs stalwart 2>&1 | grep -A8 'bootstrap mode'

La pagina Docker documenta anche -e STALWART_RECOVERY_ADMIN=admin:mySecretPass come metodo per impostare una credenziale fissa all’avvio. In Compose corrisponde alla chiave environment:, se preferisci questa soluzione alla lettura dei log.

L’elenco completo delle porte documentate e il motivo per cui questo file è più breve

La pagina Docker di Stalwart pubblica le porte 443, 8080, 25, 587, 465, 143, 993, 110, 995 e 4190. La pagina sull’hardening indica 587, 143, 110, 995 e 4190 come non essenziali e specifica di disabilitare 8080 dopo la configurazione iniziale. Riaggiungi solo le porte effettivamente richieste dai client. Se un telefono richiede l’invio tramite STARTTLS, pubblica 587. Se gli utenti creano regole Sieve da un client desktop, pubblica 4190.

Se Compose è una novità, la nostra guida a Docker Compose per un VPS descrive la struttura dei file e il modello dei volumi denominati usato in questo esempio. C’è un’avvertenza particolarmente importante per i server di posta: Docker pubblica le porte scrivendo regole firewall proprie, che vengono valutate prima di quelle di ufw. Di conseguenza, ufw deny 8080 non chiude una porta pubblicata da Compose. È l’associazione a 127.0.0.1 nella mappatura delle porte a chiuderla effettivamente. Per questo il file precedente la usa e il tunnel SSH continua ad applicarsi.

TLS senza certbot: il costo da sostenere

Stalwart implementa direttamente ACME (automatic certificate management environment), quindi non sono necessari certbot né un hook per il rinnovo. La documentazione elenca quattro metodi di convalida. HTTP-01 risponde a una richiesta di verifica sulla porta 80. TLS-ALPN-01 presenta un certificato dedicato sulla porta 443 usando il protocollo ALPN specifico di ACME. DNS-01 pubblica record TXT temporanei ed è uno dei due metodi che possono emettere certificati wildcard. DNS-PERSIST-01 usa record TXT di autorizzazione a lunga durata invece di crearne uno nuovo a ogni rinnovo.

Il vincolo è che Stalwart deve gestire l'handshake TLS. TLS-ALPN-01 funziona completando direttamente l'handshake, quindi non può funzionare dietro un reverse proxy che termina TLS. Se nginx o Caddy occupa già la porta 443 su quel server, ci sono tre possibilità. La guida di Stalwart per nginx configura nginx come passthrough TCP, con listen 443; proxy_pass 127.0.0.1:10443; proxy_protocol on;, in modo che la connessione TLS raggiunga Stalwart senza modifiche. In questo modo ogni connessione sulla porta 443 viene inoltrata a Stalwart, quindi questa soluzione è adatta a un server in cui nginx non pubblica altri servizi su quella porta. In alternativa, configura Stalwart con DNS-01 o HTTP-01, oppure assegnagli un indirizzo IP dedicato.

DANE e MTA-STS: impostazioni predefinite da conoscere

Entrambi si configurano per strategia TLS sull'oggetto MtaTlsStrategy, nelle sezioni Settings, MTA, Outbound, TLS Strategies dell'interfaccia web. Il campo dane è impostato per impostazione predefinita su optional. Tenta la convalida DANE quando il destinatario pubblica record TLSA e, in caso contrario, ripiega sul normale STARTTLS. Se lo imposti su require, la consegna procede solo quando è disponibile un record TLSA verificabile. Il campo mtaSts si comporta allo stesso modo e, per impostazione predefinita, usa optional. I timeout correlati sono tlsTimeout (3 minuti per impostazione predefinita) e mtaStsTimeout (5 minuti per impostazione predefinita).

Per la posta in entrata, Stalwart può pubblicare la tua policy MTA-STS all'indirizzo https://mta-sts.<domain>/.well-known/mta-sts.txt, che richiede la porta 443 aperta. Il singleton MtaSts include mode (testing per impostazione predefinita), maxAge (7 giorni per impostazione predefinita) e mxHosts, che, se vuoto, usa i nomi host presenti nel certificato TLS. Devi fornire due record DNS: un record CNAME mta-sts che punti all'host di posta e un record TXT _mta-sts contenente l'identificatore della policy.

dig +short TXT _mta-sts.example.org
curl -s https://mta-sts.example.org/.well-known/mta-sts.txt

La ricerca TXT dovrebbe restituire una stringa v=STSv1; id=... e curl dovrebbe restituire il corpo della policy. Se curl non restituisce nulla, la porta 443 è chiusa oppure il certificato per mta-sts.example.org non è mai stato emesso.

Mantieni mode su testing finché entrambi i controlli non hanno esito positivo. Una policy in modalità enforce con un certificato non funzionante impedisce agli altri server di consegnarti la posta, e lo scoprirai dagli utenti anziché dai log. DANE presenta un problema analogo: richiede una zona firmata con DNSSEC e un record TLSA che associ il certificato leaf deve essere ripubblicato a ogni rinnovo ACME. Puoi associare la policy alla CA emittente oppure accettare di eseguire questa operazione a ogni rinnovo.

La cifratura dei dati a riposo non è una cifratura end-to-end

Questa è la funzionalità più spesso interpretata in modo errato, quindi riportiamo esattamente quanto indicato nella documentazione. I messaggi in chiaro di ogni utente vengono cifrati automaticamente usando il certificato OpenPGP o S/MIME dell'utente prima di essere scritti sul disco. encryptAtRest è abilitato per impostazione predefinita e si applica ai messaggi ricevuti tramite SMTP o LMTP, purché il destinatario abbia registrato una chiave di cifratura. encryptOnAppend è impostato su false per impostazione predefinita, «lasciando invariati i messaggi aggiunti, in modo che i client mantengano il pieno controllo sui contenuti che archiviano». OpenPGP usa PGP/MIME anziché il precedente PGP/Inline, con AES-256 o AES-128. Stalwart non genera le chiavi: gli utenti esportano una chiave pubblica ASCII-armored e la registrano come oggetto PublicKey in Account, Public Keys.

Questa protezione si applica quindi a un'immagine del disco sottratta, a un backup sottratto e a un operatore che legge l'archivio dopo la consegna. Senza la chiave privata, i byte archiviati non sono leggibili e neppure l'amministratore può decifrarli.

Non protegge il messaggio durante il transito. Un messaggio attraversa Internet usando il livello TLS concordato dai due server, arriva in chiaro e Stalwart lo cifra in quel momento. Il mittente, il provider del mittente e qualsiasi hop che abbia rimosso TLS hanno già visto il messaggio in chiaro.

È importante indicare chiaramente altri tre limiti. Le cartelle Sent e Drafts vengono scritte dal client dell'utente, tramite un'operazione di aggiunta, e encryptOnAppend è impostato su false per impostazione predefinita; pertanto restano in chiaro, a meno che non si modifichi questa impostazione. La documentazione che ho consultato nuovamente il 12 ottobre 2026 descrive solo il contenuto dei messaggi e non afferma che i dati dell'envelope, gli header o le voci dell'indice siano cifrati; non bisogna quindi darlo per scontato. Inoltre, non indica che i messaggi già archiviati prima del caricamento di una chiave vengano cifrati nuovamente; bisogna quindi presumere che non lo siano e verificarlo. Non è neppure specificato se la ricerca full-text continui a funzionare nei corpi dei messaggi cifrati. Verificatelo con un account temporaneo prima di promettere questa funzionalità a qualcuno.

Se un utente perde la propria chiave privata, la posta è persa. Non esiste alcuna procedura di recupero, per scelta progettuale.

WKD è un'attività del server web, non del server di posta

WKD (Web Key Directory) è l'altra parte del modello OpenPGP e risolve un problema diverso. Pubblica la chiave pubblica a un URL HTTPS fisso sotto il tuo dominio, in modo che il client di posta del mittente possa trovarla e crittografare il messaggio prima che lasci il suo dispositivo. Questa è la crittografia end-to-end. La crittografia dei dati inattivi di Stalwart riguarda la copia presente sul disco. Configurare una delle due non configura anche l'altra.

Stalwart non fornisce WKD. I suoi endpoint HTTP documentati, consultati il 12 ottobre 2026, elencano percorsi well-known per jmap, caldav, carddav, oauth-authorization-server, openid-configuration, acme-challenge, mta-sts.txt, mail-v1.xml e autoconfig. Non esiste alcun percorso openpgpkey. Pubblica WKD tramite un normale server web statico.

La specifica definisce due strutture. Il metodo avanzato usa https://openpgpkey.example.org/.well-known/openpgpkey/example.org/hu/iy9q119eutrkn8s1mk4r39qejnbu3n5q?l=Joe.Doe. Il metodo diretto usa https://example.org/.well-known/openpgpkey/hu/iy9q119eutrkn8s1mk4r39qejnbu3n5q?l=Joe.Doe. Questa stringa di 32 caratteri è l'hash SHA-1 della parte locale convertita in minuscolo e codificata in z-base-32. Per questo motivo non devi creare manualmente questi nomi di file. GnuPG li crea per te.

gpg --export --armor you@example.org > you.asc
gpg-wks-client --print-wkd-url you@example.org
gpg-wks-client --install-key you.asc you@example.org

--print-wkd-url stampa l'URL che un client recupererà, usando la forma con sottodominio. --install-key scrive la chiave in una struttura di directory locale che rispecchia il layout WKD, sotto una directory di primo livello denominata openpgpkey per impostazione predefinita e modificata con -C dir. Copia questa struttura nella root del server web, aggiungi il file policy richiesto accanto alla directory hu (è valido anche un file vuoto) e recupera il tuo URL con curl per verificare che restituisca i dati della chiave e non un errore 404.

Storage su un singolo VPS

Stalwart suddivide lo storage in quattro ruoli: un data store per i record strutturati, come lo stato delle mailbox; un blob store per i byte dei messaggi e gli allegati originali; un search store per l'indicizzazione full-text; e un in-memory store per i rate limiter, i token di autenticazione e i dati di sessione. Ogni ruolo può puntare a un backend diverso. L'elenco dei backend supportati include RocksDB, FoundationDB, PostgreSQL, MySQL, SQLite, object storage compatibile con S3, Azure Blob Storage, Redis, ElasticSearch e Meilisearch.

Su un singolo VPS la risposta è semplice. La documentazione definisce RocksDB «il backend consigliato per le installazioni single-node di Stalwart per la sua velocità e affidabilità». Redis è supportato soltanto come in-memory store e non può essere usato come data store o blob store. Non è quindi necessario un container Redis separato per iniziare. In seguito puoi spostare il blob store su S3 se le mailbox superano lo spazio disponibile sul disco.

I backup dipendono dal backend. Per i database esterni, usa la procedura prevista dal database. Per i backend embedded, la FAQ indica di copiare la directory /var/lib/stalwart. Esegui l'operazione con il servizio arrestato oppure da uno snapshot del filesystem o del volume. Una copia a livello di file di un key-value store in esecuzione può acquisire i dati durante una scrittura. Potresti accorgertene soltanto quando provi a ripristinare il backup.

Il filtro antispam che sostituisce Rspamd

Il filtraggio viene eseguito nello stesso processo, quindi non è necessario mantenere attivo un secondo demone. Il classificatore si configura nel singleton SpamClassifier, nella sezione Settings, Spam Filter, Classifier. Utilizza l'algoritmo FTRL-Proximal con feature hashing. FtrlFh è l'impostazione predefinita consigliata per la maggior parte delle installazioni. FtrlCcfh sostituisce il feature hashing con hashing basato su cuckoo per ridurre le collisioni degli hash ed è pensato per installazioni su larga scala. Il classificatore si addestra continuamente: quando gli utenti contrassegnano un messaggio come spam o ham, questa etichetta viene usata direttamente per le decisioni future.

Intorno al classificatore operano DNS blocklist, greylisting, rilevamento del phishing, spam trap e Pyzor. È inoltre possibile richiamare SpamAssassin tramite milter se si dispone di regole a cui non si vuole rinunciare.

Quando mailcow è ancora la scelta giusta

Stalwart non include una webmail. Questa è di gran lunga la lacuna principale e non è stata colmata. La documentazione di mailcow, consultata il 12 ottobre 2026, elenca sedici componenti, tra cui SOGo, che fornisce agli utenti una casella accessibile dal browser e un’interfaccia CalDAV e CardDAV pronta all’uso. Il post della roadmap di Stalwart del 20 giugno 2025 afferma che una webmail integrata è «nei nostri piani, ma al momento non è una priorità immediata» e che verrà sviluppata in Rust con Dioxus dopo la versione 1.0, «molto probabilmente nel corso del 2026». Al 12 ottobre 2026 il blog del progetto non contiene alcun post che ne annunci la disponibilità. Con Stalwart, quindi, è necessario distribuire Roundcube autonomamente oppure chiedere a ogni utente di configurare un client di posta.

Stalwart dispone di un’interfaccia di amministrazione web, quindi questa non è la lacuna che gli utenti si aspettano. La seconda lacuna riguarda la maturità della versione. Le FAQ indicano che Stalwart è ancora alla versione 0.x e che il layout dei dati e la configurazione possono cambiare prima della v1.0, rendendo eventualmente necessaria una migrazione. Il post del progetto di giugno 2026 si intitola «Zero segnalazioni di bug aperte: la strada verso Stalwart 1.0», indicando chiaramente lo stato del progetto: vicino, ma non ancora arrivato. Al 12 ottobre 2026 la versione più recente è ancora v0.16.26.

La terza lacuna è quella che nessuno inserisce negli elenchi delle funzionalità. Postfix, Dovecot e Rspamd hanno alle spalle un decennio di risposte documentate. Alle due di notte, con messaggi in coda e utenti in attesa, una ricerca che restituisce una stringa di errore corrispondente vale più di un’architettura elegante. Se questa è la tua situazione, la nostra guida all’installazione di mailcow illustra l’intero stack dall’inizio alla fine e la notte sarà più breve.

Scegli Stalwart se vuoi un unico binario, un unico file di configurazione e JMAP, e sei disposto ad adottare una tecnologia ancora nelle fasi iniziali. Scegli mailcow se vuoi una webmail subito e un’ampia base di risposte già disponibili.

Spostare la posta esistente

Il percorso generico consiste nel trasferire i messaggi da IMAP a IMAP con imapsync, che non dipende dal software in esecuzione sui due endpoint. Eseguire prima una simulazione.

imapsync --dry \
  --host1 old.example.org --user1 you@example.org --passfile1 /root/.old.pw \
  --host2 mail.example.org --user2 you@example.org --passfile2 /root/.new.pw

--dry indica a imapsync di «non eseguire realmente alcuna operazione; stampa soltanto ciò che verrebbe fatto», quindi leggere l'output prima di rimuovere il flag. Ogni file delle password contiene la password nella prima riga, quindi chmod 600 entrambi i file e poi eliminarli.

Stalwart include anche strumenti più recenti, che la maggior parte delle guide di terze parti non ha ancora integrato. Il suo blog documenta Vandelay, uno strumento di importazione ed esportazione JMAP (29 maggio 2026), e un proxy di migrazione per gli aggiornamenti senza downtime (10 giugno 2026). Leggere entrambe le risorse prima di pianificare una migrazione di grandi dimensioni, perché sono più recenti di quasi tutto ciò che si trova in altre guide.

Modalità di errore e stringhe visualizzate

L'interfaccia di amministrazione non viene mai caricata. Le FAQ indicano direttamente questa causa: al primo avvio il bundle dell'interfaccia web viene scaricato da GitHub, quindi un server senza accesso HTTPS in uscita a github.com esegue il servizio, ma tutte le route dell'interfaccia web restituiscono 404. Verificare dal server con curl -sI https://github.com/stalwartlabs/webui/releases/latest/. Le altre cause comuni indicate sono uno schema HTTP o HTTPS non corrispondente e un reverse proxy che non inoltra l'indirizzo IP del client.

Nel log non compare la password di bootstrap. Viene stampata una sola volta, all'avvio, in modalità bootstrap. Se nel frattempo il servizio è stato riavviato, ampliare l'intervallo con sudo journalctl -u stalwart --since today | grep -A8 'bootstrap mode'. Se la password è effettivamente scomparsa, impostare STALWART_RECOVERY_ADMIN in /etc/stalwart/stalwart.env e riavviare.

Il relay tramite un proxy locale viene rifiutato. Le note di rilascio della versione v0.16.19 registrano una correzione per le route relay rifiutate con host resolves loopback address. Se viene visualizzata esattamente questa stringa, è in esecuzione una build precedente. Aggiornare fissando una versione più recente, senza introdurre workaround.

Il servizio non si avvia dopo la creazione manuale della propria unit. Senza AmbientCapabilities=CAP_NET_BIND_SERVICE, l'utente stalwart non può effettuare il bind sulle porte 25, 443, 465 o 993 e l'avvio non riesce sul primo listener. Copiare la riga relativa alle capability dalla unit generata dall'installer.

I certificati non vengono mai emessi. HTTP-01 richiede che la porta 80 sia raggiungibile e libera. TLS-ALPN-01 richiede che sia Stalwart a rispondere all'handshake TLS sulla porta 443. Se un altro processo sul server occupa una delle due porte, ACME continuerà a fallire senza messaggi evidenti, mentre tutto il resto sembrerà funzionare correttamente.

FAQ

Stalwart sostituisce Postfix, Dovecot e Rspamd su un unico VPS?

Sì. Un singolo binario Rust gestisce SMTP, IMAP, POP3, JMAP, CalDAV, CardDAV e WebDAV e include il filtro antispam, l'archivio dei messaggi e un client ACME. È presente una sola unità systemd e un solo file di configurazione in /etc/stalwart/config.json, invece di quattro demoni e della relativa configurazione di integrazione. Non sostituisce però la zona DNS né la policy del provider sulla porta 25, da cui dipende il funzionamento effettivo della posta self-hosted.

Quanta RAM richiede un server di posta Stalwart?

La pagina dei requisiti di sistema di Stalwart, consultata il 12 October 2026, indica circa 100 MB in idle e specifica che 1 GB di RAM è sufficiente per una piccola installazione con 5 to 10 utenti. Una configurazione con circa 5 utenti e poco traffico funziona con un singolo core CPU. Il limite predefinito è di 8,192 connessioni simultanee complessive tra tutti i servizi ed è configurabile. Il limite effettivo cresce quindi con il numero di connessioni e con il volume dei messaggi, non soltanto con il numero di utenti. Non è pubblicata una dimensione minima del disco. Dimensiona quindi il disco in base alla posta che intendi conservare.

Il passaggio a Stalwart migliorerà la recapitalità della mia posta?

No. La recapitalità dipende dal fatto che la porta TCP 25 in uscita sia aperta sul VPS, dal reverse DNS dell'indirizzo IP e dalla configurazione di SPF, DKIM e DMARC del dominio. Stalwart supporta DANE, MTA-STS e i report TLS SMTP e può pubblicare la policy MTA-STS per te. Questi meccanismi regolano però la sicurezza del trasporto, non il livello di affidabilità che una rete destinataria attribuisce al tuo indirizzo. Verifica la porta 25 con nc -vz -w 5 alt1.aspmx.l.google.com 25 prima di installare qualsiasi componente.

Stalwart include la webmail?

Non al 12 October 2026. Include un'interfaccia web di amministrazione, che è un componente diverso. L'articolo della roadmap del progetto, pubblicato il 20 June 2025, afferma che un client webmail è previsto dopo la versione 1.0, sarà sviluppato in Rust con Dioxus e arriverà "most likely sometime in 2026". Il blog del progetto non contiene ancora un annuncio al riguardo. Se gli utenti hanno bisogno subito di una casella accessibile dal browser, installa Roundcube insieme a Stalwart oppure usa uno stack che includa SOGo.

Da quali minacce protegge la cifratura dei dati a riposo di Stalwart?

Cifra i messaggi di ogni utente con la relativa chiave pubblica OpenPGP o S/MIME prima di scriverli su disco. In questo modo, chi entra in possesso di un disco o di un backup, oppure un amministratore che legge l'archivio, non può recuperare il contenuto dei messaggi. Non si tratta di cifratura end-to-end: il messaggio arriva in testo in chiaro e viene cifrato al momento della consegna, quindi ogni hop precedente lo ha potuto leggere. encryptOnAppend è impostato su false per impostazione predefinita. I messaggi presenti in Sent e Drafts e scritti dal client restano quindi in chiaro, a meno che tu non modifichi questa impostazione. La documentazione riguarda soltanto il contenuto dei messaggi e non fornisce informazioni sui metadati, sulle voci dell'indice o sulla ricifratura della posta archiviata prima del caricamento della chiave. Verifica quindi questi aspetti direttamente, senza dare per scontato il comportamento.

#stalwart#email#self-hosting#mail-server#smtp