Lingue disponibili:

Lo Streaming è Rotto VI: Lo Stack Completo

Questo post è stato originariamente scritto in inglese. La traduzione potrebbe non riflettere il 100% delle idee originali dell'autore.

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.

Qbittorrent

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

Prowlarr

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:

  1. Aggiungi i tuoi indexer (tracker pubblici o privati)
  2. Collegalo a Radarr e Sonarr tramite chiavi API
  3. 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

Sonarr

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

Radarr

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

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

Overserr

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

Plex

Dettagli critici:

  1. 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”.

  2. 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.

  3. 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.

  4. 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 (Movies che punta a /data/movies, TV Shows che 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

Homepage

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

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)

Calibre

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:

  1. Attendi Gluetun - Controlla i log: docker logs gluetun

    • Cerca “VPN connection successful”
    • Verifica l’IP: docker exec gluetun curl ifconfig.me
  2. Configura Prowlarr (porta 9696)

    • Aggiungi gli indexer
    • Connetti a Sonarr/Radarr tramite le chiavi API
    • Testa FlareSolverr se usi indexer protetti
  3. 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
  4. 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
  5. Configura Radarr (porta 7878)

    • Come Sonarr, ma cartella principale: /data/media/movies
  6. Configura Bazarr (porta 6767)

    • Connetti a Sonarr/Radarr
    • Aggiungi provider di sottotitoli (OpenSubtitles, Subscene)
    • Imposta le lingue preferite
  7. Configura Jellyfin (porta 8096)

    • Aggiungi librerie: Film (/data/movies), Serie TV (/data/tvshows)
    • Abilita l’accelerazione hardware (Intel QuickSync)
    • Crea account utente
  8. 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:

  1. Abilita l’eliminazione automatica in Sonarr/Radarr dopo X giorni
  2. Imposta limiti di qualità - Non scaricare remux da 80GB a meno che non ti servano davvero
  3. Monitora l’uso del disco tramite Homepage o Scrutiny
  4. Pulizia regolare - Rimuovi i contenuti già visti che non riguarderai

Ottimizzazione della Rete

  1. Port forwarding - Inoltra la porta 6881 sulla tua VPN per massimizzare le velocità di download
  2. WiFi 5GHz per il TV Box - Come discusso nel post sull’hardware, WiFi AC > Ethernet 100Mbps per lo streaming 4K
  3. Direct Play invece della transcodifica - Configura i client Jellyfin per supportare nativamente i tuoi formati di file

Rafforzamento della Sicurezza

  1. Cambia tutte le password predefinite
  2. Disabilita l’accesso remoto a meno che non sia strettamente necessario
  3. Mantieni le credenziali VPN di Gluetun in .env - Mai hardcodarle
  4. Aggiornamenti regolari - Esegui docker compose pull && docker compose up -d mensilmente

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/dri sia 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
  • 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.

Vittoria!

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

Ci vediamo nel prossimo post.