Idiomes disponibles:

El Streaming Està Trencat VI: La Pila Completa

Aquesta publicació va ser originalment escrita en anglès. La traducció pot no reflectir el 100% de les idees originals de l'autor.

Prou de fer-ho esperar, oi?

De bromes a part, considero que els posts anteriors d’aquesta sèrie són extremadament importants. Cadascun cobreix una peça crítica:

  • Streaming is Broken II: Choosing Hardware. On vam aprendre sobre una configuració de servidor domèstic de baix cost amb els meus dos cèntims sobre emmagatzematge.
  • Streaming is Broken III: The Foundation (OS, Docker, and “Day One”). On vam configurar el nostre OS, Docker, i vam preparar el terreny per al que vindria després.
  • Streaming is Broken IV: The Fortress: VPN and Gluetun. Un capítol que normalment no trobaràs en altres tutorials, centrat en seguretat i privadesa.
  • Streaming is Broken V: Hardlinks and Permissions. Consells per evitar mals de cap futurs en les nostres configuracions.

Però si hagués de triar només un post per explicar com configurar un servidor domèstic, seria aquest.

Sense més dilació, comencem.

La Pila Multimèdia

qBittorrent

Com vaig dir en posts anteriors, la pirateria és el pitjor crim del món, m’encanten les empreses que ofereixen serveis dolents, i gaudeixo pagant més per menys. És clar, per raons legals, dic això.

Qbittorrent

Ara, parlant seriosament, el flux del nostre servidor multimèdia domèstic serà el següent:

  • Cercarem pel·lícules i sèries a Overseerr (tot s’explicarà més endavant)
  • Overseerr enviarà sol·licituds a Radarr (Pel·lícules) i Sonarr (Sèries)
  • Radarr i Sonarr cercaran el material en llocs indexats per Prowlarr, la funció única del qual serà gestionar aquests indexadors
  • qBittorrent descarregarà el fitxer. Radarr i Sonarr identificaran automàticament el fitxer i mouran la descàrrega a les seves pròpies carpetes
  • Jellyfin serà la nostra aplicació de streaming a la TV, iPad, ordinador, etc. És on veurem el contingut adquirit

Amb això en ment, comencem amb el primer element a configurar de la nostra llista: el descarregador.

Al nostre docker compose, tindrem alguna cosa així:

  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

Aquí, com vaig explicar en el meu post de seguretat, qBittorrent estarà protegit mitjançant VPN, i Gluetun serà qui protegeixi el nostre contenidor. En el meu cas, connectat a un servei de VPN de pagament (té integracions amb NordVPN, Surfshark, etc.). Com que parlem de descarregar fitxers multimèdia, oblida’t de les VPN gratuïtes: a més de ser limitades per raons òbvies, són extremadament insegures.

És important deixar clar que per evitar filtracions d’IP, qBittorrent dependrà absolutament que Gluetun estigui funcional. Si la VPN cau, qBittorrent s’aturarà automàticament. Aquesta és la bellesa del depends_on amb condition: service_healthy. El contenidor ni tan sols s’iniciarà si Gluetun no està llest.

En aquest cas i d’ara endavant, configurarem els permisos i la zona horària (PUID, PGID i TZ) de la mateixa manera. Per això, crea un fitxer .env per a aquests paràmetres.

Exemple bàsic:

PUID=1000
PGID=1000
TZ=Etc/UTC

Per configurar l’aplicació en si, no reinventaré la roda. Enllaçaré el tutorial corresponent de TRaSH Guides per a cada tecnologia:

  • Basic-Setup - Configuració bàsica dels paràmetres més comuns.
  • Paths - On establir la teva ubicació d’arrel de descàrrega.
  • How to add Categories - Com configurar categories per a qBittorrent, i com pots gestionar i organitzar els teus torrents en grups. Les aplicacions Starr poden utilitzar categories en qBittorrent per fer un seguiment de les descàrregues a monitoritzar, en lloc de vigilar cada torrent del teu client.
  • Port forwarding - On al teu client de descàrrega hauries d’afegir el port que has reenviat amb el teu Servei VPN.

Prowlarr: El Gestor d’Indexadors

Prowlarr és l’heroi anònim d’aquesta pila. És l’intermediari que connecta el teu Radarr i Sonarr als indexadors de torrents. Pensa-hi com una operadora de centraleta dels anys 50, excepte que en lloc de connectar trucades telefòniques, connecta les teves sol·licituds de descàrrega a llocs de torrents.

  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

Notes el patró aquí? També està darrere de Gluetun. Tot el que toqui la internet pública per a “mètodes d’adquisició alternatius” es queda darrere de la VPN. Sense excepcions.

La configuració de Prowlarr és senzilla:

  1. Afegeix els teus indexadors (rastrejadors públics o privats)
  2. Connecta’l a Radarr i Sonarr mitjançant claus API
  3. Deixa que sincronitzi automàticament

La bellesa és que configures els indexadors una vegada a Prowlarr, i es propaguen a totes les teves aplicacions Arr. No més copiar i enganxar URLs de rastrejadors en cinc interfícies diferents.

Per a una configuració detallada, consulta TRaSH Guides - Prowlarr.

FlareSolverr: L’evasió del Cloudflare

Alguns indexadors es protegeixen amb les mesures anti-bot de Cloudflare. FlareSolverr és un navegador sense capçalera que resol aquests desafiaments automàticament.

  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

El configures una vegada a Prowlarr, i ell s’encarrega de la resta. Quan Prowlarr accedeix a un lloc protegit per Cloudflare, FlareSolverr intervé, resol el repte i retorna els resultats. És com tenir un advocat robot especialitzat en passar guardes de seguretat. La guia és aquí

Sonarr: El gestor de sèries de TV

Sonarr és on passa la màgia per a les sèries de televisió. Supervisa la teva “llista de seguiment”, cerca a Prowlarr nous episodis, els envia a qBittorrent i organitza tot automàticament.

  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

Punts clau de configuració:

  • Carpetes Arrel: Estableix a /data/media/tv
  • Client de Descàrrega: Apunta a qBittorrent a localhost:8080 (recorda, comparteixen la mateixa pila de xarxa a través de Gluetun)
  • Perfils de Qualitat: Utilitza Configuracions de Qualitat de TRaSH Guides per evitar descarregar versions de qualitat basura

Sonarr automàticament:

  • Cercarà nous episodis quan s’emetin
  • Actualitzarà episodis existents si apareixen versions de millor qualitat
  • Reanomenarà fitxers segons l’esquema de noms preferit
  • Moureu les descàrregues completades a la teva biblioteca de mitjans utilitzant Hardlinks (recordes aquella publicació?)

Radarr: El gestor de pel·lícules

Radarr és el germà de Sonarr, però per a pel·lícules. La mateixa lògica, tipus de contingut diferent.

  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 configuració reflecteix la de Sonarr:

  • Carpeta Arrel: /data/media/movies
  • Client de Descàrrega: qBittorrent a localhost:8080
  • Perfils de Qualitat: TRaSH Guides per a Radarr

La diferència és el tipus de contingut. Radarr fa el seguiment de pel·lícules individuals en lloc de sèries/temporades/episodis. També s’integra perfectament amb serveis com les llistes de Trakt o IMDb si vols automatitzar l’addició de pel·lícules a la teva col·lecció.

Bazarr: L’especialista en subtítols

Recordes quan em vaig queixar de la qualitat basura dels subtítols de Netflix a la primera publicació? Bazarr resol això.

  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 automàticament:

  • Descarrega subtítols per a les teves pel·lícules i sèries
  • Admet múltiples idiomes
  • Sincronitza amb OpenSubtitles, Subscene i altres proveïdors
  • Pot fins i tot actualitzar subtítols existents si apareixen versions millors

La configuració és senzilla: connecta’l a Sonarr i Radarr mitjançant claus API, selecciona els teus idiomes i proveïdors preferits i deixa’l funcionar. El teu thriller polonès finalment tindrà subtítols en anglès comprensibles.

Kaizoku: El descarregador de manga

Per a aquells que consumeixen més que només pel·lícules i sèries, Kaizoku s’encarrega de l’adquisició de 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

Fa el seguiment de sèries de manga, descarrega automàticament nous capítols i els organitza per al teu plaer de lectura. Pensa-hi com a Sonarr, però per a còmics.

Overseerr: El gestor de sol·licituds

Aquest és el component orientat a l’usuari. Overseerr és amb el que interactuen els membres de la teva família quan volen veure alguna cosa.

  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

Nota alguna cosa diferent? Sense Gluetun. Overseerr no descarrega res. És només una interfície de sol·licituds. La teva dona vol veure Gossip Girl? Obre Overseerr, ho cerca, fa clic a “Sol·licitar”, i Sonarr s’encarrega de la resta.

Plex: El Frontend de Streaming

Aquí és on tot s’uneix. Plex és el teu servei de streaming personal.

  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

Detalls crítics:

  1. network_mode: host - A diferència dels altres contenidors, Plex necessita accés directe a la xarxa per a la detecció DLNA i el màxim rendiment de streaming. Recordes el diagrama d’arquitectura de l’entrada sobre la VPN? Aquest és el “Grup Net”.

  2. devices: /dev/dri - Això exposa el codificador de maquinari Intel QuickSync al contenidor. Sense això, la transcodificació assassinaria la teva CPU. Amb això, la GPU del teu N100 maneja la transcodificació 4K mentre la CPU fa la migdiada.

  3. PLEX_CLAIM - Aquest token vincula el teu servidor Plex al teu compte de Plex en l’arrencada inicial. L’obtens de plex.tv/claim. Caduca després de 4 minuts, així que genera’l just abans del teu primer docker compose up.

  4. Sense dependència de Gluetun - Plex fa streaming localment. Passar vídeo 4K de 80Mbps a través d’un túnel VPN és una bogeria. Aquest trànsit es queda a la teva xarxa local (LAN), ràpid i net.

Essencials de configuració:

  • Habilita l’Acceleració de Maquinari (Intel QuickSync) a Configuració → Transcoder
  • Configura les teves biblioteques (Movies apuntant a /data/movies, TV Shows apuntant a /data/tvshows)
  • Configura l’accés remot (Plex ho gestiona automàticament, però pots desactivar-ho per a ús només a la LAN)
  • Instal·la l’aplicació de Plex a la teva TV, telèfon, tauleta

La bellesa de Plex sobre les alternatives de codi obert és el poliment. Les aplicacions són natives, ràpides i funcionen perfectament en tots els dispositius imaginables. La teva dona no necessitarà un tutorial per veure Gossip Girl al seu iPad.

Per a una configuració detallada, consulta la documentació oficial de Plex.

La Pila de Suport

Portainer: El Tauler de Control de Docker

Gestionar contenidors via CLI està bé quan estàs configurant les coses. Però quan alguna cosa falla a les 2 de la matinada i necessites reiniciar un servei ràpidament, una interfície web és inestimable.

  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 et dóna:

  • Estat dels contenidors d’un cop d’ull
  • Reiniciar/aturar/eliminar amb un clic
  • Visualització de registres sense necessitar SSH
  • Monitorització de l’ús de recursos

Accedeix-hi a http://la-teva-ip-del-servidor:9000.

Homepage: El Tauler de Control Unificat

Homepage és el teu centre de control de missió. Agrega tots els teus serveis en una única interfície bonica.

  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

El configures amb fitxers YAML per mostrar:

  • Estat dels serveis
  • Enllaços ràpids
  • Integracions d’API (cua de descàrrega de Sonarr, afegits recents de Jellyfin)
  • Estadístiques del sistema

Això es converteix en la teva pàgina d’inici preferida. No més memoritzar quin servei està en quin port.

Scrutiny: El Monitor de Salut dels Discs

Recordes aquell SSD de 512GB en què confiem? Necessitem monitoritzar la seva salut.

  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 llegeix les dades S.M.A.R.T. del teu disc i t’alertarà si detecta degradació. Els SSD no fallen gradualment; fallen sobtadament. Això et dóna un avís abans d’una pèrdua de dades catastròfica.

FileBrowser: El Gestor de Fitxers Web

A vegades necessites accedir als fitxers directament sense fer SSH o muntar un recurs compartit 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 proporciona:

  • Gestió de fitxers basada en web
  • Capacitats de pujada/baixada
  • Controls de permisos d’usuari
  • Enllaços per compartir fitxers

Útil per a aquelles rares vegades en què necessites afegir un fitxer manualment o comprovar alguna cosa sense accés al terminal.

Kavita i Calibre-Web: La pila de lectura

Per als entusiastes dels llibres:

  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 a manga i còmics (fitxers CBZ/CBR)
  • Calibre-Web: Per a llibres electrònics (EPUB, MOBI, PDF)

Calibre

Tots dos ofereixen interfícies de lectura basades en web amb seguiment del progrés, gestió de metadades i suport per a aplicacions mòbils.

El Docker Compose complet

Aquí és com tot encaixa. Fixa’t en la segregació de xarxa entre el grup VPN (Gluetun + els clients de descàrrega) i el grup net (Jellyfin, Overseerr, etc.):

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" # Port 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

Llista de comprovació del primer arrencada

Després d’executar docker compose up -d, aquesta és la teva seqüència d’inici:

  1. Espera que Gluetun s’inicii - Comprova els registres: docker logs gluetun

    • Busca “VPN connection successful”
    • Verifica la IP: docker exec gluetun curl ifconfig.me
  2. Configura Prowlarr (port 9696)

    • Afegeix indexadors
    • Connecta amb Sonarr/Radarr mitjançant claus API
    • Prova FlareSolverr si utilitzes indexadors protegits
  3. Configura qBittorrent (port 8080)

    • Canvia la contrasenya per defecte
    • Estableix la ruta de descàrrega: /data/downloads/torrents
    • Afegeix categories: tv, movies
    • Segueix les Guies TRaSH
  4. Configura Sonarr (port 8989)

    • Afegeix Prowlarr com a indexador
    • Afegeix qBittorrent com a client de descàrrega (localhost:8080)
    • Estableix la carpeta arrel: /data/media/tv
    • Importa perfils de qualitat de les Guies TRaSH
  5. Configura Radarr (port 7878)

    • Igual que Sonarr, però amb carpeta arrel: /data/media/movies
  6. Configura Bazarr (port 6767)

    • Connecta amb Sonarr/Radarr
    • Afegeix proveïdors de subtítols (OpenSubtitles, Subscene)
    • Estableix els idiomes preferits
  7. Configura Jellyfin (port 8096)

    • Afegeix biblioteques: Pel·lícules (/data/movies), Sèries de TV (/data/tvshows)
    • Habilita l’acceleració per maquinari (Intel QuickSync)
    • Crea comptes d’usuari
  8. Configura Overseerr (port 5055)

    • Connecta amb Jellyfin
    • Connecta amb Sonarr/Radarr
    • Habilita les sol·licituds dels usuaris

Consells d’optimització de rendiment

Gestió d’emmagatzematge

Com que estem treballant amb un SSD de 512GB, la gestió de l’espai és crítica:

  1. Habilita l’eliminació automàtica a Sonarr/Radarr després de X dies
  2. Estableix límits de qualitat - No descarreguis remuxos de 80GB a menys que realment els necessitis
  3. Monitoritza l’ús del disc mitjançant Homepage o Scrutiny
  4. Neteja periòdica - Elimina contingut vist que no tornaras a veure

Optimització de xarxa

  1. Reenviament de ports - Reenvia el port 6881 a la teva VPN per maximitzar les velocitats de descàrrega
  2. WiFi de 5GHz per a la TV Box - Com es va comentar a l’entrada sobre maquinari, WiFi AC > Ethernet de 100Mbps per a streaming 4K
  3. Reproducció Directa en lloc de Transcodificació - Configura els clients de Jellyfin perquè suportin els teus formats de fitxer de manera nativa

Enduriment de seguretat

  1. Canvia totes les contrasenyes per defecte
  2. Deshabilita l’accés remot a menys que sigui absolutament necessari
  3. Manté les credencials VPN de Gluetun a .env - Mai les codifiquis directament
  4. Actualitzacions regulars - Executa docker compose pull && docker compose up -d mensualment

Resolució de problemes comuns

“qBittorrent no s’inicia”

  • Comprova els registres de Gluetun: docker logs gluetun
  • Verifica les credencials VPN a .env
  • Assegura’t que la comprovació d’estat passa: docker inspect gluetun | grep Health

“Sonarr/Radarr no pot arribar a qBittorrent”

  • Comparteixen la xarxa de Gluetun, utilitza localhost:8080
  • No utilitzis noms de contenidor o IPs
  • Comprova les regles del tallafocs a la configuració de Gluetun

“La transcodificació de Jellyfin és lenta”

  • Verifica que l’acceleració per maquinari estigui habilitada
  • Comprova que /dev/dri estigui muntat correctament
  • Instal·la intel-media-va-driver-non-free a l’amfitrió

“Els subtítols no es descarreguen”

  • Comprova els registres de Bazarr per problemes amb els proveïdors
  • Verifica que les claus API siguin correctes
  • Alguns proveïdors limiten la freqüència; espera i torna-ho a provar
  • Tots els contenidors han de mapejar el mateix volum arrel (/data)
  • Les descàrregues i el contingut han d’estar al mateix sistema de fitxers
  • Comprova la propietat dels fitxers (PUID/PGID)

Què ve ara?

Ara tenim un servidor domèstic completament funcional que rivalitza amb qualsevol servei de streaming. Però això és només la base. En entrades futures, cobriré:

  • Automatització avançada: Scripts personalitzats per a eliminació, notificacions i manteniment
  • Accés remot: Exposar el teu servidor de manera segura mitjançant Tailscale o Cloudflare Tunnels
  • Optimització 4K: Mapeig de tons HDR, perfils de qualitat específics i gestió d’amplada de banda
  • Estratègies de còpia de seguretat: Protegint la teva configuració i contingut
  • Gestió multi-usuari: Biblioteques separades, restriccions de visualització i quotes d’amplada de banda
  • Integració amb Trakt/IMDb: Sincronització automàtica de llistes de seguiment
  • Personalització avançada de Jellyfin: Connectors, temes i configuracions específiques per client

La bellesa d’aquest sistema és que és modular. Pots afegir o eliminar serveis segons sigui necessari. No t’importa el manga? Elimina Kaizoku. Vols afegir gestió de música? Afegeix Lidarr. L’arquitectura escala amb les teves necessitats.

Has transformat un mini PC barat en una infraestructura de nivell empresarial. Has pres el control del teu consum de contingut allunyant-te de les corporacions que et cobren més per menys. I has après els fonaments de la contenidorització, xarxes i arquitectura de sistemes pel camí.

Victòria!

El servidor està construït. La pila està completa. Ara endavant i adquireix (legalment, és clar) el contingut que realment vols veure.

Ens veiem a la propera entrada.