Proč mít Kuki TV v Dockeru?

Co je Kuki TV? Kuki TV je televizní aplikace pro počítač, ale i pro Android a chytré televize. Tato televize (alespoň podle mého názoru) je aplikace postavená na KODI (původně XBMC). Velkou výhodou je, že má i podporu pro Linux. Přesněji pro Ubuntu, Debian a Archlinux a přesně tohle je kámen úrazu. Používám totiž všude Fedoru a nehodlám to měnit jenom proto, že tato aplikace to nepodporuje.

Upozorňuji, že následující návod není ideálně bezpečný, pro domácí použití je podle mého názoru v pořádku, ale nedoporučuji toto řešení používat na důležitém / jednoduše napadnutelném stroji. Pro fungování Kuki v Dockeru se kontejner zapíná jako privilage a kontejner získává přístup ke grafickému prostředí uživatele. Ani jedna z těchto věcí není ideálně bezpečná.

Tento návod slouží mimo jiné i jako návod na obecné vyřešení problému jak tunelovat z kontejneru zvuk a jak rozjet v kontejneru grafickou kartu.

Možné řešení

Virtuální stroj - tohle řešení je to nejjednodušší. Prostě a jednoduše si člověk vytvoří VM a nainstaluje si do něj Ubuntu/Debian/Archlinux a poté Kuki. Nevýhoda tohoto řešení je, že poté musíte mít na disku VM, která zabírá nemálo místa a ještě dlouho trvá, než si televizi zapnete, protože musí naběhnout virtuální stroj.

Wine - vzít si Windows variantu a spustit ji přes Wine, může a nemusí fungovat. Tak nebo tak, tohle řešení může přínést hromadu komplikací. A také aplikace má podporu pro Linux, tak proč zkoušet Windows variantu?

Flatpak - je řešení kontejnerů pro uživatelské aplikace. Výhoda je, že každá aplikace si může dotáhnout s sebou co potřebuje a je při spuštění izolovaná od systému. Tohle je asi nejlepší řešení, ale jelikož znám Docker víc než Flatpak, tak jsem se prozatím rozhodl pro Docker. Do budoucna mám plán zkusit i tuto variantu.

Docker - není to zrovna elegantní řešení, ale podle mých měřítek asi nejlepší. Docker kontejner je rychlý na naběhnutí (téměr okamžitý) a nebere skoro žádné systémové prostředky.

Vytvoření kontejneru

Projdeme si zajímavé části Docker file krok po kroku.

Obecné nastavení

FROM ubuntu:16.04

Základ pro tento kontejner je Ubuntu kontejner 16.04. Tahle verze je doporučená aplikací Kuki.

ENV TZ Europe/Prague

RUN apt-get update && apt-get install -y tzdata
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

Nastavení časové zóny, aby správně fungovala, musí se nainstalovat balík tzdata a nastavit se soubory /etc/localtime a /etc/timezone.

Video

První ze všeho potřebujete nainstalovat ovladače pro grafickou kartu. K tomu potřebujete vědět jaké ovladače nainstalovat. Ubuntu doporučuje pro zjištění, které ovladače potřebujete, vytvořit kontejner pouze s nainstalovaným balíkem ubuntu-drivers-common a spustit kontejner s příkazem ubuntu-drivers devices. Tento příkaz by měl sdělit, který balíček je potřebný pro instalaci. Nadále v návodu vysvětlím instalaci Intel a NVidia grafických karet, tak jak to funguje pro můj hardware,
zmíněné verze balíčku můžete zaměnit za to, co vrátil ubuntu-drivers příkaz.

Grafické karty Intel

RUN apt-get install -y xserver-xorg-video-intel

Pro grafické karty intel stačí nainstalovat ovladače xserver-xorg-video-intel a vše ostatní by mělo prostě fungovat.

Grafické karty NVidia

Zde je situace mnohem složitější. Pro fungování dockeru s NVidia grafickou kartou potřebujete použít NVidia docker. Ve zkratce potřebujete na počítač (ne do kontejneru) nainstalovat tuto utilitu za pomoci návodu zde. A nastavit správně prostředí v kontejneru.

LABEL com.nvidia.volumes.needed="nvidia_driver"
ENV PATH /usr/local/nvidia/bin:${PATH}
ENV LD_LIBRARY_PATH /usr/local/nvidia/lib:/usr/local/nvidia/lib64:${LD_LIBRARY_PATH}

Tímto v jednoduchosti řeknete kde má kontejner hledat knihovny pro grafickou kartu, které fungují v kontejneru.

Poté musíte spouštět kontejner přes příkaz nvidia-docker místo příkazu docker.

Audio

RUN apt-get update && apt-get install -y pulseaudio

Pro zprovoznění zvuku je potřeba do kontejneru nainstalovat pulseaudio.

Nainstalovat Kuki TV

RUN apt-get install -y curl libcurl3 && \
curl http://linux.kuki.cz/kuki.pgp | apt-key add - && \
echo "deb http://linux.kuki.cz/ xenial kuki" > /etc/apt/sources.list.d/kuki.list
RUN apt-get update && apt-get install -y kuki

Jednoduše spustíme příkazy jak jsou napsány v návodu na stránkách Kuki TV.

Finální nastavení kontejneru

RUN adduser --disabled-password --gecos "Kuki user" --uid 1000 kuki

USER kuki
ENV HOME /home/kuki

Přídáme uživatele, který bude aplikaci Kuki v kontejneru spouštět pro zvýšení bezpečnosti.
Zároveň nastavíme i jeho domovskou složku.

COPY kuki-pulse /usr/local/bin/kuki-pulse
RUN chmod 755 /usr/local/bin/kuki-pulse

Nakopírujeme do kontejneru spouštěcí soubor pro Kuki TV, který zároveň umožní tunelovat PulseAudio ven z kontejneru. Tohle bude potřeba připojit i na straně počítače, ale k tomu se ještě dostaneme v sekci integrace.

CMD /usr/local/bin/kuki-pulse

Nastavíme defaultní příkaz pro spouštění kontejneru. Tohle zjednodušší budoucí práci s kontejnerem.

Integrace do hostitelského počítače

Audio

Proto abychom dostali z kontejneru Audio, tak potřebujeme využít tunelování co se nastavuje při spouštění Kuki v Docker kontejneru. To uděláme tak, že nainstalujeme aplikaci paprefs (balíček s tímto jménem je přímo ve Fedorě. Poté paprefs spustíme a pokračujeme do záložky Síťové nastavení a zapneme Povolit síťový přístup k místním zdrojům[4].

Poté ještě potřebujeme povolit port ve firewall. Pokud používáte defaultní firewalld, tak to provedete přes tento příkaz:

sudo firewall-cmd --add-port=4713/tcp --permanent
sudo firewall-cmd --reload

Nyní jsme schopni spustit Kuki TV.

Spuštění Kuki provedete tímto příkazem:

sudo docker run -ti --rm -e DISPLAY=unix$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -v /home/$USER/.kuki:/home/kuki/.kuki --privileged kuki

nebo za pomoci skriptu v repozitáři

./run_kuki.sh

Snadnější spouštění

Pokud chcete mít Kuki jako program v systému stačí nakopírovat složku share která je v repozitáři do ~/.local/share/ a skript run_kuki.sh do ~/bin/. Tohle je ale integrace pouze pro aktuálního uživatele.

Pro integraci do systému nakopírujte složku ~/.local/share/ do /usr/share/ a run_kuki.sh do /bin/.

[4]: Systém mám v Angličtině, takže se překlad možná malinko liší