Zpět na domů

Domácí mediální server na Dockeru: Transmission + Jellyfin + Telegram

Návod na vytvoření domácího mediálního serveru na bázi Dockeru s integrací Transmission, Jellyfin a Telegram-bota. Podpora NAS, automatické stahování a notifikace.

Sestav si svůj Netflix za večer: Docker, Transmission, Jellyfin a Telegram-bot
Advertisement 728x90

# Vytvoření domácího mediálního serveru: Transmission, Jellyfin a Telegram-bot v Dockeru

Za jeden večer lze sestavit plnohodnotný domácí mediální server s pohodlným ovládáním přes Telegram. Místo zastaralého rozhraní Transmission — moderní Flood UI, místo ručního kopírování souborů — automatická indexace v Jellyfin a místo neustálého sledování — upozornění na dokončení stahování přímo v messengeri. Vše běží na síťovém úložišti (NAS) a spouští se jedním příkazem přes Docker.

Architektura řešení na bázi Docker

V jádru systému jsou tři kontejnery propojené společnou souborovou soustavou přes CIFS-svazek. Transmission stahuje torrenty, Jellyfin indexuje mediální soubory a poskytuje rozhraní pro prohlížení, zatímco Telegram-bot slouží jako uživatelské rozhraní pro ovládání a upozornění. Klíčovým prvkem je použití Docker volume s ovladačem CIFS, což umožňuje přímo připojit síťovou sdílenou složku do kontejnerů bez vazby na lokální souborovou soustavu hostitele.

Typická chyba začátečníků — pokus použít bind mount pro síťové disky ve Windows. Kvůli specifikům WSL2 tyto cesty nejsou v kontejnerech vidět. Řešení — explicitní uvedení typu svazku jako cifs s parametry připojení:

Google AdInline article slot
volumes:
  downloads:
    driver: local
    driver_opts:
      type: cifs
      device: ${SMB_HOST}
      o: "username=${SMB_USER},password=${SMB_PASSWORD},vers=3.0,uid=1000,gid=1000,file_mode=0777,dir_mode=0777"

Oba služby — Transmission i Jellyfin — tento svazek využívají, ale s různými body připojení uvnitř kontejnerů, což zajišťuje konzistenci cest a eliminuje konflikty.

Nastavení Telegram-bota a automatizace

Bot je implementován v Pythonu s použitím knihovny python-telegram-bot a komunikuje s Transmission přes jeho RPC API. Běží v režimu sdíleného síťového zásobníku s kontejnerem Transmission (network_mode: "service:transmission"), což vylučuje potřebu přeposlouchání dalších portů a snižuje latenci.

Hlavní možnosti bota:

Google AdInline article slot
  • Přidávání torrentů odesláním .torrent-souborů nebo magnet-odkazů
  • Automatická upozornění na dokončení stahování s ukazatelem postupu v Unicode
  • Ovládání aktivních stahování přes tlačítka ve zprávách
  • Filtrování upozornění, aby se zabránilo duplikacím při restartu

Ukazatel postupu je realizován jednoduchou funkcí:

def progress_bar(pct, width=12):
    filled = round(pct * width)
    return "█" * filled + "░" * (width - filled)

Pro zabránění spamu při restartu bota se používá mechanismus sledování již dokončených torrentů podle jejich ID. Při startu skript inicializuje množinu completed_ids a upozornění se odesílají pouze pro nově dokončená stahování.

Jemné nastavení Transmission a obcházení omezení image

Oficiální image linuxserver/transmission má jednu vlastnost — při každém spuštění přepíše část nastavení z settings.json a ignoruje proměnné prostředí. To se týká parametrů jako watch-dir, download-dir a incomplete-dir. Řešení — použití mechanismu custom-cont-init.d, který umožňuje spouštět libovolné skripty po inicializaci, ale před spuštěním démona.

Google AdInline article slot

Příklad skriptu 01-fix-settings.sh:

#!/bin/sh
mkdir -p /downloads/Downloads
mkdir -p /downloads/.incomplete
mkdir -p /downloads/watch

SETTINGS=/config/settings.json
if [ -f "$SETTINGS" ]; then
    sed -i 's|"watch-dir": ".*"|"watch-dir": "/downloads/watch"|' $SETTINGS
    sed -i 's|"watch-dir-enabled": false|"watch-dir-enabled": true|' $SETTINGS
    sed -i 's|"download-dir": ".*"|"download-dir": "/downloads/Downloads"|' $SETTINGS
    sed -i 's|"incomplete-dir": ".*"|"incomplete-dir": "/downloads/.incomplete"|' $SETTINGS
    sed -i 's|"incomplete-dir-enabled": false|"incomplete-dir-enabled": true|' $SETTINGS
fi

Další problém — instalace Flood UI. V nových verzích image byly třetí strany rozhraní odstraněny. Je nutné ručně stáhnout archiv z GitHub a rozbalit ho do složky config/flood-ui/. Pro automatizaci tohoto procesu je v repozitáři připraven skript setup-flood.sh.

První spuštění Jellyfin a integrace s televizorem

Po spuštění kontejnerů otevřete webové rozhraní Jellyfin na adrese http://localhost:8096. Proces počátečního nastavení zahrnuje vytvoření uživatele a přidání mediální knihovny. Jako zdroj uveďte cestu /media/Downloads — přesně tak je připojena společná složka uvnitř kontejneru Jellyfin.

Jellyfin automaticky:

  • Prohledává obsah složky
  • Rozpoznává typ obsahu (filmy, seriály)
  • Načítá metadata a plakáty z TMDB
  • Generuje pohodlnou navigaci podle žánrů, let, herců

Pro prohlížení na televizi nainstalujte oficiální aplikaci Jellyfin (podporováno Android TV, Apple TV, Fire TV, Roku). Při prvním spuštění zadejte lokální IP adresu hostitele a port 8096. Autorizace probíhá přes dříve vytvořeného uživatele.

Časté otázky a rozšíření funkcionality

Co dělat, když nemáte NAS? Nahraďte CIFS-svazek lokální složkou s volbou bind:

volumes:
  downloads:
    driver: local
    driver_opts:
      type: none
      device: /absolute/path/to/folder
      o: bind

Jak přidat VPN? Použijte kontejner gluetun a přesuňte Transmission do jeho síťového prostoru:

transmission:
  network_mode: "service:gluetun"
  depends_on:
    - gluetun

Jak aktualizovat systém? Proveďte:

docker compose pull && docker compose up -d

Jak získat přístup zvenčí? Použijte Tailscale nebo Cloudflare Tunnel — je to bezpečnější než přeposlouchání portů na routeru.

Co je důležité

  • Použití CIFS volume místo bind mount je klíčové pro práci se síťovými disky v Docker Desktop na Windows
  • Mechanismus custom-cont-init.d umožňuje obcházet omezení oficiálního image Transmission
  • Sdílený síťový zásobník mezi botem a Transmission zjednodušuje architekturu a zvyšuje spolehlivost
  • Jellyfin automaticky obohacuje mediální soubory metadaty — není třeba nic nastavovat ručně
  • Všechna data jsou uložena na externím NAS, což činí systém odolným vůči přeinstalaci OS

— Editorial Team

Advertisement 728x90

Číst dál