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
apt install apache2 -y
apt install software-properties-common
add-apt-repository ppa:ondrej/php
apt update
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
nano /etc/php/8.3/apache2/php.ini
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
apt install mariadb-server
mysql_secure_installation
mysql
CREATE DATABASE nextcloud;
CREATE USER 'nextclouduser'@'localhost' IDENTIFIED BY 'PASSWORT';
GRANT ALL PRIVILEGES ON nextcloud.* TO 'nextclouduser'@'localhost';
FLUSH PRIVILEGES;
EXIT;
cd /tmp && wget https://download.nextcloud.com/server/releases/latest.zip
unzip latest.zip
mv nextcloud /var/www/
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>
a2ensite nextcloud.conf
a2dissite 000-default.conf
a2enmod rewrite
a2enmod headers
a2enmod env
a2enmod dir
a2enmod mime
service apache2 restart
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
certbot --apache -m master@domain.com -d cloud.domain.com
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
*/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
"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,
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>
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
service clamav-freshclam stop
freshclam
systemctl status clamav-freshclam
journalctl -u clamav-freshclam
service clamav-freshclam start
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
service clamav-freshclam restart && service clamav-daemon restart
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" ),
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
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/
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.