Streaming è Rotto III: Le Fondamenta (OS, Docker e “Giorno Uno”)
Ora che abbiamo il nostro hardware, possiamo iniziare con la configurazione di sistema del nostro server. Il MiniPC che ho comprato aveva Windows preinstallato. È anche possibile usare il sistema Microsoft per quello che vogliamo, ma è uno spreco ridicolo di prestazioni ed energia.
Un Home Server robusto non è un computer desktop che rimane acceso tutto il giorno: è un sistema dedicato. Costruiremo le fondamenta software da zero, trasformando il mini PC in un’infrastruttura di livello enterprise, pronta a funzionare 24/7 senza intervento umano.
Scegliere e Configurare il Sistema Operativo
Ma… perché non Windows? Windows consuma circa 2GB a 4GB di RAM solo per esistere e far girare la sua interfaccia grafica. Sul nostro N100, questo è uno spreco, come ho detto, è buttare le prestazioni nella spazzatura. Inoltre, Docker su Windows (via WSL2) aggiunge un livello di virtualizzazione che può impattare le prestazioni I/O e di rete.
Non usare Windows. Dimentica questa schifezza.
Qui possiamo usare qualsiasi Linux… senza interfaccia. Un server non ha bisogno di un mouse, finestre o sfondi.
Installeremo Ubuntu Server senza interfaccia grafica. Il server sarà controllato al 100% via terminale (SSH) dal tuo PC principale. Questo garantisce che ogni ciclo di CPU e megabyte di RAM sia dedicato a ciò che conta: i tuoi servizi.
Naturalmente, installare Ubuntu da zero aggiungerà alcuni livelli di complessità (non troppi). Aggiornare repository, installare dipendenze, configurare permessi utente, modificare file di sistema… È lì che le cose possono andare storte e apparire errori che ti costano cari mesi dopo.
Per questo, ho creato un piccolo script che automatizzerà tutte queste configurazioni iniziali. Il codice è autoesplicativo.
#!/bin/bash
if [ "$EUID" -ne 0 ]; then
echo "Please run as root (sudo ./install.sh)"
exit 1
fi
REAL_USER=$SUDO_USER
if [ -z "$REAL_USER" ]; then
echo "Could not detect sudo user. Exiting."
exit 1
fi
USER_UID=$(id -u $REAL_USER)
USER_GID=$(id -g $REAL_USER)
USER_HOME=$(getent passwd $REAL_USER | cut -d: -f6)
BASE_DIR="$USER_HOME/EmuleVision"
echo "Starting installation for user: $REAL_USER"
echo "Base Directory: $BASE_DIR"
apt update && apt upgrade -y
apt install -y curl gnupg ca-certificates lsb-release cifs-utils samba vim git net-tools intel-media-va-driver-non-free libmfx1 vainfo
if ! command -v docker &> /dev/null; then
mkdir -p /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
usermod -aG docker $REAL_USER
fi
usermod -aG render $REAL_USER
usermod -aG video $REAL_USER
mkdir -p $BASE_DIR/{downloads/torrents,media/{movies,tv,manga},books}
mkdir -p $BASE_DIR/Settings/{Qbittorrent,Prowlarr,Sonarr,Radarr,Jellyfin,Gluetun,Portainer,Homepage,Scrutiny,AdGuard,Kaizoku,Kavita,CalibreWeb,Filebrowser}
chown -R $REAL_USER:$REAL_USER $BASE_DIR
chmod -R 775 $BASE_DIR
cat <<EOF >> /etc/sysctl.conf
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1
EOF
sysctl -p
sed -r -i.orig 's/#?DNSStubListener=yes/DNSStubListener=no/g' /etc/systemd/resolved.conf
sed -r -i 's/#?DNS=/DNS=1.1.1.1 8.8.8.8/g' /etc/systemd/resolved.conf
rm -f /etc/resolv.conf
ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
systemctl restart systemd-resolved
cat <<EOF >> /etc/samba/smb.conf
[EmuleVision]
path = $BASE_DIR
writeable = yes
guest ok = no
create mask = 0775
directory mask = 0775
valid users = $REAL_USER
force user = $REAL_USER
EOF
echo "Set SMB password for $REAL_USER:"
smbpasswd -a $REAL_USER
systemctl restart smbd
TZ=$(timedatectl show -p Timezone --value)
cat <<EOF > $BASE_DIR/.env
PUID=$USER_UID
PGID=$USER_GID
TZ=$TZ
VPN_USER=vpn_username_here
VPN_PASS=vpn_password_here
EOF
chown $REAL_USER:$REAL_USER $BASE_DIR/.env
echo "Installation complete."
echo "1. Edit $BASE_DIR/.env with your VPN credentials."
echo "2. Place your docker-compose.yml in $BASE_DIR."
echo "3. Reboot the system."
Cosa fa lo script?
Docker nativo. Installa il Docker Engine direttamente dalla fonte ufficiale, garantendo la versione più recente e sicura, senza affidarsi ai pacchetti obsoleti della distribuzione. Provare a farlo su Windows con WSL è chiedersi un mal di testa.
Driver Intel QuickSync. Ubuntu Server viene con driver generici, che influenzeranno direttamente le prestazioni del nostro N100 per la transcodifica video. Lo script installa
intel-media-va-driver-non-freee configura i permessi di rendering (grupporender), assicurando che Jellyfin abbia accesso diretto all’hardware.Rimozione IPv6. Più avanti mi concentrerò specificamente sulla parte di sicurezza, dato che nel mio caso ho scelto di proteggere il mio homeserver con una VPN. Questo è opzionale, ma garantisce la privacy del tuo server, specialmente se prevedi di “acquisire” film o serie via metodi alternativi. Lo script disabilita IPv6 direttamente nel Kernel Linux (
sysctl.conf). In questo modo, né Docker, né la VPN, né qBittorrent possono usare IPv6, eliminando fisicamente la possibilità di una fuga. Ricorda, le fughe di IP via IPv6 sono il fallimento di sicurezza numero uno nelle VPN domestiche.Creazione di Cartelle e Struttura Iniziale. Lo script crea l’albero delle directory
/data/mediae/data/downloadscon i permessi utente corretti (PUID/PGID). Se questo viene fatto male ora, gli Hardlink (copie istantanee senza duplicare spazio) falliranno. Parleremo di più di questo tipo di copia nel prossimo post.
Con questo, il nostro server è pronto, sicuro e ottimizzato in 2 minuti!

PS: Ho chiamato questo progetto EmuleVision. Cambialo come vuoi.
Configurare un IP Statico (Il Modo Giusto)
Il nostro server ha bisogno di un IP Statico, questo è ovvio. Se l’IP continua a cambiare ad ogni riavvio, la nostra televisione perderà il riferimento al nostro server ad ogni cambio di IP fatto dal DHCP del router. Ci sono due modi per farlo: il modo sbagliato e il modo giusto.
Il modo sbagliato. Impostare un IP statico solo sul sistema operativo. Fondamentalmente, questo significherebbe configurare l’IP statico all’interno del file di rete di Ubuntu (netplan). Questo funziona bene finché non cambi router o porti il tuo server in un’altra casa. Allora dovrai collegare una tastiera e un HDMI per riconfigurarlo manualmente. Ricorda: non vogliamo un’interfaccia grafica sul nostro server.
Il modo giusto. Cambiamo la configurazione di Riserva DHCP/Static Lease direttamente sul router, senza toccare il nostro sistema operativo. Configuriamo il router per assegnare sempre lo stesso IP (es. 192.168.1.50) all’indirizzo MAC del server. In questo modo il server rimane in modalità “Automatica” (DHCP). Se cambi rete, prende un nuovo IP e funziona immediatamente. La gestione è centralizzata sul router.
Per Riassumere
Dopo l’installazione fisica (solo cavi di alimentazione e rete) e il sistema operativo, il flusso di lavoro è chirurgico:
Accedi al router e scopri l’IP che il server ha ottenuto. Con questo, identifichiamo l’indirizzo MAC del nostro MiniPC.
Assegna un IP statico (o un altro che vuoi) sul router (Static Lease).
Accedi via SSH (
ssh utente@ip) dal tuo computer principale.Esegui lo script
install.sh.Riavvia per applicare i blocchi del Kernel e i Driver.
Nel prossimo post, tratteremo la privacy e la sicurezza del server. È opzionale, ma come si dice, ogni cane conosce la propria coda. In altre parole, proteggi il tuo server!
