Trasforma un Mini PC in un Server sicuro e professionale con Ubuntu, Docker e Traefik

Guida completa per configurare un server domestico con Ubuntu, dai requisiti hardware alla creazione di account Tailscale e Cloudflare, installazione di Docker, gestione sicura del traffico Web con Traefik e certificati HTTPS automatici, fino al monitoraggio dei servizi.

Stai cercando di trasformare un PC in un vero e proprio home server per gestire servizi, backup e applicazioni in totale autonomia? Vuoi scoprire come rendere i tuoi dati sicuri, accessibili da remoto e organizzati con efficienza, senza spendere una fortuna? Vediamo come configurare un server domestico con Ubuntu: dai componenti hardware essenziali fino alla gestione di container Docker, traffico Web sicuro con Traefik e monitoraggio automatico dei servizi.

Di seguito proponiamo una soluzione efficace e a costo (quasi) zero, facile da implementare. Ovviamente esistono molteplici soluzioni alternative, altrettanto valide o addirittura migliori. L’utilizzo di uno strumento o dell’altro dipende dalle esigenze specifiche di ciascun utente.

Prima di cominciare, diamo per scontato di possedere un nome di dominio utilizzabile liberamente per configurare uno o più terzi livelli. Punteremo il terzo livello server.miodominio.tld al server domestico con Ubuntu.

La scelta dell’hardware per creare un Server sicuro

Per un home server affidabile, il primo passo consiste ovviamente nella scelta dell’hardware. Si possono ovviamente valutare diverse opzioni ma l’acquisto di un Mini PC con 32 GB di RAM e almeno un’unità SSD da 500 GB (meglio 1 TB o più a seconda degli utilizzi) è un ottimo punto di partenza. Questi dispositivi combinano compattezza, performance, sono generalmente molto silenziosi (pensate a un sistema che deve rimanere accesso 24/7) e compatibili con Ubuntu Server.

Se si dispone di un router per il collegamento alla rete Internet e si padroneggia bene la configurazione del server DHCP, si è già a buon punto.

Per iniziare, è bene annotare la configurazione del server DHCP e verificare l’intervallo di assegnazione degli indirizzi IP privati. Va selezionato un indirizzo IP non assegnato manualmente a nessun altro dispositivo connesso in rete locale.

Creazione degli account

Prima di installare qualsiasi applicazione sul Mini PC, è opportuno creare due account gratuiti:

Entrambi offrono piani gratuiti che si adattano perfettamente a un ambiente domestico di self-hosting.

Installazione di Ubuntu Server e assegnazione dell’IP statico

Dopo aver installato Ubuntu Server LTS (Long Term Support) sul Mini PC (download), si deve assegnare alla macchina l’indirizzo IP statico selezionato in precedenza, in maniera tale che all’interno della rete locale il dispositivo risponda sempre al medesimo indirizzo. Sul server Ubuntu, i passi principali sono i seguenti.

Assegnazione di un indirizzo IP statico

Si può digitare ip addr per verificare il nome esatto dell’interfaccia di rete da configurare. Supponendo che il file di configurazione Netplan sia il seguente, si può digitare quanto segue:

sudo nano /etc/netplan/01-netcfg.yaml

Supponiamo di voler assegnare all’interfaccia ens33 l’indirizzo IP statico 192.168.1.100 con gateway 192.168.1.1 e DNS 8.8.8.8. Il file dovrebbe essere simile a questo:

network:
  version: 2
  ethernets:
    ens33:
      dhcp4: no
      addresses:
        - 192.168.1.100/24
      gateway4: 192.168.1.1
      nameservers:
        addresses:
          - 8.8.8.8
          - 8.8.4.4

Attenzione: in YAML l’indentazione è fondamentale (è necessario usare la barra spaziatrice, non il tasto TAB).

Dopo aver salvato le modifiche (CTRL+O, CTRL+X), si può digitare il comando seguente per applicare le modifiche:

sudo netplan apply

Aggiornamento del sistema

sudo apt update && sudo apt upgrade -y

Installazione di Docker

curl -sSL https://get.docker.com | sh
sudo usermod -aG docker $USER
newgrp docker
sudo systemctl enable docker
sudo systemctl start docker
docker version

Installazione del client Tailscale

Per connettere il server alla VPN Tailscale, è sufficiente scaricare e installare l’apposito client per Linux.

La procedura si riduce all’utilizzo del seguente comando, documentato nell’area download di Tailscale:

curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale up

Aprendo nel browser l’indirizzo specificato nel comando curl, si può verificare puntualmente la lista di operazioni eseguite automaticamente dallo script.

Concluse queste operazioni iniziali, il server Mini PC è pronto per eseguire container e gestire applicazioni in modo isolato e sicuro.

Configurazione di Cloudflare

Posto di aver già collegato con Cloudflare la gestione del nome di dominio miodominio.tld, accediamo al panello di gestione DNS Cloudflare.

Qui creiamo un record DNS di tipo A per ogni sottodominio da usare. Un record A associa un nome di dominio (es. server.miodominio.tld) a un indirizzo IP specifico. In questo caso, l’IP da specificare è quello assegnato dalla VPN Tailscale al server Ubuntu. Quando qualcuno prova a raggiungere un sottodominio, la richiesta è instradata verso il server remoto tramite VPN.

Dopo aver configurato i record DNS, il server può essere raggiunto in modo sicuro usando Tailscale, anche da dispositivi esterni alla rete locale.

Quando si associa un record A del dominio all’IP di un dispositivo Tailscale, si sta puntando un sottodominio all’IP della VPN privata Tailscale. Funziona solo se il client che prova a connettersi fa parte della rete Tailscale. In altre parole, il server non è realmente esposto al pubblico: chiunque su Internet che non è nella VPN non può accedere al server.

Non si sta certo aprendo il server a chiunque, ma si sta comunque esponendo il DNS a un IP che appartiene alla nostra rete privata VPN.

Come nota finale, bisogna comunque controllare che l’IP indicato in Cloudflare sia statico all’interno della rete Tailscale.

Gestione del traffico in sicurezza con Traefik e Cloudflare

Traefik è un reverse proxy che consente di instradare il traffico verso i container Docker senza usare porte esposte al pubblico. Con Traefik, ogni servizio può avere un proprio sottodominio e certificati HTTPS erogati e gestiti automaticamente da Cloudflare. Per prima cosa è bene creare manualmente la rete traefik_default:

docker network create traefik_default

Creiamo quindi le cartelle necessarie:

cd ~
mkdir -p homeserver
cd homeserver

mkdir -p traefik/acme

mkdir -p apps/core

Erogazione del servizio via HTTPS

Per garantire che tutti i servizi del server domestico siano accessibili in modo sicuro, è fondamentale servirli tramite HTTPS. Per gestire i certificati TLS in modo automatico e centralizzato, si può ricorrere ancora una volta a Traefik in combinazione con il certificate resolver di Cloudflare.

Il processo inizia generando un API token in Cloudflare, necessario affinché Traefik possa richiedere, rinnovare e gestire i certificati TLS senza alcun intervento manuale.

La configurazione del container Traefik riportata di seguito include la specifica di un entrypoint sicuro websecure, abilitando TLS e indicando l’utilizzo del resolver DNS di Cloudflare. In particolare, Traefik è configurato per generare certificati validi per tutti i sottodomini di un dominio principale (*.miodominio.tld) tramite il meccanismo del DNS challenge, che garantisce la validità dei certificati anche senza esporre direttamente le porte HTTP/HTTPS all’esterno.

Il container Traefik legge l’API token di Cloudflare attraverso una variabile d’ambiente (CLOUDFLARE_DNS_API_TOKEN) e salva tutte le informazioni dei certificati in un file di storage interno (miodominio.json), permettendo il rinnovo automatico e sicuro dei certificati.

Grazie a questa configurazione, ogni servizio esposto tramite Traefik può essere raggiunto tramite sottodomini HTTPS, combinando sicurezza, automazione e facilità di gestione, senza la necessità di configurazioni complesse o rinnovi manuali.

Digitiamo nano ./traefik/docker-compose.yml e incolliamo il file di configurazione Docker per Traefik:

services:
  traefik:
    image: traefik:v3.2
    container_name: traefik
    # Container riavviato automaticamente se si arresta o se il server si riavvia
    restart: unless-stopped
    # Concede privilegi elevati al container, necessario per alcune operazioni interne di Traefik
    privileged: true
    command:
      # Abilita TLS sull’entrypoint 'websecure', cioè il traffico HTTPS
      - --entrypoints.websecure.http.tls=true
      # Indica a Traefik di usare il resolver 'dns-cloudflare' per ottenere i certificati TLS
      - --entrypoints.websecure.http.tls.certResolver=dns-cloudflare
      # Specifica che il certificato TLS generato deve coprire tutti i sottodomini
      - --entrypoints.websecure.http.tls.domains[0].sans=*.miodominio.tld
       # Abilita il DNS Challenge per ACME, metodo utilizzato per dimostrare la proprietà del dominio
      - --certificatesresolvers.dns-cloudflare.acme.dnschallenge=true
      # Specifica che il provider DNS per il challenge è Cloudflare
      - --certificatesresolvers.dns-cloudflare.acme.dnschallenge.provider=cloudflare
      # Imposta un ritardo di 10 secondi prima che Traefik verifichi la propagazione del record DNS
      - --certificatesresolvers.dns-cloudflare.acme.dnschallenge.delayBeforeCheck=10
      # Specifica dove salvare i certificati ACME ottenuti (file persistente)
      - --certificatesresolvers.dns-cloudflare.acme.storage=acme/miodominio.json
    environment:
      - CLOUDFLARE_DNS_API_TOKEN=${CLOUDFLARE_DNS_API_TOKEN}
networks:
  default:
    external:
      name: traefik_default

Alla fine, usiamo le combinazioni di tasti CTRL+O, CTRL+X per salvare le modifiche e chiudere l’editor di testo.

Digitando quanto segue, si avvia il container principale di Traefik:

cd ./traefik
docker compose up -d

Avvio del container applicativo

Il file seguente definisce un container core che esegue l’immagine Docker indicata. Le label con traefik.* istruiscono Traefik su come gestire il traffico verso il container. La rete traefik_default è dichiarata come esterna: come spiegato ai paragrafi precedenti, Traefik deve già esistere ed essere collegato a quella rete affinché il routing funzioni.

services:
  core:
    image: ghcr.io/immagine-docker-da-caricare
    restart: unless-stopped
    ports:
      - 8080:8080
    labels:
      - traefik.enable=true
      - traefik.http.routers.app-name.rule=Host(`server.miodominio.tld`)
    networks:
      - traefik_default
networks:
  traefik_default:
    external: true

Al posto di ghcr.io/immagine-docker-da-caricare, si deve aver cura di indicare il nome dell’immagine Docker reale dell’applicazione che si desidera caricare nel container. E ovviamente, server.miodominio.tld deve essere sostituito con il terzo livello corretto.

Il file deve essere salvato come docker-compose.yml all’interno della cartella ./apps/core. Dall’interno di questa directory, si può eseguire il comando docker compose up -d per avviare il container. Grazie alle label, Traefik rileva automaticamente il container e instrada tutto il traffico diretto al sottodominio verso il container stesso.

Non è necessario esporre porte esterne (l’indicazione 8080:8080 serve solo per test locali) perché Traefik gestisce il routing interno tramite la rete Docker.

Note finali

Per ridurre al minimo i rischi legati all’esposizione diretta del server su Internet, è possibile integrare i Tunnel Cloudflare insieme a Traefik e Tailscale. I tunnel consentono di rendere accessibili i servizi pubblici senza aprire porte sul router o esporre direttamente l’indirizzo IP del server, aumentando significativamente la sicurezza della rete domestica. Questa configurazione, combinata con certificati TLS gestiti automaticamente da Traefik, garantisce che tutto il traffico Web sia cifrato e instradato in modo sicuro.

I Cloudflare Tunnels permettono di:

  • Rendere alcuni servizi pubblicamente accessibili senza esporre il server direttamente su Internet.
  • Far passare tutto il traffico tramite i server di Cloudflare, che fungono da reverse proxy sicuro.
  • Usare HTTPS automatico senza dover aprire porte sul router o configurare NAT/port forwarding.
  • Applicare regole di accesso aggiuntive tramite Cloudflare Zero Trust (es. autenticazione a due fattori, restrizioni IP, ecc.).

Dal punto di vista operativo, è altrettanto importante implementare un sistema di monitoraggio e notifica. Strumenti come Uptime Kuma permettono di rilevare immediatamente eventuali interruzioni dei servizi, mentre servizi di notifica self-hosted come ntfy.sh consentono di ricevere alert automatici su backup, aggiornamenti dei container o anomalie nei progetti in corso.

Ancora WUD (What’s Up Docker?) consente di ottenere notifiche automatiche su aggiornamenti delle immagini Docker mentre si può valutare l’adozione di Komodo per gestire la configurazione, la gestione e gli aggiornamenti dei vari container Docker.

Questo articolo contiene link di affiliazione: acquisti o ordini effettuati tramite tali link permetteranno al nostro sito di ricevere una commissione nel rispetto del codice etico. Le offerte potrebbero subire variazioni di prezzo dopo la pubblicazione.

Ti consigliamo anche

Link copiato negli appunti