SSD Nodes Learn Hosting plans →
Guide Matt ConnorDi Matt Connor · Aggiornato 2026-09-29

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 server di posta che esegui su un singolo VPS come binario Rust autonomo. Dallo stesso processo gestisce SMTP, IMAP, POP3, JMAP, CalDAV, CardDAV e WebDAV, e include un filtro antispam, un proprio archivio dei messaggi e un client ACME. Uno stack convenzionale svolge lo stesso lavoro 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, dalle pagine delle release e dallo script di installazione di Stalwart, consultati il 28 agosto 2026, con riferimento alla release v0.16.19 (pubblicata il 24 agosto 2026). Sono comandi da eseguire sul tuo server. Dopo ogni comando trovi 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/*. Leggi i termini di licenza prima di progettare una distribuzione basata su una funzionalità che non hai ancora verificato personalmente.

Un unico binario riduce realmente il numero di componenti da gestire. Non riduce però i due fattori che determinano se i tuoi messaggi arriveranno a destinazione.

La porta 25 e la reputazione DNS non dipendono dal software utilizzato

La porta TCP 25 in uscita è il primo controllo. Molti provider VPS la bloccano per impostazione predefinita sui nuovi account. Una porta 25 bloccata consente al server di comunicare con se stesso, ma con nessun altro sistema. Verificala 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 restituisce Connection to alt1.aspmx.l.google.com ... 25 port [tcp/smtp] succeeded! in circa un secondo. Una porta bloccata resta in attesa per tutti i cinque secondi e poi restituisce nc: connect to alt1.aspmx.l.google.com port 25 (tcp) failed: Connection timed out, perché i pacchetti vengono scartati a monte e nessun sistema invia un reset al server. Se visualizzi questo risultato, apri un ticket con il provider. Nessun server di posta può aggirare un pacchetto scartato.

Il secondo controllo riguarda il modo in cui le reti riceventi valutano il tuo indirizzo IP e il tuo dominio. Sono quindi rilevanti il DNS inverso dell'indirizzo IP, SPF, DKIM, DMARC e la cronologia degli invii del blocco di indirizzi in cui è stato assegnato il tuo IP. La pagina di configurazione DNS di Stalwart chiarisce chi gestisce questa attività: i record DNS inversi «sono in genere configurati dal provider di hosting, non da Stalwart». Lo stesso vale per il resto di questa configurazione. Questi elementi si trovano nella tua zona DNS e nel pannello di controllo del provider, non nel server di posta.

Per questo motivo, questa pagina non spiega nuovamente questi record. Abbiamo una guida specifica: Configurare una volta SPF, DKIM e DMARC per tutti i sistemi che inviano posta. Se non hai ancora deciso se gestire autonomamente la posta, inizia da la nostra valutazione onesta dell'utilità attuale dell'email self-hosted. La scelta di Stalwart non cambia nessuno di questi fattori.

Requisiti di una piccola VPS per eseguire un server di posta Stalwart

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

La pagina non indica una dimensione minima del disco. Dimensiona quindi il disco in base alla quantità di posta che prevedi di conservare, lasciando anche spazio aggiuntivo per la compattazione dello store.

Devono funzionare tre percorsi in uscita. In caso contrario, il server può sembrare non funzionante per motivi che non hanno nulla a che fare con la posta. Il server 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. Deve poter usare 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 in esecuzione il server di posta, ma senza interfaccia di amministrazione.

Installare una release fissata, non la versione "latest"

L'installer ufficiale è uno script shell. Leggerlo 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 28 agosto 2026 mostra esattamente cosa fa. 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. In /etc/stalwart/stalwart.env viene scritto un file d'ambiente con modalità 0640, appartenente a root:stalwart. Lo script accetta un solo prefisso di installazione opzionale e un flag --fdb per la build di FoundationDB. Non accetta alcun argomento per la versione.

Quest'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. Fissa manualmente il binario subito dopo l'installazione. È anche la procedura di aggiornamento indicata nelle note di rilascio di v0.16.19: "Se esegui l'aggiornamento da v0.16.x, sostituisci il binario (oppure esegui docker pull)."

STALWART_TAG=v0.16.19
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, leggi journalctl -u stalwart -n 50. Ogni release viene distribuita con un bundle .sigstore.json corrispondente, quindi la firma del download può essere verificata prima dell'installazione.

L'unità che lo script scrive viene eseguita come User=stalwart e imposta AmbientCapabilities=CAP_NET_BIND_SERVICE. Questa capability consente a un account senza privilegi di aprire le porte 25, 443, 465 e 993. Se in seguito scrivi una unità personalizzata e ometti quella riga, il servizio non si avvia perché un utente normale non può aprire 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.19 era presente su Docker Hub il 28 agosto 2026, insieme a una variante -alpine. Blocca la versione della patch, non il tag mobile v0.16, per lo stesso motivo indicato per il binario precedente.

services:
  stalwart:
    image: stalwartlabs/stalwart:v0.16.19
    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 le porte 587, 143, 110, 995 e 4190 come non essenziali e specifica di disabilitare la porta 8080 dopo la configurazione iniziale. Riaggiungi soltanto le porte effettivamente richieste dai client. Se un telefono richiede l’invio tramite STARTTLS, pubblica la porta 587. Se gli utenti creano regole Sieve da un client desktop, pubblica la porta 4190.

Se Compose è una novità, la nostra guida a Docker Compose per un VPS illustra la struttura dei file e il modello dei volumi denominati utilizzato in questo caso. C’è un’avvertenza importante soprattutto per i server di posta: Docker pubblica le porte scrivendo regole proprie nel firewall e queste regole vengono valutate prima di quelle di ufw. Di conseguenza, ufw deny 8080 non chiude una porta pubblicata da Compose. Nel mapping della porta è necessario associare la porta a 127.0.0.1 per chiuderla effettivamente. Per questo il file precedente usa questa configurazione, mentre il tunnel SSH continua ad applicarsi.

TLS senza certbot: costi e vincoli

Stalwart implementa direttamente ACME (automatic certificate management environment), quindi non usa certbot né un renewal hook. La documentazione elenca quattro metodi di validazione. HTTP-01 risponde a una richiesta di challenge 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 scriverne uno nuovo a ogni rinnovo.

Il vincolo è che Stalwart deve gestire direttamente la porta. TLS-ALPN-01 funziona completando direttamente l'handshake TLS, quindi non può funzionare dietro un reverse proxy che termina TLS al suo posto. Se nginx o Caddy gestisce già la porta 443 su quel server, sposta Stalwart su DNS-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 equivale alla cifratura end-to-end

Questa è la funzionalità che viene interpretata più spesso in modo errato. Di seguito è riportato esattamente ciò che indica la documentazione. I messaggi in chiaro di ogni utente vengono cifrati automaticamente con il certificato OpenPGP o S/MIME dell'utente prima che i messaggi vengano scritti su 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 dei contenuti che memorizzano». OpenPGP usa PGP/MIME e non il precedente PGP/Inline, con AES-256 o AES-128. Stalwart non genera le chiavi: gli utenti esportano una chiave pubblica in formato ASCII-armored e la registrano come oggetto PublicKey in Account, Public Keys.

Questa protezione copre quindi un'immagine del disco sottratta, un backup sottratto e la lettura dello storage da parte di un operatore dopo la consegna. Senza la chiave privata, i byte memorizzati non sono leggibili e nemmeno 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.

È opportuno indicare chiaramente altri tre limiti. Le cartelle Sent e Drafts vengono scritte dal client, tramite un'operazione di append, e encryptOnAppend è false per impostazione predefinita. Di conseguenza, rimangono in chiaro finché non si modifica questa impostazione. La documentazione consultata il 28 August 2026 descrive soltanto il contenuto dei messaggi e non indica che i dati dell'envelope, gli header o le voci dell'indice vengano cifrati. Non bisogna quindi darlo per scontato. Inoltre, non indica che i messaggi già memorizzati prima del caricamento di una chiave vengano cifrati nuovamente. Si deve quindi presumere che non lo siano e verificare. Non è indicato neppure 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 chiave privata, perde anche la propria posta. Non esiste un meccanismo di recupero, per scelta progettuale.

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

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

Stalwart non fornisce WKD. I suoi endpoint HTTP documentati, consultati il 28 agosto 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. Servilo 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. Se ne occupa GnuPG.

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 il client recupererà, usando la forma con sottodominio. --install-key scrive la chiave in una struttura di directory locale che rispecchia il layout WKD, all'interno di una directory di primo livello chiamata openpgpkey per impostazione predefinita; puoi modificarne il nome con -C dir. Copia questa struttura nella document 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 resta la scelta giusta

Stalwart non include una webmail. È la lacuna principale e non è in procinto di essere colmata. La documentazione di mailcow, consultata il 28 August 2026, elenca sedici componenti, tra cui SOGo, che offre agli utenti una casella accessibile dal browser e un'interfaccia CalDAV e CardDAV pronta all'uso. Il post della roadmap di Stalwart del 20 June 2025 afferma che una webmail integrata è "in our plans, but it's not currently our immediate priority" e che sarà sviluppata in Rust con Dioxus dopo la versione 1.0, "most likely sometime in 2026". Al 28 August 2026 il blog del progetto non contiene alcun post che ne annunci la disponibilità. Con Stalwart devi quindi installare 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 ci si aspetta. La seconda lacuna riguarda la maturità della versione. La FAQ indica che Stalwart è alla versione 0.x e che il layout dei dati e la configurazione possono cambiare prima della v1.0, rendendo necessaria una migrazione. Il post del progetto pubblicato a June 2026 ha il titolo "Zero open bug reports: The road to Stalwart 1.0", che indica chiaramente lo stato attuale: il progetto è vicino, ma non è ancora arrivato alla versione 1.0.

La terza lacuna è quella che nessuno inserisce in un elenco di funzionalità. Postfix, Dovecot e Rspamd hanno alle spalle un decennio di risposte documentate. Alle due di notte, con i messaggi in coda e gli 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 se sei disposto a usare un progetto ancora giovane. 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 descrivono direttamente questo caso: al primo avvio, il bundle dell'interfaccia web viene scaricato da GitHub. Se il server non può effettuare connessioni HTTPS in uscita verso github.com, il servizio risulta attivo ma la pagina resta vuota. Verificate dal server con curl -sI https://github.com/stalwartlabs/webui/releases/latest/. Le altre cause comuni indicate sono uno schema HTTP o HTTPS non coerente e un reverse proxy che non inoltra l'indirizzo IP del client.

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

Il relay tramite un proxy locale viene rifiutato. Le note di rilascio della versione v0.16.19 riportano una correzione per le route relay rifiutate con host resolves loopback address. Se incontrate esattamente questa stringa, state eseguendo una build precedente. Aggiornate fissando la versione desiderata; non applicate workaround.

Il servizio non si avvia dopo la creazione di una unit personalizzata. Senza AmbientCapabilities=CAP_NET_BIND_SERVICE, l'utente stalwart non può associare le porte 25, 443, 465 o 993 e l'avvio fallisce sul primo listener. Copiate 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 servizio 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 singolo 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 integrazione. Non sostituisce però la zona DNS né la policy del provider sulla porta 25, che determinano il successo o il fallimento effettivo della posta self-hosted.

Quanta RAM richiede un server di posta Stalwart?

La pagina dei requisiti di sistema di Stalwart, consultata il 28 agosto 2026, indica circa 100 MB in inattività e afferma che 1 GB di RAM è sufficiente per una distribuzione di piccole dimensioni con 5-10 utenti. Una configurazione con circa 5 utenti e poco traffico funziona su un singolo core della CPU. Il limite predefinito è di 8,192 connessioni simultanee per tutti i servizi ed è configurabile. Il limite massimo cresce quindi con il numero di connessioni e il volume della posta, non soltanto con il numero di utenti. Non è pubblicata una dimensione minima del disco, quindi dimensiona il disco in base alla posta che vuoi 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 sul dominio. Stalwart supporta DANE, MTA-STS e i report TLS per SMTP e può pubblicare la policy MTA-STS al posto tuo, ma questi meccanismi regolano la sicurezza del trasporto, non il fatto che una rete destinataria consideri attendibile il tuo indirizzo. Testa la porta 25 con nc -vz -w 5 alt1.aspmx.l.google.com 25 prima di installare qualsiasi componente.

Stalwart include una webmail?

Non al 28 agosto 2026. Include un'interfaccia web di amministrazione, che è un componente diverso. Il post della roadmap del progetto del 20 giugno 2025 afferma che un client webmail è previsto dopo la versione 1.0, sviluppato in Rust con Dioxus, «molto probabilmente nel corso del 2026». Il blog del progetto non contiene ancora alcun annuncio al riguardo. Se gli utenti hanno bisogno subito di una casella di posta accessibile dal browser, distribuisci Roundcube insieme a Stalwart oppure usa uno stack che includa SOGo.

Da cosa protegge la cifratura dei dati inattivi 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 ruba un disco o un backup, oppure un amministratore che legge l'archivio, non può recuperarne il contenuto. Non si tratta di cifratura end-to-end: il messaggio arriva in testo in chiaro e viene cifrato al momento della consegna, quindi ogni passaggio precedente lo ha visto in chiaro. encryptOnAppend è impostato su false per impostazione predefinita, quindi i messaggi inviati e le bozze scritti dal client restano in chiaro se non modifichi questa impostazione. La documentazione tratta soltanto il contenuto dei messaggi e non specifica nulla sui metadati, sulle voci degli indici o sulla ricifratura della posta archiviata prima del caricamento della chiave. Verifica quindi direttamente questi aspetti, senza dare per scontato il comportamento.

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