Migration von Nextcloud auf einen neuen Server mit Ubuntu 16.04 LTS

Heute möchte ich Euch zeigen, wie man eine Nextcloud-Instanz auf einen neuen VPS umziehen kann. Gründe dafür können sein, das einem der Speicherplatz ausgeht und der VPS vom Provider nicht vergrößert werden kann.

Wir sollten uns bewusst sein, dass je nach TTL im DNS eine Downtime für unsere Nextcloud-Instanz entsteht. Wenn möglich auf jeden Fall die TTL auf das Minimum reduzieren (je nach DNS-Provider unterschiedlich) und bei größeren Datenmengen kann man diese schon einen Tag vorher einer Erstsynchronisation unterziehen. Auf jeden Fall empfehle ich die Prozedur einmal vorher zu testen und sich mit dem Ablauf vertraut zu machen. Im Anschluß kann dann die Livemigration durchgeführt werden.

Step 1: Vorbereitung neuer Server

Vorraussetzung ist natürlich ein neuer VPS mit mehr Speicherplatz und shell-Zugriff, den wir auf Nextcloud vorbereiten. Für Nextcloud 13 und php7.2-fpm mit Apache2 und mysql, können wir die folgenden Dinge abarbeiten.

sudo apt install -y software-properties-common
sudo apt install -y python-software-properties
sudo add-apt-repository -y ppa:ondrej/php
sudo add-apt-repository -y ppa:ondrej/apache2
sudo add-apt-repository -y ppa:certbot/certbot
sudo apt update
sudo apt install -y lamp-server^
sudo apt install -y libapache2-mod-php7.2 php7.2-cli php7.2-common php7.2-mbstring php7.2-gd php7.2-intl php7.2-xml php7.2-mysql php7.2-zip php7.2-dev php7.2-curl php7.2-fpm php-dompdf php-apcu redis-server php-redis unzip nano
sudo a2dismod mpm_prefork
sudo a2enmod proxy_fcgi setenvif mpm_event
sudo a2dismod php7.2
sudo a2enconf php7.2-fpm
sudo apt install -y python-certbot-apache

die mysql-Installation sichern wir noch ab:

sudo mysql_secure_installation

Passen die Apache2-Konfiguration an:

sudo nano /etc/apache2/apache2.conf

und ändern den folgenden Code:

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>

zu

<Directory /var/www/>
Options Indexes FollowSymLinks
AllowOverride All
Require all granted
</Directory>

und natürlich die php.ini:

sudo nano /etc/php/7.2/fpm/php.ini

dort fügen wir den folgenden Code ein:

opcache.enable=1
opcache.enable_cli=1
opcache.interned_strings_buffer=8
opcache.max_accelerated_files=10000
opcache.memory_consumption=128
opcache.save_comments=1
opcache.revalidate_freq=1

Wenn php-APCu im Einsatz ist, dann muss die php.ini entprechend erweitert werden, siehe auch hier.

Zum Synchronisieren nutzen wir später rsync, falls nicht installiert, dann einfach nachinstallieren:

sudo apt install rsync

Um rsync mit sudo zu nutzen, müssen wir auf dem Zielserver noch die /etc/sudoers anpassen:

Pfad von rsync überprüfen:

which rsync

dann:

sudo visudo

und ganz unten als letzte Zeile die folgende einfügen (eventuell Pfad anpassen):

username  ALL=NOPASSWD:/usr/bin/rsync

Datei speichern.

Step 2: Migration der Nextcloud-Daten, Zertifikate und Apache2-vhosts

Nur Live-Migration: Bevor wir beginnen sollten wir den DNS-Record (A und ggf. AAAA) auf die neue Server-IP anpassen.

Wir starten mit den kleineren Dingen und synchronisieren die Zertifikate und die Apache2-vHosts auf den neuen Server.

Zertfikate synchronisieren (Pfade und neuen Hostnamen/IP anpassen, sudo User sollte auf neuen Server ebenfalls existieren):

sudo rsync -azv --rsync-path="sudo rsync" --progress /etc/letsencrypt/live/nextcloud.deine-domain.tld/ username@hostname:/etc/letsencrypt/live/nextcloud.deine-domain.tld/

Apache2-vHosts synchronisieren:

sudo rsync -azv --rsync-path="sudo rsync" --progress /etc/apache2/sites-available/001-nextcloud* username@hostname:/etc/apache2/sites-available/

Live-Migration: Nun aktivieren wir vorher den Wartungsmodus in Nextcloud:

sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --on

und fahren mit den Daten fort:

sudo rsync -azv --rsync-path="sudo rsync" --progress /var/www/html/nextcloud/ username@hostname:/var/www/html/nextcloud

Step 3: Datenbank migrieren

Auf dem Quellserver erstellen wir einen Dump der Nextcloud-Datenbank mit:

mysqldump -u root -pdein-passwort -h localhost --verbose nextcloud > /tmp/nextcloud.sql

(richtig: kein Leerzeichen hinter -p)

und kopieren diesen mit scp auf den neuen Server:

scp /tmp/nextcloud.sql username@hostname:/tmp/

Bevor wir die Datenbank importieren, legen wir eine leere Datenbank an:

mysql -u root -p
create database nextcloud;
exit

Die Datenbank wird jetzt auf dem neuen Host importiert:

mysql -u root -pdein-passwort nextcloud < /tmp/nextcloud.sql

und wir legen den Nutzer in mysql an:

sudo mysql -u root -p
create user nextcloud@localhost identified by 'DEIN_PASSWORT';
grant all privileges on nextcloud.* to nextcloud@localhost;
flush privileges;
exit;

Falls wir das alte Passwort für den mysql User nicht mehr wissen, können wir in der config.php nachschauen.

cat /var/www/html/nextcloud/config/config.php | grep dbpassword

Step 4: Aktivieren Apache2-vHosts und Test

Mit dem folgenden Befehl aktivieren wir die beiden Nextcloud-vHosts (http/https):

sudo a2ensite 001-nextcloud.conf
sudo a2ensite 001-nextcloud-le-ssl.conf
sudo systemctl restart apache2

und bei Live-Migration deaktivieren wir den Wartungsmodus:

sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --off

und erstellen wieder unseren cron-job:

sudo crontab -u www-data -e

dort die Zeile einfügen:

*/15 * * * * php -f /var/www/html/nextcloud/cron.php

Testen können wir die Nextcloud-Instanz indem wir die neue IP-Adresse in unserer lokalen hosts-Datei auf unserer Workstation eintragen:

unter Linux:

/etc/hosts

unter Windows:

C:\Windows\System32\drivers\etc\hosts

Auch hier gilt wieder überprüfen der LogFiles und wenn keine Fehler vorliegen, dann entweder Livemigration oder warten bis neuer DNS-Record verteilt wurde.
Das LetsEncrypt-Zertifikat erneuern wir danach mit:

sudo certbot --apache

Sollte der Login-Button nach der Migration oder beim Testen nicht funktionieren, dann reicht es eventuell schon in der config.php die Zeile mit „instanceid“ zu kommentieren.

Das war es für heute und viel Erfolg beim „Nextclouden“ 🙂

Schreibe einen Kommentar

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