„Die selbst gehostete Produktivitätsplattform, mit der Sie die Kontrolle behalten.“ So steht es auf der offiziellen Website und es stimmt. Nextcloud lässt sich leicht Installieren und Konfigurieren und ermöglicht jedem die Hoheit über seine Daten zu behalten. Die Hardwareanforderungen sind sehr überschaubar, weshalb sich der kleine Einplatinenrechner Raspberry Pi hervorragend als Server im privaten Umfeld eignet. Die Anschaffungs- und auch die laufenden Kosten sind gering was den kleinen PC sehr attraktiv macht.
Da vor kurzem einer meiner älteren Raspberry Pis freigeworden ist, habe ich darauf die aktuellste Nextcloud installiert und die Chance ergriffen, den ganzen Installationsprozess neu zu beschreiben.
Die Installation einer Nextcloud und deren Konfiguration habe ich hier im Blog bereits in einer Vielzahl von Artikeln hier im Blog beschrieben.
Der ➡ Hauptartikel der die Installation auf einem Raspberry Pi beschreibt wurde im April 2018 erstellt und von mir bereits ein paar mal überarbeitet. Das letzte mal im Januar 2021. In der Zwischenzeit sind ➡ viele Artikel dazugekommen.
Die Nextcloud läuft nach der erfolgreichen Installation auf einem Raspberry Pi 2 Model B Rev 1.1.
Inhaltsverzeichnis
- Hardware und Betriebssystem
- Betriebssystem auf die SD-Karte spielen
- SSH-Verbindung mit Public Keys einrichten
- Update des Betriebssystems
- Installation der benötigten Pakete
- Apache Module aktivieren
- MariaDB-Server
- Nextcloud Installation starten
- Nextcloud – Konfigurieren
- Papierkorb Retention
- CRON aktivieren
- Nextcloud Standarddateien ändern – Skeleton
- Backup
- Redis Installieren
- index.html anpassen
- Let“s Encrypt
- Apache2 000-default-le-ssl.conf
- Apache2 meineurl.de.conf
- Nextcloud – Fehlermeldungen
- Server Hardening
-
Hardware: Raspberry Pi 2 Model B Rev 1.1*
-
Betriebssystem: Raspberry Pi OS – https://www.raspberrypi.com/software/
- PRETTY_NAME=“Raspbian GNU/Linux 10 (buster)“
- NAME=“Raspbian GNU/Linux“
- VERSION_ID=“10″
- VERSION=“10 (buster)“
‼ Die Anleitung wird auf Codeberg verwaltet. ‼
➡ https://codeberg.org/strobelstefan.org/nextcloud-installation-configuration
Hardware und Betriebssystem
Die Installation wurde getestet auf:
Betriebssystem auf die SD-Karte spielen
Zur detaillierten Anleitung
SSH-Verbindung mit Public Keys einrichten
Es werden keine neuen SSH-Schlüssel für die Verbindung verwendet, sondern es wird eine YubiKey-Hardwaretoken verwendet. Eine ausführliche Anleitung zum einrichten findet sich auf ➡ https://strobelstefan.de/yubikey/
# Bekannte Keys entfernen
ssh-keygen -R ip-addresse
# SSH-Verbindung herstellen
ssh pi@ip-adresse
# OpenSSH Server auf dem neuen Server installieren
sudo apt install openssh-server
Die Installation des openssh-server
ist nicht notwendig, wenn nach dem Flashen des Betriebssystems auf die SD-Karte die Datei ssh
angelegt wurde oder der SSH-Dienst über das Menü raspi-config
bereits aktiviert wurde.
# .ssh-Verzeichnis anlegen und Rechte anpassen
mkdir .ssh
chmod 0711 ~/.ssh
# Datei für die SSH-Schlüssel anlegen
nano ~/.ssh/authorized_keys
# Den privaten Schlüssel in die Datei authorized_keys kopieren
# Key 1 - Description
ssh-rsa keykeykeykeykeykeykeykeykey
# Key 2 - Description
ssh-rsa keykeykeykeykeykeykeykeykey
# Key 3 - Description
...
Mehrere Schlüssel können einfach fortlaufend in die Datei eingefügt werden. Kommentare können eingefügt werden und sind mit #
am Zeilenanfang zu kommentieren.
# Rechte neu setzten
sudo chown root:root ~/.ssh/authorized_keys
sudo chmod 644 ~/.ssh/authorized_keys
# SSH-Dienst neustarten
sudo systemctl restart sshd
Update des Betriebssystems
sudo apt update && sudo apt dist-upgrade
Installation der benötigten Pakete
sudo apt install apache2 php7.3 php7.3-gd php7.3-curl php7.3-common php7.3-intl php-pear php-apcu php7.3-xml libapache2-mod-php7.3 php7.3-mbstring php7.3-zip php7.3-mysql mariadb-server-10.3 smbclient imagemagick php-imagick php7.3-bcmath php7.3-gmp
Apache Module aktivieren
sudo a2enmod rewrite
sudo a2enmod headers
sudo a2enmod env
sudo a2enmod dir
sudo a2enmod mime
Apache Neustart
sudo systemctl restart apache2
Apache aufrufen
Funktionstest, falls der Webserver läuft wird die index.html im Webbrowser angezeigt. Die Datei liegt im Root-Verzeichnis des Webserver /var/www/html
.
http://ip-addresse
MariaDB-Server
MariaDB Server absichern
sudo mysql_secure_installation
MariaDB – Datenbank für Nextcloud anlegen
sudo mariadb
CREATE DATABASE nextcloud CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
Datenbankname: nextcloud
MariaDB – Benutzer anlegen
Achtung!!! Das Passwort ist NUR für die Nextcloud-Datenbank und wird später noch benötigt.
sudo mariadb
CREATE USER nextcloud@localhost identified by "password";
GRANT ALL PRIVILEGES on nextcloud.* to nextcloud@localhost;
# Optional when you face any errors
grant all privileges on nextcloud.* to "nextcloud"@"localhost" with grant option;
FLUSH privileges;
quit;
- Benutzername: nextcloud
- Passwort: durch-benutzer-neu-vergeben
sudo mariadb
# Alle existierenden Datenbanken auflisten
SHOW DATABASES;
# Alle Benutzer des Datenbankservers anzeigen
SELECT User FROM mysql.user;
# Benutzer löschen
DROP USER IF EXISTS nextcloud;
# Datenbank "nextcloud " löschen
DROP DATABASE IF EXISTS nextcloud;
Nextcloud Installation starten
Mit Prüfung der md5sum
Die heruntergeladene Datei wird anhand der md5sum überprüft.
# Wechsel in das Home-Verzeichnis
cd
# Download der aktuellsten Nextcloud-Version
curl https://download.nextcloud.com/server/releases/latest.tar.bz2 > latest.tar.bz2
# Download der md5-Prüfsumme
curl https://download.nextcloud.com/server/releases/latest.tar.bz2.md5 > latest.tar.bz2.md5
# Vergleich der beiden md5sums
md5sum latest.tar.bz2
cat latest.tar.bz2.md5
# tar.bz2-Archiv in das Verzeichnis kopieren
sudo cp latest.tar.bz2 /var/www/html/
# Wechsle in das Verzeichnis
cd /var/www/html/
# tar.bz2-Archiv entpacken
sudo tar xfvj latest.tar.bz2
Aufräumen
sudo rm /var/www/html/latest.tar.bz2
rm ~/latest.tar.bz2
rm ~/latest.tar.bz2.md5
Ohne Prüfung der md5sum
Quick und dirty, Installation ohne die Prüfung der md5sum.
cd /var/www/html
curl https://download.nextcloud.com/server/releases/latest.tar.bz2 | sudo tar -jxv
Nextcloud – Ordner und -berechtigungen vergeben
cd /var/www/html/nextcloud
sudo mkdir -p /var/www/html/nextcloud/data
sudo chown www-data:www-data /var/www/html/nextcloud/data
sudo chmod 750 /var/www/html/nextcloud/data
sudo chown www-data:www-data config apps
sudo systemctl restart apache2
Nextcloud aufrufen
Erster Aufruf der Nextcloud und Eingabe der erforderlichen Informationen.
http://ip-adresse/nextcloud
- Benutzername: ist neu zu vergeben
- Passwort: ist neu zu vergeben
- Datenverzeichnis: keine Änderung notwendig
- Datenbank-Benutzer: nextcloud
- Datenbank-Passwort: siehe oben
- Datenbank-Name: nextcloud
- Server: localhost
Nach der Installation funktioniert die Weiterleitung auf das Dashboard nicht korrekt.
http://ip-adresse/nextcloud
Nextcloud – Konfigurieren
Es gibt zwei Möglichkeiten Einträge in die Konfigurationsdatei config.php
zu schreiben:
-
Option 1: Die Datei wird mit einem Editor bearbeitet. (die Option wird in dieser Anleitung verwendet.)
-
Option 2: Mit dem
occ
Kommando lassen sich die Einträge bearbeiten.
Beispiel:sudo -u www-data php occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu"
sudo -u www-data php /var/www/html/nextcloud/occ config:system:set memcache.local --value="\\OC\\Memcache\\APCu"
Pretty URLs
sudo nano /var/www/html/nextcloud/config/config.php
# Am Ende der Datei, aber vor ); die Zeile eintragen
"htaccess.RewriteBase" => "/nextcloud",
sudo systemctl restart apache2
Der Eintrag kann auch mit Hilfe des occ-Befehls erstellt werden.
sudo -u www-data php /var/www/html/nextcloud/occ config:system:set htaccess.RewriteBase --value="/nextcloud"
OPcache
sudo nano /var/www/html/nextcloud/config/config.php
# Am Ende der Datei, aber vor ); die Zeile eintragen
"memcache.local" => "\\OC\\Memcache\\APCu",
sudo systemctl restart apache2
Anpassung der php.ini
sudo cp /etc/php/7.3/apache2/php.ini /etc/php/7.3/apache2/php.ini-bak
sudo nano /etc/php/7.3/apache2/php.ini
# Am Ende der Datei vor "; Local Variables:" ist einzutragen
opcache.enable=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1
sudo systemctl restart apache2
Gib mir gerne einen Kaffee ☕ aus!
Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕ ausgeben.
bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj
Datenverzeichnis und temporäres Upload-Verzeichnis auf externen USB-Stick verschieben
Vor der Änderungen ist ein Backup der Nextcloud-Konfigurations-Datei zu erstellen und anschließend die Nextcloud in den Wartungsmodus zu versetzen.
sudo cp /var/www/html/nextcloud/config/config.php ~
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --on
siehe APCu bei Fehlermeldung.
UUID des angeschlossenen Laufwerks bestimmen
sudo blkid
Eintrag in der /etc/fstab
erstellen.
# Mount Point erstellen
sudo mkdir /mnt/data
# Eintrag in der /etc/fstab
sudo nano /etc/fstab
# Am Ende der Datei die Zeile mit der UUID des USB-Sticks eintragen
# Data-Verzeichnis der Nextcloud
UUID=xcxcxcxcxcxcxc /mnt/data ntfs-3g utf8,dmask=007,fmask=007,umask=007,uid=www-data,gid=www-data 0
# Laufwerk einhängen in das Verzeichnis /mnt/data
sudo mount -a
Daten-Verzeichnis
Der alte Eintrag "datadirectory" => "/var/www/html/nextcloud/data",
in der Konfigurationsdatei ist zu ersetzen
sudo mkdir -p /mnt/data/nc-data
sudo nano /var/www/html/nextcloud/config/config.php
"datadirectory" => "/mnt/data/nc-data/data",
sudo mv -v /var/www/html/nextcloud/data /mnt/data/nc-data
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --off
Temporäres Uploadverzeichnis
sudo mkdir -p /mnt/data/nc-tmp
sudo nano /var/www/html/nextcloud/config/config.php
"tempdirectory" => "/mnt/data/nc-tmp",
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --off
Papierkorb Retention
Definiert wann Ordner und Dateien im Papierkorb endgültig gelöscht werden sollen.
sudo nano /var/www/html/nextcloud/config/config.php
"trashbin_retention_obligation" => "auto, 30",
CRON aktivieren
In der Nextcloud Weboberfläche ist die Option „Einstellungen –> Grundeinstellungen –> Cron“ auszuwählen.
sudo crontab -u www-data -e
*/5 * * * * php -f /var/www/html/nextcloud/cron.php
Manuelles ausführen des Cron Jobs
sudo -u www-data php -f /var/www/html/nextcloud/cron.php
Nextcloud Standarddateien ändern – Skeleton
Option 1: Eigene Vorlagen definieren
Nextcloud legt jedem neuen Benutzer standardmäßig Dateien in seinen Dateiordner. Es können eigene Dateien und Ordner definiert werden.
cd /var/www/html/nextcloud/core/skeleton
ls
Documents "Nextcloud Manual.pdf" Photos Templates
"Nextcloud intro.mp4" Nextcloud.png "Reasons to use Nextcloud.pdf"
Neues Skeleton-Verzeichnisses anlegen und Vorlagen erstellen:
sudo mkdir /mnt/data/nc-data/data/skeleton-neu
# Im neuen Verzeichnis sind alle Vorlagen zu hinterlegen
Anpassung der config.php
:
sudo nano /var/www/html/nextcloud/config/config.php
"skeletondirectory" => "/mnt/data/nc-data/data/skeleton-neu",
Option 2: Ganz ohne Vorlagen
sudo nano /var/www/html/nextcloud/config/config.php
"skeletondirectory" => "",
Backup
Das einfachste Backup ist die Automatisierung mit Hilfe eines Bash-Skripts.
Die Quellen sind dabei:
- Konfigurationsdateien –
/var/www/html/nextcloud/config
- Datenverzeichnis –
/mnt/data/nc-data
- Datenbank
nextcloud
- Themes-Verzeichnis (optional) –
var/www/html/nextcloud/themes
Das Ziel auf dem die Backups landen sollen, sollte ein sparates Speichermedium (Festplatte, USB-Stick, NAS, etc.)sein.
# Einbindung des Speichermediums wie in Abschnitt beschrieben "Datenverzeichnis und temporäres Upload-Verzeichnis auf externen USB-Stick verschieben"
sudo blkid
sudo nano /etc/fstab
# Data-Verzeichnis der Nextcloud
UUID=xcxcxcxcxcxcxc /mnt/nextcloud-backup ntfs-3g utf8,dmask=007,fmask=007,umask=007,uid=www-data,gid=www-data,noatime 0
# Mount Point setzen für Speichermedium
sudo mkdir /mnt/nextcloud-backup
# Bash Skript anlegen und Berechtigungen vergeben
sudo mkdir /etc/skripte
sudo nano /etc/skripte/backup-nextcloud.sh
Inhalt der Datei backup-nextcloud.sh
. Das Passwort für die Datenbanksicherung ist anzupassen.
#!/usr/bin/env bash
# Creates backups of Nextcloud instance
# 1. config directory
# 2. data directory
# 3. data base dump
#
# Copyright by Stefan Strobel
# https://www.strobelstefan.org
# Wechsel in das Nexcloud-Verzeichnis
cd /var/www/html/nextcloud
# Aktiviere den Maintenance Mode für Nextcloud - Keine User Anmeldung mehr möglich!
sudo -u www-data php occ maintenance:mode --on
# Sichere die Config-Datei
sudo tar -cpzf /mnt/nextcloud-backup/Nextcloud_Config_`date +"%Y%m%d%H"`.tar.gz -C /var/www/html/nextcloud/config .
# Sichere das gesamte Verzeichnis /data
sudo tar -cpzf /mnt/nextcloud-backup/Nextcloud_Data_`date +"%Y%m%d%H"`.tar.gz -C /var/www/html/nextcloud/data/ .
# Erstelle ein Datenbanksicherung
mysqldump --default-character-set=utf8mb4 --single-transaction -h localhost -u nextcloud -passwort nextcloud > /mnt/nextcloud-backup/nextcloud-sqlbkp_`date +"%Y%m%d"`.bak
# Entferne den Maintenance Mode für Nextcloud - User Anmeldungen sind wieder möglich!
sudo -u www-data php occ maintenance:mode --off
Die Rechte für das Skript sind auf die folgenden Werte zu setzen:
-rwx------ 1 root root 1.2K Sep 1 19:45 backup-nextcloud.sh
Rechte setzen:
sudo chmod 700 /etc/skripte/backup-nextcloud.sh
Skript manuell starten
sudo sh /etc/skripte/backup-nextcloud.sh
CRON Job anlegen:
# Backup-Skript - täglich im 6:30
30 6 * * * /bin/bash /etc/skripte/backup-nextcloud.sh
Weiter Möglichkeiten für die Datensicherung der Nextcloud
- ➡ Raspberry Pi SD-Karte im Livebetrieb klonen – Neue Version
- ➡ Nextcloud – Datensicherung von Kalendern und Adressbüchern automatisch erstellen
- ➡ Datensicherung für die Nextcloud mit BorgBackup
Aus der offiziellen Nextcloud-Dokumentation
- Backup – ➡ https://docs.nextcloud.com/server/latest/admin_manual/maintenance/backup.html
- Restore – ➡ https://docs.nextcloud.com/server/latest/admin_manual/maintenance/restore.html
- Using the occ command – ➡ https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/occ_command.html#maintenance-commands-label
Redis Installieren
Redis lässt sich mit einem Passwort absichern. Der Passworthash wird in der redis.conf
und der config.php
eingetragen.
# Passworthash erstellen
echo passwort | sha256sum
Redis Installation und Konfiguration
sudo apt install redis-server php-redis
sudo nano /etc/redis/redis.conf
# Ersetzen
# unixsocketperm 700
unixsocketperm 770
# maxclients 10000
maxclients 100
# requirepass foobared
requirepass passwort
Webserver Rechte auf den Socket gewähren
sudo usermod -aG redis www-data
sudo service redis-server restart
# Redis Service anzeigen
ps ax | grep redis
Nextcloud anpassen
Es wird auch APCu
verwendet. Die Konfiguration ist im Abschnitt „APCu“ beschrieben.
sudo nano /var/www/html/nextcloud/config/config.php
"memcache.local" => "\OC\Memcache\APCu",
"memcache.distributed" => "\OC\Memcache\Redis",
"memcache.locking" => "\OC\Memcache\Redis",
"redis" => [
"host" => "/var/run/redis/redis-server.sock",
"port" => 6379,
"dbindex" => 0,
"password" => "<hier den obigen Hash eintragen>",
"timeout" => 1.5,
],
Redis Fehler
Der Host wird nicht richtig erkannt, die Nextcloud Weboberfläche ist nicht mehr erreichbar.
sudo nano /var/www/html/nextcloud/config/config.php
# Alter Eintrag
"host" => "/var/run/redis/redis-server.sock",
"port" => 6379,
# Neuer Eintrag
"host" => "127.0.0.1",
"port" => 6379,
Apache – Webserver konfigurieren
index.html anpassen
sudo rm /var/www/html.index.html
sudo nano /var/www/html/index.html
# Option 1: Inhalt der index.html
<html>
<head>
<title>Are you looking for something?</title>
</head>
<body>
Are you looking for something?<br>
Maybe it is not here.<br>
Please contact your administrator for assistance.
</body>
</html>
# Option 2: Inhalt der index.html
<html>
<head>
<title>Redirect</title>
<meta http-equiv="refresh" content="0; URL=https://meineurl.de/nextcloud">
<meta name="keywords" content="automatic redirection">
</head>
<body>
If your browser doesn"t automatically go there within a few seconds,
you may want to go to the destination manually.
</body>
</html>
Let“s Encrypt
Der Port 80 muss für den Server erreichbar sein. Let“s Encrypt verwendet für die Zertifikatserstellung den Port 80. Ist dieser nicht erreichbar, dann schlägt die Zertifikatserstellung und -erneuerung fehlt.
Auf der offiziellen Website des Projekts ist eine detaillierte Installationsanleitung für Let“s Encrypt zu finden
Option 1: Installation mit pip
Für die Installation und Konfiguration habe ich aus den Optionen folgendes gewählt
- Software: Apache
- System: pip
ACHTUNG!!! Zwingend auf der Projektseite die Beschreibung und evtl. Aktualisierungen dieser Anleitung nachschlagen!
sudo apt update && sudo apt install python3 python3-venv libaugeas0
sudo python3 -m venv /opt/certbot/
sudo /opt/certbot/bin/pip install --upgrade pip
sudo /opt/certbot/bin/pip install certbot certbot-apache
sudo ln -s /opt/certbot/bin/certbot /usr/bin/certbot
sudo certbot --apache
Option 2: Installation mit snap
sudo apt update && sudo apt dist-upgrade
sudo apt install snapd
sudo reboot
sudo snap install core
sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Aktualisierung des Zertifikats
ACHTUNG!! Port 80 muss geöffnet sein. Die Aktualisierung des Let“s Encrypt Zertifikats ist unabhängig der gewählten Installationsoption.
Die Aktualisierung des Zertifikats erfolgt mit dem Befehl:
# Testlauf
sudo certbot renew --dry-run
# Aktualisierung
sudo certbot renew
Eintrag als trusted_domains
sudo nano /var/www/html/nextcloud/config/config.php
# meineurl.de mit fortlaufender Nummerierung eintragen
"trusted_domains" =>
array (
0 => "192.168.xxx.yyy",
1 => "meineurl.de",
),
Apache2 000-default-le-ssl.conf
meineurl.de
ist durch die jeweilige Domain zu ersetzen.
cd /etc/apache2/sites-available/
sudo cp 000-default-le-ssl.conf 000-default-le-ssl.conf-bak
sudo rm etc/apache2/sites-available/000-default-le-ssl.conf
sudo nano etc/apache2/sites-available/000-default-le-ssl.conf
# Inhalt der Datei 000-default-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ServerName meine-url.de
</VirtualHost>
<VirtualHost *:443>
# The ServerName directive sets the request scheme, hostname and port that
# the server uses to identify itself. This is used when creating
# redirection URLs. In the context of virtual hosts, the ServerName
# specifies what hostname must appear in the request"s Host: header to
# match this virtual host. For the default virtual host (this file) this
# value is not decisive as it is used as a last resort host regardless.
# However, you must set it for any further virtual host explicitly.
#ServerName www.example.com
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; strict-origin; preload"
Redirect 301 /.well-known/carddav /nextcloud/remote.php/dav
Redirect 301 /.well-known/caldav /nextcloud/remote.php/dav
Redirect 301 /.well-known/webfinger /nextcloud/index.php/.well-known/webfinger
Redirect 301 /.well-known/nodeinfo /nextcloud/index.php/.well-known/nodeinfo
</IfModule>
# Available loglevels: trace8, ..., trace1, debug, info, notice, warn,
# error, crit, alert, emerg.
# It is also possible to configure the loglevel for particular
# modules, e.g.
#LogLevel info ssl:warn
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
# For most configuration files from conf-available/, which are
# enabled or disabled at a global level, it is possible to
# include a line for only one particular virtual host. For example the
# following line enables the CGI configuration for this host only
# after it has been globally disabled with "a2disconf".
#Include conf-available/serve-cgi-bin.conf
ServerName meine-url.de
SSLCertificateFile /etc/letsencrypt/live/meine-url.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/meine-url.de/privkey.pem
Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>
sudo systemctl restart apache2
- ➡ https://docs.nextcloud.com/server/latest/admin_manual/installation/harden_server.html
- ➡ https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html
Apache2 meineurl.de.conf
meineurl.de
ist durch die jeweilige Domain zu ersetzen.
sudo nano /etc/apache2/sites-available/meineurl.de.conf
<VirtualHost *:80>
ServerName meineurl.de
Redirect permanent / https://meineurl.de/nextcloud
</VirtualHost>
<VirtualHost *:443>
ServerName meineurl.de
Redirect permanent / meineurl.de/nextcloud
<IfModule mod_headers.c>
Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
</IfModule>
</VirtualHost>
sudo systemctl restart apache2
Nextcloud – Fehlermeldungen
Ordner-Berechtigungen sind falsch gesetzt
Die Ordnerberechtigungen sind nicht korrekt gesetzt und der Webserver-Benutzer www-data
erhält keinen Schreibzugriff auf die Nextcloud-Verzeichnisse.
Dieser Fehler hat für den Betrieb der Nextclou keine Auswirkuingen. Steht jedoch eine Update an, müssen in die aufgelisteten Ordner neue Dateien geschrieben oder bestehende Dateien geändert werden.
Check for write permissions
The following places can not be written to:
/var/www/html/nextcloud/updater/../version.php
/var/www/html/nextcloud/updater/../public.php
/var/www/html/nextcloud/updater/../cron.php
/var/www/html/nextcloud/updater/../occ
/var/www/html/nextcloud/updater/../.htaccess
/var/www/html/nextcloud/updater/../remote.php
/var/www/html/nextcloud/updater/../.user.ini
/var/www/html/nextcloud/updater/../status.php
/var/www/html/nextcloud/updater/../robots.txt
/var/www/html/nextcloud/updater/../console.php
/var/www/html/nextcloud/updater/../index.php
/var/www/html/nextcloud/updater/../COPYING
/var/www/html/nextcloud/updater/../AUTHORS
/var/www/html/nextcloud/updater/../index.html
Abhilfe schafft das Setzen der richtigen Zugriffsreche
sudo chown -R www-data:www-data /var/www/html/nextcloud
sudo find /var/www/html/nextcloud/ -type d -exec chmod 750 {} \;
sudo find /var/www/html/nextcloud/ -type f -exec chmod 640 {} \;
App-Ordner
Fehlermeldung:
Einige App-Ordner haben einen anderen Besitzer als der Benutzer des Webservers. Dies kann der Fall sein, wenn Apps manuell installiert wurden. Prüfe die Berechtigungen der folgenden App-Ordner:
...
Lösung:
sudo chown -R www-data:www-data /var/www/html/nextcloud/apps
PHP-Speichergrenze
Fehlermeldung:
Die PHP-Speichergrenze liegt unterhalb des empfohlenen Wertes von 512MB.
Lösung:
cd /etc/php/7.3/apache2
sudo cp php.ini php.ini-bak
sudo nano /etc/php/7.3/apache2/php.ini
# Eintrag memory_limit anpassen
memory_limit = 512M
sudo systemctl restart apache2
In diesem Zuge Können gleich noch zwei weiter Werte in der php.ini angepasst werden:
sudo nano /etc/php/7.3/apache2/php.ini
upload_max_filesize = 16G
post_max_size = 16G
max_execution_time = 30
sudo systemctl restart apache2
- ➡ Uploading big files > 512MB
- ➡ https://docs.nextcloud.com/server/latest/admin_manual/configuration_files/big_file_upload_configuration.html?highlight=output_buffering#configuring-php
Fehlende PHP-Module
Fehlermeldung:
Dieser Installation fehlen einige empfohlene PHP-Module. Für bessere Leistung und bessere Kompatibilität wird dringend empfohlen, diese zu installieren.
bcmath
gmp
Lösung:
sudo apt install php7.3-bcmath php7.3-gmp
sudo systemctl restart apache2
Fehlende Telefonregion
Fehlermeldung:
Für Deine Installation ist keine Standard-Telefonregion festgelegt
Lösung:
sudo nano /var/www/html/nextcloud/config/config.php
# Am Ende der Datei, aber vor ); die Zeile eintragen
"default_phone_region" => "DE",
sudo systemctl restart apache2
Webfinger & Nodeinfo
Fehlermeldung:
Dein Webserver ist nicht richtig konfiguriert, um "/.well-known/webfinger" aufzulösen.
Dein Webserver ist nicht richtig konfiguriert, um "/.well-known/nodeinfo" aufzulösen.
Lösung:
siehe Apache2 000-default-le-ssl.conf
Die Lösung des Problems ist im Detail hier beschrieben:
➡ Nextcloud – Warnung für webfinger & nodeinfo
Caldav & Carddav
Fehlermeldung:
Dein Webserver ist nicht richtig konfiguriert, um "/.well-known/caldav" aufzulösen.
Dein Webserver ist nicht richtig konfiguriert, um "/.well-known/carddav" aufzulösen.
Lösung:
siehe ➡ Apache2 000-default-le-ssl.conf
- ➡ https://docs.nextcloud.com/server/latest/admin_manual/configuration_server/reverse_proxy_configuration.html
- ➡ Nextcloud und das lästige Problem mit /.well-known/caldav & /.well-known/carddav
APCu
Fehlermeldung:
An unhandled exception has been thrown:
OC\HintException: [0]: Memcache \OC\Memcache\APCu not available for local cache (Is the matching PHP module installed and enabled?)
Lösung:
# apcu.ini editieren
sudo nano /etc/php/7.3/mods-available/apcu.ini
# Am Ende der Datei eintragen
apc.enable_cli=1
# Webserver neustarten
sudo systemctl restart apache2
# Nextcloud config.php editieren
sudo nano /var/www/htmls/nextcloud/config.php
# Zeile einfügen
"memcache.local" => "\OC\Memcache\APCu",
output_buffering
Fehlermeldung:
PHP configuration option output_buffering must be disabled
Lösung:
sudo nano /etc/php/7.3/apache2/php.ini
# Eintrag auskommentieren
; output_buffering = 4096
# Eintrag einfügen und output_buffering ausschalten
output_buffering = off
sudo systemctl restart apache2
Server Hardening
Benutzerverwaltung Raspberry Pi
Die Installation und Konfiguration wurde mit dem Standardbenutzer pi
durchgeführt. Es wird empfohlen den Standardbenutzer zu deaktivieren bzw. zu löschen und einen neuen Benutzer anzulegen mit dem die Administration des Servers durchgeführt wird.
Diese Anleitung stellt nur einen Auszug der Möglichkeiten der Benutzerverwaltung dar. Bitte zwingend auf die eigenen Anforderungen abstimmen.
Neuen Benutzer anlegen
sudo adduser <benutzer>
sudo usermod -aG sudo <benutzer>
sudo usermod -aG users <benutzer>
# Wird eine eigene Gruppe für die SSH-Anmeldung verwendet ist der neue Benutzer dort zwingend hinzuzufügen.
# Benutzer wechseln
su - <benutzer>
# Passwort vergeben
passwd
SSH-Schlüssel für neuen Benutzer anlegen
Es sind die SSH-Schlüssel für den neuen Benutzer anzulegen, wie in Abschnitt „SSH-Verbindung mit Public Keys einrichten“ beschrieben.
Verwendet man die gleichen Schlüssel auch unter dem neuen Benutzer, kann die Datei des Benutzers pi
einfach in das Benutzerverzeichnis des neuen Benutzers kopiert werden. Am einfachsten funktioniert der Kopiervorgang, wenn man den als Benutzer pi
ausführt.
su - <benutzer>
mkdir .ssh
chmod 0711 ~/.ssh
exit
# Benutzer wechseln
whoami
# Es sollte der Benutzer pi ausgegeben werden
pi
cd ~/.ssh
ls
authorized_keys
sudo cp authorized_keys /home/<benutzer>/.ssh/
# Benutzer wechseln
su - <benutzer>
# Rechte neu setzten
sudo chown root:root ~/.ssh/authorized_keys
sudo chmod 644 ~/.ssh/authorized_keys
sudo systemctl restart sshd
Benutzer pi deaktivieren bzw. löschen
Bevor der Benutzer pi
deaktiviert oder gelöscht wird, unbedingt prüfen, ob
- SSH-Zugriff möglich ist
- der neue Benutzer Mitglied der Gruppe
sudo
ist und auch wirklichsudo
-Befehle ausführen kann.
Ist beides möglich, kann der Benutzer pi
deaktiviert bzw. gelöscht werden.
# Anzeige der Benutzerdaten
chage -l pi
# Bevorzugete Option
chsh -s /usr/sbin/nologin pi
# Lock Account
sudo passwd -l pi
# Unlock Account
sudo passwd -u pi
# Benutzeranmeldung sperren
sudo usermod -L pi
# Benutzer
sudo deluser pi
# Benutzer inkl. Home-Verzeichnis löschen
sudo deluser --remove-home pi
fail2ban
sudo apt install fail2ban
# Konfigurationsdatei für fail2ban
# dort Anpassungen entsprechend den Anforderungen vornehmen
sudo nano /etc/fail2ban/jail.conf
nextcloud.conf
erstellen:
sudo nano /etc/fail2ban/filter.d/nextcloud.conf
[Definition]
_groupsre = (?:(?:,?\s*"\w+":(?:"[^"]+"|\w+))*)
failregex = ^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Login failed:
^\{%(_groupsre)s,?\s*"remoteAddr":"<HOST>"%(_groupsre)s,?\s*"message":"Trusted domain error.
datepattern = ,?\s*"time"\s*:\s*"%%Y-%%m-%%d[T ]%%H:%%M:%%S(%%z)?"
nextcloud.local
erstellen:
sudo nano /etc/fail2ban/jail.d/nextcloud.local
[nextcloud]
backend = auto
enabled = true
port = 80,443
protocol = tcp
filter = nextcloud
maxretry = 3
bantime = 86400
findtime = 43200
logpath = /mnt/data/nc-data/data/nextcloud.log
fail2ban neustarten und Status der Konfiguration ansehen:
sudo systemctl restart fail2ban.service
sudo fail2ban-client status nextcloud
fail2ban Benachrichtigungen
Die Konfiguration wird im Abschnitt „fail2ban“ beschrieben und ist Voraussetzung für den Versand der Benachrichtigungen.
fail2ban kann auch E-Mail mit Nachrichten zu bestimmten Ereignissen an eine definierte E-Mail-Adresse senden. Im Abschnitt
➡ Raspberry Pi – E-Mail-Versand einrichten
# Backup der Datei anlegen
sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.conf.bak
# Datei bearbeiten
sudo nano /etc/fail2ban/jail.conf
# Die Zeilen in der Datei sind anzupassen
...
destemail =
...
sender =
...
mta = mail
...
# action = %(action_)s
action = %(action_mwl)s
...
sudo systemctl restart fail2ban.service
E-Mail-Versand beim Neustarten des Raspbery Pis ausschalten.
sudo nano /etc/fail2ban/action.d/mail-buffered.local
# In die Datei kopieren
[Definition]
actionstart =
actionstop =
# Dummy-Dateien anlegen
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois-lines.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/mail-whois.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-buffered.local
cp /etc/fail2ban/action.d/mail-buffered.local /etc/fail2ban/action.d/sendmail-common.local
sudo systemctl restart fail2ban.service
unattended-upgrade
sudo apt install unattended-upgrades
# unattended-upgrades konfigurieren
sudo dpkg-reconfigure -plow unattended-upgrades
# Datei anlegen und mit Inhalt füllen
sudo nano /etc/apt/apt.conf.d/10periodic
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Download-Upgradeable-Packages "1";
APT::Periodic::AutocleanInterval "7";
APT::Periodic::Unattended-Upgrade "1";
ufw – Firewall
ACHTUNG Werden Ports über die Firewall geschlossen, ist ggf. eine SSH-Anmeldung am Server nicht mehr möglich. Der Port 22 sollte deshalb unbedingt geöffnet bleiben!
Ist der Server über SSH nicht mehr erreichbar, kann der Raspberry Pi an einen Monitor angeschlossen werden und eine normale Benutzeranmeldung durchgeführt werden. Es sollte hier unbedingt das Tastaturlayout über sudo raspi-config
auf „Deutsch“ gesetzt werden, um die Anmeldeinformationen ohne Probleme eingeben zu können.
sudo apt install ufw
IPV6 deaktivieren (optional)
sudo nano /etc/default/ufw
# Zeile alt
IPV6=yes
# Zeile neu
IPV6=no
Zwei Profile sind in /etc/ufw/applications.d/
anzulegen.
Profil 1: Port 80 – nextcloud_80
sudo nano /etc/ufw/applications.d/nextcloud_80
[nextcloud_80]
title=Nextcloud - Port 80
description=Nextcloud - Port 80 for http
ports=80/tcp
Profil 2: Port 443 – nextcloud_443
sudo nano /etc/ufw/applications.d/nextcloud_443
[nextcloud_443]
title=Nextcloud - Port 443
description=Nextcloud - Port 443 for https
ports=443/tcp
ufw restart
sudo ufw allow 22
sudo ufw app update nextcloud_443
sudo ufw app update nextcloud_80
sudo ufw allow nextcloud_80
sudo ufw allow nextcloud_443
sudo ufw enable
sudo ufw reload
sudo ufw app list
Zusätzliche Tweaks
Verzögerter Boot-Vorgang
Werden am Raspberry Pi externe Festplatten angeschlossen, dann werden diese u.U. nicht während des Boot-Vorgangs eingebunden. Der Pi gewährt 2 Sekunden, dann wird das Betriebssystem gestartet.
sudo nano /boot/config.txt
# Am Ende der Datei eintragen
program_usb_timeout=1
# Weiterer Eintrag in der Datei
# The command instructs to wait for a given number of seconds in start.elf
# before loading the kernel.
boot_delay=30
RTC-Modul DS3231
RTC steht für Real Time Clock und hilft dem Raspberry Pi nach einem Neustart die eingestellte Zeit nicht zu verlieren, da der kleine Einplatinenrechner über keine Batterie verfügt.
Das RTC-Modul DS3231 ist auf den GPIOs
sudo raspi-config
# Auswählen
3 Interface Options --> P5 I2C
Dateien anpassen
sudo nano /etc/modules
# In Datei eintragen
i2c-dev
i2c-bcm2708
I2C-Modul installieren
sudo apt update && sudo apt install i2c-tools && sudo shutdown -h now
Raspberry Pi herunterfahren und das RTC DS3231 anschließen.
sudo i2cdetect -y 1
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: -- -- -- -- -- -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- 68 -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
Wird „68“ ausgegeben wurde das DS3231 erkannt und kann verwendet werden.
echo ds3231 0x68 | sudo tee /sys/class/i2c-adapter/i2c-1/new_device
# Ausgabe, wenn RTC-Modul erfolgreich erkannt wurde
ds3231 0x68
Einstellung bei jedem Neustart laden
sudo nano /etc/rc.local
# Zeile VOR "exit 0" einfügen
echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
Uhrzeit prüfen
# Uhrzeit überprüfen
sudo hwclock
2021-10-09 14:27:07.410247+02:00
# Uhr einstellen
sudo hwclock -w
Nicht mehr benötigte Komponenten abschalten
sudo update-rc.d ntp disable
sudo update-rc.d fake-hwclock disable
Regelmäßiger Neustart des Raspberry Pis
Ein regelmäßiger Neustart des Raspberry Pis is ggf. sinnvoll und kann mit einem CRON automatisiert werden.
sudo crontab -e
# Reboots the system every Wednesday at 6:05 a.m.
0 6 * * 3 /sbin/shutdown -r +5
Raspberry Pi – E-Mail-Versand einrichten
Pakete installieren
sudo apt install postfix libsasl2-modules mutt
main.cfg editieren
sudo nano /etc/postfix/main.cf
# Strato - Am Ende der Datei eintragen
relayhost= smtp.strato.de:587
smtp_sasl_auth_enable = yes
sender_canonical_maps = hash:/etc/postfix/sender_canonical
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
smtp_enforce_tls = no
smtp_tls_enforce_peername = no
smtpd_tls_security_level = may
# GMail - Am Ende der Datei eintragen
relayhost= smtp.gmail.com:587
smtp_sasl_auth_enable = yes
sender_canonical_maps = hash:/etc/postfix/sender_canonical # Absender definieren
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd # Passwort des E-Mail-Kontos
smtp_sasl_security_options = noanonymous
smtp_use_tls = yes
smtp_enforce_tls = no
smtp_tls_enforce_peername = no
smtpd_tls_security_level = may
Zugangsdaten und Absender konfigurieren
sudo nano /etc/postfix/sasl_passwd
# Eintrag in der Datei nach dem Schema
E-Mail-Server:Port E-Mail-Adresse:Passwort
sudo nano /etc/postfix/sender_canonical
# Einträge nach dem Schema
pi
user1
user2
sudo postmap /etc/postfix/sasl_passwd
sudo chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
sudo postmap /etc/postfix/sender_canonical
sudo chown root:root /etc/postfix/sender_canonical /etc/postfix/sender_canonical.db
sudo chmod 0600 /etc/postfix/sender_canonical /etc/postfix/sender_canonical.db
sudo systemctl restart postfix
E-Mail-Versand testen – ohne Anhang
echo "Test E-Mail" | mutt -s "Test-Email ohne Anhang"
E-Mail-Versand testen – mit Anhang
cd
touch datei.txt
echo "Test-Email mit Anhang" | mutt e-mail-adresse -a /home/pi/datei.txt -s "Test-Email mit Anhang"
Anleitung auf Codeberg.org
‼ Die aktuellste Version dieser Anleitung findest du auf Codeberg.org. ‼
➡ https://codeberg.org/strobelstefan.org/nextcloud-installation-configuration
Gib mir gerne einen Kaffee ☕ aus!
Wenn dir meine Beiträge gefallen und geholfen haben, dann kannst du mir gerne einen Kaffee ☕ ausgeben.
bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj
‼ Die Anleitung wird auf Codeberg verwaltet. ‼
➡ https://codeberg.org/strobelstefan.org/nextcloud-installation-configuration
Photo by José Ramos on Unsplash

ist absolut technik-begeistert und großer Fan von Linux und Open Source. Raspberry Pi Bastler der ersten Stunde und nach wie vor begeistert von dem kleinen Stück Hardware, auf dem er tolle Projekte umsetzt. Teilt hier seine Erfahrungen mit Nextcloud, Pi-hole, YubiKey, Synology und openmediavault und anderen spannenden IT-Themen. Nutzt Markdown und LaTeX zum Dokumentieren seiner Projekte und Gitea zum Versionieren. Sitzt vor einem 49“ Monitor, nutzt Windows und MacOS zum Arbeiten, Linux auf seinen Servern und virtuellen Maschinen und hört dabei Spotify und MP3s und Radio-Streams über seinen RadioPi.