Lo Streaming è Rotto VI: Lo Stack Completo
Basta tergiversare, giusto?
Scherzi a parte, considero i post precedenti di questa serie estremamente importanti. Ognuno copre un pezzo critico:
- Streaming is Broken II: Choosing Hardware. Dove abbiamo imparato a configurare un homeserver a basso costo con i miei due centesimi sullo storage.
- Streaming is Broken III: The Foundation (OS, Docker, and “Day One”). Dove abbiamo configurato il nostro OS, Docker e preparato il terreno per ciò che sarebbe venuto dopo.
- Streaming is Broken IV: The Fortress: VPN and Gluetun. Un capitolo che normalmente non troverai in altri tutorial, focalizzato su sicurezza e privacy.
- Streaming is Broken V: Hardlinks and Permissions. Consigli per evitare futuri mal di testa nelle nostre configurazioni.
Ma se dovessi scegliere un solo post per spiegare come configurare un homeserver, sarebbe questo.
Senza ulteriori indugi, cominciamo.
Lo Stack Multimediale
qBittorrent
Come ho detto nei post precedenti, la pirateria è il crimine peggiore al mondo, amo le aziende che offrono servizi scadenti e mi piace pagare di più per ottenere meno. Ovviamente, per motivi legali, lo dico.

Ora, parlando seriamente, il flusso del nostro home media server sarà il seguente:
- Cercheremo film e serie in Overseerr (tutto sarà spiegato più avanti)
- Overseerr invierà le richieste a Radarr (Film) e Sonarr (Serie)
- Radarr e Sonarr cercheranno il materiale sui siti indicizzati da Prowlarr, la cui unica funzione sarà gestire questi indexer
- qBittorrent scaricherà il file. Radarr e Sonarr identificheranno automaticamente il file e sposteranno il download nelle loro cartelle
- Jellyfin sarà la nostra app di streaming sulla TV, iPad, computer, ecc. È dove guarderemo il contenuto acquisito
Con questo in mente, iniziamo con il primo elemento da configurare nella nostra lista: il downloader.
Nel nostro docker compose, avremo qualcosa del genere:
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- WEBUI_PORT=8080
volumes:
- /home/donkey/EmuleVision/Settings/Qbittorrent:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
Qui, come ho spiegato nel mio post sulla sicurezza, qBittorrent sarà protetto tramite VPN, e Gluetun sarà quello che protegge il nostro container. Nel mio caso, connesso a un servizio VPN a pagamento (ha integrazioni con NordVPN, Surfshark, ecc.). Dato che stiamo parlando di scaricare file multimediali, dimenticate le VPN gratuite: oltre ad essere limitate per ovvie ragioni, sono estremamente insicure.
È importante chiarire che per evitare perdite di IP, qBittorrent dipenderà assolutamente dal fatto che Gluetun sia funzionante. Se la VPN cade, qBittorrent si fermerà automaticamente. Questa è la bellezza del depends_on con condition: service_healthy. Il container non si avvierà nemmeno se Gluetun non è pronto.
In questo caso e andando avanti, configureremo permessi e fuso orario (PUID, PGID e TZ) allo stesso modo. Per questo, create un file .env per questi parametri.
Esempio fittizio:
PUID=1000
PGID=1000
TZ=Etc/UTC
Per configurare l’applicazione stessa, non reinventerò la ruota. Collegherò il tutorial TRaSH Guides corrispondente per ogni tecnologia:
- Basic-Setup - Configurazione di base delle impostazioni più comuni.
- Paths - Dove impostare la root location dei download.
- How to add Categories - Come impostare le categorie per qBittorrent e come gestire e organizzare i tuoi torrent in gruppi. Le app Starr possono usare le categorie in qBittorrent per tenere traccia dei download da monitorare, invece di guardare ogni torrent nel tuo client.
- Port forwarding - Dove nel tuo download client dovresti aggiungere la porta che hai inoltrato con il tuo servizio VPN.
Prowlarr: Il Gestore degli Indexer
Prowlarr è l’eroe non celebrato di questo stack. È l’intermediario che collega il tuo Radarr e Sonarr agli indexer di torrent. Pensalo come un centralinista degli anni ‘50, tranne che invece di collegare chiamate telefoniche, collega le tue richieste di download ai siti di torrent.
prowlarr:
image: ghcr.io/hotio/prowlarr:latest
container_name: prowlarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Prowlarr:/config
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped

Notate lo schema qui? Anche questo è dietro Gluetun. Tutto ciò che tocca la rete pubblica per “metodi di acquisizione alternativi” rimane dietro la VPN. Nessuna eccezione.
La configurazione di Prowlarr è semplice:
- Aggiungi i tuoi indexer (tracker pubblici o privati)
- Collegalo a Radarr e Sonarr tramite chiavi API
- Lascia che si sincronizzi automaticamente
La bellezza è che configuri gli indexer una volta in Prowlarr, e si propagano a tutte le tue app Arr. Niente più copia e incolla di URL di tracker in cinque interfacce diverse.
Per la configurazione dettagliata, consulta TRaSH Guides - Prowlarr.
FlareSolverr: Il Bypass di Cloudflare
Alcuni indexer si proteggono con le misure anti-bot di Cloudflare. FlareSolverr è un browser headless che risolve automaticamente queste sfide.
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
Lo configuri una volta sola in Prowlarr, e lui gestisce il resto. Quando Prowlarr accede a un sito protetto da Cloudflare, FlareSolverr interviene, risolve la sfida e restituisce i risultati. È come avere un avvocato robot specializzato nel superare i buttafuori. La guida è qui
Sonarr: Il Gestore di Serie TV
Sonarr è dove avviene la magia per le serie TV. Monitora la tua “lista da guardare”, cerca nuovi episodi tramite Prowlarr, li invia a qBittorrent e organizza tutto automaticamente.
sonarr:
image: ghcr.io/linuxserver/sonarr:latest
container_name: sonarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Sonarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped

Punti chiave della configurazione:
- Cartelle Radice: Impostata su
/data/media/tv - Client di Download: Puntare a qBittorrent su
localhost:8080(ricorda, condividono lo stesso stack di rete tramite Gluetun) - Profili di Qualità: Usa le Impostazioni di Qualità delle TRaSH Guides per evitare di scaricare release di qualità scadente
Sonarr automaticamente:
- Cerca nuovi episodi quando vengono trasmessi
- Aggiorna episodi esistenti se compaiono versioni di qualità migliore
- Rinomina i file secondo lo schema di denominazione preferito
- Sposta i download completati nella tua libreria multimediale usando Hardlink (ricordi quel post?)
Radarr: Il Gestore di Film
Radarr è il fratello di Sonarr, ma per i film. Stessa logica, tipo di contenuto diverso.
radarr:
image: ghcr.io/linuxserver/radarr:latest
container_name: radarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Radarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped

La configurazione rispecchia Sonarr:
- Cartella Radice:
/data/media/movies - Client di Download: qBittorrent su
localhost:8080 - Profili di Qualità: TRaSH Guides per Radarr
La differenza è il tipo di contenuto. Radarr tiene traccia di singoli film invece di serie/stagioni/episodi. Si integra anche perfettamente con servizi come le liste Trakt o IMDb se vuoi automatizzare l’aggiunta di film alla tua collezione.
Bazarr: Lo Specialista dei Sottotitoli
Ricordi quando mi lamentavo della qualità scadente dei sottotitoli di Netflix nel primo post? Bazarr risolve quello.
bazarr:
image: ghcr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/media/movies:/movies
- /home/donkey/EmuleVision/media/tv:/tv
- /home/donkey/EmuleVision/Settings/Bazarr:/config
depends_on:
gluetun:
condition: service_healthy

Bazarr automaticamente:
- Scarica sottotitoli per i tuoi film e serie
- Supporta più lingue
- Si sincronizza con OpenSubtitles, Subscene e altri provider
- Può persino aggiornare sottotitoli esistenti se compaiono versioni migliori
La configurazione è semplice: collegalo a Sonarr e Radarr tramite chiavi API, seleziona le lingue e i provider preferiti e lascialo funzionare. Il tuo thriller polacco avrà finalmente sottotitoli in inglese comprensibili.
Kaizoku: Il Downloader di Manga
Per coloro che consumano più di semplici film e serie, Kaizoku gestisce l’acquisizione di manga.
kaizoku:
image: ghcr.io/oae/kaizoku:latest
container_name: kaizoku
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- KAIZOKU_PORT=3002
volumes:
- /home/donkey/EmuleVision/Settings/Kaizoku:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
Tiene traccia delle serie di manga, scarica automaticamente nuovi capitoli e li organizza per il tuo piacere di lettura. Pensalo come Sonarr, ma per i fumetti.
Overseerr: Il Gestore delle Richieste
Questo è il componente rivolto all’utente. Overseerr è ciò con cui interagiscono i tuoi familiari quando vogliono guardare qualcosa.
overseerr:
image: lscr.io/linuxserver/overseerr:latest
container_name: overseerr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
ports:
- "5055:5055"
volumes:
- /home/donkey/EmuleVision/Settings/Overseerr:/config
restart: unless-stopped

Noti qualcosa di diverso? Niente Gluetun. Overseerr non scarica nulla. È solo un’interfaccia per le richieste. Tua moglie vuole guardare Gossip Girl? Apre Overseerr, lo cerca, clicca “Richiedi”, e Sonarr gestisce il resto.
Plex: Il Frontend di Streaming
Qui è dove tutto si riunisce. Plex è il tuo servizio di streaming personale.
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- VERSION=docker
- PLEX_CLAIM=claim-6DcZ6Chj7tSXYU4n6GS7
network_mode: host
volumes:
- /home/donkey/EmuleVision/Settings/Plex:/config
- /home/donkey/EmuleVision/media/movies:/data/movies
- /home/donkey/EmuleVision/media/tv:/data/tvshows
devices:
- /dev/dri:/dev/dri
restart: unless-stopped

Dettagli critici:
network_mode: host - A differenza degli altri container, Plex ha bisogno di accesso diretto alla rete per la scoperta DLNA e le massime prestazioni di streaming. Ricordi il diagramma dell’architettura del post sulla VPN? Questo è il “Clean Group”.
devices: /dev/dri - Questo espone l’encoder hardware Intel QuickSync al container. Senza questo, la transcodifica massacrerebbe la tua CPU. Con esso, la GPU del tuo N100 gestisce la transcodifica 4K mentre la CPU sonnecchia.
PLEX_CLAIM - Questo token collega il tuo server Plex al tuo account Plex al primo avvio. Lo ottieni da plex.tv/claim. Scade dopo 4 minuti, quindi generalo subito prima del tuo primo
docker compose up.Nessuna dipendenza da Gluetun - Plex trasmette in locale. Far passare video 4K a 80Mbps attraverso un tunnel VPN è da pazzi. Questo traffico rimane sulla tua LAN, veloce e pulito.
Configurazioni essenziali:
- Abilita l’Accelerazione Hardware (Intel QuickSync) in Impostazioni → Transcoder
- Configura le tue librerie (
Moviesche punta a/data/movies,TV Showsche punta a/data/tvshows) - Configura l’accesso remoto (Plex lo gestisce automaticamente, ma puoi disabilitarlo per solo LAN)
- Installa l’app Plex sulla tua TV, telefono, tablet
La bellezza di Plex rispetto alle alternative open-source è la finezza. Le app sono native, veloci e funzionano perfettamente su ogni dispositivo immaginabile. Tua moglie non avrà bisogno di un tutorial per guardare Gossip Girl sul suo iPad.
Per una configurazione dettagliata, consulta la documentazione ufficiale di Plex.
Lo Stack di Supporto
Portainer: La Dashboard di Docker
Gestire i container via CLI va bene quando stai configurando le cose. Ma quando qualcosa si rompe alle 2 di notte e hai bisogno di riavviare rapidamente un servizio, un’interfaccia web è inestimabile.
portainer:
image: portainer/portainer-ce:2.20.2
container_name: portainer
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /home/donkey/EmuleVision/Settings/Portainer:/data
ports:
- "9000:9000"
restart: unless-stopped
Portainer ti offre:
- Stato dei container a colpo d’occhio
- Riavvio/arresto/rimozione con un clic
- Visualizzazione dei log senza SSH
- Monitoraggio dell’utilizzo delle risorse
Accedi a http://indirizzo-ip-del-tuo-server:9000.
Homepage: La Dashboard Unificata
Homepage è il tuo centro di controllo. Aggrega tutti i tuoi servizi in un’unica interfaccia bellissima.
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
volumes:
- /home/donkey/EmuleVision/Settings/Homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock
environment:
- HOMEPAGE_ALLOWED_HOSTS=*
ports:
- "3000:3000"
restart: unless-stopped

Lo configuri con file YAML per visualizzare:
- Stato dei servizi
- Collegamenti rapidi
- Integrazioni API (coda download di Sonarr, aggiunte recenti di Jellyfin)
- Statistiche di sistema
Questo diventa la tua homepage preferita. Niente più memorizzare quale servizio è su quale porta.
Scrutiny: Il Monitor della Salute dei Dischi
Ricordi quell’SSD da 512GB su cui facciamo affidamento? Dobbiamo monitorarne la salute.
scrutiny:
image: ghcr.io/analogj/scrutiny:master-omnibus
container_name: scrutiny
cap_add:
- SYS_RAWIO
devices:
- /dev/sda:/dev/sda
volumes:
- /run/udev:/run/udev:ro
- /home/donkey/EmuleVision/Settings/Scrutiny:/opt/scrutiny/config
- /home/donkey/EmuleVision/Settings/Scrutiny/influxdb:/opt/scrutiny/influxdb
ports:
- "8086:8080"
restart: unless-stopped

Scrutiny legge i dati S.M.A.R.T. dal tuo disco e ti avvisa se rileva un degrado. Gli SSD non falliscono gradualmente; falliscono all’improvviso. Questo ti dà un avvertimento prima di una perdita di dati catastrofica.
FileBrowser: Il Gestore di File Web
A volte hai bisogno di accedere ai file direttamente senza fare SSH o montare una condivisione Samba.
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
environment:
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/Settings/Filebrowser/filebrowser.db:/database.db
- /home/donkey/EmuleVision/Settings/Filebrowser/.filebrowser.json:/.filebrowser.json
- /home/donkey/EmuleVision:/srv
ports:
- "8082:80"
restart: unless-stopped
FileBrowser fornisce:
- Gestione dei file basata sul web
- Capacità di upload/download
- Controlli dei permessi utente
- Link di condivisione file
Utile per quelle rare volte in cui devi aggiungere manualmente un file o controllare qualcosa senza accesso al terminale.
Kavita e Calibre-Web: Lo Stack di Lettura
Per gli appassionati di libri:
kavita:
image: jvmilazz0/kavita:latest
container_name: kavita
environment:
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Kavita:/kavita/config
- /home/donkey/EmuleVision/media/manga:/manga
- /home/donkey/EmuleVision/media/comics:/comics
ports:
- "5000:5000"
restart: unless-stopped
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/CalibreWeb:/config
- /home/donkey/EmuleVision/books:/books
ports:
- "8083:8083"
restart: unless-stopped
- Kavita: Per manga e fumetti (file CBZ/CBR)
- Calibre-Web: Per ebook (EPUB, MOBI, PDF)

Entrambi forniscono interfacce di lettura web-based con tracciamento dei progressi, gestione dei metadati e supporto per app mobile.
Il Docker Compose Completo
Ecco come tutto si combina insieme. Nota la segregazione di rete tra il gruppo VPN (Gluetun + downloader) e il gruppo pulito (Jellyfin, Overseerr, ecc.):
version: '3'
services:
gluetun:
image: qmcgaw/gluetun
container_name: gluetun
cap_add:
- NET_ADMIN
devices:
- /dev/net/tun:/dev/net/tun
ports:
- "8080:8080" # Qbittorrent
- "9696:9696" # Prowlarr
- "8191:8191" # Flaresolverr
- "8989:8989" # Sonarr
- "7878:7878" # Radarr
- "3002:3002" # Kaizoku
- "6881:6881" # Porta Torrent
- "6881:6881/udp"
- "6767:6767" # Bazarr
- "8090:8090"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- VPN_SERVICE_PROVIDER=custom
- VPN_TYPE=openvpn
- OPENVPN_USER=${VPN_USER}
- OPENVPN_PASSWORD=${VPN_PASS}
- OPENVPN_CUSTOM_CONFIG=/gluetun/custom.conf
- FIREWALL_VPN_INPUT_PORTS=6881
- BLOCK_MALICIOUS=no
- BLOCK_ADS=no
- BLOCK_SURVEILLANCE=no
- FIREWALL_INPUT_PORTS=8080,9696,8191,8989,7878,3002,6767,8090
volumes:
- ./Settings/Gluetun:/gluetun
restart: always
healthcheck:
test: ["CMD-SHELL", "ping -c 1 1.1.1.1 || ping -c 1 8.8.8.8 || ping -c 1 9.9.9.9 || exit 1"]
interval: 10s
timeout: 5s
retries: 3
start_period: 20s
qbittorrent:
image: lscr.io/linuxserver/qbittorrent:latest
container_name: qbittorrent
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- WEBUI_PORT=8080
volumes:
- /home/donkey/EmuleVision/Settings/Qbittorrent:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
prowlarr:
image: ghcr.io/hotio/prowlarr:latest
container_name: prowlarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Prowlarr:/config
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
flaresolverr:
image: ghcr.io/flaresolverr/flaresolverr:latest
container_name: flaresolverr
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
sonarr:
image: ghcr.io/linuxserver/sonarr:latest
container_name: sonarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Sonarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
radarr:
image: ghcr.io/linuxserver/radarr:latest
container_name: radarr
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Radarr:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
bazarr:
image: ghcr.io/linuxserver/bazarr:latest
container_name: bazarr
restart: unless-stopped
network_mode: "service:gluetun"
environment:
- TZ=${TZ}
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/media/movies:/movies
- /home/donkey/EmuleVision/media/tv:/tv
- /home/donkey/EmuleVision/Settings/Bazarr:/config
depends_on:
gluetun:
condition: service_healthy
kaizoku:
image: ghcr.io/oae/kaizoku:latest
container_name: kaizoku
network_mode: "service:gluetun"
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- KAIZOKU_PORT=3002
volumes:
- /home/donkey/EmuleVision/Settings/Kaizoku:/config
- /home/donkey/EmuleVision:/data
depends_on:
gluetun:
condition: service_healthy
restart: unless-stopped
overseerr:
image: lscr.io/linuxserver/overseerr:latest
container_name: overseerr
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
ports:
- "5055:5055"
volumes:
- /home/donkey/EmuleVision/Settings/Overseerr:/config
restart: unless-stopped
adguardhome:
image: adguard/adguardhome
container_name: adguardhome
ports:
- "53:53/tcp"
- "53:53/udp"
- "3001:3000"
volumes:
- /home/donkey/EmuleVision/Settings/AdGuard/work:/opt/adguardhome/work
- /home/donkey/EmuleVision/Settings/AdGuard/conf:/opt/adguardhome/conf
restart: unless-stopped
calibre-web:
image: lscr.io/linuxserver/calibre-web:latest
container_name: calibre-web
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/CalibreWeb:/config
- /home/donkey/EmuleVision/books:/books
ports:
- "8083:8083"
restart: unless-stopped
kavita:
image: jvmilazz0/kavita:latest
container_name: kavita
environment:
- TZ=${TZ}
volumes:
- /home/donkey/EmuleVision/Settings/Kavita:/kavita/config
- /home/donkey/EmuleVision/media/manga:/manga
- /home/donkey/EmuleVision/media/comics:/comics
ports:
- "5000:5000"
restart: unless-stopped
filebrowser:
image: filebrowser/filebrowser:latest
container_name: filebrowser
environment:
- PUID=${PUID}
- PGID=${PGID}
volumes:
- /home/donkey/EmuleVision/Settings/Filebrowser/filebrowser.db:/database.db
- /home/donkey/EmuleVision/Settings/Filebrowser/.filebrowser.json:/.filebrowser.json
- /home/donkey/EmuleVision:/srv
ports:
- "8082:80"
restart: unless-stopped
portainer:
image: portainer/portainer-ce:2.20.2
container_name: portainer
volumes:
- /etc/localtime:/etc/localtime:ro
- /var/run/docker.sock:/var/run/docker.sock
- /home/donkey/EmuleVision/Settings/Portainer:/data
ports:
- "9000:9000"
restart: unless-stopped
homepage:
image: ghcr.io/gethomepage/homepage:latest
container_name: homepage
volumes:
- /home/donkey/EmuleVision/Settings/Homepage:/app/config
- /var/run/docker.sock:/var/run/docker.sock
environment:
- HOMEPAGE_ALLOWED_HOSTS=*
ports:
- "3000:3000"
restart: unless-stopped
scrutiny:
image: ghcr.io/analogj/scrutiny:master-omnibus
container_name: scrutiny
cap_add:
- SYS_RAWIO
devices:
- /dev/sda:/dev/sda
volumes:
- /run/udev:/run/udev:ro
- /home/donkey/EmuleVision/Settings/Scrutiny:/opt/scrutiny/config
- /home/donkey/EmuleVision/Settings/Scrutiny/influxdb:/opt/scrutiny/influxdb
ports:
- "8086:8080"
restart: unless-stopped
plex:
image: lscr.io/linuxserver/plex:latest
container_name: plex
environment:
- PUID=${PUID}
- PGID=${PGID}
- TZ=${TZ}
- VERSION=docker
- PLEX_CLAIM=
network_mode: host
volumes:
- /home/donkey/EmuleVision/Settings/Plex:/config
- /home/donkey/EmuleVision/media/movies:/data/movies
- /home/donkey/EmuleVision/media/tv:/data/tvshows
devices:
- /dev/dri:/dev/dri
Checklist per il Primo Avvio
Dopo aver eseguito docker compose up -d, ecco la sequenza di avvio:
Attendi Gluetun - Controlla i log:
docker logs gluetun- Cerca “VPN connection successful”
- Verifica l’IP:
docker exec gluetun curl ifconfig.me
Configura Prowlarr (porta 9696)
- Aggiungi gli indexer
- Connetti a Sonarr/Radarr tramite le chiavi API
- Testa FlareSolverr se usi indexer protetti
Configura qBittorrent (porta 8080)
- Cambia la password predefinita
- Imposta il percorso di download:
/data/downloads/torrents - Aggiungi le categorie:
tv,movies - Segui le TRaSH Guides
Configura Sonarr (porta 8989)
- Aggiungi Prowlarr come indexer
- Aggiungi qBittorrent come client di download (localhost:8080)
- Imposta la cartella principale:
/data/media/tv - Importa i profili di qualità dalle TRaSH Guides
Configura Radarr (porta 7878)
- Come Sonarr, ma cartella principale:
/data/media/movies
- Come Sonarr, ma cartella principale:
Configura Bazarr (porta 6767)
- Connetti a Sonarr/Radarr
- Aggiungi provider di sottotitoli (OpenSubtitles, Subscene)
- Imposta le lingue preferite
Configura Jellyfin (porta 8096)
- Aggiungi librerie: Film (
/data/movies), Serie TV (/data/tvshows) - Abilita l’accelerazione hardware (Intel QuickSync)
- Crea account utente
- Aggiungi librerie: Film (
Configura Overseerr (porta 5055)
- Connetti a Jellyfin
- Connetti a Sonarr/Radarr
- Abilita le richieste degli utenti
Suggerimenti per l’Ottimizzazione delle Prestazioni
Gestione dello Storage
Dato che stiamo lavorando con un SSD da 512GB, la gestione dello spazio è critica:
- Abilita l’eliminazione automatica in Sonarr/Radarr dopo X giorni
- Imposta limiti di qualità - Non scaricare remux da 80GB a meno che non ti servano davvero
- Monitora l’uso del disco tramite Homepage o Scrutiny
- Pulizia regolare - Rimuovi i contenuti già visti che non riguarderai
Ottimizzazione della Rete
- Port forwarding - Inoltra la porta 6881 sulla tua VPN per massimizzare le velocità di download
- WiFi 5GHz per il TV Box - Come discusso nel post sull’hardware, WiFi AC > Ethernet 100Mbps per lo streaming 4K
- Direct Play invece della transcodifica - Configura i client Jellyfin per supportare nativamente i tuoi formati di file
Rafforzamento della Sicurezza
- Cambia tutte le password predefinite
- Disabilita l’accesso remoto a meno che non sia strettamente necessario
- Mantieni le credenziali VPN di Gluetun in .env - Mai hardcodarle
- Aggiornamenti regolari - Esegui
docker compose pull && docker compose up -dmensilmente
Risoluzione dei Problemi Comuni
“qBittorrent non si avvia”
- Controlla i log di Gluetun:
docker logs gluetun - Verifica le credenziali VPN in
.env - Assicurati che l’healthcheck passi:
docker inspect gluetun | grep Health
“Sonarr/Radarr non riesce a raggiungere qBittorrent”
- Condividono la rete di Gluetun, usa
localhost:8080 - Non usare nomi container o IP
- Controlla le regole del firewall nella configurazione di Gluetun
“La transcodifica di Jellyfin è lenta”
- Verifica che l’accelerazione hardware sia abilitata
- Controlla che
/dev/drisia montato correttamente - Installa intel-media-va-driver-non-free sull’host
“I sottotitoli non si scaricano”
- Controlla i log di Bazarr per problemi con i provider
- Verifica che le chiavi API siano corrette
- Alcuni provider applicano rate-limiting; aspetta e riprova
“Gli Hardlinks non funzionano”
- Tutti i container devono mappare lo stesso volume principale (
/data) - I download e i media devono essere sullo stesso filesystem
- Controlla la proprietà dei file (PUID/PGID)
E Ora?
Ora abbiamo un home server completamente funzionale che rivaleggia con qualsiasi servizio di streaming. Ma questa è solo la base. Nei post futuri tratterò:
- Automazione Avanzata: Script personalizzati per eliminazione, notifiche e manutenzione
- Accesso Remoto: Esporre in sicurezza il tuo server tramite Tailscale o Cloudflare Tunnels
- Ottimizzazione 4K: HDR tone mapping, profili di qualità specifici e gestione della banda
- Strategie di Backup: Proteggere la tua configurazione e i tuoi media
- Gestione Multi-Utente: Librerie separate, restrizioni di visualizzazione e quote di banda
- Integrazione con Trakt/IMDb: Sincronizzazione automatica delle watchlist
- Personalizzazione Avanzata di Jellyfin: Plugin, temi e impostazioni specifiche per client
La bellezza di questo sistema è che è modulare. Puoi aggiungere o rimuovere servizi secondo necessità. Non ti interessa il manga? Rimuovi Kaizoku. Vuoi aggiungere la gestione della musica? Aggiungi Lidarr. L’architettura si adatta alle tue esigenze.
Hai trasformato un mini PC economico in un’infrastruttura di livello enterprise. Hai ripreso il controllo del tuo consumo di media, sottraendolo alle aziende che ti fanno pagare di più per meno. E lungo il percorso hai imparato i fondamenti della containerizzazione, del networking e dell’architettura di sistema.

Il server è costruito. Lo stack è completo. Ora vai e acquisisci (legalmente, ovviamente) i contenuti che vuoi davvero guardare.
Ci vediamo nel prossimo post.