Toto je starší verze dokumentu!
Nextcloud
Při instalaci Nextcloudu v Dockeru jsem se rozhodl zdokumentovat postup a zároveň sdílet zkušenosti s problémy, na které jsem narazil. Použití Dockeru je často výhodné pro snadnou správu kontejnerů, ale i zde je potřeba věnovat pozornost několika detailům.
Problémy s náhledy a přehráváním videí
Během používání Nextcloudu jsem narazil na problém s nezobrazováním náhledů videí. Po krátkém zkoumání jsem zjistil, že je potřeba doinstalovat nástroj ffmpeg do Docker kontejneru, aby Nextcloud mohl generovat náhledy videí.
Níže je uveden obsah mého Dockerfile, který přidává podporu pro ffmpeg a kvůli jinému pluginu rovnou exiftool:
# Vyjdeme z oficiálního obrazu Nextcloud FROM nextcloud:apache # Přepneme na uživatele root pro instalaci balíčků USER root # Nainstalujeme ffmpeg a exiftool RUN apt-get update && apt-get install --no-install-recommends -y ffmpeg libimage-exiftool-perl && apt-get clean
Tento Dockerfile zajišťuje:
- Instalaci ffmpeg, který je nezbytný pro generování náhledů videí.
- Instalaci ExifTool, který může být užitečný pro manipulaci s EXIF daty.
Konfigurace náhledů v Nextcloudu
Kromě instalace ffmpeg bylo nutné upravit soubor `config.php` v konfiguraci Nextcloudu. Přidal jsem následující nastavení (dle zdroje):
'enable_previews' => true, 'enabledPreviewProviders' => array ( 0 => 'OC\\Preview\\TXT', 1 => 'OC\\Preview\\MarkDown', 2 => 'OC\\Preview\\OpenDocument', 3 => 'OC\\Preview\\PDF', 4 => 'OC\\Preview\\MSOffice2003', 5 => 'OC\\Preview\\MSOfficeDoc', 6 => 'OC\\Preview\\Image', 7 => 'OC\\Preview\\Photoshop', 8 => 'OC\\Preview\\TIFF', 9 => 'OC\\Preview\\SVG', 10 => 'OC\\Preview\\Font', 11 => 'OC\\Preview\\MP3', 12 => 'OC\\Preview\\Movie', 13 => 'OC\\Preview\\MKV', 14 => 'OC\\Preview\\MP4', 15 => 'OC\\Preview\\AVI', ),
Po těchto úpravách začaly náhledy videí fungovat, avšak přehrávání videí přímo v prohlížeči stále nefungovalo.
Analýza problému přehrávání
Připojil jsem se do Docker kontejneru Nextcloudu a spustil příkaz pro analýzu videa:
docker exec -it nextcloud bash ffmpeg -i /path/to/PXL_20241104_172349059.mp4
Z výstupu jsem zjistil, že formát videa je následující:
Stream #0:2[0x3](eng): Video: hevc (Main) (hvc1 / 0x31637668), yuvj420p(pc, bt709), 1920x1080, 19807 kb/s, SAR 1:1 DAR 16:9, 30 fps, 30 tbr, 90k tbn (default)
Formát videa je HEVC (H.265), což je důvod, proč nebylo možné video přehrát v některých prohlížečích.
Podpora H.265 v prohlížečích
Podpora pro H.265 v prohlížečích je omezená:
- Firefox nepodporuje H.265 kvůli licenčním omezením.
- Google Chrome a Microsoft Edge podporují H.265 pouze při podpoře operačního systému (např. Windows 10/11).
- Safari na macOS/iOS H.265 obvykle podporuje.
Pro přehrávání videí v prohlížeči je tedy nutné videa překódovat na formát H.264, který je široce podporovaný.
Překódování videí
Překódování videa do formátu kompatibilního s prohlížeči lze provést pomocí příkazu:
ffmpeg -i /path/to/input.mp4 -vcodec libx264 -acodec aac /path/to/output.mp4
Pro zajištění kompatibility jsem na telefonu nastavil, aby se videa nahrávala přímo ve formátu H.264. Zvažuji také překódování starších videí do tohoto formátu.
Úprava EXIF dat
Nextcloud třídí fotografie podle EXIF dat, což zajišťuje správné řazení dle času pořízení. Pokud však některé fotografie EXIF data nemají, Nextcloud je automaticky zatřídí podle data nahrání. Abych zajistil správné třídění i u těchto fotografií, bylo nutné změnit jejich EXIF data.
Pro tento účel jsem použil nástroj ExifTool společně s vlastním skriptem, který umožňuje rychlou úpravu EXIF dat přímo z příkazové řádky. Skript funguje tak, že nastaví datum a čas do EXIF atributů fotografie.
Úprava EXIF dat
Nextcloud třídí fotografie podle EXIF dat, což zajišťuje správné řazení dle času pořízení. Pokud však některé fotografie EXIF data nemají, Nextcloud je automaticky zatřídí podle data nahrání. Abych zajistil správné třídění i u těchto fotografií, bylo nutné změnit jejich EXIF data. Nextcloud nemá integrovánu editaci EXIF dat. Podle diskuse ve fórech to nemají ani v plánu, protože by to bylo zbytečně náročné.
Pro tento účel jsem použil nástroj ExifTool společně s vlastním skriptem, který umožňuje rychlou úpravu EXIF dat přímo z příkazové řádky. Skript funguje tak, že nastaví datum a čas do EXIF atributů fotografie.
Skript pro úpravu EXIF dat
Níže je uveden můj skript, který jsem vytvořil pro tento účel:
#!/bin/bash # Zkontrolovat, zda jsou zadány dva argumenty if [ "$#" -ne 2 ]; then echo "Použití: $0 'YYYY-MM-DD HH:MM:SS' soubor" exit 1 fi # Parametry datum_cas="$1" soubor="$2" # Zkontrolovat, zda soubor existuje if [ ! -f "$soubor" ]; then echo "Soubor '$soubor' neexistuje!" exit 2 fi # Nastavit EXIF data pomocí ExifTool exiftool -overwrite_original \ -DateTimeOriginal="$datum_cas" \ -CreateDate="$datum_cas" \ -ModifyDate="$datum_cas" \ "$soubor" # Kontrola úspěšnosti if [ $? -eq 0 ]; then echo "EXIF data úspěšně nastavena pro '$soubor' na '$datum_cas'." else echo "Došlo k chybě při nastavování EXIF dat." exit 3 fi
Tento skript umožňuje snadnou změnu datumu a času v EXIF datech souboru. Stačí spustit skript s parametry v následujícím formátu:
./skript.sh 'YYYY-MM-DD HH:MM:SS' cesta_k_souboru
Například:
./skript.sh '2024-12-31 12:34:56' fotka.jpg
Po úspěšném provedení skriptu jsou EXIF data aktualizována a fotografie bude správně zatříděna v Nextcloudu.
Problémy s mobilní aplikací na synchronizaci fotek a videí
Při synchronizaci souborů z telefonu do Nextcloudu jsem narazil na problém, který způsobuje, že nahrávání fotek a videí nefunguje správně. Bohužel se zdá, že jde o aktuální chybu v aplikaci nebo na straně serveru Nextcloudu. Doufám, že tato situace bude brzy vyřešena, jak se uvádí v této diskusi: Photo upload does not work anymore.
Alternativně jsem v jiné diskusi narazil na doporučení používat aplikaci FolderSync jako náhradu za oficiální mobilní aplikaci Nextcloudu: Auto upload on Android not uploading anything. FolderSync nabízí pokročilé možnosti synchronizace a může být užitečnou alternativou.
Podrobný návod na nastavení FolderSync najdete zde: FolderPair Settings - Advanced.
Přestože FolderSync může sloužit jako náhradní řešení, má jedno zásadní omezení: vytváří jinou strukturu složek. Na rozdíl od Nextcloudu neumí automaticky generovat podsložky, což může být při organizaci souborů nevýhodné. Toto je tedy aspekt, který je třeba zvážit při rozhodování, zda tuto aplikaci používat.
Přestože FolderSync může sloužit jako náhradní řešení, má jedno zásadní omezení: vytváří jinou strukturu složek. Na rozdíl od Nextcloudu neumí automaticky generovat podsložky, což může být při organizaci souborů nevýhodné. Toto je tedy aspekt, který je třeba zvážit při rozhodování, zda tuto aplikaci používat.
Dočasné řešení problému s autouploadem
Jako dočasné řešení problému s automatickým nahráváním souborů jsem se rozhodl nainstalovat starší verzi aplikace Nextcloud prostřednictvím F-Droidu. Konkrétně jsem zvolil verzi 3.30.4, která funguje bez problémů.
Výhodou F-Droidu je možnost výběru konkrétní verze aplikace při instalaci. V nabídce jsem viděl celkem tři dostupné starší verze, což usnadňuje volbu při testování, která z nich bude nejlépe vyhovovat.
Ve zdrojových kódech pro Android jsou nahlášeny chyby. Problematická verze je 3.30.6. Takže nezbývá než počkat na opravu a novější verzi a zatím fungovat na starší.
Instalace Face Recognition v Nextcloudu
Při hledání řešení pro rozpoznávání obličejů v Nextcloudu jsem narazil na plugin Face Recognition, který je dostupný na GitHubu. Instalace samotného pluginu v Nextcloudu však nestačí, protože v Docker kontejneru chybí potřebné knihovny, které plugin vyžaduje.
Na stránce Docker Wiki pluginu jsem našel návod na instalaci potřebných knihoven. Bohužel se mi zatím nepodařilo knihovny zkompilovat. Možná je problém v architektuře, protože se pokouším plugin zprovoznit na zařízení Raspberry Pi 4 s 32bitovým operačním systémem.
Plánuji se k tomuto problému vrátit později a vyzkoušet další možnosti, jak knihovny úspěšně nainstalovat a plugin zprovoznit.
Spouštění OCC příkazů v Nextcloudu
Pro správu Nextcloudu je často potřeba spouštět příkazy přes rozhraní OCC (OwnCloud Console). V případě instalace Nextcloudu v Dockeru je nutné OCC příkazy spouštět specifickým způsobem, například:
docker exec -u 33 -it nextcloud php /var/www/html/occ
Tento příkaz provádí následující kroky:
- docker exec: Spustí příkaz uvnitř běžícího Docker kontejneru.
- -u 33: Specifikuje uživatele s ID 33, což je ve výchozím nastavení uživatel www-data, který má oprávnění ke správě Nextcloudu.
- -it: Spustí příkaz v interaktivním režimu.
- nextcloud: Název kontejneru, ve kterém běží instance Nextcloudu.
- php /var/www/html/occ: Spouští konzolovou aplikaci OCC pomocí PHP.
Jedním z užitečných OCC příkazů je například:
docker exec -u 33 -it nextcloud php /var/www/html/occ files:scan myuser
Tento příkaz je určen pro manuální rescan souborů konkrétního uživatele (v tomto případě uživatele myuser). To může být užitečné v následujících situacích:
- Pokud byly soubory nahrány přímo do úložiště Nextcloudu mimo oficiální aplikaci (např. přes SFTP nebo jiný nástroj).
- Pokud došlo ke změnám v souborové struktuře, které nejsou automaticky zohledněny.
- Pro synchronizaci databáze Nextcloudu s aktuálním stavem souborového systému.
Příkaz projde souborový systém, zkontroluje všechny soubory a složky uživatele a aktualizuje databázi Nextcloudu, aby odrážela aktuální stav úložiště.
Příkaz OCC maintenance:repair
Dalším užitečným příkazem v Nextcloudu je:
docker exec -u 33 -it nextcloud php /var/www/html/occ maintenance:repair --include-expensive
Tento příkaz spouští údržbový proces, který slouží k opravě různých problémů v databázi a souborovém systému Nextcloudu.
- php /var/www/html/occ maintenance:repair: Spouští údržbový proces, který provádí automatické opravy.
- –include-expensive: Tento přepínač zahrnuje i časově náročné opravy, které vyžadují více prostředků a mohou trvat delší dobu.
Tento příkaz je vhodné použít v situacích, kdy je třeba opravit databázové nesrovnalosti nebo jiné problémy, které mohou nastat při běhu Nextcloudu. Například:
- Po ruční manipulaci se soubory nebo databází.
- Při problémech s indexy databáze.
- Po neúspěšné aktualizaci nebo instalaci aplikací.
- Když dojde ke ztrátě integrity některých dat.
Příklady oprav, které příkaz provádí
- Rekonstrukce chybějících databázových indexů.
- Oprava duplicitních nebo nekonzistentních záznamů v databázi.
- Aktualizace souborových metadat.
- Synchronizace oprávnění a vlastnictví souborů.
Použití přepínače –include-expensive je užitečné zejména při větších instalacích nebo složitějších problémech, protože tento přepínač zahrnuje komplexní opravy, které jsou standardně vypnuté kvůli vyšším nárokům na výkon a čas.
Příkaz OCC preview:generate-all
Pro použití jsem musel nejprve nainstalovat v Nextcloudu plugin previewgenerator. Podrobnosti k příkazům a možnostem jsou v dokumentaci.
Tento příkaz slouží k vygenerování všech náhledů obrázků v Nextcloudu pro specifikovanou složku. Konkrétní příklad příkazu je:
docker exec -u 33 -it nextcloud php /var/www/html/occ preview:generate-all --path="/myuser/files/Photos"
- –path=„/myuser/files/Photos“: Specifikuje konkrétní složku (v tomto případě složku Photos uživatele myuser), pro kterou se náhledy generují.
Tento příkaz je užitečný v situacích, kdy:
- Je potřeba vygenerovat náhledy obrázků pro nově přidané soubory, například po ručním nahrání přes SFTP nebo jiný externí nástroj.
- Chcete zrychlit procházení obrázků ve webovém rozhraní Nextcloudu, protože předem vygenerované náhledy minimalizují zatížení serveru při prohlížení.
- Po instalaci nebo konfiguraci pluginů, které upravují zpracování náhledů.
Výhody a upozornění
- Výhody: Předem vygenerované náhledy zlepšují uživatelský zážitek a snižují nároky na výkon serveru během procházení obrázků.
- Upozornění: Proces generování náhledů může být časově náročný, zvláště pokud složka obsahuje velké množství obrázků nebo pokud je server méně výkonný. Doporučuje se tento příkaz spouštět mimo špičku, aby nedošlo k ovlivnění běhu aplikace.
Tento příkaz je tedy ideální pro správu a optimalizaci náhledů v Nextcloudu, zejména pro složky s mnoha obrázky.
Nastavení cronu v Nextcloudu
Pro správné fungování Nextcloudu je důležité nastavit cron, který se stará o pravidelné provádění úloh na pozadí. Tyto úlohy zahrnují například:
- Aktualizace metadat souborů.
- Mazání starých a nepotřebných dat.
- Synchronizaci a další operace nutné pro plynulý chod aplikace.
Webcron vs systémový cron
Nejprve jsem se pokusil nastavit webcron, který spouští úlohy při přístupu přes webový prohlížeč. Tento přístup však nedostačoval při větším množství nahraných souborů, protože úlohy nestíhaly být vykonány včas. Proto jsem musel přejít na systémový cron, který spouští úlohy pravidelně podle definovaného plánu.
Nastavení systémového cronu
Pro konfiguraci jsem přidal následující řádek do souboru `/etc/crontab`:
*/5 * * * * root /usr/bin/docker exec -u 33 nextcloud php /var/www/html/cron.php > /dev/null
Tento příkaz zajišťuje spuštění úloh každých 5 minut uvnitř Docker kontejneru, kde běží Nextcloud. Všechny výstupy jsou přesměrovány na /dev/null, aby nebyly ukládány.
Maximální délka spuštění příkazu je 15 minut, pak skončí. Takže při velkém množství zpracování by měli v jednu chvíli v časovém intervalu běžet maximálně 3 instance.
Přehled úloh na pozadí
Pro získání přehledu o aktuálních úlohách lze použít následující příkaz:
docker exec -u 33 -it nextcloud php /var/www/html/occ background-job:list
Struktura výstupu obsahuje následující informace:
- id: Jedinečný identifikátor úlohy v databázi.
- class: Třída odpovědná za vykonání úlohy (např. aktualizace metadat nebo mazání starých souborů).
- last_run: Datum a čas posledního spuštění úlohy.
- argument: Parametry předané úloze, které mohou být specifické (např. uživatelské jméno, ID souboru).
Kontrola nastavení
Po nastavení cronu je dobré zkontrolovat jeho funkčnost v administrátorském rozhraní Nextcloudu v sekci Základní nastavení → Úlohy na pozadí. Zde je možné ověřit, zda cron probíhá podle očekávání a úlohy jsou správně vykonávány.
Instalace Recognition v Nextcloudu
Plugin Recognize slouží k automatickému rozpoznávání obsahu médií v Nextcloudu. Umožňuje automatické přidávání tagů k fotografiím, videím a hudbě, čímž usnadňuje jejich kategorizaci a vyhledávání. Plugin dokáže:
- 📷 👪 Rozpoznávat obličeje na fotografiích (např. z kontaktů).
- 📷 🏔 Rozpoznávat zvířata, krajiny, jídlo, vozidla, budovy a další objekty.
- 📷 🗼 Rozpoznávat památky a monumenty.
- 👂 🎵 Rozpoznávat hudební žánry.
- 🎥 🤸 Rozpoznávat lidské akce na videích.
Plugin využívá systém Collaborative Tags Nextcloudu, což umožňuje například:
- 👂 Poslouchat označenou hudbu pomocí aplikace audioplayer.
- 📷 Prohlížet označené fotografie a videa v aplikaci photos.
Plugin je dostupný na GitHubu: Recognize.
Velikosti modelů:
- Object recognition: 1GB
- Landmark recognition: 300MB
- Video action recognition: 50MB
- Music genre recognition: 50MB
Požadavky a instalace
Plugin jsem nejprve nainstaloval v Nextcloudu jako administrátor. Během instalace jsem zjistil, že plugin vyžaduje nainstalovanou verzi Node.js 20.9 a vyšší. Pro instalaci Node.js na Raspberry Pi 4 jsem využil návod z článku: Install Node.js 20 on Raspberry Pi 4.
Do svého Dockerfile jsem přidal následující část pro instalaci Node.js:
# Node.js for Recognize # source for node.js: https://xavier.arnaus.net/blog/install-nodejs-20-into-a-raspberry-pi-4 RUN apt-get update && apt-get install -y \ ca-certificates \ curl \ gnupg && \ curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | gpg --dearmor -o /usr/share/keyrings/nodesource.gpg && \ echo "deb [signed-by=/usr/share/keyrings/nodesource.gpg] https://deb.nodesource.com/node_20.x nodistro main" | tee /etc/apt/sources.list.d/nodesource.list && \ apt-get update && \ apt-get install -y nodejs && \ apt-get clean && rm -rf /var/lib/apt/lists/*
Po dokončení instalace Node.js jsem nainstaloval modely pro rozpoznávání pomocí příkazu:
docker exec -u 33 -it nextcloud php /var/www/html/occ recognize:download-models
Výkon a použití
Vzhledem k tomu, že plugin běží na Raspberry Pi 4, je výkon omezený. Předpokládám postupné dodávání fotografií v malém množství (jednotky fotografií za den), což by zařízení mělo bez problémů zvládnout.
Ignorování adresářů
Pokud nechcete, aby byl určitý adresář procházen při rozpoznávání, můžete do něj přidat příslušné soubory:
- .noimage: Pro vyloučení z rozpoznávání obrázků.
- .nomusic: Pro vyloučení z rozpoznávání hudebních žánrů.
- .novideo: Pro vyloučení z rozpoznávání videí.
- .nomedia: Pro úplné vyloučení z rozpoznávání.
Například pro ignorování všech souborů v cestě `path/to/your/folder/*` přidejte soubor `path/to/your/folder/.nomedia`.
Nastavení tmpfs v docker-compose.yml
tmpfs je speciální typ souborového systému, který uchovává data přímo v paměti (RAM) místo na disku. To znamená, že přístup k těmto datům je výrazně rychlejší, protože eliminuje potřebu čtení a zápisu na fyzický disk. Použití tmpfs může být užitečné zejména pro dočasné soubory, které nepotřebují trvalé uložení.
Proč použít tmpfs v Nextcloudu
Plugin Recognize dočasně ukládá soubory k rozpoznání do adresáře `/tmp`. Při použití Dockeru může být výhodné mapovat tento adresář do paměti pomocí tmpfs. Tím se zvyšuje rychlost zpracování souborů a zároveň se snižuje zatížení pevného disku.
⚠️ Pozor: Pro použití tmpfs je důležité zajistit, že váš systém má dostatek volné RAM. V opačném případě mohou selhat veřejné nahrávky nebo práce s velkými soubory.
Nastavení tmpfs v docker-compose.yml
Pro přidání tmpfs do Docker Compose souboru jsem použil následující konfiguraci:
services: app: image: nextcloud-apache ... volumes: - type: tmpfs target: /tmp tmpfs: mode: "1777" # Volitelně: nastavení oprávnění ...
Tato konfigurace:
- Vytváří tmpfs svazek namapovaný na `/tmp`.
- Ukládá dočasná data přímo do paměti, což zrychluje zpracování.
- Nastavuje oprávnění pomocí volitelného parametru mode, kde `1777` zajišťuje, že adresář `/tmp` je zapisovatelný pro všechny uživatele.
Výhody a omezení
- Výhody:
- Výrazně vyšší rychlost při práci s dočasnými soubory.
- Snížení opotřebení disku.
- Omezení:
- Velikost tmpfs je omezena velikostí dostupné RAM.
- Velké soubory nebo velké množství dočasných souborů mohou vést k vyčerpání paměti a selhání aplikace.
Použití tmpfs je tedy skvělým řešením pro zvýšení výkonu, pokud máte dostatečné množství paměti a chcete minimalizovat zátěž pevného disku.
Nastavení grafického rozhraní po instalaci
Řešení problému s připojením k databázi v Nextcloudu
Při provozu Nextcloudu jsem narazil na chyby v logu související s připojením k databázovému serveru PostgreSQL. Záznamy v logu naznačovaly, že Nextcloud nemůže vytvořit nové připojení k databázi kvůli vyčerpání dostupných připojení. Chyba vypadala například takto:
OC\DB\Exceptions\DbalException: An exception occurred in the driver: SQLSTATE[08006] [7] connection to server at "postgres" (192.168.32.9), port 5432 failed: FATAL: remaining connection slots are reserved for roles with the SUPERUSER attribute
Interpretace chyby
- Nedostatek dostupných připojení: PostgreSQL omezuje počet současně aktivních připojení k databázovému serveru. Pokud je tento počet vyčerpán, zbývající sloty jsou rezervovány pro uživatele s atributem SUPERUSER. To znamená, že běžné uživatelské připojení (např. používané Nextcloudem) nemůže být vytvořeno.
- Doctrine\DBAL\Exception: Knihovna Doctrine DBAL, kterou Nextcloud využívá pro práci s databází, nemohla navázat připojení kvůli výše uvedenému problému.
- SQLSTATE[08006]: Tato chyba indikuje selhání připojení k databázovému serveru.
Příčina
Hlavní příčinou problému bylo nízké nastavení maximálního počtu připojení v PostgreSQL. Výchozí hodnota parametru `max_connections` byla příliš nízká pro požadavky aplikace.
Řešení
Pro vyřešení problému jsem zvýšil hodnotu parametru `max_connections` v konfiguračním souboru PostgreSQL:
1. Otevřete konfigurační soubor PostgreSQL (obvykle se nachází v `/etc/postgresql/<verze>/main/postgresql.conf`). 2. Najděte a upravte následující řádek:
max_connections = 300
Tato hodnota určuje maximální počet současně aktivních připojení. Zvýšení z výchozí hodnoty (obvykle 100) na 300 by mělo být dostatečné pro většinu menších a středně velkých instalací.
3. Restartujte PostgreSQL server, aby se změny projevily:
sudo systemctl restart postgresql
Doporučení
Po úpravě konfiguračního souboru jsem problém znovu monitoroval. Dále je vhodné pravidelně kontrolovat přehled vytížení připojení a zajistit, že žádné procesy zbytečně nespotřebovávají připojení. To lze provést pomocí příkazů v PostgreSQL, například:
SELECT * FROM pg_stat_activity;
Tímto způsobem lze identifikovat potenciální problémy a optimalizovat přístup k databázi.