<?xml version="1.0" encoding="UTF-8" standalone="no"?><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" version="2.0">

<channel>
	<title>RaffaeleChiatto.com</title>
	<atom:link href="https://www.raffaelechiatto.com/feed/" rel="self" type="application/rss+xml"/>
	<link>https://www.raffaelechiatto.com</link>
	<description>Il Blog di Informatica a 360°</description>
	<lastBuildDate>Wed, 28 Oct 2026 07:36:27 +0000</lastBuildDate>
	<language>it-IT</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.raffaelechiatto.com/wp-content/uploads/2025/05/favicon-150x150.png</url>
	<title>RaffaeleChiatto.com</title>
	<link>https://www.raffaelechiatto.com</link>
	<width>32</width>
	<height>32</height>
</image> 
	<itunes:explicit>no</itunes:explicit><itunes:subtitle>Il Blog di Informatica a 360°</itunes:subtitle><itunes:category text="Technology"><itunes:category text="Gadgets"/></itunes:category><item>
		<title>Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-postal-su-ubuntu-server-26-04-con-docker-engine/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-postal-su-ubuntu-server-26-04-con-docker-engine/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Wed, 28 Oct 2026 07:36:27 +0000</pubDate>
				<category><![CDATA[Postal]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[caddy]]></category>
		<category><![CDATA[Compose]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[MailTransferAgent]]></category>
		<category><![CDATA[postal]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1125156</guid>

					<description><![CDATA[&#160; Postal è una piattaforma open source per l’invio e la ricezione di email, pensata per siti web, applicazioni e servizi che devono spedire grandi quantità di messaggi in modo affidabile. Si può considerare un’alternativa self-hosted a servizi commerciali come SendGrid, Mailgun o Amazon SES: offre le stesse funzionalità principali, ma lascia il pieno controllo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="679" height="89" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 9" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Postal è una piattaforma open source per l’invio e la ricezione di email, pensata per siti web, applicazioni e servizi che devono spedire grandi quantità di messaggi in modo affidabile.</p>
<p>Si può considerare un’alternativa self-hosted a servizi commerciali come SendGrid, Mailgun o Amazon SES: offre le stesse funzionalità principali, ma lascia il pieno controllo dell’infrastruttura, dei dati e dei costi.</p>
<p>Sviluppato dal provider britannico Krystal e distribuito con licenza MIT, Postal mette a disposizione un’interfaccia web completa per gestire organizzazioni, server di posta e domini.</p>
<p>Gli invii avvengono via SMTP o tramite API HTTP, con firma DKIM automatica dei messaggi. Postal offre anche il tracciamento di aperture e clic, i webhook per notificare alle applicazioni consegne e rimbalzi, la gestione dei pool di IP e un sistema di instradamento per la posta in arrivo.</p>
<p>Un punto va chiarito subito: Postal non è un server di caselle di posta.</p>
<p>Non offre IMAP o POP3 e non sostituisce soluzioni come Dovecot, Exchange o Microsoft 365.</p>
<p>È un Mail Transfer Agent orientato all’invio transazionale e massivo: email di registrazione, reset password, notifiche, newsletter e comunicazioni generate da applicazioni.</p>
<p>Dalla versione 3 l’architettura si è semplificata: Postal gira interamente in container Docker e non richiede più RabbitMQ, ma solo un database MariaDB.</p>
<p>Un server dedicato basta quindi per avere in poco tempo una piattaforma di invio professionale.</p>
<p>In questa guida vedremo passo dopo passo come installare e configurare Postal su Ubuntu Server 26.04 LTS con Docker Engine.</p>
<p>Partiremo dalla configurazione dei record DNS e arriveremo al primo accesso all’interfaccia web, con HTTPS gestito automaticamente da Caddy.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<p>Un server Ubuntu Server 26.04 LTS con un utente sudo e accesso SSH, dedicato (Postal non convive bene con altri servizi che occupano le stesse porte o risorse).</p>
<p>RAM: almeno 4 GB. CPU: almeno 2 core. Disco: almeno 25 GB (di più se prevedi volumi alti di invio, per via dei log dei messaggi).</p>
<p>Un dominio dedicato all&#8217;infrastruttura di invio (es. postal.tuodominio.it), con accesso al pannello DNS.</p>
<p>La porta 25 in uscita non bloccata dal provider: è la condizione più comune di fallimento — verificala prima di iniziare.</p>
<p><strong>NOTA BENE</strong>: Postal gira interamente in container Docker: qualunque sistema operativo compatibile con Docker va bene, questa guida usa Ubuntu 26.04 come richiesto.</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL DNS</strong></h3>
<p>Configura nel pannello DNS del dominio scelto per Postal:</p>
<p><strong>Record A (e AAAA se hai IPv6)</strong>:</p><pre class="urvanov-syntax-highlighter-plain-tag">postal.tuodominio.it. IN A a.b.c.d
postal.tuodominio.it. IN AAAA ipv6::address</pre><p><strong>Record MX</strong>:</p><pre class="urvanov-syntax-highlighter-plain-tag">postal.tuodominio.it. IN MX 10 postal.tuodominio.it.</pre><p><strong>PTR (reverse DNS)</strong> richiesto lato provider, l&#8217;IP deve risolvere all&#8217;indietro nell&#8217;hostname:</p><pre class="urvanov-syntax-highlighter-plain-tag">nslookup a.b.c.d → deve restituire postal.tuodominio.it</pre><p>I record SPF, return-path e DKIM li completerai allo step 11, dopo aver avviato Postal e creato il dominio dalla dashboard.</p>
<p>&nbsp;</p>
<h3><strong>PREPARAZIONE DEL SISTEMA</strong></h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt full-upgrade -y
sudo apt install -y ca-certificates curl gnupg git jq ufw</pre><p><strong>NOTA BENE:</strong> se l&#8217;aggiornamento include un nuovo kernel, riavvia con sudo reboot prima di proseguire.</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI DOCKER ENGINE</strong></h3>
<p>Aggiungi la chiave GPG e il repository Docker:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null</pre><p>Quindi aggiornare con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update</pre><p>Installa <strong>Docker Engine</strong> e il plugin <strong>Compose</strong>:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre><p>Verifica e abilita l&#8217;utente corrente:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker run hello-world
sudo usermod -aG docker $USER
newgrp docker</pre><p><strong>ATTENZIONE</strong>: se poco dopo il rilascio di Ubuntu 26.04 il repository Docker non ha ancora una build per il suo codename, sostituisci <strong>$(. /etc/os-release &amp;&amp; echo &#8220;$VERSION_CODENAME&#8221;)</strong> con il codename della LTS precedente supportata (es. noble) nel comando sopra.</p>
<p>&nbsp;</p>
<h3><strong>AVVIARE MARIADB E RABBITMQ</strong></h3>
<p>Postal richiede MariaDB (10.6+) per i dati e RabbitMQ come coda dei messaggi. Genera prima due password robuste:</p><pre class="urvanov-syntax-highlighter-plain-tag">openssl rand -hex 16 # usala come password di MariaDB

openssl rand -hex 16 # usala come password di RabbitMQ</pre><p>Avvia i due container (sostituisci <strong>PASSWORD_MARIADB e PASSWORD_RABBITMQ</strong> con i valori generati):</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker run -d --name postal-mariadb \
-p 127.0.0.1:3306:3306 \
--restart always \
-e MARIADB_DATABASE=postal \
-e MARIADB_ROOT_PASSWORD=PASSWORD_MARIADB \
mariadb

sudo docker run -d --name postal-rabbitmq \
-p 127.0.0.1:5672:5672 \
--restart always \
-e RABBITMQ_DEFAULT_USER=postal \
-e RABBITMQ_DEFAULT_PASS=PASSWORD_RABBITMQ \
-e RABBITMQ_DEFAULT_VHOST=postal \
rabbitmq:3.8</pre><p>Entrambi pubblicano la porta solo su 127.0.0.1, quindi restano raggiungibili esclusivamente dal server stesso.</p>
<p><strong>NOTA BENE</strong>: per volumi di invio elevati o messaggi molto grandi, la documentazione ufficiale consiglia di alzare innodb_log_file_size di MariaDB ad almeno 10 volte la dimensione massima prevista dei messaggi.</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DELLA CLI DI POSTAL</strong></h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo git clone https://github.com/postalserver/install /opt/postal/install
sudo ln -s /opt/postal/install/bin/postal /usr/bin/postal</pre><p>Verifica che il comando sia disponibile:</p><pre class="urvanov-syntax-highlighter-plain-tag">postal --help</pre><p>Se è tutto corretto dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">Usage: postal [command]

Running postal:

* start - start Postal
* stop - stop Postal
* restart - restart Postal
* status - view current process status
* logs [service] - view logs from services

Setup/upgrade tools:

* initialize - create and load the DB schema
* upgrade - upgrade the DB schema

Other tools:

* version - show the current Postal version
* make-user - create a new global admin user
* default-dkim-record - display the default DKIM record
* console - open an interactive console
* test-app-smtp - send a test message through Postal
* bootstrap hostname [path] - create a new set of config
* bash [service] - access a bash console for a running process</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>BOOTSTRAP DELLA CONFIGURAZIONE</strong></h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo postal bootstrap postal.tuodominio.it</pre><p>Sostituisci <strong>postal.tuodominio.it</strong> con l&#8217;hostname configurato al passo <strong>CONFIGURAZIONE DEL DNS</strong>.</p>
<p>Il comando crea in <strong>/opt/postal/config</strong>:</p><pre class="urvanov-syntax-highlighter-plain-tag">Latest version is: 3.3.7
=&gt; Creating /opt/postal/config/postal.yml
=&gt; Creating /opt/postal/config/Caddyfile
=&gt; Creating signing private key</pre><p><strong>postal.yml</strong> — file di configurazione principale<br />
<strong>signing.key</strong> — chiave privata per la firma dei messaggi<br />
<strong>Caddyfile</strong> — configurazione del proxy web/TLS</p>
<h3></h3>
<h3><strong>CONFIGURAZIONE DI POSTAL.YML</strong></h3>
<p>Apri il file <strong>postal.yml</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /opt/postal/config/postal.yml</pre><p>Quindi inserire all&#8217;interno del file il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">main_db:
host: 127.0.0.1
username: root
password: LA_PASSWORD_MARIADB generata allo step AVVIARE MARIADB E RABBITMQ
database: postal

message_db:
host: 127.0.0.1
username: root
password: LA_PASSWORD_MARIADB generata allo step AVVIARE MARIADB E RABBITMQ
prefix: postal

rabbitmq:
host: 127.0.0.1
username: postal
password: LA_PASSWORD_RABBITMQ generata allo step AVVIARE MARIADB E RABBITMQ
vhost: postal

dns:
mx_records:
- postal.tuodominio.it
smtp_server_hostname: postal.tuodominio.it
spf_include: spf.postal.tuodominio.it
return_path: rp.postal.tuodominio.it
route_domain: routes.postal.tuodominio.it
track_domain: postal.tuodominio.it</pre><p>Sezione DNS (sostituisci tuodominio.it con il tuo dominio)</p>
<p>&nbsp;</p>
<h3><strong>INIZIALIZZARE IL DATABASE E CREARE L&#8217;AMMINISTRATORE</strong></h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo postal initialize
sudo postal make-user</pre><p>Il secondo comando chiede email, nome, cognome e password del primo utente amministratore: rispondi ai prompt interattivi.</p>
<p>Se è andato tutto a buon fine dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">Postal User Creator
Enter the information required to create a new Postal user.
This tool is usually only used to create your initial admin user.

E-Mail Address : admin@lab.prv
First Name : admin
Last Name : admin
Initial Password : ***********

User has been created with e-mail address admin@lab.prv</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>AVVIO DI POSTAL E DEL PROXY CADDY</strong></h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo postal start
sudo postal status</pre><p>Tutti i servizi devono risultare Up. Avvia poi Caddy per la gestione automatica di TLS/HTTPS:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker run -d --name postal-caddy \
--restart always \
--network host \
-v /opt/postal/config/Caddyfile:/etc/caddy/Caddyfile \
-v /opt/postal/caddy-data:/data \
caddy</pre><p>Verifica che tutti i container siano attivi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker ps</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>ACCESSO A POSTAL DA WEB GUI</strong></h3>
<p>Visita <strong>https://postal.tuodominio.it</strong> e accedi con l&#8217;utente creato allo step <strong>INIZIALIZZARE IL DATABASE E CREARE L&#8217;AMMINISTRATORE</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125160 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-01-1024x507.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="507" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 10" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-01-980x485.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-01-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire le credenziali e cliccare <strong>Login</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125161 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-02-1024x507.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="507" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 11" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-02-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-02-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Dovremmo visualizzare la schermata di <strong>benvenuto di Postal</strong></p>
<h3></h3>
<h3><strong>COMPLETARE I RECORD DNS (SPF, RETURN-PATH, DKIM)</strong></h3>
<p>Dalla dashboard: crea un&#8217;organizzazione, poi un mail server al suo interno, quindi aggiungi il dominio da cui invierai la posta.</p>
<p>Postal genera automaticamente la chiave DKIM specifica per quel dominio, mostrata nella pagina di verifica.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125162 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-03-1024x505.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="505" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 12" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-03-980x484.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-03-480x237.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Create the first Organization</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125163 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-04-1024x506.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="506" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 13" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-04-980x485.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-04-480x237.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire i dati e cliccare <strong>Create Organization</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125164 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-05-1024x506.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="506" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 14" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-05-980x484.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-05-480x237.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare <strong>Build your first mail server</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125165 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-06-1024x508.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="508" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 15" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-06-980x486.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-06-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire le info richieste quindi cliccare <strong>Build Server</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125166 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-07-1024x507.png" alt="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="507" title="Installazione e Configurazione Base di Postal su Ubuntu Server 26.04 con Docker Engine 16" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-07-980x485.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-postal-ubuntu-07-480x238.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>A questo punto dovremmo visualizzare la <strong>Dashboard di Postal</strong></p>
<p>&nbsp;</p>
<h3><strong>AGGIUNTE NEL DNS</strong></h3>
<p>Aggiungi nel DNS i seguenti record:</p>
<p>SPF sul sottodominio dedicato (TXT su spf.postal.tuodominio.it):</p><pre class="urvanov-syntax-highlighter-plain-tag">v=spf1 ip4:a.b.c.d ip6:ipv6::address ~all</pre><p>SPF sull&#8217;hostname principale (TXT su postal.tuodominio.it):</p><pre class="urvanov-syntax-highlighter-plain-tag">v=spf1 a mx include:spf.postal.tuodominio.it ~all</pre><p>Return-path (A/AAAA su rp.postal.tuodominio.it verso l&#8217;IP del server, più un CNAME psrp.postal.tuodominio.it → rp.postal.tuodominio.it) e lo stesso TXT SPF di cui sopra sul record rp.</p>
<p>DKIM copia esattamente il record TXT mostrato dalla dashboard, nel formato postal-[CHIAVE]._domainkey.postal.tuodominio.it.</p>
<p>Usa il pulsante <strong>&#8220;verifica DNS&#8221;</strong> nella dashboard per confermare che tutti i record siano stati recepiti prima di iniziare a inviare.</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL FIREWALL</strong></h3>
<p>Aprire le porte con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo ufw allow OpenSSH
sudo ufw allow 25/tcp # SMTP (ricezione e invio)
sudo ufw allow 587/tcp # Submission, se usato dalle tue app
sudo ufw allow 80/tcp # HTTP (validazione TLS)
sudo ufw allow 443/tcp # HTTPS (dashboard)
sudo ufw enable
sudo ufw status</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>MANUTENZIONE E COMANDI UTILI</strong></h3>
<p>Stato dei servizi: sudo postal status</p>
<p><strong>Log di Postal</strong>: sudo postal logs -f</p>
<p><strong>Riavviare Postal</strong>: sudo postal restart</p>
<p><strong>Fermare/avviare Postal</strong>: sudo postal stop / sudo postal start</p>
<p><strong>Aggiornare Postal</strong>: sudo postal upgrade</p>
<p><strong>Console Rails (debug avanzato)</strong>: sudo postal console</p>
<p><strong>Backup</strong>: i dati critici sono nel database MariaDB (container postal-mariadb) e nella cartella /opt/postal/config (in particolare signing.key, da conservare con cura: è la chiave usata per firmare i messaggi). Un mysqldump periodico più una copia di /opt/postal/config coprono un ripristino completo.</p>
<p><strong>Risoluzione problemi</strong>: se l&#8217;invio non parte, verifica di nuovo la porta 25 in uscita (causa più comune) e che i record SPF/DKIM/return-path risultino &#8220;verificati&#8221; nella dashboard prima di dichiarare il dominio pronto all&#8217;invio.</p>
<h3></h3>
<h3><strong>CONCLUSIONI</strong></h3>
<p>In questa guida abbiamo visto come installare e configurare Postal su Ubuntu Server 26.04 LTS con Docker Engine.</p>
<p>Siamo partiti dalla preparazione dei record DNS e siamo arrivati al primo accesso all’interfaccia web in HTTPS, passando per l’installazione di Docker, l’avvio di MariaDB, la generazione della configurazione e la creazione dell’utente amministratore.</p>
<p>Prima di decidere se adottare Postal in produzione, conviene valutarne con attenzione punti di forza e limiti.</p>
<h4><strong>PRO</strong></h4>
<ul>
<li><strong>Open source e gratuito</strong>: distribuito con licenza MIT, senza costi di licenza né tariffe per singolo messaggio inviato, a differenza dei servizi commerciali.</li>
<li><strong>Pieno controllo dei dati</strong>: messaggi, log e statistiche restano sui propri server, un aspetto rilevante per privacy, GDPR e requisiti di compliance.</li>
<li><strong>Interfaccia web completa</strong>: gestione centralizzata di organizzazioni, server, domini, credenziali e log dei messaggi, senza dover lavorare solo da riga di comando.</li>
<li><strong>Multi-tenant</strong>: permette di separare clienti, progetti o applicazioni in organizzazioni e server distinti, ideale per MSP e agenzie.</li>
<li><strong>SMTP e API HTTP:</strong> si integra facilmente con qualsiasi applicazione, CMS o gestionale.</li>
<li><strong>Funzionalità avanzate</strong>: firma DKIM automatica, tracciamento di aperture e clic, webhook per consegne e rimbalzi, pool di IP e route per la posta in arrivo.</li>
<li><strong>Installazione semplificata</strong>: dalla versione 3 gira interamente in Docker e richiede solo MariaDB, senza RabbitMQ.</li>
</ul>
<h4></h4>
<h4><strong>CONTRO</strong></h4>
<ul>
<li><strong>La consegnabilità è tutta a carico vostro</strong>: reputazione dell’IP, warm-up, monitoraggio delle blacklist e configurazione corretta di SPF, DKIM, DMARC e PTR sono responsabilità dell’amministratore. Con un IP nuovo o “sporco”, i messaggi finiscono facilmente in spam.</li>
<li><strong>Porta 25 spesso bloccata</strong>: molti provider cloud (AWS, Azure, Google Cloud e diversi VPS) bloccano il traffico SMTP in uscita, e a volte è difficile ottenerne lo sblocco.</li>
<li><strong>Non è un server di caselle di posta</strong>: niente IMAP o POP3. Per la posta degli utenti servono altre soluzioni.</li>
<li><strong>Niente gestione delle campagne</strong>: mancano liste di contatti, editor di template e gestione delle disiscrizioni. Per le newsletter serve un software dedicato, come Listmonk o Mautic, che usi Postal come motore di invio.</li>
<li><strong>Server dedicato e risorse non trascurabili</strong>: almeno 4 GB di RAM e un host riservato, perché Postal non convive bene con altri servizi sulle stesse porte.</li>
<li><strong>Manutenzione e sicurezza a carico vostro</strong>: aggiornamenti, backup, monitoraggio e protezione del server non sono inclusi come in un servizio gestito, e non c’è un supporto ufficiale con SLA.</li>
<li><strong>Community e documentazione più limitate rispetto alle alternative commerciali</strong>: per i problemi meno comuni spesso bisogna cercare tra le issue su GitHub.</li>
</ul>
<p>In sintesi, Postal è un’ottima scelta per chi ha competenze sistemistiche, vuole mantenere il controllo dell’infrastruttura di invio e gestisce volumi tali da rendere costosi i servizi a consumo.</p>
<p>Chi invece preferisce non occuparsi di reputazione degli IP, blacklist e manutenzione troverà più comodo un servizio gestito, accettandone costi e dipendenza da terzi.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-postal-su-ubuntu-server-26-04-con-docker-engine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-umami-su-ubuntu-server-26-04-con-docker-compose/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-umami-su-ubuntu-server-26-04-con-docker-compose/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 26 Oct 2026 07:31:39 +0000</pubDate>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Umami]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[umami]]></category>
		<category><![CDATA[webanalytics]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1125137</guid>

					<description><![CDATA[&#160; Chi gestisce un sito web prima o poi deve chiedersi quanti utenti lo visitano, da dove arrivano e quali contenuti funzionano meglio. Per anni la risposta quasi automatica è stata Google Analytics. Oggi però la scelta non è più così scontata, tra l’attenzione crescente alla privacy, il GDPR, i banner dei cookie sempre più [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="679" height="89" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 25" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Chi gestisce un sito web prima o poi deve chiedersi quanti utenti lo visitano, da dove arrivano e quali contenuti funzionano meglio.</p>
<p>Per anni la risposta quasi automatica è stata Google Analytics. Oggi però la scelta non è più così scontata, tra l’attenzione crescente alla privacy, il GDPR, i banner dei cookie sempre più invasivi e il desiderio di tenere i propri dati sotto controllo.</p>
<p>Umami è una piattaforma di web analytics open source, leggera e pensata per rispettare la privacy dei visitatori.</p>
<p>Non usa cookie, non raccoglie dati personali e non traccia gli utenti tra siti diversi.</p>
<p>Offre comunque tutte le metriche che servono davvero: visualizzazioni di pagina, visitatori unici, sorgenti di traffico, dispositivi, browser, paesi di provenienza ed eventi personalizzati.</p>
<p>Il tutto in una dashboard pulita e immediata, lontana dalla complessità di strumenti più blasonati.</p>
<p>Il punto di forza principale è che Umami si può installare in self-hosting sulla propria infrastruttura.</p>
<p>Così i dati delle statistiche restano sul nostro server e non passano da servizi di terze parti.</p>
<p>In questa guida vedremo passo passo come installare e configurare Umami su Ubuntu Server 26.04 usando Docker Compose.</p>
<p>Con questo approccio il deploy è rapido, gli aggiornamenti sono semplici e l’ambiente resta ordinato e portabile. Partiremo dalla preparazione del server e arriveremo al primo accesso alla dashboard. Lungo la strada configureremo il database PostgreSQL e collegheremo il primo sito da monitorare.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<p>Un server con Ubuntu Server 26.04 LTS già installato, con accesso SSH e un utente con permessi sudo.</p>
<p>Risorse minime: Umami è leggero 1 vCPU e 1 GB di RAM sono sufficienti per un sito con traffico moderato; per più siti o volumi alti, meglio 2 GB+.</p>
<p>L&#8217;indirizzo IP del server, che userai per raggiungere Umami dal browser (es. 192.0.2.10).</p>
<p>Connessione internet in uscita sul server, per scaricare pacchetti e immagini Docker.</p>
<p>&nbsp;</p>
<h3><strong>PREPARAZIONE DEL SERVER</strong></h3>
<p>Collegati via SSH e porta il sistema all&#8217;ultima versione dei pacchetti.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt upgrade -y
sudo apt install -y ca-certificates curl gnupg openssl</pre><p>Verifica che il fuso orario del sistema sia impostato su UTC: Umami e PostgreSQL si comportano meglio così, ed è più semplice confrontare i dati con altri strumenti.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo timedatectl set-timezone UTC

timedatectl</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">Local time: Sat 2026-10-10 19:24:31 UTC
Universal time: Sat 2026-10-10 19:24:31 UTC
RTC time: Sat 2026-10-10 19:24:31
Time zone: UTC (UTC, +0000)
System clock synchronized: no
NTP service: active
RTC in local TZ: no</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>INSTALLAZIONE DI DOCKER ENGINE</strong></h3>
<p>Aggiungi il repository ufficiale Docker e installa Engine, CLI e il plugin compose. Ubuntu 26.04 (&#8220;Resolute&#8221;) è tra le versioni supportate ufficialmente da Docker.</p><pre class="urvanov-syntax-highlighter-plain-tag"># Chiave GPG e repository apt di Docker
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

sudo tee /etc/apt/sources.list.d/docker.sources &gt; /dev/null &lt;&lt;EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release &amp;&amp; echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF</pre><p>Quindi aggiornare con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update</pre><p>Quindi procedere con l&#8217;installazione:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre><p>Verifica che l&#8217;installazione funzioni con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl status docker --no-pager
sudo docker run --rm hello-world
docker compose version</pre><p><strong>OPZIONALE</strong>: usare Docker senza sudo</p>
<p>Per lanciare i comandi Docker senza anteporre sudo, aggiungi il tuo utente al gruppo docker e apri una nuova sessione SSH.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo usermod -aG docker $USER
newgrp docker</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/

For more examples and ideas, visit:
https://docs.docker.com/get-started/

Docker Compose version v5.6.0</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DELLA CARTELLA DI PROGETTO</strong></h3>
<p>Tieni Umami in una cartella dedicata: rende più semplici backup e aggiornamenti.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /opt/umami
sudo chown $USER:$USER /opt/umami
cd /opt/umami</pre><p>Genera due segreti che useremo nel prossimo passaggio: la password del database e la chiave APP_SECRET di Umami (usata per firmare le sessioni — deve restare privata).</p><pre class="urvanov-syntax-highlighter-plain-tag">openssl rand -hex 24 # → usa il risultato come password del DB
openssl rand -hex 32 # → usa il risultato come APP_SECRET</pre><p>Crea un file <strong>.env</strong> con i valori generati (sostituisci i segnaposto):</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano .env</pre><p>Inserire all&#8217;interno del file il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">POSTGRES_DB=umami
POSTGRES_USER=umami
POSTGRES_PASSWORD=sostituisci-con-il-primo-valore-generato
APP_SECRET=sostituisci-con-il-secondo-valore-generato</pre><p><strong>ATTENZIONE:</strong> Non usare le password d&#8217;esempio delle guide online (umami/umami): sono note pubblicamente e il servizio finirebbe esposto sull&#8217;IP del server.</p>
<p>&nbsp;</p>
<h3><strong>SCRIVERE IL DOCKER-COMPOSE.YML</strong></h3>
<p>Nella stessa cartella, crea docker-compose.yml con i due servizi: il database PostgreSQL e l&#8217;applicazione Umami, entrambi con healthcheck così Umami parte solo quando il database è davvero pronto.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano docker-compose.yml</pre><p>Inserire all&#8217;interno del file YML il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">services:
umami:
image: docker.umami.is/umami-software/umami:postgresql-latest
container_name: umami
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}
DATABASE_TYPE: postgresql
APP_SECRET: ${APP_SECRET}
depends_on:
db:
condition: service_healthy
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "curl -fSs http://localhost:3000/api/heartbeat || exit 1"]
interval: 10s
timeout: 5s
retries: 5

db:
image: postgres:15-alpine
container_name: umami-db
environment:
POSTGRES_DB: ${POSTGRES_DB}
POSTGRES_USER: ${POSTGRES_USER}
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- umami-db-data:/var/lib/postgresql/data
restart: unless-stopped
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5

volumes:
umami-db-data:</pre><p><strong>NOTA BENE:</strong> Docker Compose legge automaticamente il file .env nella stessa cartella e sostituisce le variabili ${&#8230;}: non serve altro collegamento tra i due file.</p>
<p>&nbsp;</p>
<h3><strong>VARIABILI UTILIZZATE</strong></h3>
<p>Di seguito l&#8217;utilizzo delle variabili:</p>
<p><strong>POSTGRES_DB/USER/PASSWORD</strong> &#8211; .env &#8211; Credenziali del database, condivise tra i due servizi</p>
<p><strong>DATABASE_URL</strong> &#8211; compose &#8211; Stringa di connessione che Umami usa verso il container db</p>
<p><strong>APP_SECRET</strong> &#8211; .env &#8211; Chiave usata da Umami per firmare le sessioni utente</p>
<p>&nbsp;</p>
<h3><strong>AVVIO DI UMAMI</strong></h3>
<p>Dalla cartella <strong>/opt/umami,</strong> scarica le immagini e avvia i container in background.</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose up -d</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] up 40/40
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image postgres:15-alpine Pulled 9.5s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image docker.umami.is/umami-software/umami:postgresql-latest Pulled 23.8s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Network umami_default Created 0.1s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Volume umami_umami-db-data Created 0.0s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Container umami-db Healthy 12.4s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Container umami Started</pre><p>Al primo avvio Umami esegue automaticamente le migrazioni del database: può richiedere qualche istante. Controlla lo stato e i log:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose ps

docker compose logs -f umami # Ctrl+C per uscire dai log</pre><p>Quando entrambi i servizi mostrano stato healthy, Umami è pronto sulla porta 3000 del server.</p>
<p>&nbsp;</p>
<h3><strong>APERTURA DELLE PORTE NEL FIREWALL</strong></h3>
<p>Se ufw non è ancora attivo, configuralo lasciando sempre passare SSH prima di abilitarlo, per non restare tagliati fuori dal server.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo ufw allow OpenSSH
sudo ufw allow 3000/tcp
sudo ufw enable
sudo ufw status</pre><p>Senza un reverse proxy, il traffico verso la porta 3000 non è cifrato (HTTP semplice) e la porta è raggiungibile da chiunque conosca l&#8217;IP. Se il server ha un IP fisso e conosci in anticipo da dove ti collegherai, restringi l&#8217;accesso con sudo ufw allow from &lt;TUO-IP&gt; to any port 3000 al posto della regola generica.</p>
<p>&nbsp;</p>
<h3><strong>ACCESSO TRAMITE WEB GUI</strong></h3>
<p>Apri nel browser <strong>http://&lt;IP-DEL-SERVER&gt;:3000</strong> e accedi con le credenziali predefinite</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125142 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-01-1024x490.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="1024" height="490" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 26" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-01-980x469.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-01-480x230.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire le seguenti credenziali:</p>
<p><strong>utente: admin</strong><br />
<strong>password: umami</strong></p>
<p><strong>ATTENZIONE</strong>: Cambia la password subito dopo il primo accesso, da Impostazioni → Profilo. Le credenziali predefinite sono pubbliche e note a chiunque abbia letto la documentazione di Umami.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125143 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-02-1024x495.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="1024" height="495" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 27" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-02-980x474.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-02-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se è andato tutto a buon fine dovremmo visualizzare la <strong>Dashboard di Umami</strong></p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DI BASE</strong></h3>
<p>Aggiungere il primo sito</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125144 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-03-1024x493.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="1024" height="493" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 28" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-03-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-03-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Vai su <strong>Impostazioni → Websites → Add website</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125145 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-04-1024x493.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="1024" height="493" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 29" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-04-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-04-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire la descrizione del sito e il dominio quindi cliccare <strong>Save</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125146 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-05-1024x492.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="1024" height="492" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 30" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-05-980x471.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-05-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Dovremmo visualizzare il sito come mostrato nell&#8217;immagine sobvrastante</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125147 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-06-1024x496.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="1024" height="496" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 31" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-06-980x475.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-06-480x233.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Umami genera uno <strong>snippet &lt;script&gt;</strong> univoco per quel sito.</p>
<p>Incolla lo snippet prima della chiusura del <strong>tag &lt;/head&gt;</strong> di ogni pagina del sito da monitorare.</p>
<p>Regolare fuso orario e formato dati</p>
<p>In <strong>Impostazioni → Profilo</strong> puoi impostare il tuo fuso orario di visualizzazione (il database resta in UTC) e la lingua dell&#8217;interfaccia.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1125148 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-07-1024x494.png" alt="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose - Raffaele Chiatto" width="1024" height="494" title="Installazione e Configurazione Base di Umami su Ubuntu Server 26.04 con Docker Compose 32" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-07-980x472.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/10/inst-umami-ubuntu-07-480x231.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Dalla Dashboard di Umami sarà possibile visualizzare tutte le info relative al sito</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DI UTENTI AGGIUNTIVI</strong></h3>
<p>Se altre persone del team devono consultare le statistiche, creale da <strong>Impostazioni → Utenti</strong> invece di condividere l&#8217;account admin.</p>
<p>&nbsp;</p>
<h3><strong>MANUTENZIONE</strong></h3>
<p>Aggiornare Umami con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/umami
docker compose pull
docker compose up -d</pre><p>Backup del database con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker exec umami-db pg_dump -U umami umami &gt; backup-umami-$(date +%F).sql</pre><p>Comandi utili</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose stop # ferma i container, mantiene i dati

docker compose start # riavvia dopo uno stop

docker compose down # rimuove i container, il volume dati resta

docker compose logs -f # segue i log di entrambi i servizi</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CONSIDERAZIONI FINALI</strong></h3>
<p>Con pochi comandi e un file docker-compose.yml abbiamo messo in piedi una piattaforma di web analytics completa e indipendente, che gira interamente sulla nostra infrastruttura. È proprio questo il valore principale di Umami: raccoglie le statistiche che contano senza sacrificare la privacy dei visitatori e senza consegnare i dati a servizi esterni.</p>
<p>Dopo averlo provato sul campo, ecco i punti di forza che mi hanno convinto:</p>
<p><strong>Privacy by design</strong>: niente cookie e niente dati personali. Nella maggior parte dei casi questo semplifica parecchio la conformità al GDPR e può evitare il classico banner dei cookie per le sole statistiche.</p>
<p><strong>Leggerezza</strong>: lo script di tracking pesa pochi kilobyte e non rallenta il sito, un dettaglio da non sottovalutare anche in ottica SEO e Core Web Vitals.</p>
<p><strong>Semplicità</strong>: la dashboard è chiara e immediata e le informazioni utili si trovano in pochi secondi, senza perdersi tra menu e report.</p>
<p><strong>Multi-sito e multi-utente</strong>: da un’unica istanza si possono monitorare più siti e dare accesso a colleghi o clienti, anche con dashboard condivise in sola lettura.</p>
<p><strong>Open source e self-hosted</strong>: il controllo completo resta nostro, senza costi di licenza né vincoli con un fornitore.</p>
<p>Ci sono però anche alcuni limiti da tenere a mente:</p>
<p>Chi arriva da Google Analytics non troverà funzionalità avanzate come funnel complessi, attribuzione multicanale o integrazione nativa con le piattaforme pubblicitarie.</p>
<p>Il self-hosting richiede un minimo di manutenzione: aggiornamenti dei container, backup del database PostgreSQL e monitoraggio del server sono a nostro carico.</p>
<p>Come tutti gli strumenti di analytics, Umami può essere bloccato dagli ad-blocker più aggressivi. Si può attenuare il problema rinominando lo script di tracking o servendolo tramite reverse proxy sul proprio dominio.</p>
<p>In conclusione, Umami è un’ottima scelta per blog, siti aziendali, portali di documentazione e progetti personali.</p>
<p>È adatta a chiunque voglia statistiche affidabili e rispettose della privacy senza la complessità di Google Analytics.</p>
<p>Per chi già gestisce un’infrastruttura Docker, il costo di adozione è praticamente nullo e i vantaggi si vedono da subito.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-umami-su-ubuntu-server-26-04-con-docker-compose/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Server AirPrint con Raspberry Pi: rendere compatibile qualsiasi stampante con iPhone e Mac</title>
		<link>https://www.raffaelechiatto.com/server-airprint-con-raspberry-pi-rendere-compatibile-qualsiasi-stampante-con-iphone-e-mac/</link>
					<comments>https://www.raffaelechiatto.com/server-airprint-con-raspberry-pi-rendere-compatibile-qualsiasi-stampante-con-iphone-e-mac/#respond</comments>
		
		<dc:creator><![CDATA[Angelo Lauria]]></dc:creator>
		<pubDate>Wed, 21 Oct 2026 06:37:30 +0000</pubDate>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Ipad]]></category>
		<category><![CDATA[Iphone]]></category>
		<category><![CDATA[MacOS]]></category>
		<category><![CDATA[Raspberry]]></category>
		<category><![CDATA[airprint]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[cups]]></category>
		<category><![CDATA[ipad]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[raspberry]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1125124</guid>

					<description><![CDATA[&#160; Quante volte vi è capitato di dover stampare un documento dall’iPhone o dall’iPad e di scoprire che la stampante di casa o dell’ufficio non viene nemmeno rilevata? Il motivo è semplice: i dispositivi Apple stampano in modalità wireless tramite AirPrint, un protocollo supportato solo dalle stampanti più recenti. Molte stampanti ancora funzionanti restano quindi [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="Server AirPrint con Raspberry Pi: rendere compatibile qualsiasi stampante con iPhone e Mac - Raffaele Chiatto" width="679" height="89" title="Server AirPrint con Raspberry Pi: rendere compatibile qualsiasi stampante con iPhone e Mac 34" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Quante volte vi è capitato di dover stampare un documento dall’iPhone o dall’iPad e di scoprire che la stampante di casa o dell’ufficio non viene nemmeno rilevata?</p>
<p>Il motivo è semplice: i dispositivi Apple stampano in modalità wireless tramite AirPrint, un protocollo supportato solo dalle stampanti più recenti.</p>
<p>Molte stampanti ancora funzionanti restano quindi escluse, in particolare i modelli USB, le laser di qualche anno fa e le multifunzione da ufficio.</p>
<p>Per fortuna non serve cambiare stampante. Con un Raspberry Pi, CUPS (il sistema di stampa open source usato su Linux e macOS) e Avahi (per l’annuncio dei servizi in rete tramite Bonjour) potete creare un piccolo print server AirPrint.</p>
<p>In questo modo qualsiasi stampante, collegata via USB o già presente in rete, diventa visibile e utilizzabile da iPhone, iPad e Mac senza installare driver o app aggiuntive.</p>
<p>In questa guida vedremo passo dopo passo come:</p>
<ul>
<li>preparare il Raspberry Pi e installare i pacchetti necessari</li>
<li>configurare CUPS e aggiungere la stampante</li>
<li>abilitare la condivisione e la pubblicazione AirPrint tramite Avahi</li>
<li>verificare il funzionamento da iOS e macOS</li>
</ul>
<p>Il risultato è una soluzione economica e silenziosa, che consuma pochissimo e può restare accesa 24 ore su 24.</p>
<p>È adatta sia alla rete di casa sia a un piccolo ufficio dove convivono dispositivi Apple, Windows e Linux.</p>
<p>&nbsp;</p>
<h3><strong>PREMESSA</strong></h3>
<p>Questa guida descrive come configurare un server di stampa AirPrint con Raspberry Pi OS.<br />
CUPS gestisce le code di stampa e Avahi annuncia la stampante sulla rete locale rendendola individuabile dai dispositivi compatibili.</p>
<p>I comandi e i nomi riportati sono esempi: sostituiscili con quelli del tuo sistema e della tua stampante.<br />
Il Raspberry Pi deve essere acceso e collegato alla rete quando vuoi stampare.<br />
La procedura riguarda la stampa e non configura la funzione scanner di eventuali dispositivi multifunzione.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<ul>
<li>Raspberry Pi con Raspberry Pi OS. Per esempio: Raspberry Pi 4B con Raspberry Pi OS basato su Debian 13 (Trixie).</li>
<li>Stampante USB. Per esempio: Brother MFC-1810, laser monocromatica.</li>
<li>Dispositivo Apple collegato alla stessa rete locale.</li>
<li>Accesso SSH al Raspberry Pi.</li>
</ul>
<p>&nbsp;</p>
<h3><strong>AGGIORNARE IL SISTEMA E INSTALLARE I SERVIZI</strong></h3>
<p>Aggiorna l’elenco dei pacchetti e installa gli aggiornamenti disponibili:</p>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update
sudo apt full-upgrade -y</pre><p>Installa <strong>CUPS</strong>, Avahi e gli strumenti per rilevare i servizi in rete:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y cups avahi-daemon avahi-utils</pre><p>Abilita e avvia i servizi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl enable --now cups
sudo systemctl enable --now avahi-daemon</pre><p>Aggiungi il tuo utente al gruppo degli amministratori CUPS.</p>
<p>Riconnettiti via SSH perché la modifica abbia effetto:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo usermod -aG lpadmin "$USER"</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>APRIRE IL PANNELLO CUPS TRAMITE SSH</strong></h3>
<p>Sul Raspberry Pi, il pannello CUPS è disponibile all’indirizzo <code>http://localhost:631</code>.<br />
Per amministrarlo da un altro computer senza rendere accessibile la porta a tutta la rete, crea un tunnel SSH sostituendo utente e indirizzo con i tuoi:</p><pre class="urvanov-syntax-highlighter-plain-tag">ssh -L 8631:localhost:631 &lt;utente&gt;@&lt;indirizzo-pi&gt;</pre><p>Lascia aperta la sessione SSH e apri <strong><code>http://localhost:8631</code></strong> nel browser del computer. Accedi con l’utente del Raspberry Pi aggiunto al gruppo <strong><code>lpadmin</code></strong>.</p>
<p>&nbsp;</p>
<h3><strong>COLLEGARE E RILEVARE LA STAMPANTE</strong></h3>
<p>Collega la stampante al Raspberry Pi tramite USB e accendila.</p>
<p>Verifica che il sistema la rilevi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo lpinfo -v</pre><p>Nell’elenco dovrebbe apparire una riga simile a questa:</p><pre class="urvanov-syntax-highlighter-plain-tag">usb://Brother/MFC-1810%20series?serial=...</pre><p>La Brother MFC-1810 è una stampante “host-based” e richiede un driver dedicato. Installa il driver open source <code>brlaser</code>:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y printer-driver-brlaser</pre><p>Cerca il modello disponibile:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo lpinfo -m | grep -i MFC-1810</pre><p>L’output dovrebbe contenere una voce simile a:</p><pre class="urvanov-syntax-highlighter-plain-tag">drv:///brlaser.drv/br1810.ppd Brother MFC-1810 series ...</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREARE E CONDIVIDERE LA CODA DI STAMPA</strong></h3>
<p>Abilita la condivisione delle stampanti:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo cupsctl --share-printers</pre><p>Crea la coda usando il modello e l’indirizzo USB rilevati.</p>
<p>I valori seguenti sono un esempio basato su una Brother MFC-1810: sostituisci nome coda, indirizzo USB, seriale, modello, driver e posizione con quelli della tua stampante:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo lpadmin -p NOME_CODA \
-v 'usb://Brother/MFC-1810%20series?serial=SERIALE_USB' \
-m 'drv:///brlaser.drv/br1810.ppd' \
-D 'Brother MFC-1810' \
-L 'POSIZIONE' \
-o printer-is-shared=true \
-E</pre><p>Imposta la coda come predefinita, abilitala e consenti l’invio dei lavori:</p>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo lpadmin -d NOME_CODA
sudo cupsaccept NOME_CODA
sudo cupsenable NOME_CODA</pre><p>Controlla lo stato:</p><pre class="urvanov-syntax-highlighter-plain-tag">lpstat -t</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>STAMPARE UNA PAGINA DI PROVA</strong></h3>
<p>Invia una pagina di prova e controlla la coda:</p>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">lp -d NOME_CODA /usr/share/cups/data/testprint
lpstat -o</pre><p>Prima di proseguire, verifica che la pagina venga stampata correttamente.</p>
<p>&nbsp;</p>
<h3><strong>ANNUNCIARE LA STAMPANTE IN RETE (AIRPRINT)</strong></h3>
<p>Verifica che CUPS e Avahi siano attivi:</p><pre class="urvanov-syntax-highlighter-plain-tag">systemctl is-active cups avahi-daemon</pre><p>Controlla l’annuncio DNS-SD della stampante:</p><pre class="urvanov-syntax-highlighter-plain-tag">avahi-browse -at --resolve | grep -i -E 'IPP|NOME_CODA'</pre><p>Nel record TXT verifica la presenza di informazioni come:</p><pre class="urvanov-syntax-highlighter-plain-tag">URF=V1.4,...
pdl=...image/urf,application/pdf</pre><p>La voce <strong><code>URF</code></strong> identifica il supporto al formato AirPrint. Su iPhone o iPad, apri un documento o una foto, tocca **Condividi**, poi **Stampa** e seleziona la Brother MFC-1810.</p>
<p>&nbsp;</p>
<h3><strong>SICUREZZA</strong></h3>
<p>Limita le porte 631 (CUPS) e 22 (SSH) alla rete locale fidata.</p>
<p>Non inoltrarle dal router verso Internet.</p>
<p>Il tunnel SSH descritto nel capitolo 2 consente di raggiungere il pannello di amministrazione senza esporlo a tutta la rete.</p>
<p>&nbsp;</p>
<h3><strong>RISOLUZIONE DEI PROBLEMI</strong></h3>
<h4><strong>LA STAMPANTE NON COMPARE IN CUPS</strong></h4>
<p>Controlla il cavo USB, l’alimentazione e l’output di <code>sudo lpinfo -v</code>. Alcune multifunzione espongono più interfacce USB.</p>
<h4><strong>CUPS STAMPA, MA IPHONE O IPAD NON TROVA LA STAMPANTE</strong></h4>
<p>Verifica che la condivisione sia attiva (<code>cupsctl --share-printers</code>), che entrambi i dispositivi siano sulla stessa rete e che Avahi sia attivo.</p>
<p>Controlla anche che il Wi-Fi non abbia l’isolamento dei client abilitato e che il multicast DNS (UDP 5353) non sia bloccato tra rete Wi-Fi e rete cablata.</p>
<h4><strong>LA CODA COMPARE, MA I LAVORI FALLISCONO O LA STAMPA È ERRATA</strong></h4>
<p>Controlla la sezione **Jobs** del pannello CUPS e i messaggi di errore nei log di CUPS.</p>
<p>Verifica inoltre di aver selezionato il modello e il driver corretti.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/server-airprint-con-raspberry-pi-rendere-compatibile-qualsiasi-stampante-con-iphone-e-mac/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione del Server Postfix Smarthost in alta affidabilità con KeepAlived</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-del-server-postfix-smarthost-in-alta-affidabilita-con-keepalived/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-del-server-postfix-smarthost-in-alta-affidabilita-con-keepalived/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 19 Oct 2026 06:30:50 +0000</pubDate>
				<category><![CDATA[KeepAlived]]></category>
		<category><![CDATA[Postfix]]></category>
		<category><![CDATA[HA]]></category>
		<category><![CDATA[Keepalived]]></category>
		<category><![CDATA[postfix]]></category>
		<category><![CDATA[smarthost]]></category>
		<category><![CDATA[VIP]]></category>
		<category><![CDATA[VRRP]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124879</guid>

					<description><![CDATA[&#160; Chiunque gestisca un&#8217;infrastruttura aziendale sa quanto la posta elettronica sia, ancora oggi, uno dei servizi più critici da tenere in piedi. Notifiche di backup, alert di monitoraggio, invii applicativi, comunicazioni interne: se lo smarthost SMTP che inoltra questo traffico va giù, il problema spesso non si nota subito, ma quando emerge è già tardi [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091057 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/DIFFICULT-BAR.png" alt="Installazione e Configurazione del Server Postfix Smarthost in alta affidabilità con KeepAlived - Raffaele Chiatto" width="679" height="89" title="Installazione e Configurazione del Server Postfix Smarthost in alta affidabilità con KeepAlived 38" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/DIFFICULT-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/DIFFICULT-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Chiunque gestisca un&#8217;infrastruttura aziendale sa quanto la posta elettronica sia, ancora oggi, uno dei servizi più critici da tenere in piedi.</p>
<p>Notifiche di backup, alert di monitoraggio, invii applicativi, comunicazioni interne: se lo smarthost SMTP che inoltra questo traffico va giù, il problema spesso non si nota subito, ma quando emerge è già tardi — un job di backup fallito senza preavviso, un allarme di sicurezza mai recapitato.</p>
<p>Postfix è da anni la scelta di riferimento per costruire un relay SMTP affidabile, leggero e facilmente configurabile, ma da solo resta comunque un singolo punto di guasto: se il server che lo ospita si ferma, tutta la posta in transito rimane bloccata finché non si interviene manualmente.</p>
<p>La soluzione più naturale, e anche una delle più economiche in termini di risorse, è affiancare a Postfix un meccanismo di failover automatico che sposti l&#8217;IP virtuale del servizio su un nodo di backup senza intervento umano.</p>
<p>In questa guida vedremo come installare e configurare due nodi Postfix identici in ruolo di smarthost, e come metterli in alta affidabilità usando KeepAlived e il protocollo VRRP per gestire l&#8217;IP virtuale condiviso.</p>
<p>Al termine avrai un&#8217;infrastruttura di relay SMTP che sopravvive al riavvio o al guasto di uno dei due nodi, senza che le applicazioni a monte debbano nemmeno accorgersene.</p>
<p>&nbsp;</p>
<h3><strong>ARCHITETTURA</strong></h3>
<p>Come si ottiene il failover senza toccare i client</p>
<p>Sì, si può fare, ed è uno scenario molto comune. La chiave è che i client non parlano mai direttamente a <strong>postfix1</strong> o <strong>postfix2</strong>: parlano sempre a un unico nome DNS (<strong>smtp-relay.azienda.local</strong>) che risolve verso un indirizzo IP virtuale (VIP).</p>
<p>Quell&#8217;indirizzo, in ogni istante, è ospitato fisicamente da uno solo dei due nodi.</p>
<p>keepalived, tramite il protocollo VRRP, sposta la VIP da un nodo all&#8217;altro in caso di guasto, in genere in 1-3 secondi, senza che nulla vada riconfigurato lato client o lato DNS.</p>
<p>Perché funzioni tra due reti fisicamente diverse serve un accorgimento: i due nodi devono condividere un segmento di livello 2 (la stessa VLAN/subnet) su cui far vivere la VIP e scambiarsi l'&#8221;heartbeat&#8221; VRRP.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124880 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-01-1024x510.png" alt="Installazione e Configurazione del Server Postfix Smarthost in alta affidabilità con KeepAlived - Raffaele Chiatto" width="1024" height="510" title="Installazione e Configurazione del Server Postfix Smarthost in alta affidabilità con KeepAlived 39" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-01-980x488.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-01-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Il client si affida sempre allo stesso nome DNS e allo stesso IP virtuale. È keepalived, tramite VRRP sul segmento L2 dedicato che collega le due reti, a spostare la VIP dal nodo attivo a quello di standby in caso di guasto senza che DNS o client vengano toccati.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<p>Prima di iniziare servono:</p>
<ul>
<li>Due host (fisici o VM), uno per rete/sede, con una distribuzione Ubuntu Server 26.04</li>
<li>Un segmento L2 dedicato esteso tra le due reti (VLAN stretch, trunk dedicato o overlay tipo VXLAN gestito dal team di rete), anche una subnet piccola basta (negli esempi 10.10.10.0/29).</li>
<li>Un nome DNS interno per lo smarthost, es. smtp-relay.azienda.local, che punterà alla VIP.</li>
<li>Accesso root su entrambi i nodi.</li>
<li>Le subnet delle reti client che dovranno essere autorizzate a inoltrare posta (per mynetworks).</li>
<li>Se lo smarthost deve a sua volta inoltrare la posta verso un relay esterno (provider anti-spam, Microsoft 365, SES, ecc.), le relative credenziali/host in questa guida: una casella email esistente (indirizzo completo e password) da usare solo per l&#8217;autenticazione SMTP in uscita.</li>
</ul>
<p>&nbsp;</p>
<h3><strong>RIFERIMENTO</strong></h3>
<p>Schema IP usato in questo tutorial</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124881 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-02-1024x510.png" alt="Installazione e Configurazione del Server Postfix Smarthost in alta affidabilità con KeepAlived - Raffaele Chiatto" width="1024" height="510" title="Installazione e Configurazione del Server Postfix Smarthost in alta affidabilità con KeepAlived 40" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-02-980x488.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/09/postfix-ha-02-480x239.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p><strong>ATTENZIONE</strong>: Sostituire questi valori con i tuoi.</p>
<p>I due nodi mantengono anche il proprio indirizzo &#8220;normale&#8221; sulla rete A/B per la gestione ordinaria (SSH, monitoring): l&#8217;interfaccia sul segmento 10.10.10.0/29 è dedicata esclusivamente al cluster.</p>
<p>&nbsp;</p>
<h3><strong>PREPARAZIONE DELLA RETE</strong></h3>
<p>Prima di toccare i server, va predisposto il segmento su cui vivrà la VIP.</p>
<p>Chiedi al team di rete di estendere una VLAN dedicata (o un overlay L2) tra le due sedi/reti, riservata al cluster, non serve che sia grande, basta un /29 o /28.</p>
<p>Verifica se il link tra le due sedi inoltra correttamente il traffico multicast: su collegamenti <strong>WAN-like</strong> tra sedi spesso no.</p>
<p>In questa guida configuriamo comunque VRRP in modalità unicast, che non dipende dal multicast ed è la scelta più robusta per questo scenario.</p>
<p>Aprire sui firewall intermedi il protocollo VRRP (IP protocol 112) tra i due indirizzi cluster (10.10.10.1 <img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2194.png" alt="↔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> 10.10.10.2).</p>
<p>Verificare che la latenza tra le due sedi sul link cluster sia bassa e stabile: latenze alte o instabili causano falsi failover.</p>
<p>Creare il record DNS smtp-relay.azienda.local → 10.10.10.10.</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI POSTIFIX SU UBUNTU 26.04</strong></h3>
<p>Ripetere questi passaggi su entrambi i nodi.</p>
<p>Impostare prima l&#8217;hostname corretto: Postfix lo legge in fase di installazione per proporre il &#8220;system mail name&#8221;, e usarlo da subito evita di doverlo correggere dopo.</p>
<p>Sul server Postfix 1 eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">hostnamectl set-hostname postfix1.azienda.local</pre><p>Sul server Postfix 2 eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">hostnamectl set-hostname postfix2.azienda.local</pre><p>Verificare che /etc/hosts risolva l&#8217;hostname localmente (Ubuntu lo fa già in automatico con la riga 127.0.1.1), poi aggiorna il sistema e preconfigura le risposte debconf di Postfix per un&#8217;installazione non interattiva e ripetibile in modo identico sui due nodi.</p>
<p>Sul Server Postfix 1 e Postfix 2 eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">apt update &amp;&amp; apt upgrade -y

echo "postfix postfix/main_mailer_type select Internet Site" | debconf-set-selections

echo "postfix postfix/mailname string smtp-relay.azienda.local" | debconf-set-selections

DEBIAN_FRONTEND=noninteractive apt install -y postfix libsasl2-modules keepalived</pre><p><strong>libsasl2-modules</strong> non è strettamente necessario per il ruolo di smarthost verso i client interni, ma serve al passo 4 per autenticarsi in uscita verso il Mail Server Esterno con i meccanismi PLAIN/LOGIN. Al termine dell&#8217;installazione Postfix è già attivo con una configurazione minima: il passo successivo la sostituisce.</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE BASE DI POSTFIX</strong></h3>
<p>Questa configurazione deve essere identica su entrambi i nodi (a parte l&#8217;hostname, se vuoi differenziarlo).</p>
<p>Il punto chiave è <strong>inet_interfaces = all</strong>: Postfix ascolta su tutte le interfacce del nodo, quindi non serve riavviarlo quando la VIP arriva o se ne va.</p>
<p>Editare sul server Postfix 1 e postfix 2 il file <strong>/etc/postfix/main.cf</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/postfix/main.cf</pre><p>Quindi incollare all&#8217;interno il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">myhostname = smtp-relay.azienda.local
mydomain = azienda.local
myorigin = $mydomain

# ascolta su tutte le interfacce: fisica + VIP, indifferentemente
inet_interfaces = all
inet_protocols = ipv4
mydestination = localhost

# reti autorizzate a usare questo smarthost per il relay
mynetworks = 127.0.0.0/8, 10.10.10.0/29, &lt;RETE_A&gt;/24, &lt;RETE_B&gt;/24, &lt;ALTRE_RETI_CLIENT&gt;/24

# è un puro relay in uscita: non consegna localmente per altri domini
relay_domains =
smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination

# il relay esterno (relayhost + SASL) è configurato successivamente

smtpd_tls_security_level = may
smtp_tls_security_level = may
smtpd_tls_cert_file = /etc/ssl/certs/smtp-relay.pem
smtpd_tls_key_file = /etc/ssl/private/smtp-relay.key

message_size_limit = 26214400</pre><p>Applicare e ricaricare il server Postfix 1 e postfix 2 con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">postfix check

systemctl restart postfix</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE RELAY AUTENTICATO</strong></h3>
<p>Invece di consegnare direttamente via MX, in questo tutorial inoltriamo a entrambi i nodi tutta la posta in uscita attraverso il server SMTP Pubblico, autenticandosi con una casella email già esistente (dedicata solo a questo scopo, non usata per leggere posta).</p>
<p><strong>ATTENZIONE</strong>: La maggior parte dei gestori di posta applicano limiti al numero di messaggi inviabili per casella/giorno, pensati per un uso da client di posta, non da relay aziendale. Se il volume di posta di tutta la rete interna passa da qui, verifica con il fornitore di posta i limiti del tuo piano prima di andare in produzione: superarli comporta email rifiutate o accodate, non un errore visibile ai client interni.</p>
<p>Modificare il file <strong>main.cf,</strong> su entrambi i nodi con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/postfix/main.cf</pre><p>Quindi aggiungere il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">relayhost = [smtps.aruba.it]:465
smtp_tls_wrappermode = yes
smtp_tls_security_level = encrypt
smtp_tls_CAfile = /etc/ssl/certs/ca-certificates.crt

smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_sasl_mechanism_filter = plain, login</pre><p>Creare il file con le credenziali della casella Mail e trasformalo nella mappa che Postfix usa per cercarle (va rifatto ogni volta che il file cambia).</p>
<p>Ovviamante è da fare su entrambe i Server Postfix 1 e Postfix 2</p>
<p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/postfix/sasl_passwd</pre><p>Quindi incollare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">[smtps.test.it]:465 nomecasella@tuodominio.it:PasswordDellaCasella</pre><p>Salvare e chiudere il file di configurazione</p>
<p>Quindi eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">postmap /etc/postfix/sasl_passwd

chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

chmod 600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db

systemctl restart postfix</pre><p>Verificare che l&#8217;autenticazione funzioni inviando un messaggio di prova e controllando il log con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">echo "corpo del messaggio" | mail -s "test relay Aruba" destinatario@dominio-esterno.tld

tail -f /var/log/mail.log</pre><p>Nel log, una consegna riuscita verso il mail server pubblico mostra una riga <strong>relay=smtps.test.it[&#8230;]:465, &#8230; status=sent</strong>; un problema di credenziali compare invece come <strong>SASL authentication failed</strong>.</p>
<p>&nbsp;</p>
<h3><strong>SINCRONIZZAZIONE DELLA CONFIGURAZIONE TRA I NODI</strong></h3>
<p>Il rischio più comune in un cluster attivo/passivo è il drift: i due nodi si scollegano nel tempo perché una modifica viene fatta solo su uno dei due, e il giorno del failover il nodo di riserva si comporta diversamente.</p>
<p>Di seguito alcune opzioni, dalla più semplice alla più solida da implementare:</p>
<p><strong>Repository git + deploy manuale:</strong> tieni main.cf/master.cf in un repository, applichi le modifiche su un nodo, apri una PR/commit, poi esegui lo stesso file sull&#8217;altro nodo.</p>
<p><strong>rsync a senso unico con verifica</strong>: uno script che confronta i due file e segnala differenze prima di ogni modifica pianificata.</p>
<p><strong>Ansible (consigliato se hai già altra infrastruttura gestita così)</strong>: un playbook con un unico template main.cf.j2 applicato a entrambi i nodi garantisce che siano sempre identici per costruzione.</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DI KEEPALIVED</strong></h3>
<p><strong>Keepalived</strong> gira su entrambi i nodi con lo stesso virtual_router_id, ma priorità diverse: il nodo con priorità più alta diventa MASTER e prende la VIP; l&#8217;altro resta BACKUP finché non rileva l&#8217;assenza degli annunci VRRP del master.</p>
<p>Un dettaglio importante: non basta che il processo keepalived sia vivo, deve esserlo anche postfix.</p>
<p>Per questo aggiungere uno script di controllo (vrrp_script) che verifica che Postfix sia realmente in ascolto sulla porta 25: se fallisce, la priorità del nodo viene abbassata e la VIP migra automaticamente sull&#8217;altro nodo anche se il sistema operativo è ancora <strong>&#8220;vivo&#8221;</strong>.</p>
<p>Su entrambe i server creare il file check_postfix.sh con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /usr/local/bin/check_postfix.sh</pre><p>Quindi incollare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">#!/bin/bash
# esce con 0 se postfix è sano, 1 altrimenti
if systemctl is-active --quiet postfix &amp;&amp; ss -ltn | grep -q ':25 '; then
exit 0
else
exit 1</pre><p>Salvare e chiudere lo script</p>
<p>Dare i permessi corretti con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">chmod +x /usr/local/bin/check_postfix.sh</pre><p>Sul Server Postfix 1 creare il file <strong>keepalived.conf</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/keepalived/keepalived.conf</pre><p>Incollare all&#8217;interno il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">postfix1 · priorità 150
vrrp_script chk_postfix {
script "/usr/local/bin/check_postfix.sh"
interval 2
timeout 2
fall 2
rise 2
weight -20
}

vrrp_instance VI_SMTP {
interface eth1.10 # interfaccia sul segmento cluster (VLAN dedicata)
state BACKUP # BACKUP su entrambi i nodi: decide la priorità, non lo stato dichiarato
virtual_router_id 51
priority 150
advert_int 1

unicast_src_ip 10.10.10.1
unicast_peer {
10.10.10.2
}

authentication {
auth_type PASS
auth_pass CambiaQuestaPassword
}

virtual_ipaddress {
10.10.10.10/29
}

track_script {
chk_postfix
}
}</pre><p>Salvare e chiudere il file di configurazione</p>
<p>Sul Server Postfix 2 creare il file keepalived.conf con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/keepalived/keepalived.conf</pre><p>Incollare all&#8217;interno il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">postfix2 · priorità 100
vrrp_script chk_postfix {
script "/usr/local/bin/check_postfix.sh"
interval 2
timeout 2
fall 2
rise 2
weight -20
}

vrrp_instance VI_SMTP {
interface eth1.10
state BACKUP
virtual_router_id 51
priority 100
advert_int 1

unicast_src_ip 10.10.10.2
unicast_peer {
10.10.10.1
}

authentication {
auth_type PASS
auth_pass CambiaQuestaPassword
}

virtual_ipaddress {
10.10.10.10/29
}

track_script {
chk_postfix
}
}</pre><p>Salvare e chiudere il file di configurazione</p>
<p><strong>ATTENZIONE</strong>: virtual_router_id deve essere univoco su quel segmento L2 (0-255): se in futuro aggiungi altri cluster VRRP sulla stessa VLAN, usa ID diversi per evitare conflitti. La password di autenticazione VRRPv2 è una protezione minima contro annunci accidentali, non una misura di sicurezza forte su un segmento dedicato e isolato è comunque sufficiente.</p>
<p>&nbsp;</p>
<h3><strong>AVVIO E VERIFICA</strong></h3>
<p>Su entrambe i server Postfix 1 e Postfix 2 eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">systemctl enable --now postfix

systemctl enable --now keepalived</pre><p>Quindi verificare che la VIP sia presente solo sul server Postfix 1 (quello con priorità più alta) con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">ip -4 addr show dev eth1.10 | grep 10.10.10.10

journalctl -u keepalived -n 20</pre><p>Verificare che lo smarthost risponda sulla VIP da un client sulla rete interna con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">telnet smtp-relay.azienda.local 25</pre><p>Oppure per un test più completo usare il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">swaks --to destinatario@test.tld --from mittente@azienda.local \
--server smtp-relay.azienda.local</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>TEST DI FAILOVER</strong></h3>
<p>Non dare per scontato che funzioni: verificare il failover in tre modi crescenti di severità.</p>
<h4><strong>TEST 1 — Fermare solo Postfix (guasto applicativo)</strong></h4>
<p>Sul server Postfix 1 (Master) eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">systemctl stop postfix</pre><p>Lo script di controllo dovrebbe fallire entro pochi secondi, la priorità di postfix1 scende sotto 100 e postfix2 prende la VIP.</p>
<p>Verificare con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">ip -4 addr show dev eth1.10 su postfix2</pre><p>Quindi ripetere il test SMTP dal client e se è tutto ok non dovremmo accorgerci di nulla.</p>
<p>&nbsp;</p>
<h4><strong>TEST 2 — Isolare il nodo (guasto di rete/hardware)</strong></h4>
<p>Spegnere il nodo master o disabilitare la sua interfaccia cluster.</p>
<p>Il failover in questo caso dipende dal timeout degli annunci VRRP (circa 3 × advert_int, quindi ~3 secondi con i valori di questa guida).</p>
<p>&nbsp;</p>
<h4><strong>TEST 3 — Failback</strong></h4>
<p>Riaccendere/ripristinare postfix1: avendo priorità più alta e preempt attivo (il default), riprenderà automaticamente la VIP.</p>
<p>Se si preferisce evitare che il nodo torni a fare da master automaticamente subito dopo un ripristino (per rivedere prima i log), aggiungere nopreempt nel blocco vrrp_instance di postfix1.</p>
<p>&nbsp;</p>
<h3><strong>DA SAPERE</strong></h3>
<p>Alcuni punti che vale la pena capire prima di considerare l&#8217;infrastruttura pronta per la produzione:</p>
<p>Le code non sono condivise. Ogni nodo ha la propria coda di posta locale. Se un nodo accetta un messaggio e va giù prima di consegnarlo, quel messaggio resta nella sua coda finché il nodo non torna operativo. Il VIP non sposta la posta già in coda. Per uno smarthost outbound con codifica breve è normalmente accettabile, ma monitora mailq su entrambi i nodi.</p>
<p>mynetworks deve includere sia Rete A sia Rete B, oltre a qualunque altra subnet client autorizzata al relay altrimenti dopo un failover i client di una delle due reti potrebbero non risultare più fidati per l&#8217;altro nodo.</p>
<p>Le regole firewall verso i client non cambiano mai: puntano tutte alla VIP, che è sempre lo stesso indirizzo indipendentemente da quale nodo la ospita.</p>
<p>Monitoraggio consigliato: stato keepalived (master/backup) su entrambi i nodi, servizio postfix attivo, lunghezza della coda (mailq -p), spazio disco, log in /var/log/mail.log.</p>
<p>Non allargare mai mynetworks oltre le subnet realmente fidate: è l&#8217;unica barriera che impedisce che lo smarthost diventi un open relay.</p>
<p>smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination rifiuta esplicitamente qualunque mittente non compreso in mynetworks.</p>
<p>Se alcuni client non fanno parte di una rete fidata (es. workload cloud, VPN client), valutare l&#8217;aggiunta di autenticazione SASL sulla porta submission (587) invece di allargare mynetworks.</p>
<p>Usare certificati TLS validi (interni o Let&#8217;s Encrypt) per cifrare la sessione SMTP tra client e smarthost.</p>
<p>/etc/postfix/sasl_passwd contiene la password della casella di posta in chiaro: i permessi 600 impostati al passo 4 sono il minimo indispensabile. Se lo distribuisci tra i nodi tramite un repository, non versionarlo in chiaro, usare un secret manager o uno strumento tipo Ansible Vault, e valutare la rotazione periodica della password della casella.</p>
<p>Questa architettura richiede che le due reti possano condividere un segmento L2 per la VIP. E&#8217; il caso confermato per il tuo scenario. Se in futuro questo non fosse più possibile (es. le due sedi passano a un collegamento puramente L3, senza alcuna possibilità di stretch), il failover trasparente via VIP condivisa non è più applicabile e le alternative diventano più complesse: DNS con più record A e retry lato client (funziona solo se i client stessi, tipicamente altri MTA, ritentano automaticamente su un secondo indirizzo), oppure anycast via BGP se l&#8217;azienda ha il controllo del routing. Entrambe richiedono più lavoro e garanzie più deboli sui tempi di failover rispetto a VRRP: vale la pena riconsiderarle solo se la premessa sulla rete cambia.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-del-server-postfix-smarthost-in-alta-affidabilita-con-keepalived/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>LibreNMS e PHP Unsupported: come risolvere l’errore su Ubuntu Server 24.04</title>
		<link>https://www.raffaelechiatto.com/librenms-e-php-unsupported-come-risolvere-lerrore-su-ubuntu-server-24-04/</link>
					<comments>https://www.raffaelechiatto.com/librenms-e-php-unsupported-come-risolvere-lerrore-su-ubuntu-server-24-04/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Wed, 14 Oct 2026 06:21:15 +0000</pubDate>
				<category><![CDATA[LibreNMS]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[php]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124557</guid>

					<description><![CDATA[&#160; Se gestisci un&#8217;istanza di LibreNMS su Ubuntu Server 24.04, potresti esserti imbattuto in un avviso che compare all&#8217;accesso alla dashboard: &#8220;PHP version X is the minimum supported version&#8221;. Questo messaggio segnala che la versione di PHP in uso sul sistema non è più tra quelle supportate dal progetto LibreNMS e se ignorato a lungo [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="LibreNMS e PHP Unsupported: come risolvere l&#039;errore su Ubuntu Server 24.04 - Raffaele Chiatto" width="679" height="89" title="LibreNMS e PHP Unsupported: come risolvere l&#039;errore su Ubuntu Server 24.04 44" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Se gestisci un&#8217;istanza di LibreNMS su Ubuntu Server 24.04, potresti esserti imbattuto in un avviso che compare all&#8217;accesso alla dashboard: &#8220;PHP version X is the minimum supported version&#8221;.</p>
<p>Questo messaggio segnala che la versione di PHP in uso sul sistema non è più tra quelle supportate dal progetto LibreNMS e se ignorato a lungo comporta la perdita di aggiornamenti e patch di sicurezza.</p>
<p>Il problema nasce dal fatto che Ubuntu 24.04 include di default una versione di PHP che, con il tempo, viene superata dai requisiti minimi di LibreNMS, il quale segue un ciclo di aggiornamenti più rapido rispetto ai repository LTS di Ubuntu.</p>
<p>La soluzione richiede l&#8217;installazione di una versione più recente di PHP tramite repository di terze parti, la configurazione di un pool PHP-FPM dedicato e l&#8217;aggiornamento della configurazione del web server, passaggi che, se non eseguiti nell&#8217;ordine corretto, possono generare conflitti non banali da diagnosticare.</p>
<p>In questa guida vedremo passo per passo come aggiornare PHP su Ubuntu Server 24.04, configurare correttamente PHP-FPM per LibreNMS evitando le insidie più comuni (socket duplicati, pool in conflitto, timezone non allineato), e verificare che tutto funzioni a dovere con lo script di validazione integrato.</p>
<p>&nbsp;</p>
<h3><strong>WARNING DEL PHP</strong></h3>
<p>Di seguito una schermata che mostra il Warning relativo al PHP</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124561 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-01-1024x495.png" alt="LibreNMS e PHP Unsupported: come risolvere l&#039;errore su Ubuntu Server 24.04 - Raffaele Chiatto" width="1024" height="495" title="LibreNMS e PHP Unsupported: come risolvere l&#039;errore su Ubuntu Server 24.04 45" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-01-980x474.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-01-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p><strong>PHP Unsupported</strong></p>
<p><strong>Web server PHP version does not meet the minimum requirements. PHP 8.4 is the minimum supported version as of October, 2026.</strong><br />
<strong>We recommend you update PHP to a supported version (8.5 suggested) and check your CLI PHP version matches by running ./validate.php on your server.</strong></p>
<p>Questo è l&#8217;avviso di LibreNMS: la versione PHP attuale non soddisfa il requisito minimo (PHP 8.4), e consiglia di passare a PHP 8.5.</p>
<p>&nbsp;</p>
<h3><strong>VERIFICA DELLA VERSIONE ATTUALE DEL PHP</strong></h3>
<p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">php -v</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">PHP 8.3.33 (cli) (built: Jul 30 2026 15:39:15) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.33, Copyright (c) Zend Technologies
with Zend OPcache v8.3.33, Copyright (c), by Zend Technologies</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>AGGIUNGERE IL REPOSITORY SURY/ONDREJ SU NOBLE 24.04</strong></h3>
<p>Aggiungere il repository con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y ca-certificates apt-transport-https software-properties-common lsb-release
sudo add-apt-repository ppa:ondrej/php -y
sudo apt update</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DEL PHP 8.5 CON LE ESTENSIONI COMUNI PER LIBRENMS</strong></h3>
<p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install php8.5 php8.5-cli php8.5-fpm php8.5-mysql php8.5-curl php8.5-xml php8.5-mbstring php8.5-zip php8.5-gd php8.5-snmp php8.5-json -y</pre><p><strong>NOTA BENE</strong>: alcune estensioni tipo opcache non hanno un pacchetto php8.5-opcache separato, sono già incluse nel pacchetto base</p>
<p>&nbsp;</p>
<h3><strong>IMPOSTARE PHP 8.5 COME VERSIONE ATTIVA PER CLI</strong></h3>
<p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo update-alternatives --config php</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">Sono disponibili 4 scelte per l'alternativa php (che fornisce /usr/bin/php).

Selezione Percorso Priorità Stato
------------------------------------------------------------
0 /usr/bin/php8.5 85 modalità automatica
1 /usr/bin/php7.4 74 modalità manuale
2 /usr/bin/php8.1 81 modalità manuale
* 3 /usr/bin/php8.3 83 modalità manuale
4 /usr/bin/php8.5 85 modalità manuale</pre><p>Scegliere l&#8217;entry <strong>/usr/bin/php8.5</strong></p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL WEB SERVER PER USARE PHP-FPM 8.5</strong></h3>
<p>Se si utilizza Nginx, nel vhost di LibreNMS puntare al nuovo socket editando il file di configurazione con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /etc/nginx/sites-available/librenms</pre><p>Individuare la riga</p><pre class="urvanov-syntax-highlighter-plain-tag">fastcgi_pass unix:/var/run/php/php8.3-fpm.sock;</pre><p>E sostituirla con la seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">fastcgi_pass unix:/run/php/php8.5-fpm.sock;</pre><p>Se si utilizza Apache con PHP-FPM aggiornare il proxy handler in modo analogo; se si utilizza mod_php, disabilitare il vecchio modulo e abilitare quello nuovo con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo a2dismod php8.3
sudo a2enmod php8.5
sudo a2enconf php8.5-fpm
sudo systemctl restart apache2</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>RIAVVIO DEI SERVIZI</strong></h3>
<p>Riavviare i servizi con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl restart php8.5-fpm
sudo systemctl restart nginx # o apache2</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>VERIFICA CON LO SCRIPT DI LIBRENMS</strong></h3>
<p>Verificare con lo script di LibreNMS esrguendo i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/librenms
sudo -u librenms ./validate.php</pre><p>Se è andato tutto a buon fine dovremmo visualizzare in output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">===========================================
Component | Version
--------- | -------
LibreNMS | 26.9.1-dev.4+9212d2599f (2026-08-23T19:01:46+02:00)
DB Schema | 2026_07_30_162514_add_device_refresh_config_permission (397)
PHP | 8.5.4
Python | 3.14.4
Database | MariaDB 11.8.6-MariaDB-5ubuntu0.1 from Ubuntu
RRDTool | 1.9.0
SNMP | 5.9.4.pre2
===========================================</pre><p>&nbsp;</p>
<p>Da interfaccia web cliccando sulla rotellina in alto a destra e quindi <strong>About LibreNMS</strong> dovremmo vedere una schermata come quella sottostante</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124562 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-02-1024x496.png" alt="LibreNMS e PHP Unsupported: come risolvere l&#039;errore su Ubuntu Server 24.04 - Raffaele Chiatto" width="1024" height="496" title="LibreNMS e PHP Unsupported: come risolvere l&#039;errore su Ubuntu Server 24.04 46" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-02-980x474.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/update-php-librenms-02-480x232.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/librenms-e-php-unsupported-come-risolvere-lerrore-su-ubuntu-server-24-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-mailu-su-ubuntu-server-26-04-con-docker-engine/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-mailu-su-ubuntu-server-26-04-con-docker-engine/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 12 Oct 2026 06:28:22 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[Mailu]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Compose]]></category>
		<category><![CDATA[dkim]]></category>
		<category><![CDATA[DMARC]]></category>
		<category><![CDATA[mx]]></category>
		<category><![CDATA[SPF]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124822</guid>

					<description><![CDATA[&#160; Gestire un server di posta elettronica in autonomia è da sempre una delle sfide più ostiche del self-hosting: tra Postfix, Dovecot, filtri antispam, DKIM, SPF, DMARC e certificati TLS da tenere sincronizzati, mettere in piedi un mail server &#8220;a mano&#8221; può richiedere giorni di lavoro e una manutenzione costante. Mailu nasce proprio per abbattere [&#8230;]]]></description>
										<content:encoded><![CDATA[<p><img loading="lazy" decoding="async" class="size-full wp-image-1091058 alignnone" src="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="679" height="89" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 55" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR.png 679w, https://www.raffaelechiatto.com/wp-content/uploads/2020/12/ADVANCED-BAR-480x63.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 679px, 100vw" /></p>
<p>&nbsp;</p>
<p>Gestire un server di posta elettronica in autonomia è da sempre una delle sfide più ostiche del self-hosting: tra Postfix, Dovecot, filtri antispam, DKIM, SPF, DMARC e certificati TLS da tenere sincronizzati, mettere in piedi un mail server &#8220;a mano&#8221; può richiedere giorni di lavoro e una manutenzione costante.</p>
<p>Mailu nasce proprio per abbattere questa complessità: è una suite di posta elettronica open source che impacchetta tutti i componenti necessari server SMTP (Postfix), server IMAP/POP3 (Dovecot), filtro antispam e antivirus (Rspamd), webmail (Roundcube o Rainloop) e un pannello di amministrazione via web in un set di container Docker orchestrati con Docker Compose, pronti a essere avviati con poche righe di configurazione.</p>
<p>In questo articolo vedremo come installare e configurare Mailu da zero su un&#8217;istanza Ubuntu Server 26.04 pulita, partendo dall&#8217;installazione di Docker Engine fino ad arrivare a un server di posta funzionante: creazione del dominio, generazione delle chiavi DKIM, gestione dei certificati TLS (Let&#8217;s Encrypt o manuali), esposizione delle porte corrette e creazione del primo utente amministratore.L&#8217;obiettivo è arrivare, passo dopo passo, ad avere un ambiente Mailu operativo e sicuro, evitando gli errori di configurazione più comuni dal binding delle porte sbagliato ai problemi di risoluzione DNS che spesso fanno perdere ore a chi affronta questo setup per la prima volta.</p>
<p>Non serve essere sysadmin esperti per seguire questa guida: bastano una VM (o un server fisico) con Ubuntu Server 26.04, accesso root via SSH e un po&#8217; di pazienza con la riga di comando.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<ul>
<li>Un server Ubuntu Server 26.04 LTS con un utente sudo e accesso SSH.</li>
<li>Un IP pubblico dedicato (non condiviso via NAT) con la porta 25 non bloccata dal provider: molti provider cloud/VPS bloccano di default il traffico SMTP in uscita sulla porta 25 — verifica con il tuo hosting o chiedi lo sblocco prima di iniziare, altrimenti la posta in uscita non funzionerà.</li>
<li>RAM: almeno 1 GB (senza antivirus) o 3 GB se abiliti ClamAV (consigliato), più 1 GB di swap.</li>
<li>Root partition ext4 o btrfs; opzionale una partizione dedicata montata su /mailu per lo storage della posta.</li>
<li>Un nome a dominio che gestirai per la posta (es. tuodominio.it) con accesso al pannello DNS del registrar.</li>
<li>Nessun altro servizio in ascolto sulle porte riservate a Mailu: 25, 80, 110, 143, 443, 465, 587, 993, 995, 4190.</li>
</ul>
<p><strong>NOTA BENE</strong>: Mailu richiede una versione recente di Docker installata dal repository ufficiale (non dai pacchetti Ubuntu), perché usa funzionalità Docker aggiornate.</p>
<p>&nbsp;</p>
<h3><strong>DNS DI BASE</strong></h3>
<p>Prima di avviare Mailu, configura nel pannello DNS del tuo dominio:</p>
<p><strong>Record A: </strong>l&#8217;hostname del server di posta che punta all&#8217;IP pubblico:</p>
<p><strong>mail.tuodominio.it. IN A a.b.c.d</strong></p>
<p><strong>Record MX</strong>: indirizza la posta del dominio verso l&#8217;hostname:</p>
<p><strong>tuodominio.it. IN MX 10 mail.tuodominio.it.</strong></p>
<p><strong>PTR (reverse DNS)</strong>: l&#8217;IP deve risolvere all&#8217;indietro nell&#8217;hostname del mail server. Si configura lato provider/hosting, non nel DNS del dominio:</p>
<p><strong>nslookup a.b.c.d → deve restituire mail.tuodominio.it</strong></p>
<p><strong>ATTENZIONE</strong>: un reverse DNS non configurato correttamente è una delle cause più comuni per cui la posta in uscita viene classificata come spam o rifiutata. Contatta il tuo provider se non puoi impostarlo da solo.</p>
<p>I record SPF, DKIM e DMARC li aggiungerai allo step successivo, dopo aver avviato Mailu (le chiavi DKIM vengono generate dal pannello di amministrazione).</p>
<p>&nbsp;</p>
<h3><strong>PREPARAZIONE DEL SISTEMA</strong></h3>
<p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt full-upgrade -y

sudo apt install -y ca-certificates curl gnupg ufw iptables-persistent</pre><p><strong>NOTA BENE:</strong> se l&#8217;aggiornamento include un nuovo kernel, riavvia con sudo reboot prima di proseguire.</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI DOCKER ENGINE</strong></h3>
<p>Aggiungere la chiave GPG e il repository Docker:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo install -m 0755 -d /etc/apt/keyrings

curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

sudo chmod a+r /etc/apt/keyrings/docker.asc

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release &amp;&amp; echo "$VERSION_CODENAME") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list &gt; /dev/null

sudo apt update</pre><p>Installare <strong>Docker Engine</strong> e il plugin <strong>Compose</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre><p>Verificare e abilitare l&#8217;utente corrente:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker run hello-world

sudo usermod -aG docker $USER

newgrp docker</pre><p><strong>ATTENZIONE</strong>: se poco dopo il rilascio di Ubuntu 26.04 il repository Docker non ha ancora una build per il suo codename, sostituire <strong>$(. /etc/os-release &amp;&amp; echo &#8220;$VERSION_CODENAME&#8221;</strong>) con il codename della LTS precedente supportata (es. noble) nel comando sopra.</p>
<p>&nbsp;</p>
<h3><strong>GENERARE LA CONFIGURAZIONE CON IL SETUP WIZARD</strong></h3>
<p>Mailu fornisce un wizard ufficiale che genera i due file necessari (docker-compose.yml e mailu.env) in base alle tue scelte.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /mailu

cd /mailu</pre><p>Aprire sul tuo computer <strong>https://setup.mailu.io</strong>, selezionare la versione (di norma l&#8217;ultima release stabile proposta di default) e compilare il wizard indicando almeno:</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124828 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-01-911x1024.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="911" height="1024" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 56"></a></p>
<p><strong>Hostname del server di posta</strong>: mail.tuodominio.it</p>
<p><strong>Dominio principale</strong>: tuodominio.it</p>
<p><strong>Postmaster</strong>: l&#8217;utente che riceverà la posta amministrativa (es. admin)</p>
<p><strong>TLS</strong>: Let&#8217;s Encrypt (consigliato per il rinnovo automatico dei certificati)</p>
<p><strong>Funzionalità</strong>: webmail (Roundcube), antivirus (ClamAV, opzionale ma consigliato), antispam (Rspamd, incluso di default)</p>
<p><strong>Database</strong>: SQLite va bene per installazioni piccole/singolo server</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-02a.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124841 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-02a-1024x407.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="407" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 57" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-02a-980x389.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-02a-480x191.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Il wizard produce due file da scaricare: <strong>docker-compose.yml</strong> e <strong>mailu.env</strong>.</p>
<p>Eseguire i comandi elecanti nella pagina web per scaricarli sul server</p>
<p>&nbsp;</p>
<h3><strong>REVISIONE DI MAILU.ENV</strong></h3>
<p>Apri il file con un editor (nano mailu.env) e controlla in particolare la sezione &#8220;Common configuration&#8221;: HOSTNAME, DOMAIN, POSTMASTER, TLS_FLAVOR.</p>
<p>Le chiavi segrete (es. SECRET_KEY) vengono generate automaticamente dal wizard: non serve modificarle a mano, ma vanno mantenute private.</p>
<p>Se hai scelto TLS_FLAVOR=cert invece di letsencrypt, crea manualmente una cartella certs con cert.pem e key.pem; con letsencrypt il certificato viene ottenuto e rinnovato automaticamente.</p>
<p>&nbsp;</p>
<h3><strong>AVVIO DELLO STACK</strong></h3>
<p>Avviare lo stack con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /mailu

docker compose pull

docker compose up -d

docker compose ps</pre><p>Al primo avvio Mailu scarica tutte le immagini dei servizi (postfix, dovecot, rspamd, admin, webmail, ecc.) e inizializza i volumi: può richiedere qualche minuto.</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] pull 73/73
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/webmail:2024.06 Pulled 32.9s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/postfix:2024.06 Pulled 29.4s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/unbound:2024.06 Pulled 29.6s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/dovecot:2024.06 Pulled 31.3s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image redis:alpine Pulled 21.7s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/nginx:2024.06 Pulled 31.3s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/oletools:2024.06 Pulled 29.1s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/admin:2024.06 Pulled 30.2s
<img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2714.png" alt="✔" class="wp-smiley" style="height: 1em; max-height: 1em;" /> Image ghcr.io/mailu/rspamd:2024.06 Pulled</pre><p>Seguire i log per verificare che tutto parta correttamente:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose logs -f admin</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DEL PRIMO ACCOUNT AMMINISTRATORE</strong></h3>
<p>Creare il primo account amministratore con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose exec admin flask mailu admin me tuodominio.it 'PasswordRobusta123!'</pre><p>Questo comando crea l&#8217;utente <strong>me@tuodominio.it</strong> con privilegi di amministratore.</p>
<p>Accedere poi da un qualsiasi browser al pannello dal link <strong>https://mail.tuodominio.it/admin</strong>.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124830 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-03-1024x399.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="399" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 58" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-03-980x382.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-03-480x187.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Inserire le credenziali create in precedenza quindi cliccare <strong>Entra</strong></p>
<p><strong>ATTENZIONE</strong>: è fondamentale che esista un utente con lo stesso indirizzo email impostato in POSTMASTER in mailu.env (o un alias con quel nome), altrimenti la posta amministrativa (bounce, abuse, ecc.) non avrà una casella di destinazione.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124831 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-04-1024x403.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="403" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 59" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-04-980x386.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-04-480x189.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Se è andato tutto bene dovremmo visualizzare il pannelo <strong>Admin di Mailu</strong></p>
<p>&nbsp;</p>
<h3><strong>AGGIUNGERE I RECORD SPF, DKIM E DMARC</strong></h3>
<p>Dal pannello admin andare su <strong>https://mail.tuodominio.it/admin/domain/details/tuodominio.it</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124832 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-05-1024x401.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="401" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 60" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-05-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-05-480x188.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare su <strong>Generare Chiavi</strong> per ottenere i valori DKIM specifici del tuo dominio</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124834 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-06-1024x400.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="400" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 61" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-06-980x383.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-06-480x188.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>Cliccare <strong>Conferma</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124835 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-07-1024x400.png" alt="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine - Raffaele Chiatto" width="1024" height="400" title="Installazione e Configurazione Base di Mailu su Ubuntu Server 26.04 con Docker Engine 62" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-07-980x383.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/inst-mailu-ubuntu-07-480x188.png 480w" sizes="(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw" /></a></p>
<p>La pagina mostra i record esatti da copiare. In generale avrai bisogno di:</p>
<p>S<strong>PF (record TXT sul dominio)</strong>: autorizza l&#8217;IP del server a inviare posta per conto del dominio.</p>
<p><strong>DKIM (record TXT su un sottodominio tipo dkim._domainkey.tuodominio.it)</strong>: la chiave pubblica generata dal pannello.</p>
<p><strong>DMARC (record TXT su _dmarc.tuodominio.it)</strong>: policy di gestione della posta che fallisce SPF/DKIM.</p>
<p>Copiare i valori esatti mostrati dal pannello (cambiano da installazione a installazione) nel DNS del dominio.</p>
<p><strong>NOTA BENE</strong>: se abiliti <strong>SPF/DKIM/DMARC</strong> senza aggiungere questi record nel DNS, la tua posta rischia di non essere consegnata: i due passaggi vanno sempre fatti insieme.</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL FIREWALL</strong></h3>
<p>Eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo ufw allow OpenSSH
sudo ufw allow 25/tcp # SMTP
sudo ufw allow 465/tcp # SMTPS
sudo ufw allow 587/tcp # Submission
sudo ufw allow 143/tcp # IMAP
sudo ufw allow 993/tcp # IMAPS
sudo ufw allow 110/tcp # POP3 (se abilitato)
sudo ufw allow 995/tcp # POP3S (se abilitato)
sudo ufw allow 4190/tcp # ManageSieve (se abilitato)
sudo ufw allow 80/tcp # HTTP (validazione Let's Encrypt)
sudo ufw allow 443/tcp # HTTPS (webmail, admin)
sudo ufw enable
sudo ufw status</pre><p>&nbsp;</p>
<h3><strong>MANUTENZIONE E COMANDI UTILI</strong></h3>
<p><strong>Stato dei container</strong>: docker compose ps</p>
<p><strong>Log di un servizio</strong>: docker compose logs -f admin (o smtp, imap, rspamd, ecc.)</p>
<p><strong>Riavviare un servizio</strong>: docker compose restart admin</p>
<p><strong>Aggiornare Mailu</strong>: docker compose pull &amp;&amp; docker compose up -d</p>
<p><strong>Fermare lo stack (dati conservati)</strong>: docker compose down</p>
<p><strong>Creare un altro utente</strong>: docker compose exec admin flask mailu user nome dominio.it &#8216;Password&#8217;</p>
<p><strong>Backup</strong>: i dati (caselle, chiavi DKIM, configurazione) risiedono nei volumi Docker montati in /mailu; un backup periodico della cartella /mailu (con lo stack fermo, o con uno strumento che gestisca i file aperti) copre database SQLite, posta e certificati.</p>
<p><strong>Risoluzione problemi</strong>: se la posta in uscita non parte, il sospetto numero uno è la porta 25 bloccata dal provider (vedi step 1). Se i client di posta non si connettono, verifica che nessun altro servizio (es. un vecchio Postfix locale) occupi le porte richieste da Mailu prima dell&#8217;avvio dello stack.</p>
<p>&nbsp;</p>
<h3><strong>PRO E CONTRO</strong></h3>
<p>Ecco un elenco pro/contro di Mailu, pensato per stare bene dentro l&#8217;articolo:</p>
<h4><strong>Pro</strong></h4>
<ul>
<li>Stack completo pronto all&#8217;uso: Postfix, Dovecot, Rspamd, webmail e pannello admin arrivano già integrati e configurati per parlarsi tra loro, senza dover cablare a mano ogni componente.</li>
<li>Gestione via Docker Compose: aggiornamenti, backup e rollback dei singoli servizi sono più semplici rispetto a un&#8217;installazione tradizionale su pacchetti di sistema.</li>
<li>Pannello di amministrazione web intuitivo per gestire domini, utenti, alias, DKIM e regole antispam senza toccare file di configurazione per le operazioni quotidiane.</li>
<li>Supporto nativo a Let&#8217;s Encrypt e a scenari con reverse proxy esterno (i vari TLS_FLAVOR), quindi si adatta sia a installazioni esposte direttamente sia dietro un proxy già esistente.</li>
<li>Multi-dominio e multi-utente di serie, utile per chi gestisce la posta di più organizzazioni o clienti dalla stessa istanza.</li>
<li>Progetto open source attivo, con documentazione e community su GitHub che rispondono abbastanza rapidamente ai problemi comuni.</li>
</ul>
<h4><strong>Contro</strong></h4>
<ul>
<li>Overhead di risorse: una decina di container sempre attivi (come hai visto nel tuo docker compose ps) pesano di più, in RAM e gestione, di un classico Postfix+Dovecot installato via apt.</li>
<li>Configurazione &#8220;a doppio binario&#8221;: alcune impostazioni vivono nel file .env/mailu.env, altre finiscono scritte direttamente nel docker-compose.yml (come il binding delle porte che abbiamo dovuto correggere) — un po&#8217; di attenzione va messa per non perdere modifiche tra un aggiornamento e l&#8217;altro.</li>
<li>La deliverability della posta in uscita resta comunque un problema &#8220;tuo&#8221;: IP reputation, PTR record, SPF/DKIM/DMARC e blacklist vanno curati indipendentemente dal software, e i grandi provider (Gmail, Outlook) sono sempre più severi con la posta da IP self-hosted.</li>
<li>Nessun clustering/alta disponibilità nativo: per scalare o avere ridondanza serve mettere mano tu all&#8217;infrastruttura attorno a Mailu.</li>
<li>Esporre direttamente le porte di posta (25, 587, 465, 993, 995) su internet richiede attenzione a firewall e hardening, specie su una VM di test come quella usata in questa guida.</li>
<li>Il troubleshooting a basso livello (binding delle porte, permessi dei volumi, variabili d&#8217;ambiente) richiede comunque familiarità con Docker: non è un prodotto completamente &#8220;point and click&#8221; per chi non mastica la riga di comando.</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-mailu-su-ubuntu-server-26-04-con-docker-engine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>