<?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>Thu, 27 Aug 2026 07:12:52 +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 Woodpecker CI su Ubuntu 26.04 LTS usando Docker Compose</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-woodpecker-ci-su-ubuntu-26-04-lts-usando-docker-compose/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-woodpecker-ci-su-ubuntu-26-04-lts-usando-docker-compose/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Thu, 27 Aug 2026 07:06:39 +0000</pubDate>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Woodpecker CI]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[Gitea]]></category>
		<category><![CDATA[Pipeline]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124446</guid>

					<description><![CDATA[&#160; Configurare una pipeline CI/CD self-hosted non deve necessariamente passare per GitHub Actions o per un servizio cloud a pagamento. Woodpecker CI è un motore di continuous integration open source, leggero e pensato per chi vuole mantenere il pieno controllo dei propri workflow di build e test direttamente sul proprio server, senza vincolarsi a un [&#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="" width="679" height="89" 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>Configurare una pipeline CI/CD self-hosted non deve necessariamente passare per GitHub Actions o per un servizio cloud a pagamento.</p>
<p>Woodpecker CI è un motore di continuous integration open source, leggero e pensato per chi vuole mantenere il pieno controllo dei propri workflow di build e test direttamente sul proprio server, senza vincolarsi a un provider esterno.</p>
<p>In questa guida vedremo come installare e configurare Woodpecker CI da zero su una macchina con Ubuntu 26.04 LTS (&#8220;Resolute Raccoon&#8221;), usando Docker Compose per orchestrare server e agent.</p>
<p>Affiancheremo a Woodpecker un&#8217;istanza locale di Gitea, così da ottenere un ambiente di test completamente self-hosted, senza dover dipendere da GitHub o da altri forge esterni.</p>
<p>Passo dopo passo partiremo dall&#8217;installazione di Docker Engine, passeremo per la creazione dell&#8217;applicazione OAuth che permette a Woodpecker di autenticarsi su Gitea, fino ad arrivare alla prima pipeline di test eseguita con successo.</p>
<p>Lungo il percorso affronteremo anche alcuni degli inciampi più comuni in un setup di questo tipo permessi errati sui volumi Docker, file YAML danneggiati da un editor poco accorto, Client ID OAuth non corrispondenti perché conoscerli in anticipo fa risparmiare parecchio tempo di debug.</p>
<h3></h3>
<h3><strong>PREREQUISITI</strong></h3>
<ul>
<li>Serve un server (fisico, VPS o VM) con Ubuntu 26.04 LTS, accesso sudo.</li>
<li>Un nome di dominio puntato al server è raccomandato per usare HTTPS, ma non obbligatorio per una prova locale.</li>
</ul>
<p>&nbsp;</p>
<h3></h3>
<h3><strong>AGGIORNAMENTO DEL SISTEMA E INSTALLAZIONE DI DOCKER</strong></h3>
<p>Il pacchetto docker-compose-plugin non si trova nei repository standard di Ubuntu insieme a docker.io: arriva solo dal repository ufficiale di Docker, che va aggiunto a parte. Installare quindi Docker Engine direttamente da lì (è anche il metodo raccomandato da Docker stesso, più aggiornato del docker.io di Ubuntu):</p>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt upgrade -y</pre><p><strong># Prerequisiti</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y ca-certificates curl gnupg</pre><p><strong># Chiave GPG del repository Docker</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">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</pre><p><strong># Aggiungi il repository Docker (usa in automatico il codename della tua Ubuntu)</strong></p><pre class="urvanov-syntax-highlighter-plain-tag">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></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre><p></p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl enable --now docker
sudo usermod -aG docker $USER
newgrp docker</pre><p>Verificare con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker --version
docker compose version</pre><p>&nbsp;</p>
<h3><strong>GENERAZIONE DEL SECRET CONDIVISO TRA SERVER E AGENT WOODPECKER</strong></h3>
<p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">openssl rand -hex 32</pre><p>Annotarsi il Secret:</p>
<p><strong>607582cba2b3d4e2a89da7ad8b806e117f1a12fbe44f676ffe2c32372aed21c</strong></p>
<p>Copiare il valore: lo utilizzeremo per <strong>WOODPECKER_AGENT_SECRET</strong></p>
<h3></h3>
<h3><strong>CREAZIONE DELLA STRUTTURA DEL PROGETTO E IL FILE DOCKER COMPOSE</strong></h3>
<p>Creare la struttura del progetto e il file docker-compose con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /opt/woodpecker/gitea-data /opt/woodpecker/data
cd /opt/woodpecker</pre><p>Creare il file <strong>docker-compose.yml</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo tee docker-compose.yml &gt; /dev/null &lt;&lt; 'EOF'
services:
gitea:
image: gitea/gitea:latest
container_name: gitea
restart: unless-stopped
environment:
- USER_UID=1000
- USER_GID=1000
- GITEA__server__ROOT_URL=http://SERVER_IP:3000/
- GITEA__server__HTTP_PORT=3000
- GITEA__webhook__ALLOWED_HOST_LIST=*
volumes:
- ./gitea-data:/data
ports:
- "3000:3000"
- "2222:22"

woodpecker-server:
image: woodpeckerci/woodpecker-server:v3
container_name: woodpecker-server
restart: unless-stopped
depends_on:
- gitea
ports:
- "8000:8000"
- "9000:9000"
volumes:
- ./data:/var/lib/woodpecker/
environment:
- WOODPECKER_HOST=http://SERVER_IP:8000
- WOODPECKER_AGENT_SECRET=IL_SECRET_GENERATO
- WOODPECKER_GITEA=true
- WOODPECKER_GITEA_URL=http://SERVER_IP:3000
- WOODPECKER_GITEA_CLIENT=DA_COMPILARE
- WOODPECKER_GITEA_SECRET=DA_COMPILARE
- WOODPECKER_ADMIN=DA_COMPILARE

woodpecker-agent:
image: woodpeckerci/woodpecker-agent:v3
container_name: woodpecker-agent
command: agent
restart: unless-stopped
depends_on:
- woodpecker-server
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WOODPECKER_SERVER=woodpecker-server:9000
- WOODPECKER_AGENT_SECRET=IL_SECRET_GENERATO
- WOODPECKER_MAX_WORKFLOWS=2
- WOODPECKER_BACKEND=docker
EOF</pre><p>Salvare e chiudere il filem di configurazione</p>
<p><strong>ATTENZIONE</strong>: sostituire <strong>SERVER_IP</strong> e <strong>IL_SECRET_GENERATO</strong> con i tuoi valori; i campi <strong>WOODPECKER_GITEA_CLIENT/SECRET</strong> e <strong>WOODPECKER_ADMIN</strong> li completeremo dopo aver creato l&#8217;app OAuth in Gitea</p>
<h3></h3>
<h3><strong>AVVIO DI GITEA E CREAZIONE DELL&#8217;UTENTE AMMINISTRATORE</strong></h3>
<p>Per ora avviare solo Gitea con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker compose up -d gitea</pre><p>Dovremmo visualizzare un putput simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] up 9/9
<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 gitea/gitea:latest Pulled 4.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;" /> Network woodpecker_default 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 gitea Started</pre><p>Aprire il browser su <strong>http://SERVER_IP:3000 </strong>comparirà la procedura guidata di installazione.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124454 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-01-1024x404.png" alt="" width="1024" height="404" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-01-980x387.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-01-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>Lasciare tutti i valori predefiniti (usare SQLite, va benissimo per un uso locale/di test)</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124455 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-02-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-02-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-02-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>Nella sezione <strong>Impostazioni account amministratore</strong> creare il tuo utente admin (username, email, password).</p>
<p>Quindi cliccare <strong>Installare Gitea</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124456 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-03-1024x404.png" alt="" width="1024" height="404" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-03-980x386.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-03-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 a buon fine dovremmo visualizzare la Dashboard di Gitea</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DELL&#8217;APPLICAZIONE OAUTH IN GITEA PER WOODPECKER</strong></h3>
<p>Creare l&#8217;applicazione OAuth in Gitea per Woodpecker</p>
<p>Da amministratore andaree su <strong>http://SERVER_IP:3000/admin/settings/applications</strong> (oppure <strong>Impostazioni utente</strong> → <strong>Applicazion</strong>i se preferisci un&#8217;app a livello utente) e crea una nuova applicazione OAuth2:</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124457 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-04-1024x403.png" alt="" width="1024" height="403" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-04-980x386.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_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>Inserire le seguenti informazioni:</p>
<p><strong>Nome applicazione</strong>: Woodpecker CI</p>
<p><strong>Redirect URL:</strong> http://SERVER_IP:8000/authorize</p>
<p>Cliccare <strong>Crea Applicazione</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124458 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-05-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-05-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_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>Copiare le seguenti info:</p>
<p><strong>Client ID</strong>: 3cf08282-49ff-46d4-9707-7bf6174ed82d</p>
<p><strong>Client Secret</strong>: gto_66j26rf2li7vzqlkwdykedqpbt73ggnhpru4bz7rwjwebvisuyaa</p>
<p>Salva e copia il Client ID e il Client Secret mostrati (<strong>ATTENZIONE</strong>: il secret viene mostrato una sola volta).</p>
<p>Completa le tre variabili lasciate in sospeso nel file <strong>docker-compose.yml</strong> con sed:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/woodpecker
sed -i 's/WOODPECKER_GITEA_CLIENT=DA_COMPILARE/WOODPECKER_GITEA_CLIENT=il-client-id-copiato/' docker-compose.yml
sed -i 's/WOODPECKER_GITEA_SECRET=DA_COMPILARE/WOODPECKER_GITEA_SECRET=il-client-secret-copiato/' docker-compose.yml
sed -i 's/WOODPECKER_ADMIN=DA_COMPILARE/WOODPECKER_ADMIN=il-tuo-username-gitea/' docker-compose.yml</pre><p>Sostituire <strong>il-client-id-copiato</strong>, <strong>il-client-secret-copiato</strong> e <strong>il-tuo-username-gitea</strong> con i valori reali prima di eseguire i comandi.</p>
<p>&nbsp;</p>
<h3><strong>AVVIO DI WOODPECKER (SERVER + AGENT)</strong></h3>
<p>Avviare Woodpecker con i seguenti comandi:</p>
<p>Posizionarsi nella cartella woodpcker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/woodpecker</pre><p>Avviare Docker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker compose up -d</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] up 13/14
<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 woodpeckerci/woodpecker-agent:v3 Pulled 3.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 woodpeckerci/woodpecker-server:v3 Pulled 4.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 gitea Started 1.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 woodpecker-server Started 0.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 woodpecker-agent Started</pre><p>Fare la verifica con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker compose ps</pre><p>Verificare i Log con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker compose logs -f woodpecker-server</pre><p><strong>ATTENZIONE</strong>: premere <strong>Ctrl+C</strong> per uscire dai log senza fermare i container.</p>
<p>&nbsp;</p>
<h3><strong>PRIMO ACCESSO A WOODPECKER</strong></h3>
<p>Aprire da un qualsiasi browser il link <strong>http://SERVER_IP:8000</strong></p>
<p>Cliccare Login e autorizzare l&#8217;accesso tramite il tuo account Gitea. Essendo l&#8217;utente indicato in <strong>WOODPECKER_ADMIN,</strong> sarai automaticamente amministratore di Woodpecker.</p>
<p>Se non dovesse mostrare la pagina di Login eseguire i comandi elencati di seguito:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/woodpecker
sudo docker compose down

# assegna la cartella dati all'utente 1000 usato dal processo woodpecker-server nel container
sudo chown -R 1000:1000 /opt/woodpecker/data

sudo docker compose up -d

sudo docker compose logs -f woodpecker-server</pre><p>&nbsp;</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124459 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-06-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-06-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_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 su <strong>Accedi a Woodpecker</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124461 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-07-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-07-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_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>Cliccare <strong>Autorizza Applicazione</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-08.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124462 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-08-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-08-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-08-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>Se è andato tutto a buon fine dovremmo visualizzare la <strong>Dashboard di Woodpecker</strong> come mostrato nell&#8217;ìimmagine sovrastante</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DI UN REPOSITORY DI TEST E COLLEGAMENTO ALLA PIPELINE</strong></h3>
<p>In Gitea (<strong>http://SERVER_IP:3000</strong>) creare un nuovo repository (<strong>es. test-ci</strong>) quindi clonarlo e aggiungere un file .woodpecker.yml.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-09.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124463 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-09-1024x399.png" alt="" width="1024" height="399" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-09-980x382.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-09-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>Da browser: andare su <strong>http://192.168.80.34:3000</strong> quindi fare login come admin cliccare sul <strong>+</strong> in alto a destra → <strong>Nuovo repository</strong>.</p>
<p>Nome: <strong>test-ci</strong>.</p>
<p>Spuntare <strong>Inizializza repository</strong> (così non è vuoto) e cliccare <strong>Crea Repository</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-10.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124464 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-10-1024x403.png" alt="" width="1024" height="403" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-10-980x386.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-10-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 è tutto OK dovremmo vedere una schermata come quella sovrastante</p>
<p>A questo punto da terminale eseguire i comandi elencati di seguito:</p><pre class="urvanov-syntax-highlighter-plain-tag">git clone http://192.168.80.34:3000/admin/test-ci.git</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">Cloning into 'test-ci'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 (from 0)
Receiving objects: 100% (3/3), done.</pre><p>Quindi eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd test-ci</pre><p>Creare il file YML con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">cat &gt; .woodpecker.yml &lt;&lt; 'EOF'
steps:
- name: hello
image: alpine
commands:
- echo "Ciao da Woodpecker!"
EOF</pre><p>Quindi eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">git add .woodpecker.yml

git commit -m "Aggiunge pipeline di test"

git push</pre><p>Collegarsi alla Dashboard di Woodpecker (<strong>http://SERVER_IP:8000</strong>)</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-11.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124465 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-11-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-11-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-11-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>Dalla dashboard di Woodpecker attivare il repository dalla lista cliccando su <strong>Aggiungi Repository</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-12.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124466 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-12-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-12-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-12-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>Abilita</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-13.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124467 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-13-1024x400.png" alt="" width="1024" height="400" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-13-980x383.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/08/install-woodpcker_ci_ubuntu-13-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>Cliccare <strong>Esegui Pipeline</strong></p>
<p>&nbsp;</p>
<h3><strong>COMANDI UTILI PER LA MANUTENZIONE</strong></h3>
<p>Di seguito una lista dei comandi utili per la manutenzione di Woodpecker</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/woodpecker

# Aggiornare tutte le immagini

sudo docker compose pull
sudo docker compose up -d

# Log dei singoli servizi

sudo docker compose logs -f gitea
sudo docker compose logs -f woodpecker-agent

# Fermare tutto

sudo docker compose down</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>PRO E CONTRO DI WOODPECKER CI</strong></h3>
<p>Prima di lanciarsi nell&#8217;installazione vale la pena capire dove Woodpecker CI si posiziona rispetto alle alternative più note come Jenkins, GitHub Actions o GitLab CI.</p>
<h4><strong>PRO</strong></h4>
<ul>
<li>Completamente self-hosted e open source (licenza AGPL v3): tutti i dati e le pipeline restano sulla propria infrastruttura, senza vendor lock-in e senza costi per utente o per minuto di build.</li>
<li>Architettura leggera e container-first: ogni step è semplicemente &#8220;un&#8217;immagine Docker + un comando&#8221;, il che lo rende facile da capire, da eseguire anche su hardware modesto e da far girare in container/Kubernetes con buon isolamento.</li>
<li>Supporto nativo a più forge: Gitea, Forgejo, GitHub, GitLab e Bitbucket, con integrazione OAuth2 e registrazione automatica dei webhook (come visto nella nostra configurazione con Gitea).</li>
<li>Funzionalità pratiche integrate: pipeline multiple nella cartella .woodpecker/, cron job nativi senza bisogno di trigger esterni, supporto ad architetture ARM.</li>
<li>Sviluppo attivo: nato come fork di Drone dopo il passaggio di quest&#8217;ultimo a una licenza BSL, riceve release e correzioni più frequenti rispetto al progetto originale.</li>
<li>Sintassi delle pipeline quasi identica a Drone, il che rende la migrazione da Drone particolarmente semplice.</li>
</ul>
<h4><strong>CONTRO</strong></h4>
<ul>
<li>Ecosistema di plugin più piccolo rispetto a GitHub Actions o GitLab CI: non esiste un marketplace ricco di integrazioni pronte all&#8217;uso, quindi spesso serve costruirsi il proprio step Docker.</li>
<li>Nessuna offerta gestita (SaaS): a differenza di GitHub Actions o GitLab CI, non c&#8217;è un servizio cloud &#8220;pronto all&#8217;uso&#8221; — tutta la gestione operativa (aggiornamenti, backup, sicurezza) resta a carico di chi lo installa, come stiamo facendo in questa guida.</li>
<li>Supporto solo community-driven: nessuna azienda dietro con SLA garantiti, a differenza per esempio di Drone (partnership con Harness). Documentazione e canali di supporto (Matrix, GitHub Issues) sono più piccoli rispetto a quelli di progetti più maturi.</li>
<li>Gestione dei secret piuttosto basilare: manca il rotation automatico o l&#8217;integrazione nativa con strumenti come HashiCorp Vault, e i controlli di accesso sono granulari solo a livello di repository.</li>
<li>Progetto relativamente giovane: essendo un fork di Drone, ha una storia più breve e una community più piccola rispetto a Jenkins o alle piattaforme CI dei grandi provider.</li>
</ul>
<p>Per un uso personale, un piccolo team o un homelab proprio il caso della nostra installazione locale con Gitea questi limiti pesano poco a fronte dei vantaggi in termini di semplicità, controllo e costi.</p>
<p>Diventano invece un fattore da valutare con più attenzione in contesti enterprise con requisiti stringenti di compliance, supporto SLA o gestione avanzata dei segreti.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-woodpecker-ci-su-ubuntu-26-04-lts-usando-docker-compose/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Forgejo su Ubuntu Server 26.04</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-forgejo-su-ubuntu-server-26-04/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-forgejo-su-ubuntu-server-26-04/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 24 Aug 2026 06:35:14 +0000</pubDate>
				<category><![CDATA[ForgeJo]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Certbot]]></category>
		<category><![CDATA[Forgejo]]></category>
		<category><![CDATA[Nginx]]></category>
		<category><![CDATA[proxy]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124401</guid>

					<description><![CDATA[&#160; Ogni tanto capita di guardare la propria organizzazione su GitHub e chiedersi quanto di quel codice sia davvero nostro. Non in senso legale ma in senso operativo: dove vive, chi ne detiene le chiavi, cosa succede il giorno in cui cambiano i termini di servizio o il piano gratuito diventa meno gratuito. Per un [&#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="" width="679" height="89" 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>Ogni tanto capita di guardare la propria organizzazione su GitHub e chiedersi quanto di quel codice sia davvero nostro. Non in senso legale ma in senso operativo: dove vive, chi ne detiene le chiavi, cosa succede il giorno in cui cambiano i termini di servizio o il piano gratuito diventa meno gratuito.</p>
<p>Per un homelab è una curiosità. Per chi gestisce script, playbook e configurazioni di infrastrutture altrui, è una domanda che prima o poi presenta il conto.</p>
<p>Forgejo è la risposta più elegante che ho trovato a questa domanda.</p>
<p>È un forge Git self-hosted: repository, pull request, issue, wiki, registry pacchetti e una CI compatibile con la sintassi di GitHub Actions, il tutto in un singolo binario scritto in Go che gira sereno in mezzo giga di RAM.</p>
<p>Non è un GitLab in miniatura, ed è esattamente questo il punto: fa quello che serve davvero, senza portarsi dietro Redis, Sidekiq, Gitaly e otto giga di requisiti minimi.</p>
<p>Nasce nel 2022 come fork di Gitea, quando marchio e domini di quest&#8217;ultimo sono passati a una società for-profit. Oggi vive sotto Codeberg e.V., un&#8217;associazione non-profit tedesca, con licenza GPL e una governance pubblica.</p>
<p>È la stessa piattaforma che regge <strong>Codeberg.org</strong> con oltre centomila utenti e non è esattamente un progetto sperimentale.</p>
<p>In questa guida lo installiamo su Ubuntu Server 26.04 LTS partendo da zero: database PostgreSQL, utente di servizio dedicato, deploy da binario con verifica GPG, unit systemd irrobustita, reverse proxy Nginx con certificato Let&#8217;s Encrypt e configurazione iniziale.</p>
<p>Alla fine avrai un&#8217;istanza raggiungibile in HTTPS, pronta per accogliere il primo git push.</p>
<p>Mettiamoci al lavoro.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<ul>
<li>Ubuntu 26.04 LTS (server), accesso sudo</li>
<li>2 vCPU / 2 GB RAM / 20 GB disco come minimo ragionevole (Forgejo da solo gira anche con meno, ma le Actions e i repo crescono)</li>
<li>Un record DNS <code>A</code>/<code>AAAA</code> che punta al server, ad esempio <code>git.miodominio.tld</code></li>
<li>Porte 80 e 443 raggiungibili (o solo interne, se pubblichi tramite un altro proxy)</li>
</ul>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DEL SISTEMA</strong></h3>
<p>Aggiornare il sistema e installare le dipendenze con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt upgrade -y
sudo apt install -y git git-lfs curl xz-utils gnupg ca-certificates</pre><p>Verificare la versione di Git (Forgejo 16 richiede Git ≥ 2.34) con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">git --version</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">git version 2.53.0</pre><p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DATABASE POSTGRESQL</strong></h3>
<p>SQLite funziona ed è comodo per test, ma per un&#8217;istanza destinata a durare consiglio PostgreSQL.</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y postgresql postgresql-contrib
sudo systemctl enable --now postgresql</pre><p>Creare utente e database con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo -u postgres psql</pre><p>Quindi eseguire i comandi SQL:</p><pre class="urvanov-syntax-highlighter-plain-tag">CREATE ROLE forgejo WITH LOGIN PASSWORD 'PASSWORD_MOLTO_ROBUSTA';
CREATE DATABASE forgejo WITH OWNER forgejo TEMPLATE template0 ENCODING 'UTF8' LC_COLLATE 'C.UTF-8' LC_CTYPE 'C.UTF-8';
\q</pre><p><strong>NOTA BENE:</strong> <code>TEMPLATE template0</code> con collation <code>C.UTF-8</code> evita problemi di ordinamento e di ricostruzione indici dopo un upgrade di PostgreSQL. Annota la password: ti servirà nel wizard.</p>
<p>Eseguire un Test di connessione con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">psql -h 127.0.0.1 -U forgejo -d forgejo -c '\conninfo'</pre><p>Quindi inserire la password dell&#8217;utente creato poco fa</p>
<p>Se è tutto OK dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">Connection Information
Parameter | Value
----------------------+------------------------
Database | forgejo
Client User | forgejo
Host | 127.0.0.1
Server Port | 5432
Options |
Protocol Version | 3.0
Password Used | true
GSSAPI Authenticated | false
Backend PID | 34026
SSL Connection | true
SSL Library | OpenSSL
SSL Protocol | TLSv1.3
SSL Key Bits | 256
SSL Cipher | TLS_AES_256_GCM_SHA384
SSL Compression | false
ALPN | postgresql
Superuser | off
Hot Standby | off
(18 rows)</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE UTENTE DI SISTEMA E STRUTTURA DELLE DIRECTORY</strong></h3>
<p>Forgejo non va mai eseguito come root. Creare un utente di servizio git con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo adduser --system --shell /bin/bash --gecos 'Forgejo Git Service' \
--group --disabled-password --home /home/git git</pre><p>Configurare le directory di dati con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /var/lib/forgejo /etc/forgejo
sudo chown -R git:git /var/lib/forgejo
sudo chmod 750 /var/lib/forgejo
sudo chown root:git /etc/forgejo
sudo chmod 770 /etc/forgejo</pre><p><strong>NOTA BENE</strong>: /etc/forgejo resta scrivibile finché il wizard web non ha generato <code>app.ini</code></p>
<p>&nbsp;</p>
<h3><strong>DOWNLOAD E VERIFICA DEL FILE BINARIO</strong></h3>
<p>Impostare le variabili (adatta versione e architettura linux-amd64 o linux-arm64):</p>
<p>&nbsp;</p><pre class="urvanov-syntax-highlighter-plain-tag">FORGEJO_VERSION=16.0.1
FORGEJO_ARCH=linux-amd64
BASE="https://codeberg.org/forgejo/forgejo/releases/download/v${FORGEJO_VERSION}"</pre><p>Scaricare il binario quindi firma e checksum:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /tmp
curl -fLO "${BASE}/forgejo-${FORGEJO_VERSION}-${FORGEJO_ARCH}"
curl -fLO "${BASE}/forgejo-${FORGEJO_VERSION}-${FORGEJO_ARCH}.asc"
curl -fLO "${BASE}/forgejo-${FORGEJO_VERSION}-${FORGEJO_ARCH}.sha256"</pre><p>Verificare lo SHA256 con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sha256sum -c "forgejo-${FORGEJO_VERSION}-${FORGEJO_ARCH}.sha256"</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">forgejo-16.0.1-linux-amd64: OK</pre><p>Verificare la firma GPG (chiave di release Forgejo) con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">gpg --keyserver keys.openpgp.org --recv EB114F5E6C0DC2BCDD183550A4B61A2DC5923710
gpg --verify "forgejo-${FORGEJO_VERSION}-${FORGEJO_ARCH}.asc" \
"forgejo-${FORGEJO_VERSION}-${FORGEJO_ARCH}"</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">gpg: directory '/root/.gnupg' created
gpg: keybox '/root/.gnupg/pubring.kbx' created
gpg: /root/.gnupg/trustdb.gpg: trustdb created
gpg: key A4B61A2DC5923710: public key "Forgejo &lt;contact@forgejo.org&gt;" imported
gpg: Total number processed: 1
gpg: imported: 1
gpg: Signature made Tue 21 Jul 2026 08:34:47 AM UTC
gpg: using EDDSA key 3BF4E813F84812411DA01E5BC4186DF66F4B6750
gpg: Good signature from "Forgejo &lt;contact@forgejo.org&gt;" [unknown]
gpg: aka "Forgejo Releases &lt;release@forgejo.org&gt;" [unknown]
gpg: WARNING: This key is not certified with a trusted signature!
gpg: There is no indication that the signature belongs to the owner.
Primary key fingerprint: EB11 4F5E 6C0D C2BC DD18 3550 A4B6 1A2D C592 3710
Subkey fingerprint: 3BF4 E813 F848 1241 1DA0 1E5B C418 6DF6 6F4B 6750</pre><p><strong>NOTA BENE</strong>: L&#8217;avviso sulla chiave <strong>&#8220;not certified with a trusted signature&#8221;</strong> è normale: significa solo che non hai firmato tu quella chiave.</p>
<p>Procedere con l&#8217;installazione con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo install -m 755 "forgejo-${FORGEJO_VERSION}-${FORGEJO_ARCH}" /usr/local/bin/forgejo</pre><p>fare il check con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">forgejo --version</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">forgejo version 16.0.1+gitea-1.22.0 (release name 16.0.1) built with GNU Make 4.4.1, go1.26.5 : bindata, timetzdata, sqlite, sqlite_unlock_notify</pre><p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL SYSTEMD</strong></h3>
<p>Eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo tee /etc/systemd/system/forgejo.service &gt; /dev/null &lt;&lt;'EOF'
[Unit]
Description=Forgejo (Beyond coding. We forge.)
After=network-online.target
Wants=network-online.target
After=postgresql.service
Requires=postgresql.service

[Service]
Type=simple
User=git
Group=git
WorkingDirectory=/var/lib/forgejo/
RuntimeDirectory=forgejo
RuntimeDirectoryMode=0750
ExecStart=/usr/local/bin/forgejo web --config /etc/forgejo/app.ini
Restart=always
Environment=USER=git HOME=/home/git GITEA_WORK_DIR=/var/lib/forgejo

# Hardening
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=false
ProtectKernelTunables=true
ProtectKernelModules=true
ProtectControlGroups=true
RestrictSUIDSGID=true
LockPersonality=true

[Install]
WantedBy=multi-user.target
EOF</pre><p>Quindi fare un reload e abilitare Forgejo con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl daemon-reload
sudo systemctl enable --now forgejo
sudo systemctl status forgejo --no-pager</pre><p>Se è tutto OK dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">● forgejo.service - Forgejo (Beyond coding. We forge.)
Loaded: loaded (/etc/systemd/system/forgejo.service; enabled; preset: enabled)
Active: active (running) since Sat 2026-07-25 13:44:14 UTC; 4s ago
Invocation: 7ce8cc3c82a94da388640ce1a5d8bcd2
Main PID: 34277 (forgejo)
Tasks: 8 (limit: 6210)
Memory: 92.3M (peak: 92.4M)
CPU: 450ms
CGroup: /system.slice/forgejo.service
└─34277 /usr/local/bin/forgejo web --config /etc/forgejo/app.ini

Jul 25 13:44:14 vm-srv-test forgejo[34277]: 2026/07/25 13:44:14 cmd/web.go:114:showWebStartupMessage() [I] Forgejo version: 16.0.1+gitea-1.22.0 built with G…nlock_notify
Jul 25 13:44:14 vm-srv-test forgejo[34277]: 2026/07/25 13:44:14 cmd/web.go:115:showWebStartupMessage() [I] * RunMode: prod
Jul 25 13:44:14 vm-srv-test forgejo[34277]: 2026/07/25 13:44:14 cmd/web.go:116:showWebStartupMessage() [I] * AppPath: /usr/local/bin/forgejo
Jul 25 13:44:14 vm-srv-test forgejo[34277]: 2026/07/25 13:44:14 cmd/web.go:117:showWebStartupMessage() [I] * WorkPath: /var/lib/forgejo
Jul 25 13:44:14 vm-srv-test forgejo[34277]: 2026/07/25 13:44:14 cmd/web.go:118:showWebStartupMessage() [I] * CustomPath: /var/lib/forgejo/custom
Jul 25 13:44:14 vm-srv-test forgejo[34277]: 2026/07/25 13:44:14 cmd/web.go:119:showWebStartupMessage() [I] * ConfigFile: /etc/forgejo/app.ini
Jul 25 13:44:14 vm-srv-test forgejo[34277]: 2026/07/25 13:44:14 cmd/web.go:120:showWebStartupMessage() [I] Prepare to run install page
Jul 25 13:44:15 vm-srv-test forgejo[34277]: Listen: http://0.0.0.0:3000
Jul 25 13:44:15 vm-srv-test forgejo[34277]: AppURL(ROOT_URL): http://localhost:3000/
Jul 25 13:44:15 vm-srv-test forgejo[34277]: Starting new Web server: tcp:0.0.0.0:3000 on PID: 34277
Hint: Some lines were ellipsized, use -l to show in full.</pre><p>Controllare i log in caso di problemi con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo journalctl -u forgejo -f</pre><p>A questo punto Forgejo è in ascolto su <strong>http://127.0.0.1:3000</strong> (di default sull&#8217;interfaccia <code>0.0.0.0</code>, che restringeremo dopo il wizard).</p>
<h3></h3>
<h3><strong>INSTALLAZIONE E CONFIGURAZIONE DEL REVERSE PROXY</strong></h3>
<p>Installare Nginx con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y nginx</pre><p>Configurazione del vhost:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo tee /etc/nginx/sites-available/forgejo.conf &gt; /dev/null &lt;&lt;'EOF'
server {
listen 80;
listen [::]:80;
server_name git.miodominio.tld;

# Necessario per push/pull di repository di grandi dimensioni
client_max_body_size 512M;

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

# Evita timeout su operazioni Git lunghe
proxy_read_timeout 300s;
proxy_send_timeout 300s;
proxy_request_buffering off;
}
}
EOF</pre><p>Quindi eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo ln -s /etc/nginx/sites-available/forgejo.conf /etc/nginx/sites-enabled/
sudo rm -f /etc/nginx/sites-enabled/default
sudo nginx -t &amp;&amp; sudo systemctl reload nginx</pre><p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL CERTIFICATO LET&#8217;S ENCRYPT</strong></h3>
<p>Eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d git.miodominio.tld</pre><p>Certbot aggiunge il blocco listen 443 ssl, il redirect da HTTP e imposta il rinnovo automatico via systemd timer.</p>
<p>Configurare il firewall con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo ufw allow OpenSSH
sudo ufw allow 'Nginx Full'
sudo ufw enable</pre><p><strong>ATTENZIONE</strong>: In homelab: se usi una CA interna (es. Windows CA con certificato wildcard) o un proxy centralizzato come Nginx Proxy Manager / Caddy, salta Certbot e limita l&#8217;esposizione della 3000 alla sola rete di gestione.</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE INIZIALE VIA WEB</strong></h3>
<p>Aprire da un qualsiasi <strong>https://git.miodominio.tld/</strong>. Comparirà il wizard di installazione.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/inst-forgejo-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124402 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/inst-forgejo-ubuntu-01-660x1024.png" alt="" width="660" height="1024" /></a></p>
<p>Di seguito tutti i valori da inserire:</p>
<h4><strong>Database</strong></h4>
<ul>
<li><strong>Tipo</strong>: PostgreSQL</li>
<li><strong>Host:</strong> 127.0.0.1:5432</li>
<li><strong>Utente</strong>: forgejo</li>
<li><strong>Password</strong>: quella impostata in precedenza</li>
<li><strong>Nome database</strong>: forgejo</li>
<li><strong>SSL</strong>: Disable (connessione locale)</li>
</ul>
<p>&nbsp;</p>
<h4><strong>Impostazioni generali</strong></h4>
<ul>
<li>Site Title: il nome della tua istanza</li>
<li>Repository Root Path: <code>/var/lib/forgejo/data/forgejo-repositories</code></li>
<li>LFS Root Path: <code>/var/lib/forgejo/data/lfs</code></li>
<li>Run As Username: <code>git</code></li>
<li>SSH Server Domain: <code>git.miodominio.tld</code></li>
<li>SSH Port: <code>22</code></li>
<li>Forgejo HTTP Listen Port: <code>3000</code></li>
<li>Forgejo Base URL: <code>https://git.miodominio.tld/</code></li>
<li>Log Path: <code>/var/lib/forgejo/log</code></li>
</ul>
<p>&nbsp;</p>
<h4><strong>Impostazioni opzionali</strong></h4>
<ul>
<li><strong>Email Settings</strong>: server SMTP, se vuoi notifiche e reset password funzionanti</li>
<li><strong>Server and Third-Party Service Settings</strong>: spunta **Disable Self-Registration** e **Require Sign-In to View Pages** se l&#8217;istanza è privata</li>
<li><strong>Administrator Account Settings</strong>: **crea qui l&#8217;account amministratore**. Se non lo fai, il primo utente registrato diventa admin — non è quello che vuoi su un&#8217;istanza esposta.</li>
</ul>
<p>Al termine cliccare <strong>Installare Forgejo</strong></p>
<p>A questo punto Il file <strong>/etc/forgejo/app.ini</strong> viene generato e il servizio si riavvia.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/inst-forgejo-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124403 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/inst-forgejo-ubuntu-02-1024x399.png" alt="" width="1024" height="399" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/inst-forgejo-ubuntu-02-980x382.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/inst-forgejo-ubuntu-02-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>Se è andato tutto a buon fine dovremmo visualizzare la <strong>Dashboard di ForgeJo</strong></p>
<p>&nbsp;</p>
<h3><strong>HARDENING POST INSTALLAZIONE</strong></h3>
<p>Rendere la configurazione in sola lettura per il servizio con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo chmod 750 /etc/forgejo
sudo chmod 640 /etc/forgejo/app.ini</pre><p>Far ascoltare Forgejo solo su localhost, dato che davanti c&#8217;è Nginx. Modificare il file di configurazione <strong>/etc/forgejo/app.ini</strong>:</p><pre class="urvanov-syntax-highlighter-plain-tag">[server]
HTTP_ADDR = 127.0.0.1
HTTP_PORT = 3000
ROOT_URL = https://git.miodominio.tld/
DOMAIN = git.miodominio.tld</pre><p>Di seguito alcune direttive utili da aggiungere o verificare:</p><pre class="urvanov-syntax-highlighter-plain-tag">[service]
DISABLE_REGISTRATION = true
REQUIRE_SIGNIN_VIEW = true
ENABLE_NOTIFY_MAIL = true

[security]
INSTALL_LOCK = true
PASSWORD_COMPLEXITY = lower,upper,digit,spec
MIN_PASSWORD_LENGTH = 12

[session]
COOKIE_SECURE = true

[log]
LEVEL = Info</pre><p>Riavviare Forgejo con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl restart forgejo</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>VERIFICA FUNZIONALE</strong></h3>
<p>Creare un repository di test dalla UI, poi da una macchina client:</p><pre class="urvanov-syntax-highlighter-plain-tag"># HTTPS
git clone https://git.miodominio.tld/tuo-utente/test.git

# SSH (dopo aver caricato la tua chiave pubblica nel profilo)
git clone git@git.miodominio.tld:tuo-utente/test.git</pre><p>Se l&#8217;SSH non funziona controllare che la chiave sia stata scritta in <strong>/home/git/.ssh/authorized_keys</strong> e che i permessi siano 700 sulla directory e 600 sul file.</p>
<p>&nbsp;</p>
<h3><strong>BACKUP DI FORGEJO</strong></h3>
<p>Forgejo include un comando di dump che raccoglie database, repository, allegati e configurazione:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo -u git bash -c 'cd /var/lib/forgejo &amp;&amp; \
/usr/local/bin/forgejo dump --config /etc/forgejo/app.ini \
--file /var/lib/forgejo/backup/forgejo-dump-$(date +%F).zip'</pre><p>Creare prima la directory (<strong>sudo -u git mkdir -p /var/lib/forgejo/back</strong>up) e schedulare il comando con un timer systemd o un cron, poi replicare l&#8217;archivio fuori dall&#8217;host.</p>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DI FORGEJO</strong></h3>
<p>L&#8217;upgrade consiste nel sostituire il binario:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl stop forgejo</pre><p>Scaricare e verificare la nuova versione quindi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo install -m 755 forgejo-NUOVA_VERSIONE-linux-amd64 /usr/local/bin/forgejo</pre><p>Avviare Fogejo:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl start forgejo
sudo journalctl -u forgejo -f</pre><p>Prima di ogni upgrade di major version: eseguire il dump e leggi la sezione <strong>breaking changes</strong> delle release notes. Le migrazioni del database vengono applicate automaticamente al primo avvio e non sono reversibili.</p>
<p>&nbsp;</p>
<h3><strong>PROBLEMI FREQUENTI</strong></h3>
<p><strong>502 Bad Gateway</strong>: servizio non attivo o HTTP_ADDR errato systemctl status forgejo &#8211; Verificare che la porta 3000 sia in ascolto con ss -ltnp</p>
<p><strong>Push oltre pochi MB rifiutato</strong>: limite di Nginx &#8211; Aumentare client_max_body_size</p>
<p><strong>Clone SSH chiede la password</strong>: chiave non registrata o permessi errati su /home/git/.ssh &#8211; Correggere i permessi e controllare authorized_keys</p>
<p><strong>Link generati in http://localhost:3000</strong>: ROOT_URL non corretto &#8211; Correggere [server] ROOT_URL e riavviare</p>
<p><strong>Errori di collation dopo upgrade PostgreSQL</strong>: database creato senza template0 &#8211; REINDEX DATABASE forgejo;</p>
<p><strong>Actions non partono</strong>: nessun Runner registrato &#8211; installare Forgejo Runner e registralo dalla UI (dalla 15.0 la registrazione è guidata via web)</p>
<p>&nbsp;</p>
<h3><strong>PRO E CONTRO</strong></h3>
<p>Di seguito i <strong>PRO</strong>:</p>
<p><strong>Governance e licenza</strong>. È il differenziale vero. Forgejo nasce nell&#8217;ottobre 2022 quando domini e marchio Gitea passarono a una società for-profit senza il consenso della community; il progetto vive oggi sotto l&#8217;ombrello di Codeberg e.V., un&#8217;associazione non-profit tedesca.<br />
Dalla versione 9 è rilasciato sotto licenza copyleft GPL, quindi nessun rischio di edizioni &#8220;enterprise&#8221; chiuse o di funzionalità tenute dietro un paywall.</p>
<p><strong>Leggerezza</strong>. Binario statico singolo in Go, gira tranquillamente in ~512 MB di RAM — abissale la differenza con GitLab CE, che vuole 4 GB minimi (8 per stare comodi) più Postgres, Redis, Gitaly e i worker Sidekiq.<br />
Su un LXC o una VM piccola del tuo homelab è un altro pianeta.</p>
<p><strong>Feature set completo per il 90% dei casi.</strong> Repo, pull request, issue, wiki, LFS, registry pacchetti (Docker, npm, PyPI, Cargo, Debian, Go) e CI compatibile con la sintassi GitHub Actions, tutto incluso.</p>
<p><strong>Autoconsistenza del progetto</strong>. Forgejo è sviluppato usando Forgejo stesso, testato e rilasciato con Forgejo Actions; Gitea è sviluppato su GitHub e rilasciato con GitHub Actions.<br />
Codeberg fa da banco di prova su scala reale per ogni release prima che arrivi agli altri self-hoster.</p>
<p><strong>Migrazione facile in entrata</strong>. L&#8217;importer da GitHub/GitLab funziona bene e copre issue, PR, label e milestone, non solo il codice.</p>
<p>Di seguito i <strong>CONTRO</strong>:</p>
<p><strong>Ecosistema di terze parti più povero.</strong> Un decennio di tutorial, provider Terraform, script di backup e guide di integrazione parla di Gitea: quando cerchi soluzioni finisci spesso su documentazione Gitea da adattare. In genere funziona, ma è attrito.</p>
<p><strong>Nessun vendor a cui rivolgersi</strong>. Non esiste un contratto di supporto commerciale. Per un&#8217;azienda che vuole un&#8217;alternativa leggera a GitHub con un fornitore da chiamare, Gitea è la risposta più difendibile in sede di procurement e nel tuo contesto MSP questo pesa soprattutto verso clienti che chiedono un SLA sul software.</p>
<p><strong>CI meno matura di GitLab</strong>. Forgejo Actions copre bene i casi standard, ma non ha l&#8217;equivalente di pipeline multi-stage complesse, DAG, environment con approvazioni, security scanning integrato o container registry con policy di retention avanzate.</p>
<p><strong>Federazione ancora acerba</strong>. ActivityPub/ForgeFed è la bandiera del progetto ma va trattato come un opt-in sperimentale: non contarci per casi d&#8217;uso produttivi.</p>
<p><strong>Porta a senso unico verso Gitea</strong>. Dopo l&#8217;hard fork del 2024 non sono più intercambiabili come drop-in; passare dall&#8217;uno all&#8217;altro oggi è un progetto di migrazione, non un cambio di configurazione. La direzione Forgejo → Gitea in particolare è chiusa.</p>
<p><strong>Manutenzione a tuo carico</strong>. Upgrade, backup, TLS, monitoraggio: tutto tuo. È il prezzo del self-hosting rispetto a GitHub/GitLab.com, e va messo a budget in ore, non solo in euro di VPS.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-forgejo-su-ubuntu-server-26-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Gatus su Ubuntu Server 26.04 con l’utilizzo di Docker Compose</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-gatus-su-ubuntu-server-26-04-con-lutilizzo-di-docker-compose/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-gatus-su-ubuntu-server-26-04-con-lutilizzo-di-docker-compose/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Thu, 06 Aug 2026 07:07:57 +0000</pubDate>
				<category><![CDATA[Gatus]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Compose]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[monitoring]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124351</guid>

					<description><![CDATA[&#160; Nel panorama degli strumenti di monitoraggio self-hosted Gatus si sta ritagliando uno spazio sempre più importante grazie alla sua filosofia semplice ma efficace: un dashboard di health check &#8220;developer-oriented&#8221;, pensato per chi vuole sapere in tempo reale se i propri servizi siti web, API, database, dispositivi di rete sono realmente raggiungibili e funzionanti, senza [&#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="" width="679" height="89" 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>Nel panorama degli strumenti di monitoraggio self-hosted Gatus si sta ritagliando uno spazio sempre più importante grazie alla sua filosofia semplice ma efficace: un dashboard di health check &#8220;developer-oriented&#8221;, pensato per chi vuole sapere in tempo reale se i propri servizi siti web, API, database, dispositivi di rete sono realmente raggiungibili e funzionanti, senza dover configurare uno stack di monitoring complesso.</p>
<p>A differenza di soluzioni basate puramente su metriche di traffico, Gatus esegue controlli attivi e programmati verso gli endpoint configurati, permettendo di intercettare un&#8217;interruzione di servizio anche quando nessun utente sta effettivamente generando richieste in quel momento.</p>
<p>Il tutto restituito attraverso una status page pulita, leggera e completamente personalizzabile via file YAML.</p>
<p>In questa guida vedremo passo passo come installare Gatus su Ubuntu Server 26.04, utilizzando Docker Compose come metodo di deployment: partiremo dall&#8217;installazione di Docker Engine da zero, per poi arrivare a una configurazione base funzionante, con endpoint di esempio, storage persistente su SQLite e alcune indicazioni per l&#8217;esposizione sicura tramite reverse proxy.</p>
<p>Un punto di partenza solido per chi vuole integrare un sistema di status monitoring leggero nel proprio homelab o nella propria infrastruttura di produzione.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<ul>
<li>Un server Ubuntu 26.04 con accesso sudo</li>
<li>Docker Engine (versione 19.03 o superiore, API 1.40+) e il plugin Docker Compose</li>
<li>Un container già in esecuzione, giusto per avere qualche log da guardare</li>
</ul>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DEL SISTEMA</strong></h3>
<p>Aggiornare il sistema con i seguenti comandi:</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</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI DOCKER ENGINE + DOCKER COMPOSE PLUGIN</strong></h3>
<p>Creare la directory per le chiavi GPG con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo install -m 0755 -d /etc/apt/keyrings</pre><p>Aggiungere la chiave GPG ufficiale di Docker con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg

sudo chmod a+r /etc/apt/keyrings/docker.gpg</pre><p>Aggiungere il repository Docker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] 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>Aggiornare e installare Docker + Compose plugin con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre><p><strong>NOTA BENE</strong>: Ubuntu 26.04 è recentissima se il repository Docker non ha ancora una entry specifica per il suo codename, il comando sopra userà comunque il nome codename rilevato da os-release. Se apt update desse errore per il repo, verifica su https://download.docker.com/linux/ubuntu/dists/ quale codename è disponibile e sostituiscilo manualmente.</p>
<p>&nbsp;</p>
<h3><strong>VERIFICARE L&#8217;INSTALLAZIONE DI DOCKER</strong></h3>
<p>Verificare l&#8217;installazione di Docker con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker --version

sudo docker compose version

sudo systemctl status docker</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; preset: enabled)
Active: active (running) since Sun 2026-07-12 19:56:12 UTC; 1min 18s ago
Invocation: cc37e30724f641f694ef48dfdbb5fec7
TriggeredBy: ● docker.socket
Docs: https://docs.docker.com
Main PID: 30242 (dockerd)
Tasks: 10
Memory: 27.8M (peak: 28.1M)
CPU: 316ms
CGroup: /system.slice/docker.service
└─30242 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.022827820Z" level=info msg="Restoring containers: start."
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.051534074Z" level=info msg="Deleting nftables IPv4 rules" error="running nft: /dev/stdin:1:17-30: &gt;
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.058935552Z" level=info msg="Deleting nftables IPv6 rules" error="running nft: /dev/stdin:1:18-31: &gt;
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.275806869Z" level=info msg="Loading containers: done."
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.283474191Z" level=info msg="Docker daemon" commit=8ec5ab3 containerd-snapshotter=true storage-driv&gt;
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.283562293Z" level=info msg="Initializing buildkit"
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.384444825Z" level=info msg="Completed buildkit initialization"
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.390776109Z" level=info msg="Daemon has completed initialization"
Jul 12 19:56:12 vm-srv-test dockerd[30242]: time="2026-07-12T19:56:12.390817886Z" level=info msg="API listen on /run/docker.sock"
Jul 12 19:56:12 vm-srv-test systemd[1]: Started docker.service - Docker Application Container Engine.</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>UTILIZZO DI DOCKER SENZA SUDO (OPZIONALE MA CONSIGLIATO)</strong></h3>
<p>Per utilizzare Docker senza sudo eseguire i comandi di seguito:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo usermod -aG docker $USER

newgrp docker</pre><p>Poi verificare con il seguente comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker run hello-world</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DELLA STRUTTURA DI CARTELLE PER GATUS</strong></h3>
<p>Creare la struttura delle cartelle per Gatus con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">mkdir -p ~/gatus/config ~/gatus/data

cd ~/gatus</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DEL FILE DOCKER-COMPOSE.YML</strong></h3>
<p>Creare il file <strong>docker-compose.yml</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano docker-compose.yml</pre><p>Quindi incollare all&#8217;interno il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">services:
gatus:
image: ghcr.io/twin/gatus:stable
container_name: gatus
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ./config/config.yaml:/config/config.yaml:ro
- ./data:/data
environment:
- GATUS_CONFIG_PATH=/config/config.yaml</pre><p>Salvare e chiudere il file di configurazione.</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DEL FILE DI CONFIGURAZIONE CONFIG/CONFIG.YAML</strong></h3>
<p>Creare il file di configurazione <strong>config/config.yaml</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano config/config.yaml</pre><p>Quindi incollare all&#8217;interno il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">storage:
type: sqlite
path: /data/data.db

web:
port: 8080

endpoints:
- name: Google
url: "https://google.com"
interval: 60s
conditions:
- "[STATUS] == 200"
- "[RESPONSE_TIME] &lt; 1000"

- name: Sito di esempio
url: "https://tuo-dominio-esempio.it"
interval: 60s
conditions:
- "[STATUS] == 200"</pre><p>Salvare e chiudere il file di configurazione.</p>
<p>Sostituire gli endpoint con i servizi reali da monitorare (siti, API, ESXi, vCenter, Portainer, ecc.).</p>
<p>&nbsp;</p>
<h3><strong>AVVIO DEL CONTAINER</strong></h3>
<p>Avviare il Docker con il comando:</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 7/7
<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/twin/gatus:stable Pulled 4.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;" /> Network gatus_default 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 gatus Started</pre><p>Verificare i log con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose logs -f gatus</pre><p>Dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">gatus | 2026/07/12 20:03:50 [main.configureLogging] Log Level is set to INFO
gatus | 2026/07/12 20:03:50 [config.LoadConfiguration] Reading configuration from configFile=/config/config.yaml
gatus | 2026/07/12 20:03:50 [config.ValidateAlertingConfig] Alerting is not configured
gatus | 2026/07/12 20:03:50 [config.ValidateEndpointsConfig] Validated 2 endpoints
gatus | 2026/07/12 20:03:50 [config.ValidateEndpointsConfig] Validated 0 external endpoints
gatus | 2026/07/12 20:03:50 [config.ValidateSuitesConfig] No suites configured
gatus | 2026/07/12 20:03:50 [main.initializeStorage] Total endpoint keys to preserve: 2
gatus | 2026/07/12 20:03:50 [controller.Handle] Listening on 0.0.0.0:8080
gatus |
gatus | ┌───────────────────────────────────────────────────┐
gatus | │ Fiber v2.52.13 │
gatus | │ http://[::]:8080 │
gatus | │ │
gatus | │ Handlers ............ 41 Processes ........... 1 │
gatus | │ Prefork ....... Disabled PID ................. 1 │
gatus | └───────────────────────────────────────────────────┘
gatus |
gatus | 2026/07/12 20:03:51 [watchdog.executeEndpoint] Monitored group=; endpoint=Google; key=_google; success=true; errors=0; duration=194ms
gatus | 2026/07/12 20:03:51 [api.ErrorHandler] Cannot GET /api/events/stream
gatus | 2026/07/12 20:03:52 [watchdog.executeEndpoint] Monitored group=; endpoint=Sito di esempio; key=_sito-di-esempio; success=true; errors=0; duration=1.07s</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>ACCESSO ALLA DASHBOARD DI GATUS</strong></h3>
<p>Per accedere alla Dashboard di Gatus da un qualsiasi browser richiamare il link:</p>
<p><strong>http://&lt;IP-del-server&gt;:8080</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124355 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-01-1024x403.png" alt="" width="1024" height="403" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-01-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-01-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>Dovremmo visualizzare la Dashboard di Gatus con i due Host monitorati</p>
<p>&nbsp;</p>
<h3><strong>ABILITARE L&#8217;AUTENTICAZIONE BASE (OPZIONALE)</strong></h3>
<p>Per abilitare l&#8217;autenticazione su Gatus eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt install -y apache2-utils
htpasswd -bnBC 10 '' TuaPasswordSicura | tr -d ':\n' | base64</pre><p>Nel file <strong>config.yaml</strong> aggiungere le seguenti righe:</p><pre class="urvanov-syntax-highlighter-plain-tag">security:
basic:
username: admin
password-bcrypt-base64: "INCOLLA_QUI_L'HASH"</pre><p>Salvare e chiudere il file di configurazione</p>
<p>Riavviare Docker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose up -d</pre><p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124356 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-02-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-02-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-gatus-ubuntu-02-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>Fare un refresh della pagina web e se è tutto corretto dovrebbe chiedere la credenziali di accesso.</p>
<p>&nbsp;</p>
<h3><strong>ABILITARE L&#8217;ALERT VIA EMAIL (OPZIONALE)</strong></h3>
<p>Per abilitare gli alert via mail inserire all&#8217;interno del file <strong>config.yaml</strong> le seguenti righe:</p><pre class="urvanov-syntax-highlighter-plain-tag">alerting:
email:
from: "gatus@mypsx.net"
to: "tuamail@example.com"
smtp:
host: smtp.example.com
port: 587
username: user
password: pass</pre><p>Salvare e chiudere il file di configurazione.</p>
<p>&nbsp;</p>
<h3><strong>MANUTENZIONE</strong></h3>
<p>Per aggiornare Gatus alla nuova versione eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd ~/gatus

docker compose pull

docker compose up -d</pre><p>Per controllare la dimensione del database SQLite eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">du -sh ~/gatus/data/</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>FUNZIONALITA&#8217; DI GATUS CON PRO E CONTRO</strong></h3>
<p>Ecco l&#8217;elenco completo delle funzionalità di Gatus, con pro e contro per ciascuna area.</p>
<h4><strong>Tipi di health check</strong></h4>
<p>Funzionalità: monitoraggio via HTTP, TCP, ICMP (ping), DNS, STARTTLS/TLS, e persino query GraphQL Gatus è una dashboard di health monitoring orientata agli sviluppatori che permette di monitorare i servizi tramite query HTTP, ICMP, TCP e DNS. TwiN</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: copre praticamente ogni tipo di servizio (web app, database, DNS interni, certificati, dispositivi di rete raggiungibili solo via ping).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong> Pro:</strong> supporta anche richieste GraphQL con verifica del body, utile per API moderne.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: nessun check &#8220;agent-based&#8221; (a differenza di Zabbix/Prometheus node_exporter) non misura CPU/RAM/disco dell&#8217;host, solo raggiungibilità/risposta del servizio.</p>
<h4><strong>Condizioni di valutazione (conditions)</strong></h4>
<p>Funzionalità: condizioni flessibili su status code, tempo di risposta, contenuto del body (JSON path), scadenza certificati, IP Gatus valuta il risultato delle query usando una lista di condizioni su valori come il codice di stato, il tempo di risposta, la scadenza del certificato e il body. TwiN</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: molto più granulare di un semplice &#8220;è su/giù&#8221; puoi verificare che l&#8217;API risponda con dati corretti, non solo con HTTP 200.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: utilizzabile anche come test di accettazione automatizzati (UAT), non solo monitoring.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: la sintassi delle condizioni (JSON path custom, placeholder [STATUS], [BODY], ecc.) richiede una curva di apprendimento iniziale, specialmente per condizioni complesse su body annidati.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: l&#8217;operatore pat() (pattern matching) è molto più oneroso computazionalmente di un confronto diretto, quindi va usato con parsimonia.</p>
<h4><strong>Alerting multi-canale</strong></h4>
<p>Funzionalità: integrazioni native con Slack, Discord, Teams, PagerDuty, Twilio, Telegram, Email, Mattermost, Google Chat, Opsgenie, Gotify, ntfy, HomeAssistant, GitHub, GitLab, iLert e provider custom via webhook.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: copertura estremamente ampia &#8220;out of the box&#8221;, incluse integrazioni home-lab friendly come ntfy e HomeAssistant.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: soglie configurabili per failure/success (es. avvisa solo dopo 3 fallimenti consecutivi, chiudi l&#8217;alert dopo 2 successi).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong> Pro</strong>: provider custom per casi non coperti (es. rollback automatici, webhook interni).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: ogni provider ha una sintassi di configurazione leggermente diversa nello YAML, quindi bisogna consultare la doc per ciascuno.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: non tutti i provider gestiscono l&#8217;auto-risoluzione (send-on-resolved) allo stesso modo  per alcuni (es. PagerDuty, iLert) è fortemente raccomandato abilitarla per evitare incident &#8220;fantasma&#8221; aperti.</p>
<h4><strong>Storage dei dati storici</strong></h4>
<p>Funzionalità: storage in memoria, SQLite (default consigliato) o PostgreSQL Gatus supporta anche uno storage PostgreSQL configurabile tramite stringa di connessione. Libre Self-hosted</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: SQLite è zero-config e perfetto per homelab/singola istanza.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro:</strong> PostgreSQL disponibile per scenari multi-istanza o retention più lunga.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro:</strong> lo storage in memoria (default se non configurato) perde tutto lo storico ad ogni riavvio del container.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: nessun supporto nativo per storage a lungo termine tipo time-series DB (InfluxDB/Prometheus) se ti servono dashboard analitiche avanzate, va integrato esternamente.</p>
<h4><strong>Dashboard e status page</strong></h4>
<p>Funzionalità: dashboard web con dark mode, badge di stato (anche integrabili in README GitHub), raggruppamento endpoint per categoria.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: interfaccia pulita, leggera, pensata per essere pubblica (status page stile StatusPage.io).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: badge integrabili ovunque (utile per un post sul blog o repo Gitea).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: la personalizzazione grafica è limitata rispetto a soluzioni più &#8220;enterprise&#8221; (Uptime Kuma ha temi più ricchi, Kener è pensato apposta per status page brandizzate).</p>
<h4><strong>Sicurezza e accesso</strong></h4>
<p>Funzionalità: autenticazione basic (bcrypt), OIDC (in alpha).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: protezione semplice via basic auth per dashboard esposte pubblicamente.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: OIDC è ancora in stato alpha — non affidarti ad esso per ambienti di produzione critici, specialmente se hai già SSO aziendale da integrare stabilmente.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: nessun sistema di ruoli/permessi granulare (RBAC) è tutto o niente sull&#8217;accesso alla dashboard.</p>
<h4><strong>Metriche e osservabilità</strong></h4>
<p>Funzionalità: endpoint /metrics in formato Prometheus.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro:</strong> si integra facilmente col tuo stack Grafana/Prometheus esistente.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: basso consumo di risorse, tipico delle applicazioni Go il consumo di risorse richiesto è trascurabile, come tipico delle applicazioni Go.</p>
<h4><strong>Deployment e automazione</strong></h4>
<p>Funzionalità: Docker, Helm Chart per Kubernetes, Terraform provider, auto-discovery Kubernetes (alpha), istanze remote (sperimentale).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong> Pro</strong>: ottimo fit sia per homelab Docker/Portainer sia per cluster K8s più strutturati.</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /><strong> Pro</strong>: configurazione dichiarativa in YAML → si presta benissimo a GitOps (perfetto per il tuo workflow con Gitea).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: auto-discovery K8s e istanze remote sono ancora sperimentali/alpha non stabili al 100% per produzione.</p>
<h4><strong>Filosofia generale: monitoraggio &#8220;esterno&#8221; vs metriche interne</strong></h4>
<p>Funzionalità: check attivi e sintetici, non dipendenti dal traffico reale a differenza delle metriche che dipendono dal traffico esistente, Gatus ti avvisa anche se nessun cliente sta attivamente chiamando l&#8217;endpoint in quel momento. Openaitx</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/2705.png" alt="✅" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Pro</strong>: rileva problemi anche prima che gli utenti reali li notino (es. load balancer giù senza traffico).</p>
<p><img src="https://s.w.org/images/core/emoji/17.0.2/72x72/26a0.png" alt="⚠" class="wp-smiley" style="height: 1em; max-height: 1em;" /> <strong>Contro</strong>: essendo check sintetici a intervalli, non sostituisce un vero APM (Application Performance Monitoring) per diagnosticare cause profonde di degradazione è complementare, non alternativo, a strumenti come Prometheus/Grafana per metriche interne.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-gatus-su-ubuntu-server-26-04-con-lutilizzo-di-docker-compose/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Dozzle su Ubuntu Server 26.04 con Docker Engine</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-dozzle-su-ubuntu-server-26-04-con-docker-engine/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-dozzle-su-ubuntu-server-26-04-con-docker-engine/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 03 Aug 2026 06:33:30 +0000</pubDate>
				<category><![CDATA[Dozzle]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Docker]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124341</guid>

					<description><![CDATA[&#160; Dozzle è un log viewer per container Docker leggero e in tempo reale pensato per essere l&#8217;alternativa pratica al classico docker logs -f lanciato a mano su ogni container. È stateless (non salva nulla su disco), pesa pochi MB e si installa con un solo comando Docker. Nelle versioni più recenti supporta anche query [&#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="" width="679" height="89" 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>Dozzle è un log viewer per container Docker leggero e in tempo reale pensato per essere l&#8217;alternativa pratica al classico docker logs -f lanciato a mano su ogni container.</p>
<p>È stateless (non salva nulla su disco), pesa pochi MB e si installa con un solo comando Docker.</p>
<p>Nelle versioni più recenti supporta anche query SQL sui log tramite DuckDB in-browser monitoraggio multi-host con agent dedicati e notifiche verso Slack, Discord, ntfy o webhook generici.</p>
<p>In questa guida vedremo come installarlo su Ubuntu 26.04 con configurazione tramite Docker Compose, persistenza dei dati, autenticazione e pubblicazione dietro reverse proxy con certificato TLS.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<ul>
<li>Un server Ubuntu 26.04 con accesso sudo</li>
<li>Docker Engine (versione 19.03 o superiore, API 1.40+) e il plugin Docker Compose</li>
<li>Un container già in esecuzione, giusto per avere qualche log da guardare</li>
</ul>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI DOCKER</strong></h3>
<p>Se Docker non è ancora installato eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update

sudo apt install -y ca-certificates curl gnupg

sudo install -m 0755 -d /etc/apt/keyrings

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

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

echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] 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

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin

sudo usermod -aG docker $USER</pre><p>Dopo l&#8217;ultimo comando, esci e rientra nella sessione SSH (o esegui newgrp docker) per usare Docker senza sudo.</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DELLA DIRECTORY DELLO STACK</strong></h3>
<p>Come per gli altri servizi self-hosted conviene tenere ogni stack in una cartella dedicata sotto /opt:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /opt/stacks/dozzle

cd /opt/stacks/dozzle</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DEL DOCKER-COMPOSE.YML</strong></h3>
<p>Creare il file <strong>docker-compose.yml</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano docker-compose.yml</pre><p>Contenuto minimo, con persistenza del volume /data (necessaria per non perdere le impostazioni di notifica tra un riavvio e l&#8217;altro del container):</p><pre class="urvanov-syntax-highlighter-plain-tag">services:
dozzle:
image: amir20/dozzle:latest
container_name: dozzle
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- dozzle_data:/data
ports:
- "8080:8080"
environment:
- DOZZLE_HOSTNAME=dozzle-srv01
# - DOZZLE_ENABLE_ACTIONS=true # abilita start/stop/restart dei container dalla UI
# - DOZZLE_ENABLE_SHELL=true # abilita l'accesso alla shell dei container dalla UI
# - DOZZLE_AUTH_PROVIDER=simple # abilita l'autenticazione (vedi Passo 5)

volumes:
dozzle_data:</pre><p><strong>NOTA BENE</strong>: il flag :ro sul mount del socket Docker perchè Dozzle ha bisogno solo di leggere lo stato dei container e i log, quindi montarlo in sola lettura è una buona pratica anche se, va detto, l&#8217;accesso al socket Docker resta comunque equivalente a un accesso root sull&#8217;host.</p>
<p>&nbsp;</p>
<h3><strong>AVVIO DEL CONTAINER</strong></h3>
<p>Avviare il Container con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose up -d</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] up 9/9
<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 amir20/dozzle:latest Pulled 3.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;" /> Network dozzle_default 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;" /> Volume dozzle_dozzle_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 dozzle Started</pre><p>Fare un check con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker ps | grep dozzle</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">d7c03c6a3fb8 amir20/dozzle:latest "/dozzle" 33 seconds ago Up 31 seconds 0.0.0.0:8080-&gt;8080/tcp, [::]:8080-&gt;8080/tcp dozzle</pre><p>Verificare che sia raggiungibile il link con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">curl -I http://localhost:8080</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>ACCESSO A DOZZLE DA WEBGUI</strong></h3>
<p>Se tutto è a posto da un qualsiasi browser richiamare il link <strong>http://IP-DEL-SERVER:8080</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-doozle.ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124343 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-doozle.ubuntu-01-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-doozle.ubuntu-01-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-doozle.ubuntu-01-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>Se è tutto OK dovremmo visualizzare la dashboard con l&#8217;elenco dei container in esecuzione sull&#8217;host.</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL FIREWALL</strong></h3>
<p>Se si vuole esporre la porta solo sulla rete interna limitare la regola alla subnet invece di aprirla su 0.0.0.0 con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo ufw allow from 192.168.0.0/16 to any port 8080 proto tcp</pre><p>Se invece si pubblica Dozzle dietro reverse proxy la porta 8080 non deve essere esposta pubblicamente: basta che sia raggiungibile dal proxy.</p>
<p>&nbsp;</p>
<h3><strong>ABILITARE L&#8217;AUTENTICAZIONE SU DOOZLE</strong></h3>
<p>Di default Dozzle è senza autenticazione quindi chiunque raggiunge la porta vede i log di tutti i container.</p>
<p>Per qualsiasi esposizione oltre al semplice localhost va abilitata l&#8217;autenticazione con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker run -it --rm -v dozzle_data:/data amir20/dozzle generate admin \
--password "PASSWORD_SICURA" \
--email admin@lab.prv \
--name "Admin"</pre><p>Poi nel docker-compose.yml scommentare la seguente riga:</p><pre class="urvanov-syntax-highlighter-plain-tag">yaml environment:
- DOZZLE_AUTH_PROVIDER=simple</pre><p>Quindi riavviare lo stack con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose up -d</pre><p>Da questo momento l&#8217;accesso alla UI richiederà la login.</p>
<p>&nbsp;</p>
<h3><strong>MONITORAGGIO MULTI-HOST (OPZIONALE)</strong></h3>
<p>Se si hanno più host Docker da monitorare da un&#8217;unica dashboard Dozzle supporta un&#8217;architettura ad agent: su ogni host remoto lanci un agent leggero, e li colleghi tutti al Dozzle principale.</p>
<p>Su ogni host remoto eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker run -d \
--name dozzle-agent \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock:ro \
-p 7007:7007 \
amir20/dozzle:latest agent</pre><p>Sul Dozzle principale aggiungere nel docker-compose.yml le seguenti righe:</p><pre class="urvanov-syntax-highlighter-plain-tag">environment:
- DOZZLE_REMOTE_AGENT=IP_HOST_REMOTO:7007</pre><p>L&#8217;agent comunica via gRPC sulla porta 7007: verificare che sia raggiungibile prima di dare per scontato che non funzioni.</p>
<p>&nbsp;</p>
<h3><strong>FUNZIONALITA&#8217; DI DOOZER</strong></h3>
<p>Ecco un quadro completo delle funzionalità di Dozzle, con pro e contro di ciascuna:</p>
<h4><strong>Monitoraggio log in tempo reale</strong></h4>
<p>Streaming live dei log di tutti i container Docker, senza bisogno di aprire terminali multipli con docker logs -f.</p>
<p><strong>Pro:</strong> zero configurazione, log visibili immediatamente all&#8217;avvio</p>
<p><strong>Contro</strong>: nessuna persistenza se un container va giù, vedi solo quello che rimane nel buffer del log driver Docker (limitato da max-size in daemon.json)</p>
<h4><strong>Ricerca e filtri sui log</strong></h4>
<p>Supporta ricerca regex, fuzzy search e (nelle versioni recenti) query SQL complete tramite DuckDB, eseguite via WebAssembly direttamente nel browser.</p>
<p><strong>Pro</strong>: ricerca potente senza bisogno di un backend esterno o database</p>
<p><strong>Contro</strong>: la ricerca SQL funziona solo sui log attualmente in buffer/visibili, non su uno storico persistente non è un sostituto di Loki o ELK per ricerche su settimane di log</p>
<h4><strong>Statistiche container (CPU, memoria, rete)</strong></h4>
<p>Grafici con storico &#8220;rolling&#8221; delle risorse per ogni container, aggiornati in tempo reale.</p>
<p><strong>Pro</strong>: utile per un colpo d&#8217;occhio rapido senza aprire docker stats o Portainer</p>
<p><strong>Contro</strong>: storico limitato alla sessione, non pensato per capacity planning a lungo termine</p>
<h4><strong>Multi-container / split view</strong></h4>
<p>Visualizzazione affiancata dei log di più container contemporaneamente.</p>
<p><strong>Pro:</strong> comodo per debug su stack con più servizi correlati (es. app + db + reverse proxy)</p>
<p><strong>Contro</strong>: con molti container aperti insieme l&#8217;interfaccia diventa affollata</p>
<h4><strong>Azioni sui container (start/stop/restart, shell)</strong></h4>
<p>Da abilitare esplicitamente con DOZZLE_ENABLE_ACTIONS e DOZZLE_ENABLE_SHELL.</p>
<p><strong>Pro</strong>: gestione rapida senza uscire dal browser</p>
<p><strong>Contro</strong>: disattivate di default per motivi di sicurezza — abilitarle su un&#8217;istanza esposta pubblicamente amplia parecchio la superficie di rischio, dato che chi ha accesso può eseguire comandi nei container</p>
<h4><strong>Notifiche/alert su pattern di log</strong></h4>
<p>Match su espressioni configurabili con notifica verso Slack, Discord, ntfy o webhook generico.</p>
<p><strong>Pro</strong>: permette un minimo di alerting reattivo senza integrare uno stack di observability completo</p>
<p><strong>Contro</strong>: nessuna gestione di stato/silenziamento evoluta come in un vero sistema di alerting (Alertmanager, ecc.)</p>
<h4><strong>Multi-host e Swarm/Kubernetes</strong></h4>
<p>Architettura ad agent per collegare più host Docker o cluster Swarm da un&#8217;unica dashboard; supporto anche per Kubernetes (DOZZLE_MODE=k8s, con RBAC per accesso ai log dei pod).</p>
<p><strong>Pro</strong>: scala bene per contesti MSP con più host da monitorare centralmente</p>
<p><strong>Contro</strong>: richiede di esporre/raggiungere la porta 7007 (gRPC) dell&#8217;agent su ogni host remoto, quindi va pianificato bene su reti segmentate o dietro VPN/tunnel</p>
<h4><strong>Autenticazione</strong></h4>
<p>Provider &#8220;simple&#8221; con utenti generati via CLI, oppure integrazione con reverse proxy di autenticazione tipo Authelia.</p>
<p><strong>Pro</strong>: copre il caso base senza bisogno di terze parti</p>
<p><strong>Contro</strong>: disattivata di default è facile dimenticarsene e lasciare un&#8217;istanza aperta su una rete condivisa; nessun supporto nativo a RBAC granulare (es. utenti che vedono solo certi container)</p>
<h4><strong>Impronta e leggerezza</strong></h4>
<p>Immagine da 7-10 MB, footprint minimo di CPU/RAM, nessun database.</p>
<p><strong>Pro</strong>: ideale per homelab o affiancato ad app leggere senza overhead percepibile</p>
<p><strong>Contro</strong>: proprio perché stateless, non fa retention: non è adatto a compliance/audit log a lungo termine</p>
<h4><strong>Accesso al socket Docker</strong></h4>
<p>Richiede il mount di /var/run/docker.sock (idealmente in sola lettura, :ro).</p>
<p><strong>Pro</strong>: nessuna configurazione aggiuntiva per &#8220;vedere&#8221; tutti i container</p>
<p><strong>Contro</strong>: l&#8217;accesso al socket Docker è di fatto equivalente a un accesso root sull&#8217;host è il principale motivo per cui va protetto dietro autenticazione/reverse proxy e mai esposto direttamente su internet</p>
<h4><strong>Analytics anonime</strong></h4>
<p>Raccoglie dati anonimi di utilizzo (Google Analytics) per orientare lo sviluppo, disattivabile col flag &#8211;no-analytics.</p>
<p><strong>Pro</strong>: aiuta il progetto (open source, non finanziato) a capire dove investire</p>
<p><strong>Contro</strong>: va disattivato esplicitamente se in ambienti con policy privacy stringenti (es. NIS2, clienti regolamentati)</p>
<p>In sintesi Dozzle è ottimo come vista live leggera e immediata, ma non sostituisce una piattaforma di log management vera e propria quando servono retention, ricerca storica, alerting strutturato o controlli di accesso granulari lì restano scelte più adatte Loki+Grafana, ELK o soluzioni a pagamento tipo Dash0.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-dozzle-su-ubuntu-server-26-04-con-docker-engine/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Planka su Ubuntu Server 26.04 con Docker Compose</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-planka-su-ubuntu-server-26-04-con-docker-compose/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-planka-su-ubuntu-server-26-04-con-docker-compose/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Thu, 30 Jul 2026 06:13:54 +0000</pubDate>
				<category><![CDATA[Planka]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[Canba]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[DockerCompose]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124323</guid>

					<description><![CDATA[&#160; Chi gestisce progetti in team o anche solo la propria lista di attività personali prima o poi si scontra con lo stesso dilemma: affidarsi a un servizio cloud di terze parti, con tutti i limiti in termini di privacy e controllo dei dati che questo comporta, oppure cercare un&#8217;alternativa self-hosted altrettanto semplice da usare. [&#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="" width="679" height="89" 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 progetti in team o anche solo la propria lista di attività personali prima o poi si scontra con lo stesso dilemma: affidarsi a un servizio cloud di terze parti, con tutti i limiti in termini di privacy e controllo dei dati che questo comporta, oppure cercare un&#8217;alternativa self-hosted altrettanto semplice da usare.</p>
<p>Planka risponde proprio a questa esigenza: una board Kanban open source, leggera e reattiva, che riprende l&#8217;esperienza di Trello ma gira interamente sul proprio server.</p>
<p>In questa guida vedremo come installare e configurare Planka su Ubuntu Server 26.04 utilizzando Docker Compose, l&#8217;approccio più pulito e manutenibile per chi, come nel mio caso, gestisce già altri servizi containerizzati in homelab.</p>
<p>Partiremo dall&#8217;installazione di Docker, passeremo per la configurazione del container PostgreSQL necessario come backend, fino ad arrivare alla creazione dell&#8217;utente amministratore e a qualche accorgimento pratico per evitare i problemi più comuni che si possono incontrare al primo avvio, come la classica race condition tra database e applicazione.</p>
<p>Alla fine della guida avrete un&#8217;istanza di Planka funzionante e pronta per organizzare i vostri progetti, con le basi solide per aggiungere in un secondo momento un reverse proxy con HTTPS e altre personalizzazioni.</p>
<p>&nbsp;</p>
<h3><strong>PREREQUISITI</strong></h3>
<ul>
<li>Ubuntu 26.04 con accesso sudo</li>
<li>Almeno 1 GB di RAM libera</li>
<li>Docker ed il plugin Compose</li>
</ul>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI DOCKER</strong></h3>
<p>Installare Docker con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">curl -fsSL https://get.docker.com | sudo sh

sudo usermod -aG docker $USER

newgrp docker

sudo apt install docker-compose-plugin -y</pre><p>Quindi verificare Docker con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker --version</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">Docker version 29.6.1, build 8900f1d</pre><p>Verificare Docker Compose con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose version</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">Docker Compose version v5.3.1</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DELLE STRUTTURA DI PROGETTO</strong></h3>
<p>Creare la struttura di cartella con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /opt/planka

cd /opt/planka</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CONFIGURAZIONE DEL DOCKER-COMPOSE.YML</strong></h3>
<p>Usare l&#8217;immagine ufficiale <strong>ghcr.io/plankanban/planka</strong> con PostgreSQL come backend.</p>
<p>Creare il file <strong>docker-compose.yml</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano docker-compose.yml</pre><p>Quindi copiare all&#8217;interno il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">services:
planka:
image: ghcr.io/plankanban/planka:latest
container_name: planka
restart: unless-stopped
depends_on:
postgres:
condition: service_healthy
ports:
- "3000:1337"
environment:
- BASE_URL=http://TUO_IP_O_DOMINIO:3000
- DATABASE_URL=postgres://planka:CAMBIA_QUESTA_PASSWORD@postgres:5432/planka
- SECRET_KEY=CAMBIA_CON_STRINGA_CASUALE_LUNGA
- TRUST_PROXY=false
volumes:
- ./data/user-avatars:/app/public/user-avatars
- ./data/project-background-images:/app/public/project-background-images
- ./data/attachments:/app/private/attachments

postgres:
image: postgres:16-alpine
container_name: planka-db
restart: unless-stopped
environment:
- POSTGRES_USER=planka
- POSTGRES_PASSWORD=CAMBIA_QUESTA_PASSWORD
- POSTGRES_DB=planka
volumes:
- ./db_data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U planka -d planka"]
interval: 5s
timeout: 5s
retries: 5</pre><p>Salvare il file e generare una <strong>SECRET_KEY</strong> sicura con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">openssl rand -hex 64</pre><p>Copiare il risultato dentro il file al posto di <strong>CAMBIA_CON_STRINGA_CASUALE_LUNGA</strong> e impostare una password robusta uguale in entrambi i punti <strong>CAMBIA_QUESTA_PASSWORD</strong>.</p>
<h3></h3>
<h3><strong>AVVIARE IL CONTAINER</strong></h3>
<p>Avviare il container con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/planka

docker compose up -d</pre><p>Dovremmo visualizzare un output simile al seguente:</p><pre class="urvanov-syntax-highlighter-plain-tag">[+] up 31/31
<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:16-alpine Pulled 8.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/plankanban/planka:latest Pulled 10.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;" /> Network planka_default 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 planka-db Started 4.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;" /> Container planka Started</pre><p>Verificare i log con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose logs -f planka</pre><p>Attendere che i log mostrino che il server è pronto, poi Ctrl+C per uscire dai log (i container restano attivi).</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DELL&#8217;UTENTE AMMINISTRATORE</strong></h3>
<p>Dalla versione 1.13 in poi Planka non crea più un admin di default automaticamente. Va creato a mano con il seguente comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose run --rm planka npm run db:create-admin-user</pre><p>Ti verranno chiesti email, password, nome e username.</p>
<p>In alternativa, puoi impostare le variabili <strong>DEFAULT_ADMIN_EMAIL, DEFAULT_ADMIN_PASSWORD, DEFAULT_ADMIN_USERNAME</strong> e <strong>DEFAULT_ADMIN_NAME</strong> nel compose e fare un restart in modo che l&#8217;utente viene creato al primo avvio.</p>
<p>&nbsp;</p>
<h3><strong>ACCESSO TRAMITE WEBGUI</strong></h3>
<p>Da un quslaisi browser aprire il link <strong>http://TUO_IP:3000</strong> (o l&#8217;IP del server) ed effettuare il login con le credenziali admin appena create.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124325 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-01-1024x405.png" alt="" width="1024" height="405" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-01-980x388.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-01-480x190.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 su <strong>Accedi</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124326 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-02-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-02-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-02-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>Accettare l&#8217;<strong>EULA</strong> e cliccare <strong>Continua</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124327 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-03-1024x398.png" alt="" width="1024" height="398" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-03-980x381.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-planka-ubuntu-docker-03-480x186.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 accedere alla <strong>Home di Planka</strong></p>
<p>Da questa schermata è possibile iniziare a creare Progetti</p>
<p>&nbsp;</p>
<h3><strong>BACKUP DI PLANKA</strong></h3>
<p>Planka fornisce script dedicati per backup/restore quando si usa docker-compose utile per uno script cron periodico che salvi sia il volume db_data sia le cartelle data/.</p>
<p>&nbsp;</p>
<h3><strong>TROUBLESHOOTING RAPIDO</strong></h3>
<p>Check di Errori di avvio con il seguente comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose logs planka | grep -i error</pre><p>Check Problemi di autenticazione DB con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose logs postgres</pre><p>Per un Riavvio pulito utilizzare i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">docker compose down

docker compose up -d</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>FUNZIONALITA&#8217; PRINCIPALI</strong></h3>
<h4></h4>
<h4><strong>Gestione progetti e board</strong></h4>
<ul>
<li>Board in stile Kanban con liste e card trascinabili (drag-and-drop)</li>
<li>Card con checklist, sotto-attività, etichette colorate, scadenze</li>
<li>Allegati file sulle card</li>
<li>Aggiornamenti in tempo reale via WebSocket (se più persone lavorano insieme, vedono i cambiamenti istantaneamente)</li>
</ul>
<h4><strong>Collaborazione</strong></h4>
<ul>
<li>Gestione utenti e membri per progetto/board</li>
<li>Assegnazione di card a membri specifici</li>
<li>Commenti sulle card</li>
<li>Import da Trello (utile se stai migrando)</li>
</ul>
<h4><strong>Amministrazione</strong></h4>
<ul>
<li>Autenticazione OIDC (OpenID Connect) — comodo se vuoi integrarlo con un provider SSO che magari già usi in ambito M365/Azure AD</li>
<li>Personalizzazione dei termini di utilizzo per utenti finali</li>
<li>API disponibili (con client Python non ufficiale, plankapy)</li>
<li>Supporto Swagger/Postman per chi vuole integrarlo via API</li>
</ul>
<h4><strong>Deployment</strong></h4>
<ul>
<li>Docker/Docker Compose (il metodo che abbiamo appena configurato)</li>
<li>Installazione manuale su Debian/Ubuntu</li>
<li>Helm chart per chi gira su Kubernetes — potenzialmente interessante visto il tuo K3S</li>
</ul>
<p>&nbsp;</p>
<h3><strong>PRO E CONTRO DI PLANKA</strong></h3>
<h4></h4>
<h4><strong>Pro</strong></h4>
<ul>
<li>Leggero e veloce: footprint di risorse minimo, gira bene anche su una VM homelab modesta</li>
<li>Interfaccia pulita: nessun sovraccarico di funzionalità inutili, esperienza molto simile a Trello</li>
<li>Open source e self-hosted: controllo completo dei dati, nessuna dipendenza da servizi cloud terzi</li>
<li>Real-time collaboration affidabile: funziona bene senza configurazioni complesse</li>
<li>Community attiva: sviluppo continuo, immagini Docker aggiornate regolarmente</li>
</ul>
<h4><strong>Contro</strong></h4>
<ul>
<li>Funzionalità limitate rispetto a strumenti più completi: non ha Gantt chart, timeline, dashboard di reportistica avanzata, automazioni (tipo Trello Butler o Jira workflows)</li>
<li>Nessuna gestione avanzata di permessi/ruoli granulari: i controlli di accesso sono piuttosto semplici rispetto a strumenti enterprise</li>
<li>Nessuna app mobile nativa: è web-based, va bene ma manca l&#8217;esperienza mobile dedicata</li>
<li>Gestione admin utente cambiata di recente: dalla versione 1.13 non c&#8217;è più creazione automatica dell&#8217;admin, richiede uno step manuale in più (come abbiamo visto)</li>
<li>Meno adatto a project management &#8220;pesante&#8221;: se hai bisogno di dipendenze tra task, milestone, roadmap, conviene guardare altrove (es. Taiga, che hai citato come alternativa nella guida che abbiamo trovato)</li>
<li>Notifiche limitate: manca un sistema di notifiche via email/Slack robusto out-of-the-box</li>
</ul>
<p>&nbsp;</p>
<h3><strong>IN SINTESI</strong></h3>
<p>Planka è la scelta giusta se cerchi un Trello self-hosted semplice ed essenziale per organizzare task di un piccolo team o per uso personale esattamente il tipo di tool che si inserisce bene nel tuo stack homelab accanto a Portainer, Gitea, ecc.</p>
<p>Se invece hai bisogno di project management più strutturato con reportistica, automazioni o gestione risorse, è meglio orientarsi su alternative più feature-rich come Taiga o OpenProject.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-planka-su-ubuntu-server-26-04-con-docker-compose/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Installazione e Configurazione Base di Vaultwarden su Ubuntu Server 26.04</title>
		<link>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-vaultwarden-su-ubuntu-server-26-04/</link>
					<comments>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-vaultwarden-su-ubuntu-server-26-04/#respond</comments>
		
		<dc:creator><![CDATA[Raffaele Chiatto]]></dc:creator>
		<pubDate>Mon, 27 Jul 2026 06:21:34 +0000</pubDate>
				<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VaultWarden]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[PasswordManager]]></category>
		<category><![CDATA[Waultwarden]]></category>
		<guid isPermaLink="false">https://www.raffaelechiatto.com/?p=1124297</guid>

					<description><![CDATA[&#160; Negli ultimi anni la gestione delle password è diventata un tema centrale per chiunque si occupi di sicurezza informatica, sia in ambito personale che professionale. Tra i tanti password manager disponibili, Bitwarden si è affermato come una delle soluzioni open source più apprezzate, grazie alla sua compatibilità multipiattaforma e alle funzionalità avanzate di condivisione [&#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="" width="679" height="89" 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>Negli ultimi anni la gestione delle password è diventata un tema centrale per chiunque si occupi di sicurezza informatica, sia in ambito personale che professionale.</p>
<p>Tra i tanti password manager disponibili, Bitwarden si è affermato come una delle soluzioni open source più apprezzate, grazie alla sua compatibilità multipiattaforma e alle funzionalità avanzate di condivisione e organizzazione dei dati.</p>
<p>Per chi, come me, preferisce mantenere il pieno controllo dei propri dati attraverso soluzioni self-hosted, Vaultwarden rappresenta l&#8217;alternativa ideale: si tratta di un&#8217;implementazione non ufficiale del server Bitwarden, scritta in Rust, estremamente leggera e perfettamente compatibile con tutti i client ufficiali (estensioni browser, app mobile, desktop).</p>
<p>Questo la rende una scelta particolarmente indicata per ambienti homelab, dove risorse hardware contenute e semplicità di gestione sono priorità assolute.</p>
<p>In questa guida vedremo passo per passo come installare e configurare Vaultwarden su Ubuntu Server 26.04, utilizzando Docker e Docker Compose per un deployment pulito e facilmente riproducibile.</p>
<p>Affronteremo l&#8217;installazione del container, la configurazione delle variabili d&#8217;ambiente essenziali, l&#8217;impostazione di un reverse proxy per l&#8217;accesso sicuro via HTTPS, e la gestione dei certificati in un contesto di laboratorio locale. Al termine della guida avrete un&#8217;istanza di Vaultwarden pienamente funzionante, pronta per essere utilizzata come gestore password centralizzato per la vostra infrastruttura.</p>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTO DEL SISTEMA E PREREQUISITI</strong></h3>
<p>Eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update &amp;&amp; sudo apt upgrade -y

sudo apt install -y ca-certificates curl</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>INSTALLAZIONE DI DOCKER</strong></h3>
<p>Ubuntu 26.04 supporta nativamente il repository ufficiale Docker. Docker CE 29.4.0 supporta Ubuntu 26.04 nativamente dal giorno del rilascio, senza bisogno di workaround o pinning a codename precedenti.</p>
<p>Installare la chiave GPG ufficiale Docker con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">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</pre><p>Confiugurare il repository (formato DEB822) con i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo tee /etc/apt/sources.list.d/docker.sources &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
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF</pre><p>Quindi eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo apt update

sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin</pre><p><strong>NOTA BENE</strong>: se ricevi un 404 sull&#8217;apt update (repository Docker non ancora popolato per resolute), puoi sostituire temporaneamente il codename con noble (Ubuntu 24.04), dato che i pacchetti sono compatibili a livello binario. In tal caso modifica il file docker.sources cambiando Suites: resolute in Suites: noble. Margrop Blog</p>
<p>Verificare l&#8217;installazione con i seguenti comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo systemctl enable --now docker

sudo docker run --rm hello-world</pre><p>Aggiungere il tuo utente al gruppo docker se vuoi eseguire comandi senza sudo con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo usermod -aG docker $USER

newgrp docker</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>STRUTTURA DIRECTORY PER VAULTWARDEN</strong></h3>
<p>Creare le cartelle con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo mkdir -p /opt/vaultwarden/data

cd /opt/vaultwarden</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>CREAZIONE DEL FILE DOCKER-COMPOSE</strong></h3>
<p>Creare il file <strong>docker-compose.yml</strong> con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo nano /opt/vaultwarden/docker-compose.yml</pre><p>Quindi incollare il seguente contenuto:</p><pre class="urvanov-syntax-highlighter-plain-tag">services:
vaultwarden:
image: vaultwarden/server:latest
container_name: vaultwarden
restart: unless-stopped
environment:
DOMAIN: "https://vault.tuodominio.it"
SIGNUPS_ALLOWED: "false" # metti a true solo per il primo utente, poi disattiva
WEBSOCKET_ENABLED: "true"
ADMIN_TOKEN: "GENERA_UN_TOKEN_FORTE_QUI"
LOG_FILE: "/data/vaultwarden.log"
TZ: "Europe/Rome"
volumes:
- /opt/vaultwarden/data:/data
ports:
- "192.168.80.34:8080:80" # bind solo su localhost, esposto poi via NPM</pre><p>Salvare e chiudere il file di configurazione</p>
<p>Generare un <strong>ADMIN_TOKEN</strong> sicuro (per accedere al pannello admin di Vaultwarden) con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">openssl rand -base64 48</pre><p>Incollare il risultato al posto di <strong>GENERA_UN_TOKEN_FORTE_QUI.</strong></p>
<h3></h3>
<h3><strong>AVVIO DEL CONTAINER</strong></h3>
<p>Eseguire i comandi di seguito per avviare il container:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/vaultwarden

sudo docker compose up -d</pre><p>Verificare il container con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker compose logs -f</pre><p>Se è tutto OK dovremmo visualizzare il seguente output:</p><pre class="urvanov-syntax-highlighter-plain-tag">vaultwarden | /--------------------------------------------------------------------\
vaultwarden | | Starting Vaultwarden |
vaultwarden | | Version 1.36.0 |
vaultwarden | |--------------------------------------------------------------------|
vaultwarden | | This is an *unofficial* Bitwarden implementation, DO NOT use the |
vaultwarden | | official channels to report bugs/features, regardless of client. |
vaultwarden | | Send usage/configuration questions or feature requests to: |
vaultwarden | | https://github.com/dani-garcia/vaultwarden/discussions or |
vaultwarden | | https://vaultwarden.discourse.group/ |
vaultwarden | | Report suspected bugs/issues in the software itself at: |
vaultwarden | | https://github.com/dani-garcia/vaultwarden/issues/new |
vaultwarden | \--------------------------------------------------------------------/
vaultwarden |
vaultwarden | [NOTICE] You are using a plain text `ADMIN_TOKEN` which is insecure.
vaultwarden | Please generate a secure Argon2 PHC string by using `vaultwarden hash` or `argon2`.
vaultwarden | See: https://github.com/dani-garcia/vaultwarden/wiki/Enabling-admin-page#secure-the-admin_token
vaultwarden |
vaultwarden | [2026-07-12 00:02:59.873][vaultwarden::auth][INFO] Private key 'data/rsa_key.pem' created correctly
vaultwarden | [2026-07-12 00:02:59.975][start][INFO] Rocket has launched from http://0.0.0.0:80</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>CONFIGURAZIONE REVERSE PROXY (NGINX PROXY MANAGER)</strong></h3>
<p>In questo tutorial utlizzerò come Reverse Proxy NPM</p>
<p>Creare un nuovo Proxy Host con queste info:</p>
<p><strong>Domain</strong>: vault.lab.prv<br />
<strong>Scheme</strong>: http<br />
<strong>Forward Hostname/IP</strong>: IP del server dove gira Vaultwarden<br />
<strong>Forward Port</strong>: 8080<br />
Abilitare <strong>Websockets Support</strong> (fondamentale per la sync in tempo reale)<br />
<strong>Tab SSL</strong>: richiedi certificato Let&#8217;s Encrypt, forza HTTPS.</p>
<p><strong>ATTENZIONE:</strong> Vaultwarden richiede HTTPS per funzionare correttamente con le app client (browser extension, mobile), quindi il certificato non è opzionale.</p>
<p>&nbsp;</p>
<h3><strong>PRIMO ACCESSO TRAMITE WEB GUI E CREAZIONE UTENTE</strong></h3>
<p>Aprire un qualsiasi browser e richiamare <strong>https://vault.lab.prv</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-01.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124299 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-01-1024x419.png" alt="" width="1024" height="419" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-01-980x401.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-01-480x197.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>Crea Account</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-02.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124300 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-02-1024x403.png" alt="" width="1024" height="403" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-02-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-02-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>Inserire l&#8217;<strong>indirizzo email </strong>e il <strong>nome</strong> quindi cliccare <strong>Continua</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-03.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124301 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-03-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-03-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-03-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>Inserire la <strong>Password</strong> quindi cliccare <strong>Create Account</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-04.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124302 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-04-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-04-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-04-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>Installare l&#8217;estensione o cliccare<strong> Più tardi</strong> per installarla in seguito</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-05.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124303 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-05-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-05-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-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<strong> Vai a Bitwarden WEB</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-06.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124304 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-06-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-06-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-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>Se è andato tutto a buon fine dovremmo visualizzare la Dashboard di Vaultwarden come mostrato nell&#8217;immagine sovrastante</p>
<p>Dopo aver creato l&#8217;utente admin disattivare la possibilità di registrare utenti modificando all&#8217;interno del file <strong>docker-compose.yml</strong> il seguente valore:</p><pre class="urvanov-syntax-highlighter-plain-tag">SIGNUPS_ALLOWED: "false"</pre><p>Salvare e chiudere il file YAML</p>
<p>Quindi eseguire il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo docker compose up -d</pre><p>&nbsp;</p>
<h3></h3>
<h3><strong>ACCESSO AL PANNELLO DI AMMINISTRAZIONE</strong></h3>
<p>Raggiungibile su <strong>https://vault.lab.prv/admin </strong>richiede il token generato in precedenza.</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-07.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124306 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-07-1024x402.png" alt="" width="1024" height="402" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-07-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-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>Inserire il <strong>Token</strong> quindi cliccare <strong>Enter</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-08.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124307 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-08-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-08-980x384.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-08-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>Se è tutto OK dovremmo accedere all&#8217;interfaccia <strong>Admin di Vaultwarden</strong></p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-09.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124308 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-09-1024x401.png" alt="" width="1024" height="401" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-09-980x383.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-09-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>Dal tab <strong>Users</strong> è possibile aggiungere gli utenti</p>
<p><a href="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-10.png"><img loading="lazy" decoding="async" class="aligncenter wp-image-1124309 size-large" src="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-10-1024x403.png" alt="" width="1024" height="403" srcset="https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-10-980x385.png 980w, https://www.raffaelechiatto.com/wp-content/uploads/2026/07/install-vaultwarden-ubuntu-10-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>Dal Tab <strong>Diagnostic</strong> è possibile vedere tutte le informazioni relative al server Vault</p>
<p>&nbsp;</p>
<h3><strong>BACKUP</strong></h3>
<p>Il volume <strong>/opt/vaultwarden/data</strong> contiene tutto (database SQLite, attachments, config).</p>
<p>Backup consigliato con il comando:</p><pre class="urvanov-syntax-highlighter-plain-tag">sudo tar czf vaultwarden-backup-$(date +%F).tar.gz /opt/vaultwarden/data</pre><p>Puoi integrarlo facilmente nel tuo stack Veeam/backup esistentem o schedularlo con un cron job verso il NAS.</p>
<p>&nbsp;</p>
<h3><strong>AGGIORNAMENTI DI VAULTWARDEN</strong></h3>
<p>Per eseguire gli aggiornamenti di VaultWarden eseguire i comandi:</p><pre class="urvanov-syntax-highlighter-plain-tag">cd /opt/vaultwarden

sudo docker compose pull

sudo docker compose up -d</pre><p>&nbsp;</p>
<p>&nbsp;</p>
<h3><strong>FUNZIONALITA&#8217; PRINCIPALI</strong></h3>
<h4></h4>
<h4><strong>Gestione password e vault</strong></h4>
<ul>
<li>Password, note sicure, identità, carte di credito</li>
<li>Cartelle e organizzazione vault</li>
<li>Generatore di password/passphrase integrato</li>
<li>Ricerca full-text nel vault</li>
<li>Allegati ai singoli item (es. PDF, chiavi SSH)</li>
</ul>
<h4></h4>
<h4><strong>Sincronizzazione multi-dispositivo</strong></h4>
<ul>
<li>Estensioni browser (Chrome, Firefox, Edge, Safari, Brave)</li>
<li>App mobile (iOS/Android)</li>
<li>App desktop (Windows/Mac/Linux)</li>
<li>CLI ufficiale Bitwarden</li>
<li>Sync in tempo reale via WebSocket (quello che abbiamo abilitato con WEBSOCKET_ENABLED)</li>
</ul>
<h4></h4>
<h4><strong>Organizzazioni e condivisione (gratis su Vaultwarden, a pagamento su Bitwarden ufficiale)</strong></h4>
<ul>
<li>Creazione organizzazioni multiple</li>
<li>Condivisione password tra utenti/gruppi</li>
<li>Collections con permessi granulari</li>
<li>Questo è uno dei motivi principali per cui la gente sceglie Vaultwarden: su Bitwarden cloud le organizzazioni richiedono piano a pagamento, qui sono gratuite</li>
</ul>
<h4></h4>
<h4><strong>Autenticazione a due fattori (2FA)</strong></h4>
<ul>
<li>TOTP (Google Authenticator, Authy, ecc.)</li>
<li>WebAuthn/FIDO2 (chiavi hardware tipo YubiKey)</li>
<li>Duo (con configurazione aggiuntiva)</li>
<li>Email 2FA</li>
<li>Yubikey OTP</li>
</ul>
<h4></h4>
<h4><strong>Bitwarden Send</strong></h4>
<ul>
<li>Condivisione sicura e temporanea di testo/file con link, scadenza automatica, password opzionale</li>
</ul>
<h4></h4>
<h4><strong>Pannello admin (/admin)</strong></h4>
<ul>
<li>Gestione utenti (creazione, disabilitazione, eliminazione)</li>
<li>Statistiche generali istanza</li>
<li>Configurazione SMTP per invii email (inviti, reset password)</li>
<li>Diagnostica (test connessione, versione, ecc.)</li>
<li>Backup/export diagnostica</li>
</ul>
<h4></h4>
<h4><strong>Import/Export</strong></h4>
<ul>
<li>Import da centinaia di altri password manager (LastPass, 1Password, KeePass, Chrome, ecc.)</li>
<li>Export in formati cifrati o JSON/CSV</li>
</ul>
<h4></h4>
<h4><strong>Emergency Access</strong></h4>
<ul>
<li>Designazione di un contatto di emergenza che può richiedere accesso al vault dopo un periodo di attesa configurabile</li>
</ul>
<h3></h3>
<h3><strong>PRO E CONTRO</strong></h3>
<h4></h4>
<h4><strong>PRO</strong></h4>
<ul>
<li><strong>Leggerissimo</strong>: Un singolo binario Rust, consumo RAM/CPU minimo — perfetto per homelab, gira bene anche su Raspberry Pi</li>
<li><strong>Compatibilità client al 100%</strong>: Usa le stesse app/estensioni ufficiali Bitwarden, nessuna app custom da installareù</li>
<li><strong>Funzionalità premium gratis</strong>: Organizzazioni, 2FA avanzato, Send: tutto ciò che su Bitwarden cloud richiede abbonamento qui è gratuito</li>
<li><strong>Self-hosted</strong>: controllo totale datiNessun dato transita su server terzi, importante per compliance/privacy</li>
<li><strong>Community attiva</strong>: Sviluppo costante, rilasci frequenti, ben documentato</li>
<li><strong>Facile da backuppare</strong>: Tutto in un volume/cartella (SQLite di default), backup semplice da integrare in Veeam o script cron</li>
<li><strong>Basso attack surface</strong>: Codice compatto rispetto al server ufficiale Bitwarden (che è containerizzato in decine di microservizi via bitwarden/self-host)</li>
</ul>
<h4></h4>
<h4><strong>CONTRO</strong></h4>
<ul>
<li><strong>Non ufficiale/non supportato da Bitwarden Inc</strong>.: Se qualcosa si rompe, supporto solo community (GitHub issues, Discord), nessun SLA</li>
<li><strong>Rischio di rottura compatibilità</strong>: Bitwarden Inc. può cambiare API client senza preavviso; Vaultwarden deve rincorrere gli aggiornamenti a volte con ritardo di giorni/settimane</li>
<li><strong>SQLite come DB di default:</strong> Va benissimo per uso personale/piccolo team, ma non scala bene per centinaia di utenti simultanei (puoi comunque passare a MySQL/PostgreSQL se serve)</li>
<li><strong>Nessuna interfaccia &#8220;enterprise&#8221;</strong>: Manca SSO/SAML nativo enterprise-grade (esiste supporto limitato, non paragonabile a Bitwarden Enterprise)</li>
<li><strong>Responsabilità di gestione tutta tua</strong>: Backup, certificati, aggiornamenti, sicurezza del server: nessuno lo fa per te (a differenza di Bitwarden cloud)</li>
<li><strong>Alcune funzionalità arrivano in ritardo</strong>: Feature nuove lato client Bitwarden a volte non sono supportate lato server finché la community non le implementa</li>
<li><strong>Termini di servizio &#8220;grigi&#8221;</strong>: Bitwarden Inc. non garantisce che i client ufficiali continueranno a funzionare con implementazioni terze in futuro (per ora nessun blocco, ma è un rischio teorico da tenere presente)</li>
<li><strong>Single point of failure</strong>: Se il tuo server va giù, perdi accesso al vault (mitigabile con backup + export periodici offline)</li>
</ul>
<p>&nbsp;</p>
<h3></h3>
<h3><strong>CONSIDERAZIONI FINALI</strong></h3>
<ul>
<li><strong>Per uso personale/homelab</strong>: scelta quasi obbligata, SQLite basta e avanza</li>
<li><strong>Se in futuro pensi di offrirlo a clienti come servizio gestito</strong>: valuta il passaggio a PostgreSQL come backend (più robusto per multi-tenant) e assicurati SLA chiari con i clienti sul fatto che non è supporto ufficiale Bitwarden</li>
<li><strong>Backup</strong>: essendo SQLite, è un singolo file perfetto per backup incrementali veloci, ma verifica sempre la consistenza (evita backup &#8220;a caldo&#8221; senza dump, meglio uno stop breve o sqlite3 .backup)</li>
</ul>
]]></content:encoded>
					
					<wfw:commentRss>https://www.raffaelechiatto.com/installazione-e-configurazione-base-di-vaultwarden-su-ubuntu-server-26-04/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
	</channel>
</rss>