Schritt-für-Schritt zur eigenen Nextcloud

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

  • Apache – Webserver konfigurieren
    • index.html anpassen
    • Let“s Encrypt
    • Apache2 000-default-le-ssl.conf
    • Apache2 meineurl.de.conf
    • Nextcloud – Fehlermeldungen
    • Server Hardening

    • ‼ Die Anleitung wird auf Codeberg verwaltet. ‼
      https://codeberg.org/strobelstefan.org/nextcloud-installation-configuration

      Hardware und Betriebssystem

      Die Installation wurde getestet auf:

      • 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)“

      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.

      PayPal Logo


      liberapay.com/strobelstefan.org


      Kaffee via Bitcoin

      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

      Aus der offiziellen Nextcloud-Dokumentation

      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

      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

      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

      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 wirklich sudo-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.

      PayPal Logo


      liberapay.com/strobelstefan.org


      Kaffee via Bitcoin

      bc1qfuz93hw2fhdvfuxf6mlxlk8zdadvnktppkzqzj


      ‼ Die Anleitung wird auf Codeberg verwaltet. ‼
      https://codeberg.org/strobelstefan.org/nextcloud-installation-configuration

      Photo by José Ramos on Unsplash

  • Schreibe einen Kommentar

    Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert