Fotoverwaltung mit OpenMediaVault und Nextcloud

Auf unserer Diskstation hatten wir die Synology Photos App genutzt um unsere Fotosammlungen zu verwalten, vom Handy aus automatisch neue Bilder hochzuladen und unterwegs komfortabel auf unsere Fotosammlung zugreifen zu können. Mit dem Umstieg auf OpenMediaVault ist das weggefallen, eine Alternative musste her.

Wir wollten allerdings auch weiterhin einfach am PC über eine Freigabe mit dem Dateimanager und Grafikprogrammen auf die Bilder zugreifen können, die Bilder einfach komplett ins Nextcloud schieben war also raus.

Nach etwas rumprobiererei fand ich in diesem Blogbeitrag die Nextcloud-Erweiterung “External Storage“, die ich bis dato noch nicht kannte. Sie war das Puzzlestück, das das aktuelle Setup ermöglichte.

Nextcloud lasse ich in einem Docker-Container laufen, hier habe ich die User-Homes als zusätzliches Volume unter Services → Compose → Files im docker-compose File eingetragen, so dass sie im ungenutzten Verzeichnis /home gemountet werden:

services:
app:
volumes:
- ${USER_HOMES}:/home

Im Nextcloud konnte ich dann nach Aktivierung des Addons “Externer Speicher” das Photos-Verzeichnis in meinem Homeverzeichnis als Lokalen Speicher einbinden:

Danach tauchen die Ordner und Dateien darin wie ein geteilter Ordner in Nextcloud auf und können genauso genutzt werden. Die Photos und auch die Memories-App erkennen und indizieren alle Bilder.

Je nach Größe des Archivs und Ausstattung des Rechners auf dem das läuft kann das eine Weile dauern.

Für den Upload aus der Android App musste ich der Nextcloud-App allerdings noch Berechtigungen geben im Dateisystem geben, damit sie Dateien in mein Homeverzeichnis schreiben darf. Dazu habe ich mit setfacl eine ACL für den Ordner und alles was darin liegt erzeugt, und eine weitere damit ich auch über den Dateimanager Dateien löschen und verschieben kann die vom Nextcloud erzeugt wurden:

$ setfacl -R -d -m u:gerald:rwx MobileUpload
$ setfacl -R -d -m u:www-data:rwx MobileUpload
$ getfacl MobileBackup
# file: MobileBackup
# owner: gerald
# group: users
user::rwx
user:www-data:rwx
group::r-x
mask::rwx
other::r-x
default:user::rwx
default:user:www-data:rwx
default:user:gerald:rwx
default:group::r-x
default:mask::rwx
default:other::r-x

www-data ist der User unter dem Nextcloud im Container läuft (und da wir hier ein Debian haben passt der Username zufällig auch im Hostsystem). -R sorgt dafür dass die ACL rekursiv für die Ordner und Dateien darunter gesetzt werden, -d sorgt dafür dass die Einstellung als Default für neu erstellte Dateien und Ordner gesetzt werden. -m u:username:rwx definiert die gewünschten Rechte.

Weitere installierte Apps: imaginary für schnellere Preview-Erzeugung und Preview Generator für die Generierung der Vorschaubilder für die schon vorhandene Bildbibliothek. Ansonsten werden die Vorschaubilder nur “auf Zuruf” generiert, so kann man das machen wenn das NAS gerade nichts zu tun hat.

Ergänzungen

Weitere Einstellungen und Optimierungen die ich noch vorgenommen habe:

  • Cron Job alle 5 Minuten: docker exec -u www-data nextcloud-app-1 php /var/www/html/cron.php
  • Cron Job alle 10 Minuten: docker exec -u www-data nextcloud-app-1 php occ preview:pre-generate

Dann noch ein paar empfohlene Einstellungen:

php occ config:system:set maintenance_window_start --type=integer --value=1
php occ config:system:set default_phone_region --value="DE"
php occ config:app:set --value="64 256" previewgenerator squareSizes
php occ config:app:set --value="256 4096" previewgenerator fillWidthHeightSizes
php occ config:app:set --value="" previewgenerator widthSizes
php occ config:app:set --value="" previewgenerator heightSizes
php occ config:app:set --value="256" previewgenerator coverWidthHeightSizes

Man kann mit docker exec -it nextcloud-app-1 bash in den Container springen und dort die Befehle ausführen. Die Werte werden in der config.php gespeichert, man muss das also nur einmalig machen.

Was noch aussteht

  • Nextcloud kann aktuell keine Vorschaubilder von Videodateien erstellen, da im offiziellen Nextcloud-Image kein ffmpeg vorinstalliert ist. Ich suche noch nach einer Möglichkeit das automatisch beim Erstellen des Containers zu installieren, ich habe keine Lust ein eigenes Image zu pflegen.
  • Recognize App einrichten, für Bild-, Objekt-Erkennung und Tagging

Compose-Datei

Der Vollständigkeit halber hier meine komplette Docker Compose-Datei

volumes:
db:
services:
db:
image: mariadb:10.8
command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
restart: unless-stopped
volumes:
- db:/var/lib/mysql
env_file:
- nextcloud.env
app:
image: nextcloud
ports:
- 127.0.0.1:8080:80
- '[::1]:8080:80'
links:
- db
- redis
- imaginary
volumes:
- ${BASEDIR_DATA}/nextcloud:/var/www/html
- ${USER_HOMES}:/home
- type: tmpfs
target: /tmp:exec
env_file:
- nextcloud.env
restart: unless-stopped
imaginary:
image: h2non/imaginary
restart: unless-stopped
environment:
MALLOC_ARENA_MAX: 2
command: -p 9000 -enable-url-source
redis:
image: redis:alpine
restart: unless-stopped
command: redis-server --requirepass ${REDIS_HOST_PASSWORD}
env_file:
- nextcloud.env

Dazu die Env-Datei:

MYSQL_ROOT_PASSWORD=aHR0cHM6Ly95b3V0dS5iZS9kUXc0dzlXZ1hjUQ==
MYSQL_PASSWORD=aHR0cHM6Ly95b3V0dS5iZS8zQkZUaW81Mjk2dw==
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud
REDIS_HOST=redis
REDIS_HOST_PASSWORD=aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj03RndEUDE3WFBsaw==
APACHE_DISABLE_REWRITE_IP=1
OVERWRITEHOST=nextcloud.example.com
OVERWRITEPROTOCOL=https
OVERWRITECLIURL=https://nextcloud.example.com/
OVERWRITEWEBROOT=/
PHP_MEMORY_LIMIT=2G

Hier nicht definierte Variablen habe ich als globale Variablen definiert, damit ich sie in mehreren Umgebungen nutzen kann.

Und zu guter Letzt noch die nginx-Config in /etc/nginx/sites-enabled/nextcloud.conf:

server {
server_name nextcloud.example.com;
client_max_body_size 50000M;
# Set headers
proxy_set_header Host              $host;
proxy_set_header X-Real-IP         $remote_addr;
proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
# enable websockets: http://nginx.org/en/docs/http/websocket.html
proxy_http_version 1.1;
proxy_set_header   Upgrade    $http_upgrade;
proxy_set_header   Connection "upgrade";
proxy_redirect     off;
# set timeout
proxy_read_timeout 600s;
proxy_send_timeout 600s;
send_timeout       600s;
add_header Strict-Transport-Security "max-age=63072000" always;
# http2 on;
location / {
proxy_pass http://localhost:8080/;
}
listen 443 http2 ssl; # managed by Certbot
listen [::]:443 http2 ssl;
ssl_certificate /etc/letsencrypt/live/nextcloud.example.com/fullchain.pem; # managed by Certbot
ssl_certificate_key /etc/letsencrypt/live/nextcloud.example.com/privkey.pem; # managed by Certbot
include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # managed by Certbot
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Download-Options "noopen" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "none" always;
add_header X-XSS-Protection "1; mode=block" always;
# Remove X-Powered-By, which is an information leak
fastcgi_hide_header X-Powered-By;
}
server {
if ($host = nextcloud.example.com) {
return 301 https://$host$request_uri;
} # managed by Certbot
server_name nextcloud.example.com;
listen 80;
listen [::]:80;
return 404; # managed by Certbot
}

Veröffentlicht von

Gerald Schneider

Diplom-Informatiker (DH) in Rostock. Ich blogge über Entwicklung, Internet, mobile Geräte und Virtualisierung.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert