# Tworzenie domowego serwera mediów: Transmission, Jellyfin i bot Telegram w Dockerze
W jeden wieczór można złożyć pełnowartościowy domowy serwer mediów z wygodnym zarządzaniem przez Telegram. Zamiast przestarzałego interfejsu Transmission — nowoczesny Flood UI, zamiast ręcznego kopiowania plików — automatyczna indeksacja w Jellyfin, a zamiast ciągłego monitorowania — powiadomienia o zakończeniu pobierania prosto w komunikatorze. Wszystko to działa na sieciowym magazynie (NAS) i uruchamia się jedną komendą przez Docker.
Architektura rozwiązania opartego na Docker
W podstawie systemu — trzy kontenery, połączone wspólnym systemem plików przez tom CIFS. Transmission pobiera torrenty, Jellyfin indeksuje pliki medialne i udostępnia interfejs do oglądania, a bot Telegram pełni rolę interfejsu użytkownika do zarządzania i powiadomień. Kluczowy element — użycie woluminu Docker z sterownikiem CIFS, co pozwala bezpośrednio montować udział sieciowy wewnątrz kontenerów bez wiązania z lokalnym systemem plików hosta.
Typowy błąd początkujących — próba użycia bind mount dla dysków sieciowych w Windows. Z powodu specyfiki WSL2 takie ścieżki nie są widoczne wewnątrz kontenerów. Rozwiązanie — jawne określenie typu tomu jako cifs z parametrami połączenia:
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 serwisy — Transmission i Jellyfin — używają tego tomu, ale z różnymi punktami montowania wewnątrz kontenerów, co zapewnia spójność ścieżek i brak konfliktów.
Konfiguracja bota Telegram i automatyzacji
Bot jest zaimplementowany w Pythonie z biblioteką python-telegram-bot i komunikuje się z Transmission przez jego RPC API. Działa w trybie współdzielonego stosu sieciowego z kontenerem Transmission (network_mode: "service:transmission"), co eliminuje potrzebę przekazywania dodatkowych portów i zmniejsza opóźnienie.
Główne funkcje bota:
- Dodawanie torrentów przez wysyłanie plików .torrent lub linków magnet
- Automatyczne powiadomienia o zakończeniu pobierania z paskiem postępu w Unicode
- Zarządzanie aktywnymi pobieraniami przez przyciski w wiadomościach
- Filtrowanie powiadomień, aby uniknąć duplikatów przy restarcie
Pasek postępu jest zaimplementowany prostą funkcją:
def progress_bar(pct, width=12):
filled = round(pct * width)
return "█" * filled + "░" * (width - filled)
Aby zapobiec spamowi przy restarcie bota, używany jest mechanizm śledzenia już ukończonych torrentów po ich ID. Przy starcie skrypt inicjalizuje zbiór completed_ids, a powiadomienia są wysyłane tylko dla nowych ukończonych pobrań.
Drobne dostrojenie Transmission i obejście ograniczeń obrazu
Oficjalny obraz linuxserver/transmission ma jedną cechę — przy każdym uruchomieniu nadpisuje część ustawień z settings.json, ignorując zmienne środowiskowe. Dotyczy to parametrów takich jak watch-dir, download-dir i incomplete-dir. Rozwiązanie — użycie mechanizmu custom-cont-init.d, który pozwala wykonywać dowolne skrypty po inicjalizacji, ale przed uruchomieniem demona.
Przykładowy skrypt 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
Kolejny problem — instalacja Flood UI. W nowych wersjach obrazu usunięto zewnętrzne interfejsy. Należy ręcznie pobrać archiwum z GitHub i rozpakować je do folderu config/flood-ui/. Do automatyzacji tego procesu w repozytorium jest skrypt setup-flood.sh.
Pierwszy rozruch Jellyfin i integracja z telewizorem
Po uruchomieniu kontenerów otwórz interfejs webowy Jellyfin pod adresem http://localhost:8096. Proces początkowej konfiguracji obejmuje utworzenie użytkownika i dodanie biblioteki medialnej. Jako źródło podaj ścieżkę /media/Downloads — dokładnie tak jest zamontowany wspólny folder wewnątrz kontenera Jellyfin.
Jellyfin automatycznie:
- Skanuje zawartość folderu
- Określa typ treści (filmy, seriale)
- Pobiera metadane i plakaty z TMDB
- Generuje wygodną nawigację po gatunkach, latach, aktorach
Do oglądania na telewizorze zainstaluj oficjalną aplikację Jellyfin (wspierana na Android TV, Apple TV, Fire TV, Roku). Przy pierwszym uruchomieniu podaj lokalny adres IP hosta i port 8096. Autoryzacja odbywa się przez wcześniej utworzonego użytkownika.
Najczęstsze pytania i rozszerzenia funkcjonalności
Co zrobić, jeśli nie ma NAS? Zastąp tom CIFS lokalnym folderem z opcją bind:
volumes:
downloads:
driver: local
driver_opts:
type: none
device: /absolute/path/to/folder
o: bind
Jak dodać VPN? Użyj kontenera gluetun i przenieś Transmission do jego przestrzeni sieciowej:
transmission:
network_mode: "service:gluetun"
depends_on:
- gluetun
Jak zaktualizować system? Wykonaj:
docker compose pull && docker compose up -d
Jak uzyskać dostęp z zewnątrz? Użyj Tailscale lub Cloudflare Tunnel — to bezpieczniejsze niż przekazywanie portów na routerze.
Co ważne
- Użycie woluminu CIFS zamiast bind mount jest kluczowe do pracy z dyskami sieciowymi w Docker Desktop na Windows
- Mechanizm custom-cont-init.d pozwala obejść ograniczenia oficjalnego obrazu Transmission
- Wspólny stos sieciowy między botem a Transmission upraszcza architekturę i zwiększa niezawodność
- Jellyfin automatycznie wzbogaca pliki medialne metadanymi — nie trzeba nic konfigurować ręcznie
- Wszystkie dane są przechowywane na zewnętrznym NAS, co czyni system odpornym na reinstalację systemu operacyjnego
— Editorial Team
Brak komentarzy.