Nextcloud Installation | Performant / Imaginary mit WebP / Memcache APCu & Redis

in #deutsch2 years ago (edited)

Vorschaubild

In diesem Beitrag geht es um eine leistungsstarke Einrichtung von Nextcloud.
Erfahren Sie, wie Sie mit Hilfe von WebP, Imaginary und einer alternativen Foto-App nicht nur die Performance optimieren, sondern auch das Scrollen nach Datum ermöglichen und hochwertige Vorschauen in voller Qualität beim Zoomen laden können.

Warum sollten Sie Nextcloud anstelle gängiger Cloud-Anbieter nutzen?
Ganz einfach: Sie möchten die volle Kontrolle über Ihre Daten behalten und unabhängig von einem Dienst sein.
Nextcloud bietet genau das, wonach Sie suchen.

Es handelt sich bei Nextcloud um einen komplett Open-Source-Fork von ownCloud (AGPL-3.0) und ist frei nutzbar.
Nextcloud hat sich zum Ziel gesetzt, Ihnen die gleichen Möglichkeiten wie die großen kommerziellen Anbieter zu bieten.

Was benötigen Sie für Ihre private Nextcloud?
Im Grunde genommen benötigen Sie ein gewisses Maß an Linux-Kenntnissen. Wenn Sie bereits einmal WordPress eingerichtet und gewartet haben, wird Ihnen auch die Einrichtung einer Nextcloud-Instanz nicht schwerfallen.

Keine Sorge, wir werden den Prozess gemeinsam durchgehen.

Hinweis:

Falls sich die Installation ändert, verlinke ich euch die entsprechende Dokumentation.
System Voraussetzungen
Configuration Parameters
Server Tuning
Background jobs


Installation aller wichtigen Programme für Nextcloud

sudo apt update -y && sudo apt upgrade -y && sudo apt-get install apache2 ffmpeg mariadb-server -y && sudo apt install software-properties-common && sudo add-apt-repository ppa:ondrej/php && sudo apt update && sudo apt install php8.3-{common,curl,gd,xml,mbstring,zip,bz2,intl,ldap,smbclient,imap,bcmath,gmp,apcu,fpm,readline,cli,memcached,opcache,igbinary,mysql,redis,imagick} imagemagick --allow-change-held-packages libapache2-mod-php -y

Einrichtung der PHP Config:

post_max_size & upload_max_filesize sind für die maximale Uploadgröße, ihr solltet bedenken, PHP speichert die Dateien im Temp Verzeichnis beim Upload und prüft erst im Nachhinein, ob dieser Upload genutzt wird.
Daher solltet ihr diesen Speicher auch verfügbar haben.
max_execution_time sagt wie lange ein PHP Script ausgeführt werden darf.
opcache wird zu Steigerung der Performanz genutzt.

sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.3/apache2/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/8.3/apache2/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1G/" /etc/php/8.3/apache2/php.ini
sed -i "s/post_max_size =.*/post_max_size = 20G/" /etc/php/8.3/apache2/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 20G/" /etc/php/8.3/apache2/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/8.3/cli/php.ini
sed -i "s/output_buffering =.*/output_buffering = '0'/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.validate_timestamps=.*/opcache.validate_timestamps=0/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=256/" /etc/php/8.3/apache2/php.ini
sed -i '$aapc.enable_cli=1' /etc/php/8.3/mods-available/apcu.ini
sed -i '$aopcache.jit=1255' /etc/php/8.3/mods-available/opcache.ini
sed -i '$aopcache.jit_buffer_size=256M' /etc/php/8.3/mods-available/opcache.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=256/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=64/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=100000/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=60/" /etc/php/8.3/apache2/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/8.3/apache2/php.ini
sed -i "s|;emergency_restart_threshold.*|emergency_restart_threshold = 10|g" /etc/php/8.3/fpm/php-fpm.conf
sed -i "s|;emergency_restart_interval.*|emergency_restart_interval = 1m|g" /etc/php/8.3/fpm/php-fpm.conf
sed -i "s|;process_control_timeout.*|process_control_timeout = 10|g" /etc/php/8.3/fpm/php-fpm.conf
sed -i "s/rights=\"none\" pattern=\"PS\"/rights=\"read|write\" pattern=\"PS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"EPS\"/rights=\"read|write\" pattern=\"EPS\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"PDF\"/rights=\"read|write\" pattern=\"PDF\"/" /etc/ImageMagick-6/policy.xml
sed -i "s/rights=\"none\" pattern=\"XPS\"/rights=\"read|write\" pattern=\"XPS\"/" /etc/ImageMagick-6/policy.xml

Einrichtung der Datenbank in unserem Fall MariaDB.

mysql_secure_installation

Enter current password for root (enter for none): Enter Drücken
unix_socket authentication [Y/n] n
Change the root password? [Y/n] y
New password: < Dein Passwort >
Remove anonymous users? [Y/n] y
Disallow root login remotely? [Y/n] y
Remove test database and access to it? [Y/n] y
Reload privilege tables now? [Y/n] y

Datenbank Terminal öffnen

mysql

Erstellen der Nextcloud Database

CREATE DATABASE nextcloud; 

Datenbank Nutzer Passwort und Erreichbarkeit festlegen

< nextclouduser > und ein Passwort bei < password_here > festlegen
< localhost > sagt dass das Konto es nur lokal nutzbar ist

CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'password_here';

Dem < nextclouduser > alle Rechte auf die < nextcloud > datenbank geben.

GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';

Speichern und beenden

FLUSH PRIVILEGES;
EXIT;

Nextcloud Seite zu Apatche2 hinzufügen

nano /etc/apache2/sites-available/nextcloud.conf

Als Verzeichnis oder Alias:

DocumentRoot /var/www/nextcloud/
ServerName download.example.org
Alias /nextcloud "/var/www/nextcloud/"

<Directory /var/www/nextcloud/>
    Require all granted
    AllowOverride All
    Options FollowSymLinks MultiViews

    <IfModule mod_dav.c>
        Dav off
    </IfModule>
</Directory>

<IfModule mod_headers.c>
    Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; strict-origin; preload"
    Redirect 301 /.well-known/carddav /nextcloud/remote.php/dav
    Redirect 301 /.well-known/caldav /nextcloud/remote.php/dav
    Redirect 301 /.well-known/webfinger /nextcloud/index.php/.well-known/webfinger
    Redirect 301 /.well-known/nodeinfo /nextcloud/index.php/.well-known/nodeinfo
</IfModule>

ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined

Als Subdomain:

<VirtualHost *:80>
    ServerAdmin [email protected]
    DocumentRoot /var/www/nextcloud/
    ServerName download.example.org
    ServerAlias download.example.org

    Alias /nextcloud "/var/www/nextcloud/"

    <Directory /var/www/nextcloud/>
        Options +FollowSymlinks
        AllowOverride All
        Require all granted
        <IfModule mod_dav.c>
            Dav off
        </IfModule>
        SetEnv HOME /var/www/nextcloud
        SetEnv HTTP_HOME /var/www/nextcloud
    </Directory>

    <IfModule mod_headers.c>
        Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; strict-origin; preload"
    </IfModule>

    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Hinzufügen der NextCloud (Rewrite Module) & Neustart Apache & dem www-data Rechte für Nextcloud Ordner erteillen.

a2ensite nextcloud.conf && a2enmod rewrite headers env dir mime php8.3 && service apache2 restart


install certbot

apt install certbot python3-certbot-apache

Zertifikat hinzufügen

certbot --apache -m < deine-email > -d < deine-domain >

Download der neuesten Version von Nextcloud

cd /tmp/ && wget https://download.nextcloud.com/server/releases/latest.zip && unzip latest.zip && mv nextcloud /var/www/ && mkdir /home/data/ && chown -R www-data:www-data /var/www/nextcloud/ /home/data/ && chmod -R 755 /var/www/nextcloud/

Jetzt richten wir unsere Nextcloud ein. Die Einrichtungsseite befindet sich unter www.example.org/nextcloud oder subdomain.example.org.

Zuerst legen wir ein Admin-Konto mit Benutzernamen und Passwort an.

Dann ändern wir den Speicherpfad und die Datenbank in den Einstellungen für Speicher & Datenbank.

Ändert "/var/www/nextcloud/data" zu "/home/data".

Bei Datenbank-Benutzer tragt den Benutzernamen für die Nextcloud-Datenbank ein < nextclouduser >.

Das Datenbank-Passwort ist das Passwort für euren < nextclouduser >.

Bei Datenbank-Name gebt den Namen eurer Nextcloud-Datenbank ein < nextcloud >.

Der Datenbank-Host localhost ist in Ordnung, wenn die Datenbank auf dem gleichen Server oder im gleichen Netzwerk erreichbar ist.

Einstellen der Config

Konfigurationseinstellungen:

  • "filesystem_check_changes" kann auf 1 gesetzt werden, wenn ihr möchtet, dass Nextcloud prüft, ob Änderungen am Dateisystem ohne Verwendung von Nextcloud vorgenommen wurden. Dies kann nützlich sein, wenn ihr häufig Daten auf andere Weise zu eurer Nextcloud hinzufügt und nicht immer manuell den Befehl zum Hinzufügen in Nextcloud ausführen möchtet.

  • "activity_expire_days" legt fest, wie lange Änderungen an Dateien in der Datenbank gespeichert werden. Wenn ihr nicht möchtet, dass diese Änderungen nach 14 Tagen gelöscht werden, könnt ihr diese Zeile einfach entfernen.

  • "trashbin_retention_obligation" löscht automatisch Daten, die sich seit 7 Tagen im Papierkorb befinden.

  • "preview_max_x" und "preview_max_y" legen fest, wie viele Pixel ein Vorschaubild maximal haben darf.

Weitere Informationen zu den Einstellungen findet ihr in der Nextcloud-Dokumentation oder in der config.sample.php.

sudo -u www-data cat <<EOF >>/var/www/nextcloud/config/tweaks.config.php
<?php
\$CONFIG = array (
'activity_expire_days' => 14,
'allow_local_remote_servers' => true,
'auth.bruteforce.protection.enabled' => true,
'forbidden_filenames' => 
array (
0 => '.htaccess',
1 => 'Thumbs.db',
2 => 'thumbs.db',
),
'cron_log' => true,
'default_phone_region' => 'DE',
'defaultapp' => 'files,dashboard',
'enable_previews' => true,
'preview_format' => 'webp',
'enabledPreviewProviders' => 
array (
0 => 'OC\\Preview\\Imaginary',
1 => 'OC\\Preview\\JPEG',
2 => 'OC\\Preview\\GIF',
3 => 'OC\\Preview\\BMP',
4 => 'OC\\Preview\\XBitmap',
5 => 'OC\\Preview\\Movie',
6 => 'OC\\Preview\\PDF',
7 => 'OC\\Preview\\MP3',
8 => 'OC\\Preview\\TXT',
9 => 'OC\\Preview\\MarkDown',
10 => 'OC\\Preview\\PNG',
11 => 'OC\\Preview\\WebP',
12 => 'OC\\Preview\\HEIC',
13 => 'OC\Preview\OpenDocument',
14 => 'OC\Preview\Krita',
20 => 'OC\\Preview\\Movie',
),
'preview_imaginary_url' => 'http://127.0.0.1:9000',
'filesystem_check_changes' => 0,
'filelocking.enabled' => 'true',
'htaccess.RewriteBase' => '/',
'integrity.check.disabled' => false,
'knowledgebaseenabled' => false,
'logfile' => '/var/log/nextcloud/nextcloud.log',
'loglevel' => 2,
'logtimezone' => 'Europe/Berlin',
'log_rotate_size' => '104857600',
'memcache.local' => '\OC\Memcache\APCu',
'overwriteprotocol' => 'https',
'preview_max_x' => 1024,
'preview_max_y' => 1024,
'preview_max_scale_factor' => NULL,
'profile.enabled' => false,
'quota_include_external_storage' => false,
'share_folder' => '/Freigaben',
'skeletondirectory' => '',
'theme' => '',
'trashbin_retention_obligation' => 'auto, 7',
'updater.release.channel' => 'stable',
);
EOF

Damit sind die ersten Schritte erledigt und die Nextcloud ist installiert.


Einrichtung von Imaginary mit optionaler WebP-Unterstützung.

Da ich bereits erwähnt habe, dass ich von der Standardinstallation abweichen möchte, werde ich nun den Teil mit Imaginary, WebP und der alternativen Foto-App Memory behandeln.

Imaginary docker-compose einrichten

apt-get install docker python3 docker-compose -y

mkdir /home/imaginary/
sudo -u www-data cat <<EOF >>/home/imaginary/docker-compose.yml
  version: '3.1'
  services:
  
    aio-imaginary:
      image: nextcloud/aio-imaginary:latest
      restart: always
      environment:
        - PORT=9000
      ports:
        - 127.0.0.1:9000:9000
      command: -concurrency 50 -enable-url-source -log-level debug
EOF
cd /home/imaginary/ && docker-compose up -d

Noch inoffizieller WebP-Nextcloud-Mod für Imaginary

Nicht mehr nötig, es wurde in Nextcloud hinzugefügt.

wget -O /var/www/nextcloud/lib/private/Preview/Imaginary.php https://raw.githubusercontent.com/JanisPlayer/server/master/lib/private/Preview/Imaginary.php
wget -O /var/www/nextcloud/lib/private/Preview/Generator.php https://raw.githubusercontent.com/JanisPlayer/server/master/lib/private/Preview/Generator.php

Ändern der Qualitätseinstellung von WebP Vorschaubildern

sudo -u www-data php /var/www/nextcloud/occ config:app:set preview webp_quality --value="30"

Redis Installation

Redis hilft, Datenbankzugriffe zu reduzieren und dadurch die Performance der Nextcloud zu steigern.

apt install -y redis-server -y
cp /etc/redis/redis.conf /etc/redis/redis.conf.bak
sed -i 's/port 6379/port 0/' /etc/redis/redis.conf
sed -i s/\#\ unixsocket/\unixsocket/g /etc/redis/redis.conf
sed -i 's/unixsocketperm 700/unixsocketperm 770/' /etc/redis/redis.conf
sed -i 's/# maxclients 10000/maxclients 10240/' /etc/redis/redis.conf
# Das Passwort muss auf jeden Fall geändert werden auf ein sicheres Passwort.
sed -i 's/# requirepass foobared/requirepass < Passwortmussgeändertwerden  > /' /etc/redis/redis.conf
usermod -aG redis www-data
cp /etc/sysctl.conf /etc/sysctl.conf.bak
sed -i '$avm.overcommit_memory = 1' /etc/sysctl.conf
sudo service redis-server restart
sudo service apache2 restart

# Bitte nicht vergessen < Passwortmussgeändertwerden > in das gleiche Passwort zu ändern.
# memcache.local' => '\OC\Memcache\APCu', kann auch zu 'memcache.local' => '\OC\Memcache\Redis', gändert werden falls gewünscht.

sed -i '/);/d' /var/www/nextcloud/config/tweaks.config.php && echo -e "'memcache.distributed' => '\\\OC\\\Memcache\\\Redis',\n'memcache.locking' => '\\\OC\\\Memcache\\\Redis',\n'redis' =>\narray (\n'host' => '/var/run/redis/redis-server.sock',\n'port' => 0,\n'password' => '<Passwortmussgeändertwerden>',\n'timeout' => 0.5,\n'dbindex' => 1,\n),\n);" >> /var/www/nextcloud/config/tweaks.config.php

Einrichtung der Nextcloud Apps

Eine bessere Foto-App mit einer einfacheren Bedienung Memories

sudo -u www-data php /var/www/nextcloud/occ app:install memories
sudo -u www-data php /var/www/nextcloud/occ memories:index

Recognition um Objekte oder Gesichter zu erkennen.

Die Gesichtserkennung mit der Funktion facerecognition soll besser sein, um nur Gesichter zu erkennen. Jedoch ist dies zum aktuellen Zeitpunkt des Artikels nicht mit der neuesten Version von Nextcloud möglich.

sudo -u www-data php /var/www/nextcloud/occ app:install  retention

Hintergrund Job über Cron

sudo -u www-data php /var/www/nextcloud/occ background:cron
crontab -u www-data -l > /tmp/tmp_crontab && echo "*/5  *  *  *  * php -f /var/www/nextcloud/cron.php" >> /tmp/tmp_crontab
crontab -u www-data /tmp/tmp_crontab && rm /tmp/tmp_crontab

Preview Generator

Lohnt sich bei vielen Nutzern, generiert alle Bilder ohne Nutzerinteraktion.

sudo -u www-data php /var/www/nextcloud/occ app:install previewgenerator
# Beispiel einstelllung:
# Dies wird nur generieren:
# Quadratische Vorschauen von: 64x64, 256x256 und 1024x1024
# Seitenverhältnis-Vorschauen mit einer Breite von: 64, 256 und 1024
# Seitenverhältnis-Vorschauen mit einer Höhe von: 64, 256 und 1024
# Hinweis:
# Vorschaugrößen sind immer eine Potenz von 4.
# Die kleinste Größe ist 64.
# Die maximale Größe wird durch Ihre Vorschaueinstellungen in der Datei "config.php" bestimmt.
sudo -u www-data php /var/www/nextcloud/occ config:app:set --value="64 256 1024"  previewgenerator squareSizes
sudo -u www-data php /var/www/nextcloud/occ config:app:set --value="64 256 1024" previewgenerator widthSizes
sudo -u www-data php /var/www/nextcloud/occ config:app:set --value="64 256 1024" previewgenerator heightSizes

# einmaliges ausführen
sudo -u www-data php /var/www/nextcloud/occ preview:generate-all
# Um 0 Uhr alle 24h ausführen
sudo -u www-data php /var/www/nextcloud/occ background:cron
crontab -u www-data -l > /tmp/tmp_crontab && echo "0 0  *  *  * php -f /var/www/nextcloud/occ preview:pre-generate" >> /tmp/tmp_crontab
crontab -u www-data /tmp/tmp_crontab && rm /tmp/tmp_crontab

Danke an alle, die bis hierhin dabei geblieben sind, und ich wünsche euch viel Spaß mit eurer neuen Nextcloud.

Das Tutorial ist doch umfangreicher geworden als zuerst gedacht.
Allerdings hatte ich auch viele Probleme mit Makedown, weil ich ein Zeichen wohl verwechselt habe und musste die Installation selbst testen.
Es gibt noch viel mehr, was man machen könnte, aber ich dachte, ich bleibe vorerst bei einer einfachen Einrichtung von Nextcloud.

Ich habe mir auch ab und zu etwas bei anderen Anleitungen abgsehen.
c-rieger.de -Nextcloud Installationsanleitung
apfelcast.com - Nextcloud 25 auf Linux Server (Ubuntu 22.04) installieren – Einfache Anleitung
okxo.de - Speed up Nextcloud preview generation with imaginary
vaahsen.de - Redis für Nextcloud konfigurieren Memory Caching

Artikel als Audio