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“ 🙂