Ziel

Ich habe während den Weihnachtsfeiertagen und zu Neujahr endlich etwas mehr Zeit gehabt meine Nextcloud All in One Instanz vom alten Mietserver auf den neuen zu übertragen. Auf dem neuen Server läuft Proxmox und Nextcloud in einem unprivilegierten LXC Container. Eigentlich sollte das ganze Unterfangen nicht lange dauern, aber ich habe dann doch mehrere Tage gebraucht bis es funktioniert hat.

Anstelle eines langen Beitrags über die ganzen Irrungen und Wirrungen, werde ich mich hier auf den Lösungsweg konzentrieren, vielleicht ist es ja für jemanden hilfreich.

Notwendige Schritte

Hier die notwendigen Schritte:

  • Unnötige Daten aus der alten Nextcloud Installation löschen
  • Borg Backup machen
  • DNS Einträge anpassen
  • LXC vorbereiten
  • (Optional) Tailscale installieren
  • ZFS Datasets erstellen
  • Neue Nextcloud AiO Installation vornehmen
  • Borg Backup (richtig!) Transferieren
  • Backup wieder einspielen
  • Container starten

Borg Backup, DNS und Reverse Proxy

Zuerst sollte man alle unnötigen Daten aus der alten Nextcloud Instanz löschen. Denn das Backup Tool Borg, welches von Nextcloud genutzt wird, sichert auch alle Daten im primären Speicher! Dieser Fehler ist auch gleich mir passiert, denn es war schlicht nicht genug Speicherplatz auf dem alten VPS (250GB) und der Server kroch dann mit null freien Bytes herum. Sehr ärgerlicht und auch vermeidbar.

Wenn man Nextcloud ausreichend ausgemistet hat, kann man sich als Admin in Nextcloud einloggen, auf “Administrative Settings” gehen und AiO Settings öffnen. Dort noch einmal Backup anlegen und auch gleich auf Integrität überprüfen.

Backup bestätigen…

… und abwarten:

Als nächstes kann man die DNS Einträge anpassen. Die gewünschte Domain muss man dann auf den neuen Server zeigen lassen. Das Ganze muss so aussehen wie im Gramps-Beitrag.

Auf dem neuen Mietserver muss man schließlich auch noch den Reverse Proxy konfigurieren. Ich verwende Caddy, aber Nextcloud unterstützt auch die anderen großen Reverse Proxys.

Das Caddyfile sieht in etwa so aus:

# Reverse proxy for Nextcloud AiO
cloud.domain.com {
    reverse_proxy http://xxx.xxx.xxx.xxx:11001 {
        header_up Host {host}
        header_up X-Real-IP {remote}
        header_up X-Forwarded-For {remote}
        header_up X-Forwarded-Proto {scheme}
    }
}

Der Port 11001 führt zum Apache Server. Damit das funktioniert muss die entsprechende Option im docker-compose.yml eingetragen sein.

LXC vorbereiten

Zuerst einen LXC Container erstellen, oder noch besser ein Template verwenden, und dort Docker Compose installieren. Sobald das erledigt ist, an gewünschter Stelle den Ordner für Nextcloud erstellen, ich nehme dazu gerne /opt/nextcloud.

Jetzt das docker-compose.yml von Github runterladen und anpassen.

Meine kondensierte Konfig sieht so aus:

services:
  nextcloud-aio-mastercontainer:
    image: nextcloud/all-in-one:latest
    init: true
    restart: always
    container_name: nextcloud-aio-mastercontainer
    volumes:
      - nextcloud_aio_mastercontainer:/mnt/docker-aio-config
      - /var/run/docker.sock:/var/run/docker.sock:ro
    ports:
      - "80:80"      # HTTP access for Nextcloud
      - "443:443"    # HTTPS access for Nextcloud
      - "8080:8080"  # AIO management interface
#      - "8443:8443"  # (Optional) Admin interface
    environment:
      NEXTCLOUD_MOUNT: /mnt
      APACHE_PORT: 11000
      NEXTCLOUD_DATADIR: /mnt/nextcloud-data
      APACHE_IP_BINDING: 0.0.0.0
volumes:
  nextcloud_aio_mastercontainer:
      name: nextcloud_aio_mastercontainer

Starten mit docker compose up -d und nun sollte das Nextcloud AiO Webinterface aufrufbar sein. Falls unklar ist wie man Container unter Proxmox aufrufbar machen kann – man befindet sich ja nicht im lokalen Netz des Mietservers – habe ich einen Beitrag zu den Netzwerkeinstellungen und Tailscale geschrieben.

Aber jetzt müssen wir immer noch das Backup vom alten Server übertragen und einspielen und das war gar nicht so einfach.

Probleme mit dem Backup übertragen

Der nächste Schritt hat mich am meisten Zeit gekostet und es kamen wohl zwei Fehler zusammen. Hier meine Lösungen.

Jetzt muss man das Borg Backup übertragen. Das hat zuerst nicht wirklich funktioniert, weil das Borg Repo nur root Zugriff erlaubt. Das war ärgerlich, aber man kann entweder mit dem root User kopieren, oder mittels chmod -R 744 das Repo ‘zugreifbarer’ machen. Auch wenn letzteres ein paar Bauchschmerzen verursacht. Aber noch schwerwiegender wog, dass es wohl nicht funktioniert, wenn im zukünftigen Nextcloud Daten-Verzeichnis auch noch das Backup liegen hat. Dann entpackt sich zwar das Backup zum überwiegenden Teil, spuckt aber mehrere Fehler, wie “Socket not connected (107)”…

rsync: [sender] send_files failed to open "/tmp/borg/nextcloud_aio_volumes/nextcloud_aio_nextcloud_data/admin/files/Documents/Example.md": Socket not connected (107)

… oder “(code 23)” aus:

transferred (see previous errors) (code 23) at main.c(1338) [sender=3.3.0]
2025-01-01T18:45:40.029317646Z Something failed while restoring the configuration.json.

Auf UTF-8 umstellen kann helfen

Ich habe das nicht wissenschaftlich untersucht, aber die Lösung, die bei mir geholfen hat war, dass ich einerseits die locales Einstellung auf UTF-8 angepasst, weil wohl Umlaute das ganze Werkl in die Bredouille bringen können. Auch wenn ich mir nicht sicher bin, ob das das Problem war, stellte sich heraus, dass nicht überall UTF-8 verwendet wurde. So kann man das umstellen:

Sofern locales installiert ist, das hier ausführen:

locale-gen en_US.UTF-8
locale -a
nano /etc/default/locale

Und Inhalt (wie ‘LANG=“C”’) durch folgendes ersetzen:

LANG=en_US.UTF-8
LC_ALL=en_US.UTF-8

Und Änderungen umsetzen und überprüfen:

source /etc/default/locale
locale

Eigene Verzeichnisse bzw. Datasets erstellen

Ein weiterer Fehler war, wie bereits beschrieben, dass ich die Ordner vermischt habe. Das habe ich gemacht, weil ich den LXC Container klein halten möchte (32 GB) und nicht die Nutzerdaten dort dabei haben möchte. Dadurch war aber nur im nextcloud-data Ordner genug Speicherplatz. Aber im Endeffekt hätte ich gleich ein eigenes Dataset für das Borg Backup machen sollen. Mit ZFS geht es so.

Zuerst ZFS Dataset auflisten, erstellen, Maximalbelegung (Quota) einrichten, überprüfen, Besitzer und Berechtigungen anpassen:

zpool list
zfs create rpool/nextcloud-data
zfs set compression=lz4 rpool/nextcloud-data
zfs set quota=800G rpool/nextcloud-data
zfs get quota rpool/nextcloud-data
chown 100000:100000 /rpool/nextcloud-data
chmod 700 /rpool/nextcloud-data

Dann die Container-Config anpassen…

nano /etc/pve/lxc/<CT-ID>.conf

… und die folgende Zeile hinzufügen:

mp0: /rpool/nextcloud-data,mp=/mnt/nextcloud-data

Eigenes Dataset für Borg-Backups in gleicher Manier erstellen:

zfs create rpool/nextcloud-borg
zfs set quota=200G rpool/nextcloud-borg
zfs get quota rpool/nextcloud-borg
zfs list
chown 100000:100000 /rpool/nextcloud-borg
chmod 700 /rpool/nextcloud-borg
nano /etc/pve/lxc/<CT-ID>.conf

In /etc/pve/lxc/<CT-ID>.conf kopieren:

mp1: /rpool/nextcloud-borg,mp=/mnt/nextcloud-borg

Backup übertragen und einspielen

Mit scp kann man das Backup nun korrekt übertragen, der Befehl sieht in etwa so aus:

rsync -av --progress /pfad/zum/alten-backup/borg/ <user>@<alten-vps>:/pfad/zum/alten-backup/borg

Falls das wegen Berechtigungen nicht geht kann man sich auf dem alten Server mit chmod -R 777 (oder 744 weiß nicht mehr welche Variante funktioniert hat, Vorsicht mit 777 das gibt jedem dahergelaufenen Prozess Zugriffsrechte – wobei das Borg Backup selbst ja eh noch einmal verschlüsselt ist, insofern weiß ich nicht, ob das ein Problem ist).

Dann auf die Weboberfläche vom Nextcloud AiO gehen (Port 8443) und nicht eine Domain anlegen, sondern etwas runterscrollen und Backup-Ort mit Pfad eingeben, laden. Wenn gewünscht noch einen Integritätscheck machen und gewünschtes Backup einspielen:

Nextcloud startenEs ist immer der RAM!

Sobald das Backup eingespielt ist, kann man die Container starten…

… und Nextcloud aufrufen:

Ich verwende jedoch auch noch einen NFS-Share um größere Datenmengen zu speichern bzw. zugreifbar zu machen.

NFS Share einbinden

Unprivilegierte LXC Container haben in Proxmox keine Berechtigungen Netzwershares zu verwalten. Daher funktioniert es nicht, wenn man einfach via mount oder /etc/fstab Eintrag einen solchen einrichten möchte. Das muss über den Proxmox Host gehen. Das kann man entweder in der Konsole machen, oder auch via GUI.

Zuerst muss man dem Proxmox Host jedoch Zugriff auf das Tailnet geben. Nachdem ich auf dem Hypervisor so wenig wie möglich installieren möchte, tue ich das mit ip route und iptables. Vom Proxmox Host aus folgende Befehle ausführen:

iptables -t nat -A POSTROUTING -s xxx.xxx.xxx.xxx/24 -o tailscale0 -j MASQUERADE
iptables -A FORWARD -i tailscale0 -o vmbr0 -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -i vmbr0 -o tailscale0 -j ACCEPT

Dann vom Proxmox Host aus den Server mit dem NFS-Share pingen.

Anschließend kann man unter Datacenter Storage Add einen NFS Share hinzufügen. Ich habe bei “Content” nur “ISO” ausgewählt.

Wenn man beim Erstellen einen Berechtigungsfehler “Permission denied” bekommt…

create storage failed: mkdir /mnt/pve/Nextcloud/template: Permission denied at /usr/share/perl5/PVE/Storage/Plugin.pm line 1516. (500)

… dann muss man auf dem NFS Server entweder die Berechtigungen anpassen (Nextcloud verwendet User www-data mit UID/GID 33), was dank der Verschachtelung gar nicht so trivial ist, oder man erstellt dort einfach manuell die notwendigen Ordner. Bei mir ist das TrueNAS, daher habe ich mich dort mittels SSH eingeloggt (muss man unter System Services aktivieren, und am besten gleich einen public SSH Key hinterlegen unter Credentials Local User und bei Admin hinzufügen). Dort kann man dann in das Dataset mit dem NFS-Share navigieren und als User root (gleiches Passwort wie User admin) den Ordner erstellen:

sudo su
mkdir /mnt/<Pool>/<Dataset-mit-NFS>/<Nextcloud-NFS>/template

Jetzt kann man unter Proxmox NFS hinzufügen, nur halt keine ISOs draufspeichern, aber was solls.

Jetzt fehlt nur noch der Mountpoint für den LXC. Unter etc/pve/lxc/<CT-ID>.conf diesen Mountpoint hinzufügen:

mp2: /mnt/pve/Nextcloud,mp=/mnt/nextcloud-nfs

LXC und Nextcloud starten, als Admin einloggen und den Pfad von alt auf /mnt/nextcloud-nfs/<Zielordner> anpassen:

Und schon hat man eine wundersame Speicherplatz-Vermehrung!

Backups

In meinen Beiträgen über den Proxmox Backup Server habe ich gezeigt, wie man diesen aufsetzen und konfigurieren kann. Ich habe dann auch zugleich den Nextcloud LXC zu diesem Backup-Fluss hinzugefügt. Eine Ausnahme bildet hier das Borg-Backup, welches leider darauf insistiert, dass die Nutzerdaten samt der Konfig gespeichert wird. Nachdem Borg + Nextcloud jedoch ein funktionales Gesamtpaket bilden, möchte ich das nicht zerreißen. Daher werde ich das Dataset mit den Nutzerdaten und dem Borg-Backup nicht als zfs Snapshot speichern, sondern eher einfach das Borg-Backup selbst speichern. Muss ich mir aber noch einmal anschauen, ob ich das auch automatisiert mache, oder nur nach Bedarf.

Fazit

Rückblickend ist es nicht schwer eine Nextcloud AiO Instanz zu übertragen. Man muss jedoch sauber arbeiten und manchmal stößt man auf Probleme, die halt dank der Komplexität nirgendwo sonst im Internet aufzutreten scheinen. Daher habe ich insgesamt fünf Tage gebraucht bis alles funktioniert hat. Ich hoffe diese Anleitung kann dem einen oder anderen helfen eine schnelle und reibungslose Migration von Nextcloud durchzuführen. Grundsätzlich taugt mir das Proxmox-auf-einem-VPS-Setup sehr und ich bin sehr zufrieden mit meiner neuen, alten Nextcloud Instanz.