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', 16 => 'OC\\Preview\\HEIC', 17 => 'OC\\Preview\\HEIF', 18 => 'OC\\Preview\\EMF', ),
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.
Nastavení mobilní aplikace pro synchronizaci
Při používání mobilní aplikace Nextcloud jsem se setkal s několika problémy při synchronizaci. Proto jsem se rozhodl sepsat postup, jak aplikaci nastavit od začátku. Tento postup je možné použít i v případě, že něco nefunguje správně.
1. Vymazání dat aplikace
Pokud máte aplikaci Nextcloud již nainstalovanou v telefonu, postupujte takto:
- Přejděte do Nastavení → Aplikace a vyhledejte aplikaci Nextcloud.
- Klikněte na Úložiště a mezipaměť.
- Zvolte možnost Vymazat mezipaměť a následně Vymazat úložiště.
Tento krok vyresetuje všechna lokální nastavení aplikace. Data na serveru i multimediální data v telefonu zůstanou zachována. Tento postup pomáhá odstranit případné chyby v synchronizaci způsobené nesprávnými daty uloženými v systému.
2. Nové přihlášení a nastavení synchronizace
Spusťte aplikaci znovu, projděte přihlašovacím procesem a přejděte do menu s nastavením automatického nahrávání. Nastavte následující parametry:
- Vzdálená položka - Vyberte složku na serveru, kam chcete soubory nahrávat.
- Nahrávat pouze přes neúčtované Wi-Fi připojení - Pokud chcete synchronizovat pouze přes Wi-Fi, zaškrtněte tuto možnost.
- Také nahrát už existující soubory - Tuto volbu doporučuji vždy zaškrtnout. Pokud ji nevyberete, budou se nahrávat pouze nově vytvořené soubory (např. fotografie a videa). Spouštěčem nahrávání v tomto případě bude vytvoření nového souboru. Pokud zaškrtnete tuto možnost, nahrají se i všechny existující soubory. Tato volba je relevantní pouze při prvotním nahrávání. Po nahrání všech dat se již tato volba nepoužívá, protože následné synchronizace budou probíhat pouze pro nové soubory.
- Co udělat, pokud soubor už existuje? - Zvolte možnost Přeskočit nahrávání. Tím se zabrání vzniku duplicit, protože pokud soubor již na serveru existuje, aplikace jej vynechá a přejde k dalšímu souboru.
Ú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
Plugin Face Recognition slouží k rozpoznávání obličejů na fotografiích v Nextcloudu. Je dostupný na GitHubu: Face Recognition. Instalace v administrátorském rozhraní Nextcloudu však nestačí, zejména pokud Nextcloud běží v Dockeru. Pro správné fungování je potřeba do Dockeru přidat další knihovny.
Úprava Dockerfile
Pro instalaci Face Recognition jsem vytvořil vlastní Dockerfile s čerpáním z oficiální dokumentace: Docker Wiki. Dokumentace však není aktualizovaná, a proto jsem ji musel upravit a doplnit. Zde je moje aktuální verze:
# # Use a temporary image to compile and test the libraries # FROM nextcloud:apache as builder # Build and install dlib on builder RUN apt-get update ; \ apt-get install -y build-essential wget cmake libx11-dev libopenblas-dev ARG DLIB_BRANCH=v19.19 RUN wget -c -q https://github.com/davisking/dlib/archive/$DLIB_BRANCH.tar.gz \ && tar xf $DLIB_BRANCH.tar.gz \ && mv dlib-* dlib \ && cd dlib/dlib \ && mkdir build \ && cd build \ && cmake -DBUILD_SHARED_LIBS=ON -DCMAKE_BUILD_TYPE=Release .. \ && make \ && make install # Build and install PDLib on builder ARG PDLIB_BRANCH=master RUN apt-get install unzip RUN wget -c -q https://github.com/matiasdelellis/pdlib/archive/$PDLIB_BRANCH.zip \ && unzip $PDLIB_BRANCH \ && mv pdlib-* pdlib \ && cd pdlib \ && phpize \ && ./configure \ && make \ && make install # Enable PDlib on builder # If necesary take the php settings folder uncommenting the next line # RUN php -i | grep "Scan this dir for additional .ini files" RUN echo "extension=pdlib.so" > /usr/local/etc/php/conf.d/pdlib.ini # Install bzip2 needed to extract models RUN apt-get install -y libbz2-dev RUN docker-php-ext-install bz2 # Test PDlib instalation on builder RUN apt-get install -y git RUN git clone https://github.com/matiasdelellis/pdlib-min-test-suite.git \ && cd pdlib-min-test-suite \ && make ARG EXT_DIR RUN EXT_DIR=$(php -i | grep -oP "^extension_dir => \K[^ ]+") && \ echo $EXT_DIR > /tmp/ext_dir.txt && \ cp $EXT_DIR/pdlib.so /tmp/ # # If pass the tests, we are able to create the final image. # # Vyjdeme z oficiálního obrazu Nextcloud FROM nextcloud:apache # Přepneme na uživatele root pro instalaci balíčků #USER root # Nainstalujeme ffmpeg RUN apt-get update && apt-get install --no-install-recommends -y ffmpeg libimage-exiftool-perl && \ apt-get clean && rm -rf /var/lib/apt/lists/* # Install dependencies to image RUN apt-get update ; \ apt-get install -y libopenblas-dev libopenblas0 libbz2-dev RUN docker-php-ext-install bz2 # Install dlib and PDlib to image COPY --from=builder /usr/local/lib/libdlib.so* /usr/local/lib/ # If is necesary take the php extention folder (/usr/local/lib/php/extensions/no-debug-non-zts-20180731) uncommenting the next line # RUN php -i | grep extension_dir #COPY --from=builder /usr/local/lib/php/extensions/no-debug-non-zts-20180731/pdlib.so /usr/local/lib/php/extensions/no-debug-non-zts-20180731/ COPY --from=builder /usr/local/lib/php/extensions/no-debug-non-zts-20220829/pdlib.so /usr/local/lib/php/extensions/no-debug-non-zts-20220829/ COPY --from=builder /tmp/ext_dir.txt /tmp/ext_dir.txt COPY --from=builder /tmp/pdlib.so /tmp/pdlib.so # Extract the correct path and copy the extension RUN EXT_DIR=$(cat /tmp/ext_dir.txt) && \ cp /tmp/pdlib.so $EXT_DIR/ # Enable PDlib on final image RUN echo "extension=pdlib.so" > /usr/local/etc/php/conf.d/pdlib.ini # Pdlib is already installed now on final image without all build dependencies. # You could test again if everything is correct, uncommenting the next lines. # # RUN apt-get install -y git wget # RUN git clone https://github.com/matiasdelellis/pdlib-min-test-suite.git \ # && cd pdlib-min-test-suite \ # && make # # At this point you meet all the dependencies to install the application # You can skip this step and install the application from the application store # #ARG FR_BRANCH=master #RUN apt-get install -y wget unzip nodejs npm #RUN wget -c -q -O facerecognition https://github.com/matiasdelellis/facerecognition/archive/$FR_BRANCH.zip \ # && unzip facerecognition \ # && mv facerecognition-* /usr/src/nextcloud/facerecognition \ # && cd /usr/src/nextcloud/facerecognition \ # && make # Node.js for Recognize # 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/*
Kromě toho jsem do Docker Compose souboru přidal environment proměnnou:
environment: - PHP_MEMORY_LIMIT=1024M
Nastavení a spuštění
Po sestavení a spuštění Nextcloudu:
docker-compose build nextcloud
docker-compose up -d nextcloud
Jsem provedl následující kroky:
1. Výpis dostupných modelů pro rozpoznávání:
docker exec -u 33 -it nextcloud php /var/www/html/occ face:setup
2. Nastavení přidělené RAM paměti:
docker exec -u 33 -it nextcloud php /var/www/html/occ face:setup -M 1073741824
3. Výběr konkrétního modelu:
docker exec -u 33 -it nextcloud php /var/www/html/occ face:setup -m 3
Více informací o jednotlivých modelech: https://github.com/matiasdelellis/facerecognition/wiki/Models#model-4
Mezi jednotlivými modely lze kdykoli přepínat. Pokud chci použít model 4, musím nejdříve nainstaslovat model 1, 3 a pak je možné nainstalovat model 4.
Když přepnu mezi jednotlivými modely, tak každý model má svoje uložená data. Takže například pokud si vytrénuju model 4 a chci provést migraci dat na model 3, tak nejprve přepnu na model 3, a pak mohu provést migraci:
docker exec -u 33 -it nextcloud php /var/www/html/occ face:setup -m 3 docker exec -u 33 -it nextcloud php /var/www/html/occ face:migrate -m 4 -u admin docker exec -u 33 -it nextcloud php /var/www/html/occ face:background_job -u admin
Po migraci je potřeba znovu vytvořit clustery. Migrace říká, že chci do současného modelu přenést data z modelu 4.
Pokud chci vyresetovat data, musím být v konkrétním modelu a mohu data vyresetovat takto:
docker exec -u 33 -it nextcloud php /var/www/html/occ face:reset --model -u admin
Řešení problémů
Při pokusu o skenování obličejů jednoho uživatele:
docker exec -u 33 -it nextcloud php /var/www/html/occ face:background_job -u nc_admin -t 900
jsem narazil na problém s dočasnými soubory. Problém jsem vyřešil takto:
1. V administrátorském menu Nextcloudu jsem šel do sekce Rozpoznávání obličejů. 2. Nastavil jsem posuvník pro velikost dočasných souborů. 3. Uložil změnu kliknutím na tlačítko vedle posuvníku.
Tento krok je poměrně neintuitivní, protože nastavení se bez potvrzení neuloží, což vedlo k mnoha pokusům a omylům.
A ještě je potřeba pro uživatele povolit rozpoznávání obličejů.
Nastavení cronu pro kontinuální skenování obličejů
Pro kontinuální skenování obličejů je potřeba nastavit úlohu na pozadí jako pravidelný cron úkol. Plugin Face Recognition byl navržen tak, aby postupně analyzoval fotografie a výsledky zobrazoval uživatelům průběžně. Dokumentace k tomuto nastavení je dostupná zde: Schedule Background Task.
Před konfigurací cronu je důležité zajistit, že veškeré nastavení Face Recognition funguje správně a že máte jasně definované:
- Interval spouštění úlohy: Jak často se má úloha spustit.
- Doba běhu úlohy: Maximální doba, po kterou může úloha běžet, aby nedošlo k překrývání více instancí.
V následujícím příkladu je úloha nastavena na spuštění každých 30 minut s maximální dobou běhu 15 minut:
*/30 * * * * docker exec -u 33 -it nextcloud php /var/www/html/occ face:background_job -t 900
Tento příkaz:
- */30: Spouští úlohu každých 30 minut.
- docker exec: Spouští příkaz uvnitř Docker kontejneru, kde běží Nextcloud.
- php /var/www/html/occ face:background_job: Spouští úlohu rozpoznávání obličejů.
- -t 900: Nastavuje maximální dobu běhu na 900 sekund (15 minut).
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:
.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`
Vycházím z této diskuse, protože v dokumentaci pluginu jsem tuto informaci bohužel nenašel.
Použití Face Recognition na externím modelu
Jednou z pokročilých možností při využívání pluginu Face Recognition v Nextcloudu je použití externího modelu pro rozpoznávání obličejů. Tato varianta umožňuje provádět náročné výpočty na výkonnějším stroji, což ulehčí serveru s Nextcloudem (například Raspberry Pi). Externí model lze použít například pro zpracování velké databáze fotografií, zatímco nově přidané fotografie lze průběžně zpracovávat přímo na slabším zařízení. Dokumentace k této funkcionalitě je dostupná zde: Face Recognition External Model.
Výhody použití externího modelu
Externí model umožňuje:
- Rozložit náročné úkoly na samostatný výkonnější server, čímž se sníží zátěž na server, kde běží Nextcloud.
- Paralelizovat zpracování velkých objemů fotografií.
- Flexibilitu při implementaci vlastních modelů pomocí oblíbených nástrojů strojového učení.
Bezpečnostní úvahy
Při použití externího modelu je nutné si uvědomit, že:
- Obrázky se přenášejí z Nextcloudu na externí server prostřednictvím POST požadavků.
- Obrázky jsou po analýze okamžitě smazány, ale během přenosu je nutné zajistit bezpečnost dat.
- Pokud je externí model provozován mimo lokální síť, doporučuje se použít HTTPS proxy pro ochranu dat.
Konfigurace externího modelu
1. Vytvoření API klíče:
openssl rand -base64 32 > api.key cat api.key
Tento klíč bude použit pro ověřování komunikace mezi Nextcloudem a externím modelem.
2. Spuštění externího modelu v Dockeru:
docker run --rm -i -p 8080:5000 -v /path/to/api.key:/app/api.key --name facerecognition matiasdelellis/facerecognition-external-model:v0.2.0
Model je nyní dostupný na portu 8080.
3. Ověření funkčnosti modelu:
curl localhost:8080/welcome
Očekávaný výstup:
{"facerecognition-external-model":"welcome","model":3,"version":"0.2.0"}
4. Konfigurace Nextcloudu: Nastavte externí model a API klíč pomocí OCC příkazů:
docker exec -u 33 -it nextcloud php /var/www/html/occ config:system:set facerecognition.external_model_url --value "192.168.1.123:8080" docker exec -u 33 -it nextcloud php /var/www/html/occ config:system:set facerecognition.external_model_api_key --value "NZ9ciQuH0djnyyTcsDhNL7so6SVrR01znNnv0iXLrSk="
5. Nastavení externího modelu:
docker exec -u 33 -it nextcloud php /var/www/html/occ face:setup -m 5
Externí model je nyní připraven pro použití.
Zpracování paralelních úloh
Pro paralelní zpracování fotografií lze využít více vláken na externím serveru. Příklad skriptu pro import, analýzu a klastrování obličejů naleznete v dokumentaci nebo níže. Tento proces je vhodné spustit v nástroji jako tmux nebo screen, aby mohl běžet na pozadí.
#!/bin/bash set -o errexit dir=$(pwd) # your nextcloud path cd /var/www/nextcloud/html/ sudo -u www-data php --define apc.enable_cli=1 ./occ face:stats echo -n "Select user for import & parallel processing:" read user echo "" echo "Enabling facerecognition for $user..." sudo -u www-data php --define apc.enable_cli=1 ./occ user:setting $user facerecognition enabled true echo "Done" echo "Synchronizing $user files..." sudo -u www-data php --define apc.enable_cli=1 ./occ face:background_job -u $user --sync-mode echo "Done" echo "Analyzing $user files..." # the upper number has to be lower or equal to the number of GUNICORN_WORKERS for i in {1..3}; do sudo -u www-data php --define apc.enable_cli=1 ./occ face:background_job -u $user --analyze-mode & pids[${i}]=$! done for pid in ${pids[*]}; do wait $pid done echo "Done" echo "Calculating $user face clusters..." sudo -u www-data php --define apc.enable_cli=1 ./occ face:background_job -u user --cluster-mode echo "Done" cd $dir
Použití externího modelu přináší výhody při zpracování velkých datasetů, zejména na méně výkonných zařízeních, jako je Raspberry Pi.
Další příkazy pro Face Recognition
Face Analysis
occ face:background_job [-u|--user_id USER_ID] [-t|--timeout TIMEOUT] [--defer-clustering] [-M|--max_image_area MAX_IMAGE_AREA]
Tento příkaz je hlavním nástrojem pro analýzu fotografií:
- Funkce: Vyhledává obrázky, analyzuje je a třídí nalezené obličeje do skupin podobných osob (clustering).
- Parametry:
- -u USER_ID: Analyzuje pouze fotografie konkrétního uživatele. Uživatel musí analýzu povolit individuálně.
- -t TIMEOUT: Nastavuje maximální dobu (v sekundách), po kterou příkaz běží. Po uplynutí doby se příkaz zastaví a pokračuje při dalším spuštění.
- -M MAX_IMAGE_AREA: Omezuje maximální plochu obrázku (v pixelech²) pro zpracování, čímž snižuje paměťové nároky.
- –defer-clustering: Odkládá třídění obličejů na konec analýzy.
Tento příkaz je doporučeno spustit manuálně před jeho zařazením do cron úlohy, aby se ověřila konfigurace a dostupné systémové prostředky.
Vytváření alb v aplikaci Photos
occ face:sync-albums [-u|--user_id USER_ID]
- Funkce: Vytváří alba v aplikaci Nextcloud Photos na základě rozpoznaných osob.
- Parametry:
- -u USER_ID: Synchronizuje alba pouze pro daného uživatele.
- Poznámka: Jakékoliv úpravy alb provedené v aplikaci Photos budou při dalším spuštění tohoto příkazu přepsány.
Resetování informací
occ face:reset [--all] [--model] [--image-errors] [--clustering] [-u|--user_id USER_ID]
- Funkce: Umožňuje resetovat databázi obličejů a souvisejících informací.
- Parametry:
- –all: Smaže všechny informace o obrázcích, obličejích a skupinách osob.
- –model: Resetuje aktuální model a nutí k nové analýze všech obrázků.
- –clustering: Resetuje pouze seskupování obličejů (clustering).
- –image-errors: Resetuje pouze obrázky, u kterých došlo k chybám při analýze.
- -u USER_ID: Resetuje data pouze pro konkrétního uživatele.
Migrace modelů
occ face:migrate [-m|--model_id MODEL_ID] [-u|--user_id USER_ID]
- Funkce: Migrace rozpoznaných obličejů mezi modely.
- Parametry:
- -m MODEL_ID: Určuje model, do kterého budou data migrována.
- -u USER_ID: Migruje data pouze pro daného uživatele.
- Poznámka: Jména osob nejsou přenesena a musí být znovu zadána uživatelem.
Statistiky
occ face:stats [-u|--user_id USER_ID] [-j|--json]
- Funkce: Poskytuje souhrn počtu obrázků, rozpoznaných obličejů a identifikovaných osob.
- Parametry:
- -u USER_ID: Vrací statistiky pouze pro konkrétního uživatele.
- -j: Výstup ve formátu JSON pro snadné zpracování jinými nástroji.
Stav analýzy
occ face:progress
- Funkce: Zobrazuje průběh analýzy a odhadem dobu potřebnou k dokončení.
- Parametry:
- -j: Výstup ve formátu JSON pro snadné zpracování jinými nástroji.
Tyto příkazy pokrývají širokou škálu úloh a umožňují plně kontrolovat proces rozpoznávání obličejů v Nextcloudu. Pro optimální využití je důležité přizpůsobit parametry podle dostupných prostředků a potřeb konkrétního prostředí.
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.
Migrace dat na server Nextcloudu
Při migraci dat na nový server Nextcloudu jsem původně postupoval velmi komplikovaně. Data jsem nejprve stáhl na svůj počítač a poté je přes webové rozhraní nahrával na nový server. Tento přístup byl ale pomalý a neefektivní. Nahrávání přes webové rozhraní jsem používal hlavně proto, aby se soubory správně zapsaly do databáze Nextcloudu.
Začal jsem zvažovat, zda by bylo možné nahrávat soubory přímo do adresáře nextcloud/data/uživatel/files na serveru. Takový postup však vyžaduje další kroky, aby si server nahrané soubory oskenoval a zapsal je do databáze. Bez tohoto by mohlo dojít k problémům, kdy soubory nejsou viditelné přes webové rozhraní nebo synchronizační klienty.
Doporučený postup
1. Nahrajte soubory na server Připojte se k serveru například pomocí SCP, rsync nebo jiného nástroje pro přenos souborů a nakopírujte je přímo do adresáře nextcloud/data/uživatel/files.
2. Nastavte správná oprávnění Po nahrání souborů nastavte správného vlastníka a oprávnění, aby Nextcloud mohl s těmito soubory pracovat. Typicky by soubory měly patřit uživateli a skupině webového serveru, například www-data na Debian/Ubuntu.
Příklad příkazu:
chown -R www-data:www-data /cesta/k/nextcloud/data/uživatel/files
3. Spusťte synchronizaci souborů Nextcloud poskytuje příkaz pro synchronizaci souborů a jejich zapsání do databáze:
docker exec -u 33 -it nextcloud php /var/www/html/occ files:scan uživatel
Nahraďte uživatel jménem uživatele, kterému patří nahrané soubory. Tento příkaz prohledá adresář files daného uživatele, zkontroluje změny a aktualizuje databázi.
4. Zkontrolujte výsledek
Po dokončení synchronizace:
- Otevřete webové rozhraní Nextcloudu.
- Přihlaste se jako daný uživatel a ověřte, že jsou soubory viditelné a správně zařazené.
Poznámky
- Přímý přenos souborů pomocí rsync je často rychlejší a efektivnější než stahování a nahrávání přes webové rozhraní.
- Tento postup doporučuji provádět mimo pracovní dobu, pokud server používá více uživatelů, aby se minimalizovalo zatížení serveru.