Nextcloud

Voraussetzungen

Diese Beschreibung setzt auf einem installierten Ubuntu Linux Server in aktueller LTS-Version auf. Die Ressourcenanforderungen sind normalerweise überschaubar. Das hängt vom vorgesehenen Anwendungszweck ab. Ich betreibe eine Nextcloud in einer VM mit 4 GiB RAM und 2 Prozessorkernen und eine bei einem Hoster, die mit 8 GiB RAM und 6 virtuellen Prozessorkernen total überdimensioniert ist. Beim Massenspeicher sollte man nicht zu geizig sein, schließlich soll sie ja Daten speichern und bereithalten. Diese Beschreibung geht außerdem davon aus, dass der Server über eine Domain von außen erreichbar ist. Hier tut es natürlich auch eine dynamische Domain oder eine Tunnellösung wie Cloudflare oder Pangolin.



Installation

Nach der Basisinstallation eines Linux-Servers loggt man sich per Remote-Shell auf dem Server ein. Um die weiteren Befehle im Root-Modus ohne vorgestelltes "sudo" absetzen zu können, wechselt man zunächst mit


sudo su
in den Root-Modus. Danach ist zunächst der Apache Webserver zu installieren.

apt install apache2 -y
Anschließend wird das Repository für die benötigten Programme hinzugefügt.

apt install software-properties-common
add-apt-repository ppa:ondrej/php
apt update
Dann werden die benötigten Module installiert Achtung: Hier wird php in der Version 8.3 installiert. Falls zum Zeitpunkt der Installation eine aktuellere Version empfohlen wird, ist "8.3" durch die neue Version zu ersetzen.

apt install php8.3 libapache2-mod-php8.3 php8.3-zip php8.3-xml php8.3-mbstring php8.3-gd php8.3-curl php8.3-imagick libmagickcore-6.q16-6-extra php8.3-intl php8.3-bcmath php8.3-gmp php8.3-cli php8.3-mysql php8.3-zip php8.3-gd  php8.3-mbstring php8.3-curl php8.3-xml php-pear unzip php8.3-apcu redis-server php8.3-redis php8.3-smbclient php8.3-ldap php8.3-bz2
Der Apache Webserver wird über die Datei /etc/php/8.3/apache2/php.ini konfiguriert. Dazu öffnet man sie mit nano zum bearbeiten:

nano /etc/php/8.3/apache2/php.ini
Hier sucht man die folgenden Parameter (strg+w) und ändert sie wie folgt ab:

memory_limit = 4096M
upload_max_filesize = 20G
post_max_size = 20G
date.timezone = Europe/Berlin
output_buffering = Off
opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=32
opcache.max_accelerated_files=30000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
Nun wird der Datenbankserver installiert.

apt install mariadb-server
und konfiguriert:

mysql_secure_installation
In dem erscheinenden Dialog können die vorgestellten Werte weitestgehend übernommen werden. Es ist aber ein DB-Passwort vorzugeben. Danach ist die Datenbank zu erstellen und einzurichten sowie der DB-User zu generieren.

mysql

CREATE DATABASE nextcloud; 
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'PASSWORT';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
Dass 'PASSWORT' kein sicheres Passwort ist, muss wohl nicht erwähnt werden. Nun ist die neueste Version von Nextcloud herunter zu laden, zu entpacken und in den Webordner zu verschieben:

cd /tmp && wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
mv nextcloud /var/www/
Nun liegen die Dateien im richtigen Ordner. Jetzt ist die Config-Datei dazu zu erstellen:

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

<VirtualHost *:80>
     ServerAdmin master@domain.com
     DocumentRoot /var/www/nextcloud/
     ServerName {hiermussderservernamehin}
     <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>

     ErrorLog ${APACHE_LOG_DIR}/error.log
     CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Nun wird die Site im Webserver aktiviert:

a2ensite nextcloud.conf
und die Default-Website muss noch deaktiviert werden, sonst liefert der Apache unter der Adresse, über die er ansprechbar ist, nur seine Statusseite aus:

a2dissite 000-default.conf
Danach sind noch einige Apache-Module zu aktivieren:

a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
Damit das wirksam wird, muss der Apache-Webserver neu gestartet werden.

service apache2 restart
Der Datenordner ist zu erstellen und vorzubereiten.

mkdir /home/data/
chown -R www-data:www-data /home/data/
chown -R www-data:www-data /var/www/nextcloud/
sudo find /var/www/nextcloud/ -type d -exec chmod 750 {} \;
sudo find /var/www/nextcloud/ -type f -exec chmod 640 {} \;
sudo chmod -R 750 /var/www/nextcloud/apps
sudo chmod -R 750 /var/www/nextcloud/config
sudo chmod -R 750 /var/www/nextcloud/updater
sudo chmod -R 750 /var/www/nextcloud/themes



Nachinstallationsarbeiten

SSL-Absicherung mit Let's Encrypt

Zur Absicherung wird ein SSL-Zertifikat benötigt. Das gibt es kostenlos von Let's Encrypt. Dazu wird zunächst der Bot installiert, der das Zertifikat installiert und mit dem man es regelmäßig erneuern kann:


apt install certbot python3-certbot-apache
und angewendet:

certbot --apache -m master@domain.com -d cloud.domain.com
Damit das Zertifikat regelmäßig erneuert wird, ergänzen wir die Datei /etc/crontab um die Zeilen

0 11 3 *rootcertbot renew >> /var/log/letsencrypt-renew.log && service apache2 reload > /dev/null 2>&1
0 11 6 *rootcertbot renew >> /var/log/letsencrypt-renew.log && service apache2 reload > /dev/null 2>&1
0 11 9 *rootcertbot renew >> /var/log/letsencrypt-renew.log && service apache2 reload > /dev/null 2>&1
0 11 12 *rootcertbot renew >> /var/log/letsencrypt-renew.log && service apache2 reload > /dev/null 2>&1



Wartungscronjob einrichten

Nun muss noch der Cronjob eingerichtet werden, der die regelmäßigen Verwaltungsaufgaben der Cloud anstößt. Dazu wird die Datei crontab des Webservers, also des Users www-data bearbeitet


sudo crontab -u www-data -l
und ergänzt um die Zeile:

*/5 * * * * php -f /var/www/nextcloud/cron.php



Abschlussarbeiten, Warnungen beheben

Jetzt kann man die Domain ansurfen und die Installation abschließen. Noch werden einige Fehler und Warnungen angezeigt. Darum sind noch ein paar Änderungen notwendig.

In der Datei "/etc/php/8.3/mods-available/apcu.ini" ist apc zu aktivieren:


apc.enable_cli=1
und die Datei "/var/www/nextcloud/config/config.php" zu ergänzen:

 "default_language" => "de",
  "default_locale" => "de",
  'default_phone_region' => 'DE',
  'skeletondirectory' => '',
  "loglevel" => 3,
  'filelocking.enabled' => 'true',
  'maintenance_window_start' => '1',
  'memcache.local' => '\OC\Memcache\APCu', 
  'memcache.distributed' => '\OC\Memcache\Redis',
  'memcache.locking' => '\OC\Memcache\Redis',
  'redis' => array(
     'host' => 'localhost',
     'port' => 6379,
      ),
  'logtimezone' => 'Europe/Berlin', 'default_phone_region' => 'DE',
  'opcache.save_comments' => 1,
  'opcache.revalidate_freq' => 60,
  'opcache.interned_strings_buffer' => 16,
HSTS aktivieren:

nano /etc/apache2/sites-enabled/nextcloud-le-ssl.conf

<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains;preload"
</IfModule>
Apache neustarten, um die Änderungen zu übernehmen:

service apache2 restart



Nextcloud über Reverse Proxy

Wenn man die Nextcloud über einen Reverse Proxy, wie z.B. den Nginx ansteuern möchte, dann muss man die Vertrauensbasis zwischen der Nextcloud und dem Proxy herstellen. Dazu ergänzt man die config.php um folgende Zeilen:


'overwrite.cli.url' => 'https://externe.domain', 
'overwritehost' => 'externe.domain',
'overwriteprotocol' => 'https',
'trusted_proxies' =>
   array (
         0 => 'IP.des.Proxyservers',
         1 => 'ggf. VPN-IP.des.Proxyservers,
   ),
  'forwarded_for_headers' => array('HTTP_X_FORWARDED_FOR', 'HTTP_X_REAL_IP'),  



Virenschutz

Möchte man die Nextcloud-App "Antivirus for files" nutzen, dann muss auf dem Server ein Virenschutz installiert sein. Hier ist die Beschreibung für die Installation von ClamAV. Zunächst sind die Pakete zu installieren:


apt install clamav clamav-freshclam clamav-daemon -y
ClamAV stoppen und Virendatenbanken aktualisieren:

service clamav-freshclam stop
freshclam
Mit dem Befehl "freshclam" wird bei erster Ausführung nach der Installation neben dem Aktualisieren der Virendatenbanken auch das Herunterladen der Definitionen (wie daily.cvd, main.cvd) in das Verzeichnis /var/lib/clamav initiiert. Den Status dieser Aktionen kann man mit den Befehlen

systemctl status clamav-freshclam 
und

journalctl -u clamav-freshclam
überprüfen. Erst nach erstmaliger Ausführung von freshclam (mit Rootrechten) befindet sich der Socket im Pfad /var/run/clamav. Danach ist der Dienst neu zu starten.

service clamav-freshclam start
Clamav Konfiguration anpassen, um größere Dateien (50MB) und Container-Dateien mit bis zu 25 Unterverzeichnissen scannen zu können:

cp /etc/clamav/clamd.conf /etc/clamav/clamd.conf.bak
sed -i "s/MaxFileSize.*/MaxFileSize 50M/" /etc/clamav/clamd.conf
sed -i "s/MaxDirectoryRecursion.*/MaxDirectoryRecursion 25/" /etc/clamav/clamd.conf
sed -i "s/PCREMaxFileSize.*/PCREMaxFileSize 50M/" /etc/clamav/clamd.conf
sed -i "s/StreamMaxLength.*/StreamMaxLength 50M/" /etc/clamav/clamd.conf
Im Anschluss daran werden die ClamAV relevanten Dienste neu gestartet:

service clamav-freshclam restart && service clamav-daemon restart
Mit der Adminkennung ist zunächst in der Nextcloud die App „Antivirus for files“ zu aktivieren. Unter Verwaltungseinstellungen/Sicherheit sind dann die Parameter wie folgt einzustellen:
Screenshot: Antivirus einrichten
Abb. 1: Antivirus for files einrichten



Sonstiges

Trusted Domains

Wenn beim Ansurfen der Nextcloud eine Fehlermeldung kommt, die darauf hinweist, dass man über eine nicht vertrauenswürdige Domain zugreift, dann muss man die Datei "config.php", die sich im Web-Verzeichnis (in meinem Fall und in der Regel "/var/www/nextloud") im Unterordner "config" befindet, ergänzen:


'trusted_domains' => 
  array (
    0 => 'nexcloudhome.tld',
    1 = > '173.37.47.11" ),
    
Hier sind alle Domains, unter denen man die Nextcloud aufrufen möchte, anzugeben. Das können auch IP-Adressen sein. Damit das wirksam wird, muss wieder einmal der Apache neu gestartet werden:

service apache2 restart



Protokolle löschen

Die Protokolle werden wohl nicht automatisch bereinigt. Daher kann die entsprechende Datei sehr groß werden und die Darstellung der Protokolle im Browser lange dauern. Wenn man die Nextcloud-Protokolldatei zunächst wegkopieren und dann leeren möchte, dann geht das auf der Konsole mit den Befehlen:


sudo cp /home/data/nextcloud.log /home/data/nextcloudlog.bup
sudo truncate /home/data/nextcloud.log --size 0



OCC-Kommandos ausführen

Manchmal findet man im Web oder auf der Admin-Oberfläche Hinweise zur Lösung auftretender Problemey, bei denen man OCC-Kommandos ausführen soll. Das geht folgendermaßen: Man wechselt auf der Konsole in den Ordner, indem sich die Datei occ befindet (hier: /var/www/nextcloud) und setzt das Kommando ab:


sudo -u www-data php occ [Kommando]



Datensicherung

Zur Absicherung gegen Datenverluste und eigene Dummheit sollten die Daten des Web-Verzeichnisses, das Datenverzeichnis und ein Dump der Datenbank regelmäßig gesichert werden. Mit diesen gesicherten Daten lässt die die Nextcloud komplett neu wieder aufbauen. Das klappt, ich hatte Gelegenheit, das zu testen :-(

Ich beschreibe hier das Backup vom Nextcloudserver bei einem Hoster auf einen lokalen Backupserver in meinem lokalen Netzwerk. Dazu wird zunächst regelmäßig mit einem Cron-Job ein Dump der DB erzeugt:


nano /etc/crontab

0 1 * * *hanswurst  mysqldump -u nextclouduser --password=************ nextcloud > /home/hanswurst/sicherung/nextcloud.sql
Dann werden die zu sichernden Daten jede Nacht von einem lokalen Server (über VPN) abgeholt:

0 0  * * * hanswurst  rsync -avE -e "ssh -p 22" hanswurst@{IP}:/home/data  /backup/
0 1  * * * hanswurst  rsync -avE -e "ssh -p 22" hanswurst@{IP}:/var/www/nextcloud  /backup/
0 2  * * * hanswurst  rsync -avE -e "ssh -p 22" hanswurst@{IP}:/home/hanswurst/sicherung/nextcloud.sql  /backup/

Hierzu ist keine Passwortübergabe erforderlich, wenn der Connect per Zertifikat erfolgt (s. Server absichern). Die Vorgabe des Ports (-p 22) ist nur erforderlich, wenn man auf dem Zielsystem den Standardport für den SSH-Zugriff geändert haben sollte. Dann verwendet man natürlich die geänderte Portnummer statt der 22. Ansonsten kann man den Parameter auch weglassen.

Auf dem lokalen Server liegen die Daten dann im Verzeichnis /backup. Der lokale Server wird bei mir jede Nacht per Proxmox Backup Server gesichert. Diese Sicherungen unterliegen meiner Retention-Policy (s. Datensicherung). So lassen sich die Sicherungen der Nextcloud entsprechend der Grandfather-Father-Son-Regel recovern.