it:server:nextcloud

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.

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.

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.

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 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í 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.

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.

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.

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.

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ší.

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.

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

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

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ů.

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).

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.

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.

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:
    1. -u USER_ID: Analyzuje pouze fotografie konkrétního uživatele. Uživatel musí analýzu povolit individuálně.
    2. -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í.
    3. -M MAX_IMAGE_AREA: Omezuje maximální plochu obrázku (v pixelech²) pro zpracování, čímž snižuje paměťové nároky.
    4. –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:
    1. -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:
    1. –all: Smaže všechny informace o obrázcích, obličejích a skupinách osob.
    2. –model: Resetuje aktuální model a nutí k nové analýze všech obrázků.
    3. –clustering: Resetuje pouze seskupování obličejů (clustering).
    4. –image-errors: Resetuje pouze obrázky, u kterých došlo k chybám při analýze.
    5. -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:
    1. -m MODEL_ID: Určuje model, do kterého budou data migrována.
    2. -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:
    1. -u USER_ID: Vrací statistiky pouze pro konkrétního uživatele.
    2. -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:
    1. -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í.

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ě.

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.

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.

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.

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.

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.

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).

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.

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

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

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.

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`.

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:
    1. Výrazně vyšší rychlost při práci s dočasnými soubory.
    2. Snížení opotřebení disku.
  • Omezení:
    1. Velikost tmpfs je omezena velikostí dostupné RAM.
    2. 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.

Pro jistotu jsem ještě snížil prioritu procesu.

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
  • 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.

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.

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

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.

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.

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:

  1. Otevřete webové rozhraní Nextcloudu.
  2. Přihlaste se jako daný uživatel a ověřte, že jsou soubory viditelné a správně zařazené.
  • 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.
  • it/server/nextcloud.txt
  • Poslední úprava: 2025/01/01 23:24
  • autor: Petr Nosek