Mein Nextcloud Server läuft seit mehreren Jahren auf einem alten Lenovo Laptop. Zwar mache ich von Zeit zu Zeit ein Backup der Daten auf ein externes Laufwerk, aber es wird Zeit, die Hardware auszutauschen. Ich habe mich dazu entschieden, die Infrastruktur komplett zu überdenken.

Da mein Internet Provider mir  keine öffentliche IPv4 Adresse mehr bereitstellt, bleibt die Notwendigkeit eines vServers außerhalb meines eigenen Netzwerkes bestehen. Dieser vServer hat eine öffentliche IP Adresse und tunnelt alle Anfragen zu meinem Webserver mit dem Programm 6tunnel auf die öffentliche IPv6 Adresse meines Webservers. All das ist bereits im Bericht über den Nextloud Server am DSlite Anschluss beschrieben. Die neue Umgebung soll jedoch parallel zur bestehenden Installation augebaut werden. Da ich nicht damit rechne, dass mir auf Anhieb die Neuinstallation gelingt, wird die neue Umgebung komplett redundant aufgesetzt. So entstand das Berendes-Bande.de Projekt. Als Ziel soll die Familenwebseite über den Aufruf der Domain erreichbar sein und der Nextcloudserver über cloud.domain erreichbar sein.

Vorarbeiten:
Der alte Lenovo Power PC, mit dem meine Tochter während ihres Studiums ihre AutoCAD Zeichnungen angefertigt hat, wird die neue Basis-Hardware. Es ist reichlich Hauptspeicher vorhanden, die drei SCSI Festplatten, die den Rechner den Sound eines Atomkraftwerkes gegeben haben, werden durch eine 4 TB WD SATA Festplatte ersetzt, was den Lärmpegel auf ein leichtes Rauschen reduziert.
Bei do.de registriere ich die Domain berendes-bande.de, der Bindestrich kostet mich 7 € pro Jahr.
Bei STRATO miete ich einen vServer mit Ubuntu 20.04 und 500 MB RAM für 12 € pro Jahr. Dieser Server hat eine öffentlich IPv4 Adresse, die in die A Records der Domain eingetragen wird. Ich besorge das aktuelle Server-Image von der Ubuntu Webseite und fertige einen bootfähigen USB-Stick an. Diese Prozedur habe ich im NAS Server Artikel bereits beschrieben.
Installation Server:

Mein Server bekommt eine Netzwerkverbindung per Kabel. Das vereinfacht die Installation. Ich spare mir an dieser Stelle auch die Beschreibung, wie man den Server installiert. Dazu gibt es eine sehr gute Beschreibung bei linuxtechi.com >>How to Install Ubuntu Server 22.04 LTS Step by Step (linuxtechi.com). Bei einem Rechner, mit nur einer Festplatte, nehme ich nur eine Änderung vor: unter dem Punkt 7 <Configure the storage> entferne ich das Kreuzchen bei >> Setup this disk as an LVM group. Ich installiere keine weiteren Pakete, auch nicht den OpenSSH Server.

Nachdem der neue Server neu gestartet ist, installiere ich folgende Pakete:

  • ssh - für den Zugriff über Putty
  • tlp - damit schalte ich die Festplatte bei Nichtbenutzung in den Ruhemodus
  • net-tools - kann nicht schaden, 
  • cifs-utils - die brauche ich, um die Daten von dem bestehenden Cloud Server zu übernehmen 

sudo apt install -y ssh samba tlp net-tools cifs-utils

 
Jetzt werden erstmal alle Updates installiert:
sudo apt udpate
sudo apt upgrade
 
Da wir ssh installiert haben, kann die weiter Installation auch über Putty erfolgen. Ich möchte die Festplatte nach zwei Minuten in den Ruhemodus versetzen. Dazu konfiguriere ich tlp wie folgt:
Nano /etc/tlp.conf
DISK_APM_LEVEL_ON_AC="128 128"
DISK_SPINDOWN_TIMOUT_ON_AC="0 24" 
sudo systemctl enable tlp
sudo systemctl start tlp
 
Der nächste Schritt hat mich viel Zeit gekostet. Es geht um die Netzwerkkonfiguration und das Auflösen der IPv6 Server Adresse. Der alte Server funktionierte super mit den DHCP Einstellungen, auch für IPv6. Der neue Server hatte Probleme, seine eigene IPv6 Adresse zu kennen und gab immer eine Fehlermeldung aus, die besagte, dass es keine Route gibt. Folgende Einstellungen brachten die Lösung. Zuerst habe ich die IPv6 Einstellungen manuell vorgenommen. Dazu wird bei Ubuntu 22.04 netplan benutzt. Die Konfigurationsdatei befindet sich im /etc/netplan Verzeichnis und hat die Dateiendung .yaml, bei mir heisst die Datei 00-installer-config.yaml
sudo nano /etc/netplan/00-installer-config.yaml
network:
  version: 2
  renderer: networkd
  ethernets:
    enxxxx: (das ist euer Adapername)
      dhcp4: tue
      dhcp6: false
      addresses:
        - 2a00:xxxx:xxxx:xxxx:xxxx:xxxx:xxxx/64 (eure öffentliche IP6 Adresse)
        - fe80::xxxx:xxxx:xxxx:xxxx:/64 (lokale IPv6 Addresse)
      nameservers:
        addresses:
          - 1.1.1.1
          - 8.8.8.8
          - 192.168.xxx.1 (lokale IPv4 Adresse des Routers)
      routes:
      - on-link: true
         to: default
         via: 192.168.xxx.1 (lokale IPv4 Adresse des Routers)
Damit haben wir die manuelle IPv6 Konfiguration geregelt. Die Einrückungen sind übrigens notwendig. Nun muss der Plan noch aktiviert werden:
sudo netplan try
wenn es keine Fehlermeldung gibt
sudo netplan apply
Damit aber nicht genug. Es ist noch eine weitere Änderung notwendig. Im Verzeichnis /etc/sysctl.d findet ihr eine xx.sysctl.conf Datei. Bei mir heisst die 99.sysctl.conf. In dieser Datei entfernt ihr das Kommentarzeichen am Anfang der Zeile net.ipv6.conf.all.forwarding und setzt den Wert hinter dem Gleichheitszeichen auf 1.
sudo nano /etc/sysctl.d/99.sysctl.conf
net.ipv6.conf.all.forwarding=1
Ich empfehle danach einen Neustart.
 
DNS Records und Einrichten des 6tunnel beim vServer

Nun kenne ich auch die öffentliche IPv6 Adresse des neuen Servers und kann für diese die AAAA Records der Domain registrieren.  Ich mache je einen Eintrag als AAAA record für meineDomain, www.meineDomain web.meineDomain und cloud.meineDomain mit der IPv6 Adresse meines neuen Webservers. Die gleichen A Einträge registriere ich mit der IPv4 Adresse des vServers bei STRATO. Auf dem vServer bei STRATO installiere ich das Paket 6tunnel. Ich erstelle mir im /etc Verzeichnis einen neuen Ordner 6tunnel. In diesem lege ich eine Datei tunnel.sh mit folgendem Inhalt ab:

mkdir /etc/6tunnel
nano /etc/tunnel.sh
#!/bin/bash
sleep 10s
killall 6tunnel
sleep 10s
# http
6tunnel 80  IPv6 Adresse   80
#https
6tunnel 443 IPv6 Adresse 443
 
Für die IPv6 Adresse muss natürlich eure Server IP eingepflegt werden. Nach dem Abspeichern muss diese Datei noch ausführbar gemacht werden:
chmod +x /etc/6tunnel/tunnel.sh
Beim Neustart sollte dieses Script automatisch gestartet werden. Dafür füge ich am Ende der System-Crontab die folgende Zeile ein:
nano /etc/crontab
@reboot root /bin/bash /etc/6tunnel/tunnel.sh
Danach starte ich den vServer neu. Mit dem Kommando
ps -ef | grep 6tunnel
kann man die Funktion überprüfen.
 
Auf der FritzBox in meinem Netzwerk muss für den neuen Webserver eine Portfreigabe für die Ports 80 und 443 über TCP und das Protokoll IPv6 eingerichtet werden.
Installation Webserver für die Domain Webseite
Diese Webseite wurde mit Joomla 4 erstellt. Also soll eine Kopie dieser Webseite auf dem eigenen Webserver für die Domain mit Bindestrich gehostet werden. Wir brauchen also die Module apache2 mariadb und php. Ubuntu 22.04 liefert php 8.1, welches ich auch anwenden werde.
sudo apt install apache2 mariadb-server -y
sudo apt install php libapache2-mod-php php-cli php-mysql php-json php-opcache php-mbstring php-intl php-xml php-gd php-zip php-curl php-xmlrpc wget curl unzip -y
Die php.ini Datei muss angepasst werden:
sudo nano /etc/php/8.1/cli/php.ini
memory_limit = 256M
upload_max_filesize = 128M
max_execution_time = 300
output_buffering = off
date.timezone = CET
 
Danach starten wir den Webserver und die Datenbank und sorgen dafür, dass diese beim Systemstart automatisch starten.
sudo systemctl start apache2
sudo systemctl start mariadb
sudo systemctl enable apache2 mariadb
sudo mysql_secure_installation
Das letzte Kommando sichert die Datenbank ab und fordert ein Passwort für den root Datenbank-User. Mit diesem melden wir uns anschließend an und erzeugen eine Datenbank und einen Benutzer für die Joomla-Installation.
mysql -u root -p
create database joomla_db;
create user joomla@localhost identified by 'MySecretPassword';
grant all on jooma_db.* to 'joomla'@'localhost';
FLUSH PRIVILEGES;
Exit;
Ihr solltet natürlich euer eigenes Passwort benutzen 😀
Nun holen wir uns die aktuelle Joomla Version. Diese könnte sich natürlich in der Zwischenzeit verändert haben. Ich starte das Kommando im Home-Verezichnis des angemeldeten Benutzers.
Nun entpacken wir das zip-file in das Domain Verzeichnis und passen die Rechte an:
sudo unzip joomla.zip -d /var/www/html/meineDomain
sudo chown -R www-data:www-data /var/www/html/meineDomain
sudo chmod -R 755 /var/www/data/html/meineDomain
 
Jetzt legen wir noch eine VirtualHost Datei an. Diese gehört ins Verzeichnis /etc/apache2/sites-available. Für den Anfang sieht die ungefähr so aus:
sudo nano /etc/apache2/sites-available/meineDomain.conf
<VirtualHost *:80>
  ServerAdmin webmaster@meineDomain
  Servername web.meineDomain
  ServerAlias www.meineDomain
  DocumentRoot /var/www/html/meineDomain
   <Directory /var/www/html/meineDomain/>
    Options FollowSymlinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
Mit den folgenden Kommandos machen wir den Webserver verfügbar.
sudo a2ensite meineDomain.conf
sudo systemctl restart apache2
 
Über die lokale IPv4 Adresse kann man nun die Joomla installation ausführen.
 
Damit ist der erste  Teil der Webserverinstallation abgeschlossen. Die Kopie dieser Webseite fertige ich mit Akkeeba Backup an und spiele sie ins Datenverzeichnis der Domain zurück. Im zweiten Teil installiere ich Nextcloud.
Installation von Nextcloud

Zunächst kümmern wir uns um die Datenbank. Wir legen eine neue Datenbank und einen Datenbankbenutzer für Nextcloud an.

sudo mysql -u root -p
create database nextcloud;
create user nextclouduser@localhost identified by "MySecretPassword"; - bitte denkt euch was Nettes aus
grant all on nextcloud.* to 'nextclouduser'@'localhost';
flush provileges;
exit;
Ich starte den Download der aktuellen Nextcloud Version aus dem Home Verzeichnis des aktuellen Benutzers.
Die Versionsnummern können sich mittlerweile verändert haben. Nun wird das zip Archiv in das Nextcloud Installationsverzeichnis entpackt.
sudo unzip nextcloud.zip -d /var/www/html
Jetzt noch die Besitztumsverhältnisse regeln:
sudo chown -R www-dat:www-data /var/www/html/nextcloud
sudo chmod -R 755 /var/www/html/nextcloud/
Ich habe mein Datenverzeichnis außerhalb der Nextcloud-Installation im Ordner /mnt/next-data. Das hat den Vorteil, dass man die Daten bei einer Neuistallation nicht überschreibt. Diesen Ordner müssen wir auf dem neuen Server erst anlegen.
sudo mkdir /mnt/next-data
Auch für dieses Verzeichnis müssen Besitzer und Dateirechte geregelt werden. Wenn ihr also keine verhandene Nextcloudumgebung habt, gebt ihr die folgenden Kommandos ein, ansonsten tun wir dies, nach dem Einspielen des Backups vom existierenden Server.
sudo chown -R www-dat:www-data /mnt/next-data
sudo chmod -R 755 /mnt/next-data/
Als nächstes konfigurieren wir die VirtualHost Datei für Nextcloud
sudo nano /etc/apache2/sites-available/nextcloud.conf
<VirtualHost *:80>
  ServerAdmin webmaster@meineDomain
  Servername cloud.meineDomain
  
  DocumentRoot /var/www/html/nextcloud
   <Directory /var/www/html/nextcloud/>
    Options FollowSymlinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>
Mit den folgenden Kommandos machen wir den Webserver verfügbar.
sudo a2ensite meineDomain.conf
sudo systemctl restart apache2
Über die lokale IPv4 Adresse kann man nun die Nextcloudinstallation ausführen.
In der Weboberfläche kann nun die Installation vorgenommen werden.
Letsencrypt and Firewall
Als nächstes kümmern wir uns um die Letsencrypt Zertifikate. Dazu müssen wir ein paar Module installieren. Übrigens gibt es hierzu eine sehr gute Beschreibung bei DigitalOcean.com.
sudo apt install -y certbot python3-certbot-apache
Nun muss die Firewall konfiguriert werden
sudo ufw enable
sudo ufw allow 'Apache Full'
Das Ganze kann man überprüfen mit
sudo ufw status
 
Jetzt werden die Zertifikate beantragt:
sudo certbot --apache
Bitte schaut in die Beschreibung von DigitalOcean, dort sind alle Screenshots für den Zertifikatsprozess abgebildet.
 
Damit ist die Webserver Installation abgeschlossen. Die Zertifikate werden automatisch von Letsencrypt abgerufen und erneuert. Der Server leitet alle http Anfragen auf https um. Trotzdem bleibt noch etwas nachzuarbeiten. Für Nextcloud fehlen noch ein paar PHP module, Opcache muss noch eingerichtet werden und die well-known-caldav Problematik muss beseitigt werden.
Die folgenden Module habe ich nachinstalliert:
sudo apt install php-apcu php-imagick imagemagick
In der config.php der Nextcloud Umgebung müssen ein paar Dinge getan werden.
Im Array trusted domains müssen die Namen und Adressen eures Nextcloud-Servers eingetragen werden, also z.B. cloud.meineDomain, die lokale IPv4 Adresse, die public IPv4 Adresse des vServer, sowie die kurze, lokale  IPv6 Adresse des Servers. Dazu kommt noch die Zeile
'mencache.local' => '\\OC\Memcache\\APCu',
In der vHost Datei des Nextcloud Servers müssen die folgenden Zeilen, vor der Zeile </VirtualHost> eingefügt werden. Hierbei benutze ich die Config-Datei namens nextcloud-le-ssl.conf im Verzeichnis /etc/apache2/sites-available.
sudo nano /etc/apache2/sites-available/nextcloud-le-ssl.conf
ReWriteEngine On
  RewriteRule ^/\.well-known/carddav https://%{SERVER_NAME}/remote.php/dav/   [R=301,L]
  RewriteRule ^/\.well-known/caldav https://%{SERVER_NAME}/remote.php/dav/    [R=301,L]
Leider habe ich nicht alle Änderungewn an der php.ini aufgeschrieben. Ich konnte aber mit Hilfe der Installationsanleitung zu Nextcloud, all Warnungen ausräumen, die Nextcloud in der Administrator-Übersicht anzeigt. 
Backup und Restore
Nun da Nextcloud munter läuft, müssen nur noch die Daten des alten Servers eingespielt werden. Dazu kopiere ich alles aus dem Nextcloud Datenverzeichnis auf ein externes Laufwerk. In meinem Netzwerk habe ich einen Samba Server, den ich dafür benutze, es geht aber auch mit einer USB Disk.
Das Backup der Datenbank brauchen wir auch. Dazu gebe ich am Terminal des alten Servers folgendes ein:
mysqldump -u root -p nextcloud > nextcloud.sql
Wenn man das vom Home Verzeichnis des angemeldeten Benutzer macht, wird dort auch die nextcloud.sql abgelegt. Diese wird dann auf das externe Laufwerk kopiert.
Am neuen Server geht das Ganze dann umgekehrt. Zuerst hänge ich das Samba Laufwerk ein. Dazu braucht es einen Mountpoint, den ich im Verzeichnis /mnt anlege.
sudo mkdir /mnt/old-cloud
sudo mount -t cifs //192.168.xxx.xxx/share /mnt/old-cloud
Hier muss natürlich die IPv4 Adresses des Samba Servers, sowie der Name der Freigabe stehen. Für den Zugriff wird das root-Passwort des Samba Servers abgefragt. Danach hat man über den Mountpoint Zugriff auf die gesicherten Daten. Diese stehen bei mir im Ordner mybackups und werden jetzt an Ort und Stelle kopiert.
cp -r -u /mnt/old-cloud/mybackups /mnt/next-data/
Die Besitztumsrechte korrigieren...
sudo chown -R www-dat:www-data /mnt/next-data
sudo chmod -R 755 /mnt/next-data/
Den Datenbank-Dump habe ich in ein Verzeichnis dump gelegt. Den spielen wir jetzt zurück in die Nextcloud Datenbank.
cd /mnt/next-data/dump
mysql -u root -p nextcloud < nextcloud.sql
Geschafft, der Webserver läuft und hostet die Familien Homepage sowie die Nextcloud Daten. Alles, was ich hier aufgeschrieben habe, habe ich mir nicht ausgedacht, sondern aus dem Internet zusammen gesucht. Viel Spass beim Nachbasteln.