Dienstag, 5. August 2025

Nextcloud Migration - es funktioniert doch

Die Migrationsdokumente die ich so gefunden habe - klingen alle schwierig. Dabei ist es doch "wie immer" eine Datenbank und ein Pfad für den Webserver (siehe auch mein Artikel). Klar ist der Pfad beim gehosteten Server speziell und offenbar stehen Pfade in der Datenbank. 

Meine Aufgabe: nextcloud bei all-inkl soll umziehen in eine (möglichst einfache) Installation zu Hause. Ich habe mehrere Installationen probiert: NextcloudPi, ScriptCarstenRieger, Snap, NextcloudAIO, NextcloudMicroService. Am besten schien mir erstmal die NextcloudMicroService Variante geeignet. Wie so oft habe ich versucht alles in Scriptzeilen zu packen, die durch aliase und Variablen möglichst wenig angepasst werden müssen.

Voraussetzungen für meine Anleitung ist ein ssh Zugang zum Quellsystem. Hat man den nicht, kann man die Dateien auch per ftp / Browser herunterladen und muss sie dann auf dem Zielsystem bereitstellen. 

Zielsystem installieren

Arbeitspfad vorbereiten

mkdir docker && cd docker && mkdir DocRoot

Ich habe einfach das docker-compose.yml File von hier genommen und wie üblich in einem Pfad angelegt und editiert.

hier eventuell noch die docker-compose.yml einfügen

Man kann jetzt die Docker Container erzeugen und starten. 

docker compose up -d

Über http://<IP Dockerhost>:<Port> kann man die Funktion prüfen, einrichten muss man jetzt nichts.

Daten vom Quellsystem holen

Achtung: Vor der finalen Datenübernahme muss das Quellsystem in den Maintenance Mode gesetzt werden! (config.php oder php ./occ maintenance:mode --on)

Ich erzeuge auf dem Quellserver mit einem Script einen Dump der Datenbank mit Datums Stempel. Die exakte Befehlszeile mit scp hängt vom Quellsystem ab, die Datei auf dem Zielserver nenne ich einfach dump.sql

scp ssh-vsserver@vsserver.kasserver.com:backups/dump_dddddddd_20250728_1512.sql.gz dump.sql.gz

Ich kopiere die Daten mit rsync vom Server in einen lokalen Pfad. Der Vorgang kann zeitaufwendig sein, durch rsync kann man den Vorgang aber wiederholen und muss nicht am Stück arbeiten.

SOURCE_PATH=/www/htdocs/vsserver/domain.tld
rsync -av --delete -e ssh ssh-vsserver@vsserver.kasserver.com:${SOURCE_PATH}/ DocRoot/

Alternativ erstellt man ein tar File und lädt ihn mit scp oder ftp herunter.

Datenbank anlegen und Konfiguration anpassen

Alle Zugangsdaten werden direkt aus den Konfigurationsdateien geladen. Alternativ kann man die Variablen auch manuell setzen.

MYSQL_ROOT_PASSWORD=$(awk -F"=" '/MYSQL_ROOT_PASSWORD/{print $2;exit;}' docker-compose.yml)
dbname=$(awk -F"'" '/dbname/{print $4}' DocRoot/config/config.php)
dbuser=$(awk -F"'" '/dbuser/{print $4}' DocRoot/config/config.php)
dbpassword=$(awk -F"'" '/dbpassword/{print $4}' DocRoot/config/config.php)
alias dbexec='docker exec -i docker-db-1'           # arbeiten mit der Datenbank
alias dexec='docker exec -it docker-app-1'          # arbeiten mit der nextcloud als root
alias dwexec='docker exec -u www-data docker-app-1' # arbeiten mit der nextcloud als user www-data

Hinweis und wichtig: zu diesem Zeitpunkt läuft der nextcloud Container noch mit originaler Konfiguration und damit Zugriff auf die Installationsdatenbank.

Benutzer und Datenbank neu anlegen, Rechte zuweisen, dies ist quasi ein Einzeiler, also den gesamten Block in die Befehlszeile "werfen".

dbexec mysql -uroot -p$MYSQL_ROOT_PASSWORD \
-e " CREATE USER '$dbuser'@'%' IDENTIFIED BY '$dbpassword';
CREATE DATABASE IF NOT EXISTS $dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;
GRANT ALL PRIVILEGES on $dbname.* to '$dbuser'@'%'; "

Datenbank entpacken, importieren und den absoluten Pfad anpassen, siehe auch.

gunzip dump.sql.gz 
dbexec mysql -uroot -p$MYSQL_ROOT_PASSWORD $dbname < dump.sql
dbexec mysql -uroot -p$MYSQL_ROOT_PASSWORD -D$dbname \
-e "UPDATE $dbname.oc_storages SET id = 'local::/var/www/html/data/' WHERE id = 'local::${SOURCE_PATH}/' ;"

Hinweis: Dieser Weg ist nicht offiziell supportet. Wobei ich nicht verstehe warum, man könnte den dump auf weitere absoluten Pfade durchsuchen um es abzusichern. 

Dateien an docker anbinden und anpassen

Der nextcloud Microservice Container verwendet /var/www/html als DocumentRoot, ich verbinde einfach den externen Arbeitspfad dorthin. 

Den volumes Eintrag in der docker-compose.yml ändern:

    volumes:
#      - nextcloud:/var/www/html
      - ./DocRoot:/var/www/html

In der Datei ./DocRoot/config/config.php muss der Datenbankname und der absolute Pfad für die Dateien mit sed (oder einem Editor) angepasst werden. 

sed -i "s/'dbhost' => 'localhost'/'dbhost' => 'db'/" DocRoot/config/config.php
sed -i "s|${SOURCE_PATH}|/var/www/html|" DocRoot/config/config.php

Container neu erzeugen und starten

docker compose up -d

Hinweis: Nach diesem Neustart läuft der nextcloud Container mit neuen Einstellungen und damit mit Verbindung zur importierten Datenbank. Ein Zugriff über http erfordert noch ein paar Änderungen.

Finale Anpassungen

Berechtigungen für den gesamten Pfad setzen 

dexec bash -c "chown -R www-data: /var/www/html"

Die kopierte Nextcloud wird den Zugriff über die neue (fremde) IP Adresse zunächst verhindern. Man muss (zumindest für den Test) trusted domains und proxies ergänzen/korrigieren.

Die Konfiguration der Nextcloud (auch die config.php) kann man mit dem php Kommando occ anpassen. Mit get kann man sich einen Überblick verschaffen und mit set die Werte anpassen oder ergänzen. Der Index bei trusted_domains startet bei mir mit 0 und ist durchgängig.

Nextcloud config an die neue Umgebung anpassen

dwexec php occ config:system:get trusted_domains
dwexec php occ config:system:set trusted_domains 2 --value=192.168.90.63
dwexec php occ config:system:set trusted_domains 3 --value=cloud.domain.de
dwexec php occ config:system:get trusted_proxies
dwexec php occ config:system:set trusted_proxies 0 --value=192.168.90.0/24

php ./occ maintenance:mode --off

Jetzt sollte die migrierte nextcloud unter http://<IP Docker>:<Port> erreichbar sein und funktionieren.

Anschließend muss man sich noch um https und Systemtuning kümmern. cron.php, memcache usw.

Crontab für die Nextcloud

Diese Zeile mit crontab -e einfügen

*/5 * * * * docker exec -u www-data docker-app-1 php /var/www/html/cron.php

Befehle zum Test der einzelnen Schritte

cat DocRoot/config/config.php
dbexec mysql -uroot -p$MYSQL_ROOT_PASSWORD \
-e " SHOW GRANTS FOR '$dbuser'@'%'; "
dbexec mysql -uroot -p$MYSQL_ROOT_PASSWORD -D$dbname \
-e " SELECT * from oc_storages "
dwexec php occ config:system:get trusted_domains


ToDo

set maintenance:data-fingerprint


Code


Keine Kommentare:

Kommentar veröffentlichen