# 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í:
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:
- 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.
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
Zatím žádné komentáře.