Diese Nextcloud Installationsanleitung für Ubuntu 24 oder Debian 12 mit nginx, MariaDB, PHP8, LetsEncrypt, redis, crowdsec, ufw u.v.m. beschreibt die Installation, Konfiguration und Härtung, das Monitoring sowie einige Erweiterungsmöglichkeiten von Nextcloud auf ihren Servern.
Aktualisierungen 👇
14. Dezember 2024:
» optional: Verbesserung der Sicherheit und Performance des TCP-Stacks
01. Dezember 2024:
» http/3 aktiviert, ufw angepasst
28. November 2024:
» opcache.jit=off »» on, nginx-vHost
05. November 2024:
» nodejs und npm für Nextcloud KI ergänzt
04. November 2024:
» Wechsel von mysql(dump) zu mariadb(-dump)
09. Oktober 2024:
» Nextcloud Rate Limit ergänzt
Systemvoraussetzungen 👇
Nextcloud Systemrequirements:
» https://docs.nextcloud.com/server/latest/admin_manual/installation/system_requirements.html#server
Nextcloud Remote access:
» https://docs.nextcloud.com/server/latest/admin_manual/installation/harden_server.html#connections-to-remote-servers
Die Installation basiert auf nginx (http/2 + http/3), Let’s Encrypt TLS 1.3, MariaDB 10.11, PHP 8.3 (php-fpm), Redis, crowdsec, ufw sowie Netdata und erhält abschließend sowohl von Nextcloud, als auch von Qualys SSL Labs eine A+ Sicherheitsbewertung. Die anzupassenden Parameter sind im Artikel rot markiert und müssen durch Ihre spezifischen Systemwerte (bspw. ihre.domain.de, 192.168.2.x oder Redis-Passwort-Bitte-ändern) ersetzt werden.
Möchten Sie hingegen lieber alles mit nur einem einzigen Skript installieren? Dann nutzen Sie unser Nextcloud-Installationsskript zero.sh, welches Ihnen hier zur Verfügung steht.
Inhaltsverzeichnis
- Systemvorbereitungen und Installation des nginx Webservers
- Installation und Konfiguration von PHP 8.3
- Installation und Konfiguration des Datenbankservers MariaDB 10.11
- Installation des Redis-server („in-memory-Datenbank“)
- Installation und Optimierung der Nextcloud (inkl. SSL)
- Systemhärtung (crowdsec IPS und ufw)
- Sytemmails per postfix
- Optimieren und aktualisieren der Nextcloud per Skript
- optional: Systemüberwachung mit netdata
- optional: Nextcloud Speicher erweitern/verschieben:
- optional: Nextcloud (HPB) High Performance Backend für Dateien
- optional: bash_alias für php occ, empfohlene Settings (config.php), logrotating
- optional: Verbesserung der Sicherheit und Performance des TCP-Stacks
Weiterführende Herstellerinformationen finden Sie hier.
1. Vorbereitungen und Installation des nginx Webserver
Aktuelle Installationsmedien für den zugrundeliegenden Linux-Server erhalten Sie hier:
Ubuntu 24.04.x LTS:Voraussetzungen: Download-Installationsmedium
Debian 12.x: Voraussetzungen: Download-Installationsmedium
Starten Sie mit der Installation und verbinden sich mit Ihrem Server per SSH-Konsole, bspw.
ssh <benutzer>@<IP-Adresse>
Nur Debian Server:
su - apt install -y sudo usermod -aG sudo <Ihr aktueller Benutzer> exit
Ab hier geht es wieder für beide Server-Betriebssysteme (Ubuntu und Debian) weiter:
Wechseln Sie in den privilegierten Benutzermodus
sudo -s
und aktualisieren zuerst das System.
apt update && apt upgrade -y
Bereiten Sie den Server vor, indem Sie die notwendigen Basissoftwarepakete installieren:
apt install -y \
apt-transport-https bash-completion bzip2 ca-certificates cron curl dialog \
dirmngr ffmpeg ghostscript git gpg gnupg gnupg2 htop jq libfile-fcntllock-perl \
libfontconfig1 libfuse2 locate lsb-release nodejs npm net-tools rsyslog screen smbclient \
socat software-properties-common ssl-cert tree unzip vim wget zip
Tragen Sie den zukünftigen Servernamen sowohl in die hosts-Datei, als auch in die hostname-Datei ein (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/hosts):
nano /etc/hosts
Passen Sie die roten Werte an Ihre Umgebung an, im Beispiel gehen wir davon aus, dass die Domäne „ihre.domain.de“ heißt:
127.0.0.1 localhost 127.0.1.1 ihre ihre.domain.de ::1 ihre ihre.domain.de ip6-localhost ip6-loopback [...]
Geben Sie den korrekten Servername in der hostname-Datei an und ersetzen den roten Wert durch Ihren:
nano /etc/hostname
Der Servername muss als FQDN, also vollqualifiziert angegeben werden:
ihre.domain.de
Überprüfen Sie, ob der Zeitserverdienst mit mindestens einem Endpunkt konfiguriert ist.
nano /etc/systemd/timesyncd.conf
Ist die Zeile NTP auskommentiert (#NTP=), so entfernen Sie das ‚#‘-Zeichen vor NTP und fügen Sie bspw. diese zwei Zeitserver hinzu:
NTP=ntp1.dismail.de ntp2.dismail.de
Speichern Sie diese Datei und starten den Zeitserver neu:
systemctl restart systemd-timesyncd
Sorgen Sie nun dafür, dass der Server nicht in einen „Energiesparmodus“ wechseln kann:
systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target
Starten Sie abschließend den Server neu
reboot now
und melden sich dann erneut mit priviligierten Benutzerrechten am Server an:
sudo -s
Fügen Sie dem System weitere Software-Repositories (Softwarequellen) hinzu, um die aktuellen Releases der jeweiligen Pakete installieren zu können.
Nur Ubuntu Server (X86_64):
apt install -y curl gnupg2 ca-certificates lsb-release ubuntu-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/ubuntu `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
add-apt-repository -y ppa:ondrej/php
curl "https://keyserver.ubuntu.com/pks/lookup?op=get&search=0xB8DC7E53946656EFBCE4C1DD71DAEAAB4AD4CAB6" \
| gpg --dearmor | sudo tee /usr/share/keyrings/ondrej-ubuntu-php.gpg >/dev/null
cat <<EOF > /etc/apt/sources.list.d/ondrej-ubuntu-php-noble.sources
Types: deb
URIs: https://ppa.launchpadcontent.net/ondrej/php/ubuntu/
Suites: noble
Components: main
Signed-By: /usr/share/keyrings/ondrej-ubuntu-php.gpg
EOF
curl -o /usr/share/keyrings/mariadb-keyring.pgp 'https://mariadb.org/mariadb_release_signing_key.pgp'
echo "deb [signed-by=/usr/share/keyrings/mariadb-keyring.pgp] https://mirror1.hs-esslingen.de/pub/Mirrors/mariadb/repo/10.11/ubuntu $(lsb_release -cs) main" \
| sudo tee /etc/apt/sources.list.d/mariadb.list
Nur Debian Server (X86_64):
apt install -y curl gnupg2 ca-certificates lsb-release debian-archive-keyring
curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
| sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg] \
http://nginx.org/packages/mainline/debian `lsb_release -cs` nginx" \
| sudo tee /etc/apt/sources.list.d/nginx.list
echo -e "Package: *\nPin: origin nginx.org\nPin: release o=nginx\nPin-Priority: 900\n" \
| sudo tee /etc/apt/preferences.d/99nginx
sh -c 'echo "deb [signed-by=/usr/share/keyrings/deb.sury.org-php.gpg] https://packages.sury.org/php/ $(lsb_release -sc) main" > /etc/apt/sources.list.d/php.list'
curl -sSLo /usr/share/keyrings/deb.sury.org-php.gpg https://packages.sury.org/php/apt.gpg
wget https://downloads.mariadb.com/MariaDB/mariadb_repo_setup
chmod +x mariadb_repo_setup
./mariadb_repo_setup --mariadb-server-version="mariadb-10.11"
Ab hier geht es wieder für beide Server-Betriebssysteme (Ubuntu und Debian) weiter:
Um die hinzugefügten Repositories einzulesen und das System damit zu präparieren aktualisieren wir das System abermals und generieren temporäre „self-signed“-Zertifikate, die im späteren Verlauf durch vollwertige Zertifikate von Let’s Encrypt ersetzt werden.
apt update && make-ssl-cert generate-default-snakeoil -y
Nun sind die Vorbereitungen komplett abgeschlossen und wir können mit der Installation des Webservers nginx beginnen.
apt install -y nginx
Den automatischen Start des Dienstes setzen wir wie folgt:
systemctl enable nginx.service
Mit Blick auf die späteren Anpassungen wird die Standardkonfiguration gesichert und eine neue Konfigurationsdatei geöffnet (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/nginx/nginx.conf):
mv /etc/nginx/nginx.conf /etc/nginx/nginx.conf.bak touch /etc/nginx/nginx.conf && nano /etc/nginx/nginx.conf
Kopieren Sie den gesamten nachfolgenden Inhalt in die Datei:
user www-data; worker_processes auto; pid /var/run/nginx.pid; events { worker_connections 2048; multi_accept on; use epoll; } http { log_format criegerde escape=json '{' '"time_local":"$time_local",' '"remote_addr":"$remote_addr",' '"remote_user":"$remote_user",' '"request":"$request",' '"status": "$status",' '"body_bytes_sent":"$body_bytes_sent",' '"request_time":"$request_time",' '"http_referrer":"$http_referer",' '"http_user_agent":"$http_user_agent"' '}'; server_names_hash_bucket_size 64; access_log /var/log/nginx/access.log criegerde; error_log /var/log/nginx/error.log warn; set_real_ip_from 127.0.0.1; real_ip_header X-Forwarded-For; real_ip_recursive on; include /etc/nginx/mime.types; default_type application/octet-stream; sendfile on; send_timeout 3600; tcp_nopush on; tcp_nodelay on; open_file_cache max=500 inactive=10m; open_file_cache_errors on; keepalive_timeout 65; reset_timedout_connection on; server_tokens off; resolver 176.9.93.198 176.9.1.117 valid=30s; resolver_timeout 5s; include /etc/nginx/conf.d/*.conf; }
Betreiben Sie Ihre Nextcloud hinter einem Reverse Proxy, so ersetzen Sie die IP des Parameteres „set_real_ip_from 127.0.0.1“ mit der IP des Reverse Proxys („set_real_ip_from w.x.y.z„).
Speichern Sie die Datei und schließen Sie diese, um im Anschluß den Webserver neu zu starten:
systemctl restart nginx.service
Vorbereitend für die SSL Zertifikate und die Webverzeichnisse legen wir vier Ordner an und setzen die korrekten Berechtigungen:
mkdir -p /var/log/nextcloud /var/nc_data /var/www/letsencrypt/.well-known/acme-challenge /etc/letsencrypt/rsa-certs /etc/letsencrypt/ecc-certs chown -R www-data:www-data /var/nc_data /var/www /var/log/nextcloud
Die Installation des Webservers ist somit bereits abgeschlossen und wir fahren mit der Installation und den Anpassungen von PHP fort.
2. Installation und Konfiguration von PHP 8.3 (fpm)
Das PHP Repository wurde bereits im vorherigen Kapitel eingerichtet und aktiviert, so dass wir direkt mit der Installation beginnen können.
apt update && apt install -y php-common \
php8.3-{fpm,gd,curl,xml,zip,intl,mbstring,bz2,ldap,apcu,bcmath,gmp,imagick,igbinary,mysql,redis,smbclient,sqlite3,cli,common,opcache,readline} \
imagemagick libmagickcore-6.q16-6-extra --allow-change-held-packages
Optional (bei einem geplanten Einsatz von Samba- und/oder cifs-Shares oder einer LDAP(s)-Anbindung):
apt install -y ldap-utils nfs-common cifs-utils
Setzen Sie das richtige Datumsformat, um auch ein korrektes Logging zu ermöglichen:
timedatectl set-timezone Europe/Berlin
Bevor wir mit den Optimierungen von PHP beginnen sichern wir die Konfigurationsdateien:
cp /etc/php/8.3/fpm/pool.d/www.conf /etc/php/8.3/fpm/pool.d/www.conf.bak cp /etc/php/8.3/fpm/php-fpm.conf /etc/php/8.3/fpm/php-fpm.conf.bak cp /etc/php/8.3/cli/php.ini /etc/php/8.3/cli/php.ini.bak cp /etc/php/8.3/fpm/php.ini /etc/php/8.3/fpm/php.ini.bak cp /etc/php/8.3/mods-available/apcu.ini /etc/php/8.3/mods-available/apcu.ini.bak cp /etc/php/8.3/mods-available/opcache.ini /etc/php/8.3/mods-available/opcache.ini.bak cp /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xml.bak systemctl restart php8.3-fpm.service
Die nachfolgend verwendeten Parameter lassen sich unter anderem mit Hilfe dieses Skripts ermitteln.
» codeberg: https://codeberg.org/criegerde/nextcloud/raw/branch/master/skripte/phpcalc.sh
Führen Sie die nachfolgenden Kommandos aus:
sed -i "s/;env\[HOSTNAME\] = /env[HOSTNAME] = /" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s/;env\[TMP\] = /env[TMP] = /" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s/;env\[TMPDIR\] = /env[TMPDIR] = /" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s/;env\[TEMP\] = /env[TEMP] = /" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s/;env\[PATH\] = /env[PATH] = /" /etc/php/8.3/fpm/pool.d/www.conf
sed -i 's/pm = dynamic/pm = ondemand/' /etc/php/8.3/fpm/pool.d/www.conf
sed -i 's/pm.max_children =.*/pm.max_children = 200/' /etc/php/8.3/fpm/pool.d/www.conf
sed -i 's/pm.start_servers =.*/pm.start_servers = 100/' /etc/php/8.3/fpm/pool.d/www.conf
sed -i 's/pm.min_spare_servers =.*/pm.min_spare_servers = 60/' /etc/php/8.3/fpm/pool.d/www.conf
sed -i 's/pm.max_spare_servers =.*/pm.max_spare_servers = 140/' /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s/;pm.max_requests =.*/pm.max_requests = 1000/" /etc/php/8.3/fpm/pool.d/www.conf
sed -i "s/allow_url_fopen =.*/allow_url_fopen = 1/" /etc/php/8.3/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = Off/" /etc/php/8.3/cli/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.3/cli/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.3/cli/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10240M/" /etc/php/8.3/cli/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10240M/" /etc/php/8.3/cli/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/8.3/cli/php.ini
sed -i "s/;cgi.fix_pathinfo.*/cgi.fix_pathinfo=0/" /etc/php/8.3/cli/php.ini
sed -i "s/memory_limit = 128M/memory_limit = 1G/" /etc/php/8.3/fpm/php.ini
sed -i "s/output_buffering =.*/output_buffering = Off/" /etc/php/8.3/fpm/php.ini
sed -i "s/max_execution_time =.*/max_execution_time = 3600/" /etc/php/8.3/fpm/php.ini
sed -i "s/max_input_time =.*/max_input_time = 3600/" /etc/php/8.3/fpm/php.ini
sed -i "s/post_max_size =.*/post_max_size = 10G/" /etc/php/8.3/fpm/php.ini
sed -i "s/upload_max_filesize =.*/upload_max_filesize = 10G/" /etc/php/8.3/fpm/php.ini
sed -i "s/;date.timezone.*/date.timezone = Europe\/\Berlin/" /etc/php/8.3/fpm/php.ini
sed -i "s/;cgi.fix_pathinfo.*/cgi.fix_pathinfo=0/" /etc/php/8.3/fpm/php.ini
sed -i "s/;session.cookie_secure.*/session.cookie_secure = True/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.enable=.*/opcache.enable=1/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.validate_timestamps=.*/opcache.validate_timestamps=1/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.enable_cli=.*/opcache.enable_cli=1/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.memory_consumption=.*/opcache.memory_consumption=256/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.interned_strings_buffer=.*/opcache.interned_strings_buffer=64/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.max_accelerated_files=.*/opcache.max_accelerated_files=100000/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.revalidate_freq=.*/opcache.revalidate_freq=0/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.save_comments=.*/opcache.save_comments=1/" /etc/php/8.3/fpm/php.ini
sed -i "s/;opcache.huge_code_pages=.*/opcache.huge_code_pages=0/" /etc/php/8.3/fpm/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 '$aapc.enable_cli=1' /etc/php/8.3/mods-available/apcu.ini
sed -i 's/opcache.jit=off/opcache.jit=on/' /etc/php/8.3/mods-available/opcache.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/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
Sie finden diese Dateien auch unter
» codeberg: https://codeberg.org/criegerde/nextcloud/raw/branch/master/etc/php/8.3/fpm/php.ini
» codeberg: https://codeberg.org/criegerde/nextcloud/raw/branch/master/etc/php/8.3/fpm/pool.d/www.conf
Optimieren wir PHP noch für MariaDB
sed -i '$a[mysql]' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.allow_local_infile=On' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.allow_persistent=On' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.cache_size=2000' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.max_persistent=-1' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.max_links=-1' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.default_port=3306' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.connect_timeout=60' /etc/php/8.3/mods-available/mysqli.ini sed -i '$amysql.trace_mode=Off' /etc/php/8.3/mods-available/mysqli.ini
Starten Sie nun beide Dienste, nginx und PHP, neu:
systemctl restart php8.3-fpm.service nginx.service
Auch PHP ist nun bereits installiert und für den Betrieb der Nextcloud optimiert. Für weitere PHP-Optimierungen finden Sie in diesem Artikel weitere Tuningmöglichkeiten. Starten wir nun mit der Installation und konfiguration des Datenbankserver MariaDB.
3. Installation und Konfiguration von MariaDB 10.11
Die Installation von MariaDB erfolgt mit diesem Befehl:
apt update && apt install -y mariadb-server
Bitte bachten Sie folgende Hinweise:
(1) potentiellen Problemen mittels apt-mark hold entgegenwirken
(2) manuelles Datenbankserver-Upgrade
(3) Herstellerempfehlung zum Upgrade von MariaDB v. 10.6 zu v. 10.11
Härten wir nun den Datenbankserver mittels des mitgelieferten Tools „mysql_secure_installation“. Bei einer Erstinstallation besteht kein Rootpasswort, so dass Sie die Abfrage mit ENTER bestätigen könne. Es wird empfohlen, ein Passwort direkt zu setzen, der entsprechende Dialog erscheint automatisch:
mariadb-secure-installation
Enter current password for root (enter for none): <ENTER> or type the password
Switch to unix_socket authentication [Y/n] Y
Change the root password? [Y/n] Y
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
Stoppen Sie nun den Datenbankserver und sichern dann die Standardkonfiguration, um unmittelbar danach Anpassungen vornehmen zu können (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/mysql/my.cnf):
systemctl stop mysql mkdir -p /var/log/mysql chown -R mysql:mysql /var/log/mysql mv /etc/mysql/my.cnf /etc/mysql/my.cnf.bak nano /etc/mysql/my.cnf
Kopieren Sie alle nachfolgenden Zeilen in die leere Datei:
[client]
default-character-set = utf8mb4
port = 3306
socket = /var/run/mysqld/mysqld.sock
[mysqld_safe]
log_error=/var/log/mysql/mysql_error.log
nice = 0
socket = /var/run/mysqld/mysqld.sock
[mysqld]
# performance_schema=ON
basedir = /usr
bind-address = 127.0.0.1
binlog_format = ROW
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci
datadir = /var/lib/mysql
default_storage_engine = InnoDB
expire_logs_days = 2
general_log_file = /var/log/mysql/mysql.log
innodb_buffer_pool_size = 2G
innodb_log_buffer_size = 32M
innodb_log_file_size = 512M
innodb_read_only_compressed=OFF
join_buffer_size = 2M
key_buffer_size = 512M
lc_messages_dir = /usr/share/mysql
lc_messages = en_US
log_bin = /var/log/mysql/mariadb-bin
log_bin_index = /var/log/mysql/mariadb-bin.index
log_bin_trust_function_creators = true
log_error = /var/log/mysql/mysql_error.log
log_slow_verbosity = query_plan
log_warnings = 2
long_query_time = 1
max_connections = 100
max_heap_table_size = 64M
max_allowed_packet = 512M
myisam_sort_buffer_size = 512M
port = 3306
pid-file = /var/run/mysqld/mysqld.pid
query_cache_limit = 0
query_cache_size = 0
read_buffer_size = 2M
read_rnd_buffer_size = 2M
skip-name-resolve
socket = /var/run/mysqld/mysqld.sock
sort_buffer_size = 2M
table_open_cache = 400
table_definition_cache = 800
tmp_table_size = 32M
tmpdir = /tmp
transaction_isolation = READ-COMMITTED
user = mysql
wait_timeout = 600
[mariadb-dump]
max_allowed_packet = 512M
quick
quote-names
[isamchk]
key_buffer = 16M
Speichern und schließen Sie die Datei und starten dann den Datenbankserver neu, um die Nextcloud-Datenbank, den Nextcloud-Benutzer und sein Passworts einzurichten:
systemctl restart mysql.service
mariadb -uroot -p -e "CREATE DATABASE nextclouddb CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci; CREATE USER nextclouddbuser@localhost identified by 'nextclouddbpassword'; GRANT ALL PRIVILEGES on nextclouddb.* to nextclouddbuser@localhost; FLUSH privileges;"
Erläuterung (bitte nach Ihren Wünschen anpassen):
Datenbankname: nextclouddb
Datenbankbenutzer: nextclouddbuser
Datenbankbenutzerpaßwort: nextclouddbpassword
mariadb -h localhost -uroot -p -e "SELECT @@TX_ISOLATION; SELECT SCHEMA_NAME 'database', default_character_set_name 'charset', DEFAULT_COLLATION_NAME 'collation' FROM information_schema.SCHEMATA WHERE SCHEMA_NAME='nextclouddb'"
Erscheint in der Ausgabe (resultset) „READ-COMMITTED“ und „utf8mb4_general_ci“
so wurde alles korrekt eingerichtet und wir können mit der Installation von Redis fortfahren.
4. Installation und Konfiguration von Redis
Wir installieren den Redis-Server um die Nextcloudperformance zu steigern, da durch Redis die Last auf der MariaDB-Nextclouddatenbank reduziert wird:
Hinweis bzgl. Redis und der Lizenzänderung: https://digitalcourage.social/@crits/112205838874261587
apt update && apt install -y redis-server
Passen Sie die Rediskonfiguration (Redis-Passwort-Bitte-ändern) durch das Sichern und Anpassen der Konfiguration mittels Ausführen der nachfolgenden Befehle an (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/redis/redis.conf):
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
sed -i 's/# requirepass foobared/requirepass Redis-Passwort-Bitte-ändern/' /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
Aus hinreichender Installationserfahrung heraus empfehle ich Ihnen, den gesamten Server einmalig neu zu starten:
reboot now
Gratulation, der Server ist bereits vollständig installiert und eingerichtet, so dass nun mit der Einrichtung der Nextcloud begonnen werden kann.
5. Installation und Optimierung der Nextcloud (inkl. SSL)
Wir richten verschiedene vHosts, also Webserverkonfigurationsdateien, ein und modifizieren die Standard vHost-Datei (default.conf) so, dass diese auch durch spätere Systemupdates nicht automatisch verändert wird. Da das System zuvor neu gestartet wurde wechseln wir erneut in den privilegierten Benutzermodus.
sudo -s
Sichern Sie die Standard vhost-Datei namens default.conf und legen zuerst leere vHost-Dateien zum Konfigurieren an.
[ -f /etc/nginx/conf.d/default.conf ] && mv /etc/nginx/conf.d/default.conf /etc/nginx/conf.d/default.conf.bak touch /etc/nginx/conf.d/default.conf touch /etc/nginx/conf.d/http.conf touch /etc/nginx/conf.d/nextcloud.conf
Somit ist durch die leere „default.conf“ Datei auch bei späteren Aktualisierungen des Webservers sichergestellt, dass diese Standardkonfiguration den Nextcloudbetrieb nicht beeinflußt.
Erstellen Sie die globale vhost-Datei, um die http-Standardanfragen permanent auf https umzuleiten und zudem die SSL-Zertifikatskommunikation mit Let’sEncrypt zu ermöglichen (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/nginx/conf.d/http.conf):
nano /etc/nginx/conf.d/http.conf
Kopieren Sie alle nachfolgenden Zeilen in die Datei http.conf und passen den rot markierten Domainnamen entsprechend Ihres Systems an:
upstream php-handler { server unix:/run/php/php8.3-fpm.sock; } map $arg_v $asset_immutable { "" ""; default "immutable"; } server { listen 80 default_server; listen [::]:80 default_server; server_name ihre.domain.de; root /var/www; location ^~ /.well-known/acme-challenge { default_type text/plain; root /var/www/letsencrypt; } location / { return 301 https://$host$request_uri; } }
Speichern und schließen Sie diese Datei. Bearbeiten Sie nun die eigentliche Nextcloud vHost-Datei nextcloud.conf, die sämtliche Konfigurationen für den Betrieb der Nextcloud enthält.
nano /etc/nginx/conf.d/nextcloud.conf
Kopieren Sie alle nachfolgenden Zeilen in die Datei nextcloud.conf und passen den rot markierten Domainnamen entsprechend Ihres Systems an (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/nginx/conf.d/nextcloud.conf):
limit_req_zone $binary_remote_addr zone=NextcloudRateLimit:10m rate=2r/s;
server {
listen 443 ssl;
listen [::]:443 ssl;
http2 on;
#listen 443 quic reuseport;
#listen [::]:443 quic reuseport;
#http3 on;
#http3_hq on;
#quic_retry on;
server_name ihre.domain.de;
ssl_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
ssl_certificate_key /etc/ssl/private/ssl-cert-snakeoil.key;
ssl_trusted_certificate /etc/ssl/certs/ssl-cert-snakeoil.pem;
#ssl_certificate /etc/letsencrypt/rsa-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/rsa-certs/privkey.pem;
#ssl_certificate /etc/letsencrypt/ecc-certs/fullchain.pem;
#ssl_certificate_key /etc/letsencrypt/ecc-certs/privkey.pem;
#ssl_trusted_certificate /etc/letsencrypt/ecc-certs/chain.pem;
ssl_dhparam /etc/ssl/certs/dhparam.pem;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.3 TLSv1.2;
ssl_ciphers 'TLS-CHACHA20-POLY1305-SHA256:TLS-AES-256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384';
ssl_ecdh_curve X448:secp521r1:secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
client_max_body_size 10G;
client_body_timeout 3600s;
client_body_buffer_size 512k;
fastcgi_buffers 64 4K;
gzip on;
gzip_vary on;
gzip_comp_level 4;
gzip_min_length 256;
gzip_proxied expired no-cache no-store private no_last_modified no_etag auth;
gzip_types application/atom+xml text/javascript application/javascript application/json application/ld+json application/manifest+json application/rss+xml application/vnd.geo+json application/vnd.ms-fontobject application/wasm application/x-font-ttf application/x-web-app-manifest+json application/xhtml+xml application/xml font/opentype image/bmp image/svg+xml image/x-icon text/cache-manifest text/css text/plain text/vcard text/vnd.rim.location.xloc text/vtt text/x-component text/x-cross-domain-policy;
add_header Strict-Transport-Security "max-age=15768000; includeSubDomains; preload;" always;
add_header Permissions-Policy "interest-cohort=()";
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 "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
add_header x-quic 'h3';
add_header Alt-Svc 'h3-29=":$server_port"';
fastcgi_hide_header X-Powered-By;
include mime.types;
types {
text/javascript mjs;
}
root /var/www/nextcloud;
index index.php index.html /index.php$request_uri;
location = / {
if ( $http_user_agent ~ ^DavClnt ) {
return 302 /remote.php/webdav/$is_args$args;
}
}
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location ^~ /.well-known {
location = /.well-known/carddav { return 301 /remote.php/dav/; }
location = /.well-known/caldav { return 301 /remote.php/dav/; }
location /.well-known/acme-challenge { try_files $uri $uri/ =404; }
location /.well-known/pki-validation { try_files $uri $uri/ =404; }
return 301 /index.php$request_uri;
}
location ~ ^/(?:build|tests|config|lib|3rdparty|templates|data)(?:$|/) { return 404; }
location ~ ^/(?:\.|autotest|occ|issue|indie|db_|console) { return 404; }
location ~ \.php(?:$|/) {
rewrite ^/(?!index|remote|public|cron|core\/ajax\/update|status|ocs\/v[12]|updater\/.+|ocs-provider\/.+|.+\/richdocumentscode\/proxy) /index.php$request_uri;
fastcgi_split_path_info ^(.+?\.php)(/.*)$;
set $path_info $fastcgi_path_info;
try_files $fastcgi_script_name =404;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $path_info;
fastcgi_param HTTPS on;
fastcgi_param modHeadersAvailable true;
fastcgi_param front_controller_active true;
fastcgi_pass php-handler;
fastcgi_intercept_errors on;
fastcgi_request_buffering off;
fastcgi_read_timeout 3600;
fastcgi_send_timeout 3600;
fastcgi_connect_timeout 3600;
fastcgi_max_temp_file_size 0;
}
location ~ \.(?:css|js|mjs|svg|gif|ico|jpg|png|webp|wasm|tflite|map|ogg|flac)$ {
try_files $uri /index.php$request_uri;
add_header Cache-Control "public, max-age=15768000, $asset_immutable";
add_header Permissions-Policy "interest-cohort=()";
add_header Referrer-Policy "no-referrer" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "SAMEORIGIN" always;
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header X-Robots-Tag "noindex, nofollow" always;
add_header X-XSS-Protection "1; mode=block" always;
add_header Alt-Svc 'h3=":$server_port"; ma=86400';
add_header x-quic 'h3';
add_header Alt-Svc 'h3-29=":$server_port"';
access_log off;
expires 6M;
}
location ~ \.(otf|woff2?)$ {
try_files $uri /index.php$request_uri;
expires 7d;
access_log off;
}
location /remote {
return 301 /remote.php$request_uri;
}
location /login {
limit_req zone=NextcloudRateLimit burst=5 nodelay;
limit_req_status 429;
try_files $uri $uri/ /index.php$request_uri;
}
location / {
try_files $uri $uri/ /index.php$request_uri;
}
}
Speichern und schließen Sie diese Datei. Möchten Sie HTTP3 aktivieren, so führen Sie diese Befehle aus:
sed -i "s/#listen 443 quic reuseport;/listen 443 quic reuseport;/" /etc/nginx/conf.d/nextcloud.conf
sed -i "s/#listen \[\:\:\]\:443 quic reuseport;/listen \[\:\:\]\:443 quic reuseport;/" /etc/nginx/conf.d/nextcloud.conf
sed -i "s/#http3 on;/http3 on;/" /etc/nginx/conf.d/nextcloud.conf
sed -i "s/#http3_hq on;/http3_hq on;/" /etc/nginx/conf.d/nextcloud.conf
sed -i "s/#quic_retry on;/quic_retry on;/" /etc/nginx/conf.d/nextcloud.conf
Erweitern Sie dann die Server- und Systemsicherheit durch die Möglichkeit des sicheren Schlüsselaustauschs mittels eines Diffie-Hellman Schlüssels (» git: https://codeberg.org/criegerde/nextcloud/src/branch/master/etc/ssl/certs/dhparam.pem):
openssl dhparam -dsaparam -out /etc/ssl/certs/dhparam.pem 4096
Bitte haben Sie nun Geduld! Das Generieren kann – in Abhängigkeit von der Systemleistung – einige Minuten dauern. Erst wenn das Generieren abgeschlossen ist, starten wir den Webserver erneut durch.
systemctl restart nginx.service
Wir beginnen nun die ‚eigentliche‘ Installation der Nextcloud Software und richten dafür die SSL Zertifikate von Let’s Encrypt mittels acme ein. Wechseln Sie dafür in das Arbeitsverzeichnis
cd /usr/local/src
und laden das aktuelle Nextcloud Release herunter:
wget https://download.nextcloud.com/server/releases/latest.tar.bz2 wget https://download.nextcloud.com/server/releases/latest.tar.bz2.md5
Überpüfen Sie die Dateien:
md5sum -c latest.tar.bz2.md5 < latest.tar.bz2
Nur wenn Ihnen der Test mit „OK“ bestätigt wird, fahren wir fort!
Entpacken Sie die Nextcloud Software in das Webverzeichnis (/var/www), setzen dann die notwendigen Berechtigung und Löschen die heruntergeladenen Dateien:
tar -xjf latest.tar.bz2 -C /var/www && chown -R www-data:www-data /var/www/ && rm -f latest.tar.bz2
Bitte stellen Sie sicher, dass Ihr Server sowohl über Port 80/TCP als auch über Port 443/TCP von außen erreichbar ist. Das Erstellen und Aktualisieren von Let’s Encryptzertifikaten erfolgt im Zuge dieser Anleitung zwingend über http und Port 80. Andere Möglichkeiten werden von uns im Artikel (Let’s Encrypt Zertifikate (RSA 4096 oder EC 384) ohne offene TCP-Ports 80 und 443 beantragen und erstellen beschrieben.
Für das Zertifikatshandling erstellen wir nun einen dedizierten Benutzer und fügen diesen der www-data Gruppe hinzu:
adduser acmeuser --gecos "" --disabled-password usermod -aG www-data acmeuser
Diesem technischen Benutzer erteilen wir noch die notwendigen Berechtigungen, um bei einer Zertifikatserneuerung den notwendigen Webserverstart initiieren zu können.
touch /etc/sudoers.d/acmeuser cat <<EOF >/etc/sudoers.d/acmeuser acmeuser ALL=NOPASSWD: /bin/systemctl reload nginx.service EOF
Wechseln Sie in die Shell des neuen Benutzers (acmeuser) um die Zertifikatssoftware zu installieren und verlassen diese Shell direkt im Anchluß wieder:
su - acmeuser
curl https://get.acme.sh | sh exit
Passen Sie die entsprechenden Datei- und Verzeichnisberechtigungen an, um die neuen Zertifikate darin speichern zu können:
chmod -R 775 /var/www/letsencrypt && chmod -R 770 /etc/letsencrypt && chown -R www-data:www-data /var/www/ /etc/letsencrypt
Setzen Sie Let’s Encrypt als Standard CA für Ihren Server
su - acmeuser -c ".acme.sh/acme.sh --set-default-ca --server letsencrypt"
und wechseln dann erneut in die Shell des neuen Benutzers
su - acmeuser
Beantragen Sie nun die SSL-Zertifikate von Let’s Encrypt und ersetzen dabei ihre.domain.de mit Ihrer realen Domain:
acme.sh --issue -d ihre.domain.de --server letsencrypt --keylength 4096 -w /var/www/letsencrypt --key-file /etc/letsencrypt/rsa-certs/privkey.pem --ca-file /etc/letsencrypt/rsa-certs/chain.pem --cert-file /etc/letsencrypt/rsa-certs/cert.pem --fullchain-file /etc/letsencrypt/rsa-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
acme.sh --issue -d ihre.domain.de --server letsencrypt --keylength ec-384 -w /var/www/letsencrypt --key-file /etc/letsencrypt/ecc-certs/privkey.pem --ca-file /etc/letsencrypt/ecc-certs/chain.pem --cert-file /etc/letsencrypt/ecc-certs/cert.pem --fullchain-file /etc/letsencrypt/ecc-certs/fullchain.pem --reloadcmd "sudo /bin/systemctl reload nginx.service"
Verlassen Sie die Shell des neuen Benutzers
exit
und legen sich dann ein Skript an, dass zukünftig die Berechtigungen überprüft und korrigiert (permissions.sh):
nano /root/permissions.sh
Kopieren Sie alle Zeilen in die Datei:
#!/bin/bash
find /var/www/ -type f -print0 | xargs -0 chmod 0640
find /var/www/ -type d -print0 | xargs -0 chmod 0750
if [ -d "/var/www/nextcloud/apps/notify_push" ]; then
chmod ug+x /var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push
fi
chmod -R 775 /var/www/letsencrypt
chmod -R 770 /etc/letsencrypt
chown -R www-data:www-data /var/www /etc/letsencrypt
chown -R www-data:www-data /var/nc_data
chmod 0644 /var/www/nextcloud/.htaccess
chmod 0644 /var/www/nextcloud/.user.ini
exit 0
Markieren Sie das Skript als ausführbar und führen es dann direkt aus:
chmod +x /root/permissions.sh /root/permissions.sh
Entfernen Sie Ihre bisher verwendeten Self-Signed-Zertifikate aus nginx und aktivieren Sie die neuen, vollwertigen und bereits gültigen SSL Zertifikate von Let’s Encrypt. Starten Sie dann den Webserver neu:
sed -i '/ssl-cert-snakeoil/d' /etc/nginx/conf.d/nextcloud.conf sed -i s/#\ssl/\ssl/g /etc/nginx/conf.d/nextcloud.conf systemctl restart nginx.service
Um sowohl die SSL-Zertifikate automatisch zu erneuern, als auch den notwendigen Webserverneustart zu initiieren, wurde automatisch ein Cronjob angelegt.
crontab -l -u acmeuser
Wir können nun mit der Einrichtung der Nextcloud fortfahren. Dazu verwenden Sie den nachfolgenden „silent“ Installationsbefehl:
sudo -u www-data php /var/www/nextcloud/occ maintenance:install --database "mysql" --database-name "nextclouddb" --database-user "nextclouddbuser" --database-pass "nextclouddbpassword" --admin-user "YourNextcloudAdmin" --admin-pass "YourNextcloudAdminPasssword" --data-dir "/var/nc_data"
Erläuterungen:
database-name „nextclouddb“ : Datenbankname aus Kapitel 3
database-user “nextclouddbuser” : Datenbankbenutzer aus Kapitel 3
database-pass “nextclouddbpassword” : Datenbankbenutzerpasswort aus Kapitel 3
admin-user “YourNextcloudAdmin” : frei wählbar von Ihnen
admin-pass “YourNextcloudAdminPasssword” : frei wählbar von Ihnen
Warten Sie bis die Installation der Nextcloud abgeschlossen wurde und passen dann die zentrale Konfigurationsdatei der Nextcloud „config.php“ als Webuser www-data an:
1. Fügen Sie Ihre Domain und die IP des Servers als „trusted domain“ hinzu, ergänzen Sie dabei ihre.domain.de und y.x.y.z mit Ihrer dedizierten Domain:
sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 0 --value=w.x.y.z sudo -u www-data php /var/www/nextcloud/occ config:system:set trusted_domains 1 --value=ihre.domain.de
2. Setzen Sie Ihre Domain als overwrite.cli.url und overwritehost, ergänzen Sie dabei ihre.domain.de mit Ihrer dedizierten Domain:
sudo -u www-data php /var/www/nextcloud/occ config:system:set overwrite.cli.url --value=https://ihre.domain.de sudo -u www-data php /var/www/nextcloud/occ config:system:set overwritehost --value=ihre.domain.de
Nun erweitern wir abschließend die Nextcloud Konfiguration. Sichern Sie dazu zuerst die bestehende config.php und führen dann die nachfolgenden Zeilen in einem Block aus (» codeberg: https://codeberg.org/criegerde/nextcloud/src/branch/master/var/www/nextcloud/config/config.php:
sudo -u www-data cp /var/www/nextcloud/config/config.php /var/www/nextcloud/config/config.php.bak
sed -i '/);/d' /var/www/nextcloud/config/config.php
cat <<EOF >>/var/www/nextcloud/config/config.php
'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',
'enable_previews' => true,
'enabledPreviewProviders' =>
array (
0 => 'OC\\Preview\\PNG',
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\\HEIC',
11 => 'OC\\Preview\\Movie',
12 => 'OC\\Preview\\MKV',
13 => 'OC\\Preview\\MP4',
14 => 'OC\\Preview\\AVI',
),
'filesystem_check_changes' => 0,
'filelocking.enabled' => 'true',
'htaccess.RewriteBase' => '/',
'integrity.check.disabled' => false,
'knowledgebaseenabled' => false,
'log_rotate_size' => '104857600',
'logfile' => '/var/log/nextcloud/nextcloud.log',
'loglevel' => 2,
'logtimezone' => 'Europe/Berlin',
'memcache.local' => '\\\\OC\\\\Memcache\\\\APCu',
'memcache.locking' => '\\\\OC\\\\Memcache\\\\Redis',
'overwriteprotocol' => 'https',
'preview_max_x' => 1024,
'preview_max_y' => 768,
'preview_max_scale_factor' => 1,
'profile.enabled' => false,
'redis' =>
array (
'host' => '/var/run/redis/redis-server.sock',
'port' => 0,
'password' => 'Redis-Passwort-Bitte-ändern',
'timeout' => 0.5,
'dbindex' => 1,
),
'quota_include_external_storage' => false,
'share_folder' => '/Freigaben',
'skeletondirectory' => '',
'trashbin_retention_obligation' => 'auto, 7',
'maintenance_window_start' => 1,
);
EOF
sed -i 's/^[ ]*//' /var/www/nextcloud/config/config.php
Modifizieren Sie die „.user.ini“
sudo -u www-data sed -i "s/output_buffering=.*/output_buffering=0/" /var/www/nextcloud/.user.ini
und passen die Nextcloud sowie die Nextcloud-Apps als user www-data an
sudo -u www-data php /var/www/nextcloud/occ maintenance:repair --include-expensive
sudo -u www-data php /var/www/nextcloud/occ app:disable survey_client
sudo -u www-data php /var/www/nextcloud/occ app:disable firstrunwizard
Optional: Aktivieren des internen Nextcloud Office-Pakets:
sudo -u www-data /usr/bin/php /var/www/nextcloud/occ app:install richdocuments sudo -u www-data /usr/bin/php /var/www/nextcloud/occ app:install richdocumentscode
Nextcloud ist ab sofort voll einsatzfähig, optimiert und abgesichert. Starten Sie alle relevanten Services neu:
systemctl stop nginx.service
systemctl stop php8.3-fpm.service
systemctl restart mariadb.service
systemctl start redis-server.service
systemctl start php8.3-fpm.service
systemctl start nginx.service
Richten Sie einen Cronjob für Nextcloud als „www-data“ – Benutzer ein:
crontab -u www-data -e
Fügen Sie diese Zeile am Ende ein
*/5 * * * * php -f /var/www/nextcloud/cron.php > /dev/null 2>&1
Speichern und schließen Sie dann die Datei und konfigurieren Sie den Nextcloud-Job von „Ajax“ zu „Cron“ mittels der Nextclouds CLI um:
sudo -u www-data php /var/www/nextcloud/occ background:cron
Bitte nehmen Sie sich etwas Zeit und überprüfen den Sicherheitsstatus Ihres Servers.
Ziel sollte zudem sein, mindestens die nachfolgend dargestellten „A+“-Ergebnisse in den Tests zu erzielen:
https://www.ssllabs.com/ssltest/index.html
und https://observatory.mozilla.org/
Um Schwierigkeiten zu vermeiden, die aus Aktualisierungen der verwendeten Komponenten resultieren können, lassen sich die relevanten Pakete mittels „apt-mark hold“ vom Aktualisieren ausschließen:
apt-mark hold nginx* nginx-*
apt-mark hold redis-*
apt-mark hold mariadb-* mysql-* galera-*
apt-mark hold php-* php8.3-*
Um diese Pakete im Rahmen von Aktualisierungen wieder zu berücksichtigen muss nur das „hold“ aufgehoben werden:
apt-mark unhold nginx* nginx-*
apt-mark unhold redis-*
apt-mark unhold mariadb-* mysql-* galera-*
apt-mark unhold php-* php8.3-*
Nach der Aktualisierung empfehlen wir ein erneutes setzen auf ‚hold‘.
6. Systemhärtung (crowdsec IPS und ufw)
Zuerst installieren wir crowdsec um den Server gegen Brute-force-Attacken und fehlerhafte Loginversuche zu schützen. Richten Sie dafür das Repository ein:
curl -s https://packagecloud.io/install/repositories/crowdsec/crowdsec/script.deb.sh | sudo bash
Nur für Ubuntu 24:
sed -i 's/noble/jammy/' /etc/apt/sources.list.d/crowdsec_crowdsec.list
Ab hier geht es wieder sowohl für Denian als auch für Ubuntu 22/24.x weiter:
Aktualisieren Sie die Repositories und installieren dann crowdsec.
apt update
apt install crowdsec
Stellen wir nun den „Autostart“ der CrowdSec-Software sicher:
systemctl enable --now crowdsec.service
und überprüfen, ob CrowdSec gestartet und auf Autostart („enabled“) steht:
systemctl status crowdsec.service
Richten wir nun die Grundregeln des IPS ein um einen Grundschutz zu erhalten. Dazu installieren wir „crowdsec-firewall-bouncer-nftables“ nach:
apt install crowdsec-firewall-bouncer-nftables
und lassen uns die verfügbaren und verwendeten Regeln (Bouncer) anzeigen:
cscli bouncers list
Der Grundschutz ist nun gewährleistet und beinhaltet bereits diverse Szenarien und Parser:
cscli scenarios list && cscli parser list
Um Ihren Cloudserver gegen NGINX- und Nextcloud-Attacken abzusichern fügen wir sowohl eine NGINX-, als auch eine Nextcloud- und SSH-Collection hinzu:
cscli collections install crowdsecurity/nginx
cscli collections install crowdsecurity/nextcloud
cscli collections install crowdsecurity/sshd
Passen Sie nun den Pfad des Nextcloud-Logfiles für crowdsec an:
nano /etc/crowdsec/acquis.yaml
Fügen Sie am Ende der Datei folgende rot markierten Zeilen ein:
[...]
---
filenames:
- /var/log/nextcloud/nextcloud.log
labels:
type: Nextcloud
---
Um diese Erweiterungen wirksam werden zu lassen, führen wir noch diesen Befehl zum aktualisieren der Dienste aus:
systemctl reload crowdsec && systemctl restart crowdsec
Lassen Sie sich nun die Collections anzeigen und prüfen, ob Nextcloud (Name: nextcloud), NGINX (Name: nginx) und SSH (Name: sshd) mit dem Status „enabled“ dargestellt werden. Ein erneuter Blick auf die Szenarien und Parser zeigt uns zudem auch die neuen Erweiterungen an:
cscli collections list && cscli scenarios list && cscli parser list
Ab sofort ist Ihr System auf Angriffe wie bspw. Bruteforce-, DDOS- und ähnliche Szenarien vorbereitet und sperrt „kritisch aufgefallene“ IP’s automatisch für bspw. 4 Stunden für ihren Server. Dabei werden u.a. Angriffe auf Nextcloud (logins, Bruteforce u.v.m.), SSH und NGINX analysiert und interpretiert!
Installieren wir im Anschluß die serverseitige Firewall namens uncomplicated firewall (ufw). Sofern Sie zuvor den SSH-Port von 22 auf einen anderen Port geändert haben, so müssen Sie die 22 zwingend entsprechend ersetzen!
apt install -y ufw
ufw allow 80/tcp comment "LetsEncrypt (http)"
ufw allow 443/tcp comment "LetsEncrypt (https)"
ufw allow 443/udp comment "http/3 (https)"
ufw allow 22/tcp comment "SSH"
Möchten Sie SSH nicht nach außen freigeben (empfohlen!) und nur aus dem internen Netz nutzen, so ersetzen Sie den letzten ufw-Befehl (ufw allow 22/tcp) durch diesen und ersetzen das exemplarische Subnetz durch ihr Subnetz :
ufw allow proto tcp from w.x.y.0/24 to any port 22 comment "SSH nur aus dem LAN"
Setzen Sie das Firewall-Logging auf „medium“ und verhindern nicht definierte eingehende Verbindungen.
ufw logging medium ufw default deny incoming
Aktivieren Sie die Firewall und starten diese neu:
ufw enable systemctl restart ufw.service ufw status verbose
Nextcloud kommuniziert mit verschiedenen Remote-Servern, um gewisse Information verarbeiten, austauschen und bereitstellen zu können:
- www.nextcloud.com, www.startpage.com, www.eff.org, www.edri.org for checking the internet connection
- apps.nextcloud.com for the available apps
- updates.nextcloud.com for Nextcloud updates
- lookup.nextcloud.com For updating and lookup in the federated sharing addressbook
- push-notifications.nextcloud.com for sending push notifications to mobile clients
- surveyserver.nextcloud.com if the admin has agreed to share anonymized data
- Any remote Nextcloud server that is connected with federated sharing
- …
Quelle: Nextcloud
7. Systemmails per postfix versenden
Aktualisieren Sie ihren Server und installieren Sie postfix. Sie haben damit die Möglichkeit, sich von fail2ban, apticron und bei SSH-Anmeldungen per Mail informieren zu lassen:
apt update && apt install -y postfix mailutils
Erstellen Sie Ihre Mailkonfiguration anhand meines nachfolgenden Beispiels: Wählen Sie zuerst Satellitensystem aus, geben dann ihre Domäne ein (bspw.domain.de) und zuletzt noch den smtp-Server.
Passen Sie nun die Postfixkonfiguration an:
nano /etc/postfix/main.cf
Ersetzen Sie die rot markierten Stellen:
smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu) biff = no append_dot_mydomain = no readme_directory = no compatibility_level = 2 smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key smtpd_tls_security_level=may smtp_tls_CApath=/etc/ssl/certs smtp_tls_security_level=may smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination myhostname = ihre.domain.de alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases mydestination = $myhostname, ihre.domain.de, localhost.domain.de, localhost relayhost = smtp.mailserver.de:587 mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128 mailbox_size_limit = 0 recipient_delimiter = + inet_interfaces = loopback-only inet_protocols = all #Bei Problemen mit IPv6 stellen Sie die Zeile wie nachfolgend um #inet_protocols = ipv4 smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous sender_canonical_maps = hash:/etc/postfix/sender_canonical smtp_use_tls = yes smtp_enforce_tls = yes
Hinterlegen Sie nun die Zugangsdaten für das Versenden von Mails:
nano /etc/postfix/sasl_passwd
Tragen Sie die Daten wie folgt ein und ersetzen die roten Werte durch Ihre:
smtp.domain.de ihremail@domain.de:passwort
Da in dieser Datei das Passwort im Klartext steht setzen wir die Dateiberechtigungen auf 600
chmod 600 /etc/postfix/sasl_passwd
Schreiben Sie nun die Domäne in die Datei mailname:
nano /etc/mailname
Ersetzen Sie den roten Wert durch Ihre Domäne:
domain.de
Abschließend definieren wir noch den Bezug von Benutzern zu Mailadressen. Öffnen Sie die Datei
nano /etc/postfix/sender_canonical
und legen dort Benutzer und Mailadressen fest:
root mail@domain.de root@hostname mail@domain.de <Ihr Benutzer> mail@domain.de www-data mail@domain.de default mail@domain.de
Jetzt werden die Konfiguration kompiliert und Postfix neu gestartet:
postmap /etc/postfix/sasl_passwd postmap /etc/postfix/sender_canonical systemctl restart postfix.service
Testen Sie nun den Versandt einer Mail über Ihr Postfix
echo "Dies ist eine Testmail" | mailx -s "Test" ihremail@domain.de
Sollte die Mail nicht ankommen, so sehen Sie bitte im Log (mail.log) nach:
tail -f /var/log/mail.log
Passen Sie die PHP-Konfiguration an um auch PHP-Mails über postfix zu versenden:
nano /etc/php/8.3/fpm/php.ini
Setzen Sie den sendmail_path wie folgt:
sendmail_path = "/usr/sbin/sendmail -t -i"
und starten dann PHP neu:
systemctl restart php8.3-fpm.service
Sie können nun auch Nextcloud entsprechend konfigurieren
Ihr Mailserver ist nun einsatzbereit und Sie können nun weitere Systemmails (bspw. von fail2ban und apticron) konfigurieren:
(optional) 7.1 Konfiguration von crowdsec-Mailbenachrichtigungen
Ersetzen Sie in der crowdsec-Konfiguration die nachfolgenden Parameter durch Ihre, um Benachrichtigungen bei fehlerhaften Loginversuchen und Banns zu erhalten. Sichern Sie dazu die Originalkonfiguration von crowdsec und bearbeiten diese dann im Anschluß:
cp /etc/crowdsec/notifications/email.yaml /etc/crowdsec/notifications/email.yaml.bak nano /etc/crowdsec/notifications/email.yaml
Ersetzen Sie die smtp-relevanten Daten:
[...]
smtp_host: smtp.domain.de
smtp_username: myemail@domain.de
smtp_password: mypassword
smtp_port: 587
sender_email: myemail@domain.de
receiver_emails:
- ihre@mail.de
[...]
Aktivieren Sie in der folgenden Datei das Benachrichtigungsprofil, indem Sie vor „notifications:“ und „- email_default“ jeweils die Rauten entfernen:
nano /etc/crowdsec/profiles.yaml
Nach dem Speichern beider Konfigurationsdateien wird crowdsec neu gestartet
systemctl restart crowdsec
und somit die E-Mail-Benachrichtigungen aktiviert.
(optional) 7.2 Installation von Apticron inkl. Mailbenachrichtigungen
Apticron informiert Sie über verfügbare Systemaktualisierungen bzw. auch dann, wenn ihr System „up2date“ ist. Installieren Sie apticron aus den Standardsoftwarequellen Ubuntus:
apt update && apt install -y apticron
Nun passen wir apticron an und ändern wenigstens die folgenden Parameter:
cp /usr/lib/apticron/apticron.conf /etc/apticron/apticron.conf nano /etc/apticron/apticron.conf
... EMAIL="ihre@mailadresse.de" ... SYSTEM="ihre.domain.de" ... NOTIFY_HOLDS="1" ... NOTIFY_NO_UPDATES="1" ... CUSTOM_SUBJECT='$SYSTEM: $NUM_PACKAGES package update(s)' ... CUSTOM_NO_UPDATES_SUBJECT='$SYSTEM: no updates available' ... CUSTOM_FROM="ihre@mailadresse.de" ...
Überprüfen Sie apticron und den soeben konfigurierten Mailversand indem sie apticron aufrufen:
apticron
Sie erhalten nun umgehend eine Mailbenachrichtigungen über Ihren aktuellen Systemzustand. Passen Sie zuletzt noch den Cronjob an, um sich regelmäßig und automatisch benachrichtigen zu lassen:
cp /etc/cron.d/apticron /etc/cron.d/apticron.bak nano /etc/cron.d/apticron
30 7 * * * root if test -x /usr/sbin/apticron; then /usr/sbin/apticron --cron; else true; fi
Apticron würde Sie am obigen Beispiel jeden Morgen um 07.30 Uhr per Mail über Ihren Systemaktualitätsgrad informieren.
(optional) 7.3 Mailbenachrichtigungen bei SSH-Einwahl
Passen Sie die Profildatei an und erweitern diese am Ende um die folgenden Zeilen:
nano /etc/profile
if [ -n "$SSH_CLIENT" ]; then
echo 'Login on' `hostname` `date` `who -m` | mail -s "Login on `hostname` from `echo $SSH_CLIENT |
awk '{print $1}'`" ihre@mailadresse.de
fi
Bei jeder erfolgreichen SSH-Einwahl werden Sie ab sofort aktiv benachrichtigt.
8. Optimieren & aktualisieren der Nextcloud per Skript
Erstellen Sie ein Skript um den Server, die Nextcloud sowie die aktivierten Apps zu aktualisieren und zu optimieren:
cd /root
wget -O update.sh -q https://codeberg.org/criegerde/nextcloud/raw/branch/master/skripte/update.sh
Alternativ steht Ihnen auch ein Updateskript inklusive der Nextcloud-Office-Docker-Aktualisierung zur Verfügung.
wget -O update.sh -q https://codeberg.org/criegerde/nextcloud/raw/branch/master/skripte/update-nc-office.sh
Markieren Sie das Skript als ausführbar und führen Sie es als privilegierter Benutzer regelmäßig aus.
chmod +x /root/update.sh
/root/update.sh
Weiterführende Herstellerinformationen:
- Nextcloud Webseite
- Nextcloud Dokumentation
- Nextcloud app store
- Nextcloud Vergleichsmatrix
- Nextcloud Installationsquellen
- Nextcloud Changelog und Archiv
- nginx Webseite
- PHP time zones
- MariaDB Server Documentation
- Certbot
- Lets Encrypt
- ISO Alpha-2 country codes (‚default_phone_region‘ => ‚DE‘,)
9. Optional: Systemüberwachung mit netdata
Laden Sie zuerst weitere Softwarekomponenten herunter und installieren dann Netdata von git:
cd /usr/local/src
apt install -y apache2-utils zlib1g-dev uuid-dev libuv1-dev liblz4-dev libssl-dev libelf-dev libmnl-dev libyaml-dev libprotobuf-dev protobuf-compiler gcc g++ make git autoconf autoconf-archive autogen automake pkg-config curl python3 cmake flex bison fluent-bit
git clone https://github.com/netdata/netdata.git --depth=100 --recursive
Um das Monitoring zu schützen nutzen wir die Apache2-utils und setzen einen Passwortschutz vor Netdata:
htpasswd -c /etc/nginx/netdata-access IhrName
Nun wird die Installation gestartet
cd /usr/local/src/netdata ./netdata-installer.sh --disable-telemetry -u
Nach wenigen Momenten ist Netdata bereits vollständig installiert und lauffähig – es sind dennoch wenige Konfigurationen notwendig:
nano /etc/netdata/netdata.conf
Ändern Sie den Wert für “history” auf bspw. 14400 (Daten der letzten 4 Stunden werden vorgehalten, benötigt ca. 60 MB RAM) im Bereich [global]:
history = 14400
Passen Sie zudem den [web] Bereich dahingehend an, dass Netdata nur auf localhost hört:
bind to = 127.0.0.1
Um nun das Webinterface verwenden zu können wird die bestehende vHost-Datei (nextcloud.conf) erweitert:
nano /etc/nginx/conf.d/nextcloud.conf
Fügen Sie die roten Zeilen hinzu:
[...]
location = /robots.txt {
allow all;
log_not_found off;
access_log off;
}
location /netdata {
return 301 /netdata/;
}
location ~ /netdata/(?<ndpath>.*) {
auth_basic "Bitte Zugangsdaten eingeben";
auth_basic_user_file /etc/nginx/netdata-access;
proxy_http_version 1.1;
proxy_pass_request_headers on;
proxy_set_header Connection "keep-alive";
proxy_store off;
proxy_pass http://netdata/$ndpath$is_args$args;
gzip on;
gzip_proxied any;
gzip_types *;
}
[...]
Erweitern Sie den Webserver nginx um seine integrierte Statusfunktionen – legen Sie dazu einen neuen vHost an (/etc/nginx/conf.d/stub_status.conf)
touch /etc/nginx/conf.d/stub_status.conf && nano /etc/nginx/conf.d/stub_status.conf
und kopieren alle Zeilen hinein:
server { listen 127.0.0.1:80 default_server; server_name 127.0.0.1; location /stub_status { stub_status on; allow 127.0.0.1; deny all; } }
Abschließend wird die Webserverkonfiguration (/etc/nginx/nginx.conf) um die roten Zeilen erweitert, so dass Netdata im bestehenden Webserver aufgerufen werden kann:
nano /etc/nginx/nginx.conf
[...]
http {
server_names_hash_bucket_size 64;
upstream netdata {
server 127.0.0.1:19999;
keepalive 64;
}
[...]
Nach einem abschließenden Neustart der Netdata- und Webserver-Dienste
systemctl restart netdata.service nginx.service
können Sie Netdata bereits nutzen und Ihr System analysieren:
https://ihre.domain.de/netdata
Netdata: Netdata is an all-in-one monitoring solution, expertly crafted with a blazing-fast C core, flanked by hundreds of collectors. Featuring a comprehensive dashboard with thousands of metrics, extreme performance and configurability, it is the ultimate single-node monitoring tool […]
Um Netdata zu aktualisieren genügt es, folgendes Skript auszuführen
/usr/libexec/netdata/netdata-updater.sh
Die aktuelle Version wird geprüft und ggf. auf die aktuelle aktualisiert
10. Optional: Nextcloud Speicher erweitern/verschieben
Der Nextcloud Datenspeicher lässt sich relativ einfach erweitern. Möglichkeiten sind NFS (oder Samba (cifs)), HHD/SD und die Nextcloud external storage app. Wie das im einzelnen funktioniert beschreiben die nachfolgenden Beispiele:
10.1 Nextcloud Speicher mittels NAS (nfs) vergößern:
Zuerst installieren wir die notwendigen Module
apt install -y nfs-common
und erweitern dann die fstab
cp /etc/fstab /etc/fstab.bak nano /etc/fstab
um das Laufwerk persistent im System einzubinden:
<IP-NFS-SERVER>:/<Freigabename> /<ihr>/<mountpoint> nfs auto,nofail,noatime,nolock,intr,tcp,actimeo=1800 0 0
Nach einem erfolgreichen Einhängen mittels
chown -R www-data:www-data /<ihr>/<mountpoint> mount /<ihr>/<mountpoint>
und dem grundlegenden Kopiervorgang muss sowohl die config.php noch angepasst, als auch der Nextcloud Index neu aufgebaut werden. Stoppen Sie dazu zuerst die Nextcloud
systemctl stop php8.3-fpm.service nginx.service
und editieren dann die config.php hinsichtlich des neuen Datenverzeichnisses:
sudo -u www-data nano /var/www/nextcloud/config/config.php
[...]
'datadirectory' =>'/<ihr>/<mountpoint>',
[...]
Kopieren Sie nun das vorherige Datenverzeichnis in das neue Verzeichnis:
rsync -av --progress --stats /<altes Datenverzeichnis>/ /<ihr>/<mountpoint>
Sobald dieser Kopiervorgang abgeschlossen ist wird der Nextcloud Index neu aufgebaut:
systemctl stop nginx.service php8.3-fpm.service redis-cli -s /var/run/redis/redis-server.sock auth BitteAendern FLUSHALL quit sudo -u www-data php /var/www/nextcloud/occ files:scan --all -v sudo -u www-data php /var/www/nextcloud/occ files:scan-app-data -v systemctl start php8.3-fpm.service nginx.service
Nach dem erfolgreichen Neuaufbau des Nextcloud Index
stehen Ihnen die Daten unter Nutzung des NFS Shares bereits zur Verfügung. Planen Sie die Daten sowohl über Nextcloud als auch über das Share direkt bearbeiten zu können, so sollten Sie den Parameter
'filesystem_check_changes' => 1,
in der config.php setzen. Dieser sorgt dafür, dass unabhängig wo die Daten zuletzt bearbeitet wurden, die Nextcloud file app stets synchron zum NFS (also aktuell) ist.
10.2 Nextcloud Speicher mittels weiterer HDD/SSD erweitern
Nehmen wir an, die neue Festplatte kann unter ‘/dev/sda‘ für Nextcloud eingebunden werden. Wir formatieren diese HDD/SSD mit dem Dateisystem ‘ext4’ und binden sie persistent am System (/etc/fstab) ein. Fangen wir an und stoppen zuerst den Nextcloud Server:
systemctl stop nginx.service php8.3-fpm.service redis-server.service mysql.service stop
Nun überprüfen wir die Verfügbarkeit des neuen Laufwerks am Server
fdisk -l
und partitionieren es wie folgt
(Annahme: Die neue Festplatte ist unter /dev/sda verfügbar):
fdisk /dev/sda
- Wählen Sie ‘o’ um eine neue Partitionstabelle zu erzeugen
- Wählen Sie ‘n’ um eine neue Partition zu erstellen
- Wählen Sie ‘p’ (primary partition type), also eine primäre Partition
- Wählen Sie die Partitions-Nummer: 1
- Weitere Eingaben können mit der ENTER-Taste ohne weitere Angaben, also mit den Standardwerten übernommen werden <Enter>
- Schreiben Sie die Konfiguration fest: ‘w’ und drücken <ENTER>
Die neue Partition ‘/dev/sda1’ wurde bereits erzeugt und muss nur noch formatiert werden:
mkfs.ext4 /dev/sda1 fdisk -s /dev/sda1
Nun erstellen wir ein neues Verzeichnis ‘/nc_data’ und hängen die neue Partition ‘/dev/sda1’ ein:
mkdir -p /nc_data chown -R www-data:www-data /nc_data
Das persitente Einhängen erfolgt in der fstab:
cp /etc/fstab /etc/fstab.hd.bak nano /etc/fstab
Fügen Sie am Ende folgende Zeile hinzu:
/dev/sda1 /nc_data ext4 defaults 0 1
Nun führen wir den folgenden Befehl aus, um das Laufwerk einzubinden:
mount -a
Ein Blick in das Dateisystem zeigt uns bereits die neue Platte im System:
df -Th
Nun überführen wir die Bestandsdaten noch in das neue Verzeichnis
(Annahme: Ihre Nextcloud Daten lagen bisher unter /var/nc_data):
rsync -av /var/nc_data/ /nc_data
und passen die Nextcloud config.php hinsichtlich des neuen Datenverzeichnisses an:
sudo -u www-data nano /var/www/nextcloud/config/config.php
Ändern Sie es wie folgt:
[...]
'datadirectory' =>'/nc_data',
[...]
Zum Abschluß starten wir die zuvor beendeten Dienste neu und führen einen Indizierungslauf durch:
systemctl start mysql.service php8.3-fpm.service redis-server.service
cd /var/www/nextcloud
redis-cli -s /var/run/redis/redis-server.sock FLUSHALL auth BitteAendern quit
sudo -u www-data php occ files:scan --all -v sudo -u www-data php occ files:scan-app-data -v
systemctl restart php8.3-fpm.service nginx.service
Ab sofort steht Ihnen die gesamte Kapazität der neuen Festplatte für Ihre Nextcloud zur Verfügung.
Hinweis: Sofern die Daten aus dem vorherigen Verzeichnis erfolgreich kopiert wurden, so kann das Quellverzeichnis abschließend gelöscht werden:
rm -Rf /var/nc_data/
10.3 Nextcloud Speicher mittels „External Storage“-App erweitern
In Ergänzung zu den Kapiteln 10.1 und 10.2 lässt sich der Nextcloud Speicher auch mittels der Nextcloud eigenen App „external storage“ erweitern.
So ist es möglich, ohne Komplikationen auf verschieden Speichermedien zuzugreifen:
- Dateien können „Out-of-the-Box“ neu erstellt, bearbeitet und gelöscht werden – sowohl innerhalb, als auch außerhalb der Nextcloud und werden dabei stets synchron gehalten,
- Sie können weitere Laufwerke und Shares als zusätzlichen Nextcloud Speicher bereitstellen,
- Sie können Benutzer erlauben, Ihre eigenen Devices als externen Speicher zu nutzen,
- …
Weiterführende Dokumentationen zu dieser App finden Sie hier.
11. Nextcloud High Performance Backend für Dateien
Wir beginnen mit der Einrichtung des High Performance Backends für Dateien und wechseln dafür in den Nextcloud App Store. In der Kategorie Werkzeuge findet man die App Client Push.
Alternativ können Sie die App auch über die Kommandozeile installieren:
sudo -u www-data php /var/www/nextcloud/occ app:enable notify_push
Nach der Installation und Aktivierung über den App Store sind die Tätigkeiten in der Nextcloud-Oberfläche bereits abgeschlossen. Weiter geht es hier auf der Kommandozeile des Servers.Als erstes braucht der virtuelle Host für Nextcloud eine kleine Erweiterung
nano /etc/nginx/conf.d/nextcloud.conf
Am Ende der Datei fügen wir die roten Zeilen hinzu (» codeberg: https://codeberg.org/criegerde/nextcloud/raw/branch/master/etc/nginx/conf.d/nextcloud-mit-push.conf):
[...] location / { try_files $uri $uri/ /index.php$request_uri; } location ^~ /push/ { proxy_pass http://127.0.0.1:7867/; proxy_http_version 1.1; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "Upgrade"; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } }
Starten Sie den Webserver neu:
systemctl restart nginx.service
Das Setup des High Performance Backends für Dateien wird dann über OCC aufgerufen:
cd /var/www/nextcloud sudo -u www-data php occ notify_push:setup
Sofern die die Konfiguration valide ist, werden weitere Anweisungen angezeigt, um eine systemd Unit für das Nextcloud High Performance Backend für Dateien anzulegen.
Dazu öffnen wir eine weitere, zusätzliche SSH-Session und erstellen den Service:
nano /etc/systemd/system/notify_push.service
[Unit]
Description = Push daemon for Nextcloud clients
After=nginx.service php8.3-fpm.service mariadb.service redis-server.service
[Service]
Environment=PORT=7867
Environment=NEXTCLOUD_URL=https://ihre.domain.de
ExecStart=/var/www/nextcloud/apps/notify_push/bin/x86_64/notify_push /var/www/nextcloud/config/config.php
User=www-data
[Install]
WantedBy = multi-user.target
Der Service wird anschließend aktiviert und gestartet:
systemctl daemon-reload systemctl enable --now notify_push
Sofern der Dienst korrekt gestartet wurde
wechseln wir in die erste SSH Session zurück und bestätigen den Dialog mit ENTER:
Sollten app-Updates kommen, so wird ein Serviceneustart benötigt.
systemctl restart notify_push.service
Die Konfiguration können Sie wie folgt verifizieren:
sudo -u www-data php occ notify_push:setup https://ihre.domain.de/push
Um die Funktionalität des Nextcloud HPB für Dateien zu überprüfen, laden Sie sich den Nextcloud-„test_client“ herunter
wget -O test_client -q https://github.com/nextcloud/notify_push/releases/download/v0.6.11/test_client-x86_64-unknown-linux-musl
und starten diesen gefolgt von Ihrer Domain, dem Benutzer und dem dazugehörigen Passwort. Ist bereits 2FA aktiv, so nutzen Sie ein App-Passwort.
chmod +x test_client ./test_client https://<ihre.domain.de> <Nextcloud-Benutzername> <(App-)Passwort>
und laden bspw. eine Datei in Ihre Cloud hoch.
Sehen Sie dann im Nextcloud test_client-Tool Aktivitäten, so funktioniert das Nextcloud HPB für Dateien. Löschen Sie im Anschluß an Ihre Tests den Client, um spätere Probleme beim Aktualisieren der Nextcloud zu vermeiden.
rm -f test_client
Die Einrichtung des High Performance Backends für Dateien ist somit erfolgreich abgeschlossen.
12. bash_aliases und empfohlene Settings (config.php)
Passen Sie die Datei /root/bash_aliases an, um das Nextcloud Toolset occ direkt mittels nocc starten zu können
Ubuntu
if [ ! -f /root/.bash_aliases ]; then touch /root/.bash_aliases; fi
cat <<EOF >> /root/.bash_aliases
alias nocc="sudo -u www-data php /var/www/nextcloud/occ"
EOF
source /root/.bash_aliases
Debian
if [ ! -f /root/.bashrc ]; then touch /root/.bashrc; fi
cat <<EOF >> /root/.bashrc
alias nocc="sudo -u www-data /usr/bin/php /var/www/nextcloud/occ"
EOF
source /root/.bashrc
Ab sofort können Sie als priviligierter Benutzer (sudo -s) die Nextcloud occ-Tools direkt per „nocc … “ ausführen, bspw:
nocc app:list
um sich bspw. alle aktivierten und deaktivierten Apps Ihrer Nexctloud anzeigen zu lassen. Wir empfehlen folgende Settings zu setzen:
nocc config:system:set remember_login_cookie_lifetime --value="1800" nocc config:system:set log_rotate_size --value="104857600" nocc config:system:set trashbin_retention_obligation --value="auto, 7" nocc config:system:set versions_retention_obligation --value="auto, 365" nocc config:system:set simpleSignUpLink.shown --type=bool --value=false nocc config:system:set upgrade.disable-web --type=bool --value=true nocc config:app:set text workspace_available --value=0 nocc config:system:set loglevel --value="2" nocc config:app:set settings profile_enabled_by_default --value="0" nocc app:enable admin_audit nocc config:app:set admin_audit logfile --value="/var/log/nextcloud/audit.log" nocc config:system:set log.condition apps 0 --value admin_audit
Chunk-Größe setzen oder mit ‚0‘ deaktivieren
nocc config:app:set files max_chunk_size --value="104857600"
oder
nocc config:app:set files max_chunk_size --value 0
Eine weiterführende Übersicht an Nextcloud-Einstellungen finden Sie hier.
Um die manuelle Logrotation einzurichten, bspw. für die nextcloud.log und audit.log Dateien, gehen Sie wie folgt vor:
sed -i '/log_rotate_size/d' /var/www/nextcloud/config/config.php
nocc config:system:set log_rotate_size --value="0"
nano /etc/logrotate.d/nextcloud-audit
Fügen Sie alles Nachfolgende hinzu, speichern und verlassen dann diese Datei:
/var/log/nextcloud/*.log { su root adm size 100M missingok rotate 30 compress delaycompress notifempty sharedscripts }
Um das Logrotating zu testen bzw. initial auszuführen können Sie folgende Befehle nutzen:
logrotate -d /etc/logrotate.d/nextcloud-audit
logrotate --force /etc/logrotate.d/nextcloud-audit
13. optional: Verbesserung der Sicherheit und Performance des TCP-Stacks
Die empfohlene Anpassungen sind nachfolgend aufgelistet. Wie sie diese Werte auf einmal setzen, das wird im Anschluß beschrieben:
# Schutz gegen IP-Spoofing (IPv4 und IPv6)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv6.conf.all.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
# Schutz gegen TCP-SYN-Flooding (IPv4)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 4096
net.ipv4.tcp_synack_retries = 2
net.core.somaxconn = 1024
# ICMP Echo Ignore Broadcasts (IPv4)
net.ipv4.icmp_echo_ignore_broadcasts = 1
# ICMP Redirects deaktivieren (IPv4 und IPv6)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.default.accept_redirects = 0
# Sourcen-Routing deaktivieren (IPv4 und IPv6)
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.default.accept_source_route = 0
# TCP-Timestamps deaktivieren (IPv4)
net.ipv4.tcp_timestamps = 0
# Loggen von Martian-Paketen (IPv4 und IPv6)
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1
net.ipv6.conf.all.log_martians = 1
net.ipv6.conf.default.log_martians = 1
# Maximale Anzahl von halb offenen Verbindungen (IPv4)
net.ipv4.tcp_max_syn_backlog = 4096
# Netzwerkspeichergrößen erhöhen (IPv4 und IPv6)
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.core.rmem_default = 262144
net.core.wmem_default = 262144
net.core.optmem_max = 40960
# Maximale Anzahl von Verbindungstrackings erhöhen (IPv4 und IPv6)
net.netfilter.nf_conntrack_max = 262144
net.netfilter.nf_conntrack_tcp_timeout_established = 1800
# Maximaler Backlog für Netzwerkgeräte erhöhen (IPv4 und IPv6)
net.core.netdev_max_backlog = 5000
# TCP-Verbindungseinstellungen optimieren (IPv4)
net.ipv4.tcp_fin_timeout = 15
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
# Datei-Deskriptor-Limits erhöhen
fs.file-max = 2097152
# TCP-Warteschlangen (Read/Write Queues) erhöhen (IPv4)
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
# TCP-Window-Scaling aktivieren (IPv4)
net.ipv4.tcp_window_scaling = 1
# TCP-Memory-Management optimieren (IPv4)
net.ipv4.tcp_mem = 50576 64768 98152
# Reverse Path Filtering aktivieren (IPv4 und IPv6)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1
net.ipv6.conf.all.rp_filter = 1
net.ipv6.conf.default.rp_filter = 1
# TCP Fast Open aktivieren (optional, IPv4)
net.ipv4.tcp_fastopen = 3
# ARP-Caching verbessern (IPv4)
net.ipv4.neigh.default.gc_thresh1 = 1024
net.ipv4.neigh.default.gc_thresh2 = 2048
net.ipv4.neigh.default.gc_thresh3 = 4096
Um die zuvor beschriebenen Einstellungen zur Härtung und Optimierung des TCP-Stacks umzusetzen können führen Sie folgenden Befehl aus:
wget -O /etc/sysctl.d/100-nextcloud.conf -q https://codeberg.org/criegerde/nextcloud/raw/branch/master/etc/sysctl.d/100-nextcloud.conf
Nachdem die Datei heruntergeladen wurde starten Sie den Server einmalig neu.
reboot now
Sie können nach dem Neustart alle Werte wie folgt überprüfen:
sudo -s
sysctl -A
Möchten Sie diese Einstellungen rückgängig machen, so benennen Sie die Datei bspw. in disabled um
mv /etc/sysctl.d/100-nextcloud.conf /etc/sysctl.d/100-nextcloud.conf.disabled
und starten anschleßend den Server neu.