SSD Nodes Learn
Anleitungen Matt ConnorVon Matt Connor · Aktualisiert 2026-07-24

Nextcloud auf VPS mit Docker installieren

Lernen Sie die Installation von Nextcloud via Docker Compose mit Postgres, Redis und TLS. Inklusive Anleitung für konsistente Backups und Upgrades.

Was Sie tatsächlich aufbauen

Diese Anleitung führt Nextcloud auf einem VPS mit Docker Compose aus, schaltet Let's Encrypt TLS davor und richtet ein Backup ein, das auch tatsächlich wiederhergestellt werden kann. Vier Container und ein Proxy: das offizielle nextcloud Image, das auf Loopback lauscht, Postgres für alle Datei-Metadaten, Redis für die Datei-Locks, eine zweite Kopie des Nextcloud-Images, die ausschließlich die Cron-Schleife ausführt, und nginx auf dem Host, der TLS vor allen Komponenten terminiert. Die Installation selbst dauert zwanzig Minuten; das ist jedoch nicht der entscheidende Teil. Zwei Entscheidungen in der ersten Stunde bestimmen, ob Sie Ihre Dateien in einem Jahr noch haben: eine echte Datenbank anstelle von SQLite und ein Backup, das das Verzeichnis data, die Datenbank und config.php als ein konsistentes Set sichert.

Dies setzt Ubuntu 24.04 LTS oder Debian 13, die Docker Engine mit dem aus dem Docker-Repository installierten Compose v2 Plugin sowie einen DNS A Record (plus AAAA bei IPv6) voraus, der bereits auf den VPS zeigt (cloud.example.com). Das gesamte System erfordert einen Server unter Ihrer Kontrolle — es ist nicht möglich, TLS-Terminierung und einen Datenbank-Dump auf einer fremden SaaS-Lösung durchzuführen.

Dimensionierung: Was den Speicher tatsächlich verbraucht

Der Speicherverbrauch von Nextcloud wird von drei Faktoren dominiert, wobei keiner davon "Nextcloud" selbst ist.

PHP-Worker. Das -apache-Image bedient jede gleichzeitige Anfrage über einen Worker-Prozess, der einen PHP-Interpreter hält. Jeder Worker kann bis zu PHP_MEMORY_LIMIT anwachsen, bevor PHP die Anfrage abbricht. Der maximale residente Speicherverbrauch entspricht etwa gleichzeitige Anfragen × das Memory Limit. Da ein Desktop-Sync-Client mehrere parallele Verbindungen pro Benutzer öffnet, bestimmt die Anzahl der gleichzeitigen Anfragen und nicht die Benutzeranzahl die Obergrenze.

Die Datenbank. Postgres erstellt für jede Verbindung einen Backend-Prozess und hält Shared Buffers im Speicher. Der Arbeitsdatensatz skaliert mit der Anzahl der Dateien, nicht mit der Anzahl der Bytes: oc_filecache speichert eine Zeile pro Datei pro Benutzer. Hunderttausend kleine Dateien verursachen eine höhere Datenbanklast als hundert große Dateien.

Vorschaubild-Generierung. Die Erstellung eines Thumbnails dekodiert das Originalbild in voller Auflösung in den Speicher. Videovorschauen nutzen ffmpeg. Die Ausführung von occ preview:generate-all verursacht diese Lastspitzen wiederholt hintereinander. Dies ist die häufigste Ursache dafür, dass ein kleiner VPS durch den OOM-Killer beendet wird.

Redis ist vergleichsweise kostengünstig. Alle Komponenten, die später hinzugefügt werden – Collabora, Volltextsuche, ein Antiviren-Scanner – sind separate residente Dienste mit eigenem Speicherbedarf. Diese müssen in der Dimensionierung berücksichtigt werden, bevor sie aktiviert werden.

Regelmöglichkeiten bei knappem RAM: Senken Sie PHP_MEMORY_LIMIT, begrenzen Sie preview_max_x / preview_max_y / preview_max_filesize_image, beschränken Sie enabledPreviewProviders auf die tatsächlich genutzten Formate und konfigurieren Sie trashbin_retention_obligation und versions_retention_obligation so, dass das Datenverzeichnis nicht unbemerkt auf ein Vielfaches der Dateigröße anwächst. Fügen Sie eine Swap-Datei hinzu. Swap ist langsam, aber ein OOM-Kill während eines Upgrades ist kritischer.

Warum SQLite fehlschlägt

Nextcloud enthält SQLite-Unterstützung, und das offizielle Image verwendet diese standardmäßig. Tun Sie dies nicht. SQLite serialisiert Schreibvorgänge mit einer Datenbank-weiten Sperre: Es kann nur ein Schreibvorgang gleichzeitig für die gesamte Datei ausgeführt werden. Nextcloud führt ständig Schreibvorgänge aus — Datei-Locks, Aktivitätszeilen, Cache-Einträge, Job-Status — und ein einzelner Desktop-Client, der einen Verzeichnisbaum synchronisiert, sendet viele parallele Anfragen. Bei diesem Muster treten SQLSTATE[HY000]: General error: 5 database is locked und HTTP 500-Fehler auf. Der Fehler tritt genau dann auf, wenn die Instanz beginnt, produktiv genutzt zu werden.

Eine spätere Konvertierung ist mit occ db:convert-type möglich, aber es handelt sich um eine langwierige Migration des gesamten Datensatzes. Beginnen Sie mit Postgres oder MariaDB.

Die Compose-Datei

Speichern Sie diese in /srv/nextcloud/compose.yaml ab. Die Secrets müssen in einer gleichnamigen .env Datei im Modus 600 liegen.

services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    volumes:
      - db:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud
      POSTGRES_PASSWORD: ${DB_PASSWORD}

  redis:
    image: redis:7-alpine
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD}

  app:
    image: nextcloud:31-apache
    restart: unless-stopped
    depends_on: [db, redis]
    ports:
      - "127.0.0.1:8080:80"
    volumes:
      - html:/var/www/html
      - /srv/nextcloud/data:/var/www/html/data
    environment:
      POSTGRES_HOST: db
      POSTGRES_DB: nextcloud
      POSTGRES_USER: nextcloud
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      REDIS_HOST: redis
      REDIS_HOST_PASSWORD: ${REDIS_PASSWORD}
      NEXTCLOUD_ADMIN_USER: admin
      NEXTCLOUD_ADMIN_PASSWORD: ${ADMIN_PASSWORD}
      NEXTCLOUD_TRUSTED_DOMAINS: cloud.example.com
      TRUSTED_PROXIES: 172.16.0.0/12
      OVERWRITEPROTOCOL: https
      OVERWRITECLIURL: https://cloud.example.com
      APACHE_DISABLE_REWRITE_IP: "1"
      PHP_MEMORY_LIMIT: 512M
      PHP_UPLOAD_LIMIT: 10G

  cron:
    image: nextcloud:31-apache
    restart: unless-stopped
    entrypoint: /cron.sh
    depends_on: [db, redis]
    volumes:
      - html:/var/www/html
      - /srv/nextcloud/data:/var/www/html/data

volumes:
  db:
  html:

Fixieren Sie das Major-Tag. Überprüfen Sie das aktuelle Tag auf Docker Hub, bevor Sie 31 wortgetreu kopieren. latest kann bei einem zukünftigen docker compose pull zu einem Major-Update führen, welches Nextcloud nicht unterstützt.

Das Verzeichnis für die Daten ist absichtlich ein Bind Mount und kein Named Volume: Ein Pfad, auf den ein Backup-Tool direkt zugreifen kann, ist wichtiger als eine saubere Struktur. Erstellen Sie das Verzeichnis mit der www-data UID des Images und den von Nextcloud geforderten Berechtigungen:

sudo mkdir -p /srv/nextcloud/data
sudo chown -R 33:33 /srv/nextcloud/data
sudo chmod 0770 /srv/nextcloud/data

Beachten Sie die Port-Veröffentlichung: 127.0.0.1:8080:80. Docker veröffentlicht Ports durch DNAT-Regeln. Diese werden ausgewertet, bevor die INPUT-Chain von ufw das Paket sieht. Ein einfacher 8080:80 stellt Nextcloud unverschlüsselt im öffentlichen Internet bereit, unabhängig von den ufw-Einstellungen. Durch das Binden an das Loopback-Interface bleibt der Dienst vom öffentlichen Interface fern. Die Firewall muss dann nur noch den Proxy zulassen. Wenn Sie SSH nicht für das gesamte Internet öffnen möchten, können Sie den Port 22 durch den Zugriff auf den VPS über ein selbst gehostetes WireGuard VPN vollständig aus den öffentlichen Regeln entfernen:

sudo ufw allow 22/tcp
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable

Starten Sie den Container mit docker compose up -d und überwachen Sie docker compose logs -f app. Beim ersten Start wird der gesamte Anwendungsbaum in das Volume kopiert und der Installer ausgeführt. Der Container reagiert erst, wenn dieser Vorgang abgeschlossen ist.

TLS und der Reverse Proxy

Installieren Sie nginx und certbot aus dem Distro-Repository. Erstellen Sie einen einfachen Server-Block für Port-80 mit dem korrekten server_name. Lassen Sie diesen anschließend durch certbot umschreiben. Die Funktionsweise des HTTP-01-Challenges, der Erneuerungs-Timer und die Fehlerursachen werden in issuing Let's Encrypt certificates with certbot and nginx on Ubuntu 24.04 vollständig behandelt:

sudo apt install nginx certbot python3-certbot-nginx
sudo certbot --nginx -d cloud.example.com

Certbot fügt die ssl_certificate-Zeilen sowie die :80:443-Weiterleitung hinzu. Zudem wird ein systemd-Timer installiert, der das 90-Tage-Zertifikat erneuert. Überprüfen Sie die Existenz mit systemctl list-timers | grep certbot. Ein nicht aktivierter Erneuerungs-Timer führt zum Ablauf des Zertifikats nach 90 Tagen.

Der Proxy-Block:

server {
    listen 443 ssl;
    listen [::]:443 ssl;
    server_name cloud.example.com;

    # certbot manages ssl_certificate / ssl_certificate_key here

    add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

    client_max_body_size 10G;
    client_body_timeout 300s;

    location = /.well-known/carddav { return 301 /remote.php/dav; }
    location = /.well-known/caldav  { return 301 /remote.php/dav; }

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_http_version 1.1;
        proxy_set_header Host              $host;
        proxy_set_header X-Real-IP         $remote_addr;
        proxy_set_header X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header X-Forwarded-Host  $host;
        proxy_request_buffering off;
        proxy_buffering off;
        proxy_read_timeout 3600s;
        proxy_send_timeout 3600s;
    }
}

Fügen Sie bei nginx 1.25 und neuer http2 on; hinzu. Ubuntu 24.04 verwendet eine ältere Version, bei der das Äquivalent listen 443 ssl http2; lautet. nginx -t zeigt Ihnen an, welche Version Ihre Build unterstützt.

client_max_body_size und die hohen Read-Timeouts verhindern, dass große Uploads vorzeitig abbrechen. proxy_request_buffering off streamt den Upload direkt, anstatt die gesamte Datei zuerst auf der Festplatte des Proxys zwischenzuspeichern.

nginx auf dem Host ist die einfachste Lösung für eine einzelne Anwendung. Wenn Nextcloud den VPS mit anderen Containern teilen soll, verschiebt running Traefik as a Docker Compose reverse proxy for multiple apps das Routing und die Zertifikatsausstellung in Container-Labels. Die gleichen Aspekte wie client_max_body_size und Timeouts treten dort als Middleware- und Transport-Einstellungen auf.

trusted_proxies und overwriteprotocol

Hier entstehen die meisten Fehler bei selbst gehosteten Nextcloud-Instanzen. Die Symptome scheinen oft nichts mit der Ursache zu tun zu haben.

X-Forwarded-Proto: https wird nur berücksichtigt, wenn die Anfrage von einer in trusted_proxies gelisteten Adresse eingeht. Wenn dies nicht der Fall ist, betrachtet Nextcloud die Anfrage als plain HTTP und generiert http:// URLs; der Proxy leitet diese an HTTPS weiter; der Browser folgt der Weiterleitung; Nextcloud generiert erneut http://. Dies ist die Redirect-Schleife. OVERWRITEPROTOCOL: https erzwingt das Protokoll unabhängig davon.

Die Falle in TRUSTED_PROXIES besteht darin, dass die von Nextcloud gesehene Adresse nicht 127.0.0.1 ist. nginx läuft auf dem Host und verbindet sich über einen veröffentlichten Port. Daher sieht der Container das Docker-Bridge-Gateway — eine Adresse aus 172.x. Ermitteln Sie das echte Subnetz:

docker network inspect nextcloud_default \
  -f '{{range .IPAM.Config}}{{.Subnet}}{{end}}'

Tragen Sie diesen CIDR (oder die abdeckende 172.16.0.0/12) in TRUSTED_PROXIES ein. Wählen Sie den Bereich zu groß, könnte jeder Client X-Forwarded-For fälschen. Wählen Sie ihn falsch, erscheinen alle Logins mit der Gateway-Adresse. Die Brute-Force-Schutzmechanismen blockieren dann die gesamte Instanz und die Admin-Übersicht zeigt: "The reverse proxy header configuration is incorrect, or you are accessing Nextcloud from a trusted proxy."

OVERWRITECLIURL ist wichtig für den cron-Container, da dieser keine eingehenden Anfragen erhält, um einen Hostnamen abzuleiten. Ohne diese Einstellung generieren Hintergrundprozesse Links zu localhost und E-Mail-Benachrichtigungen enthalten unbrauchbare URLs.

Hintergrundprozesse: cron statt AJAX

Der Standard-Jobrunner von Nextcloud ist AJAX: Jobs werden als Nebenwirkung beim Laden einer Seite ausgeführt. Da um 04:00 Uhr niemand die Seite aufruft, verzögern sich das Löschen des Papierkorbs, die Bereinigung von Versionen, die Erstellung von Previews und die Wiederholung von Federated-Retries. Das erste Symptom ist ein Datenverzeichnis, das kontinuierlich wächst. Der oben genannte cron-Dienst führt die offizielle /cron.sh-Schleife auf denselben Volumes aus. Konfigurieren Sie Nextcloud so, dass es darauf wartet:

docker compose exec -u www-data app php occ background:cron

Jeder occ-Befehl folgt diesem Format: docker compose exec -u www-data app php occ <command>. Es ist empfehlenswert, einen Alias dafür anzulegen.

Backups: drei Komponenten oder gar keine

Ein reines Filesystem-Backup stellt eine defekte Instanz nicht wieder her. Das Verzeichnis data enthält die Bytes; Postgres verwaltet den File-Cache, Shares, Benutzer und den App-Status; config.php speichert die Datenbank-Anmeldedaten, die Instanz-ID und den Password-Salt. Wenn Sie nur die Dateien ohne die Datenbank wiederherstellen, kann Nextcloud diese nicht finden. Wenn Sie die Datenbank ohne config.php wiederherstellen, kann sie die Datenbank nicht öffnen. Wenn Sie eine alte Datenbank gegen ein neueres data-Verzeichnis wiederherstellen, erhalten Sie Shares, die auf Dateien verweisen, die verschoben wurden.

Sichern Sie alle drei Komponenten von einer pausierten Instanz (quiesced instance) ab:

#!/usr/bin/env bash
set -euo pipefail
cd /srv/nextcloud
DEST="/var/backups/nextcloud/$(date -u +%Y%m%dT%H%M%SZ)"
mkdir -p "$DEST"

occ() { docker compose exec -T -u www-data app php occ "$@"; }

occ maintenance:mode --on
trap 'occ maintenance:mode --off' EXIT

docker compose exec -T db \
  pg_dump -U nextcloud --clean --if-exists nextcloud | gzip > "$DEST/db.sql.gz"

docker compose exec -T app \
  tar -C /var/www/html -cf - config custom_apps themes > "$DEST/app.tar"

rsync -a --delete /srv/nextcloud/data/ /var/backups/nextcloud/data/

Der Wartungsmodus (Maintenance mode) stellt sicher, dass der Dump und die Dateikopie konsistent sind. Überspringen Sie diesen Schritt, wird die Datenbank eventuell auf eine Datei verweisen, die durch rsync noch nicht erreicht wurde. Beachten Sie, dass das Skript Datenbank-Dumps mit Zeitstempel behält, aber nur einen rollierenden Mirror des data-Verzeichnisses erstellt — rsync --delete überschreibt diesen bei jedem Durchlauf — daher ist nur der neueste Dump mit der Dateikopie kompatibel.

Sichern Sie die Daten anschließend extern aus. Ein Backup, das auf demselben VPS liegt wie das Original, ist eine Kopie, kein Backup. Die Verwendung von restic gegen Object Storage oder einen zweiten Host ist die Standardlösung; die Deduplizierung ist für das data-Verzeichnis wesentlich effizienter als ein nächtlicher tar-Ball. Das vollständige Setup, von der Repository-Initialisierung über den nächtlichen Timer bis hin zur Wiederherstellungs-Übung, finden Sie in off-box VPS backups with restic.

Die Wiederherstellung ist nicht einfach der umgekehrte Prozess. Ein frisch gestarteter Stack führt den Installer aus und schreibt ein brandneues config.php — eine neue Instanz-ID und einen neuen Password-Salt. Das Importieren des Dumps auf dieser neuen Identität führt zu defekten Sessions und Share-Tokens. Stellen Sie zuerst die alte Identität wieder her, in dieser Reihenfolge:

docker compose up -d && docker compose stop app cron    # create the volumes, then halt the app
sudo rsync -a --delete /var/backups/nextcloud/data/ /srv/nextcloud/data/
docker compose run --rm -T --entrypoint "" app \
  tar -C /var/www/html -xf - < app.tar                  # the original config.php returns
gunzip -c db.sql.gz | docker compose exec -T db psql -U nextcloud -d nextcloud
docker compose start app cron
docker compose exec -T -u www-data app php occ maintenance:mode --off
docker compose exec -T -u www-data app php occ files:scan --all

files:scan gleicht den File-Cache mit den tatsächlichen Daten auf der Festplatte ab. Üben Sie diesen Vorgang einmal auf einem freien VPS, bevor Sie ihn im Ernstfall benötigen.

Upgrades: jeweils nur eine Hauptversion

Nextcloud unterstützt nur das Upgrade auf genau eine Hauptversion gleichzeitig. Ein Sprung von 29 auf 31 schlägt fehl. Dies führt zu Exception: Updates between multiple major versions and downgrades are unsupported. und versetzt das System in den Maintenance-Mode.

Der Docker-Upgrade-Prozess ist wie folgt: Erstellen Sie ein Backup, ändern Sie das Tag von 31 zu 32 in den Services app und cron, führen Sie dann docker compose pull && docker compose up -d aus und anschließend docker compose logs -f app. Der Image-Entrypoint prüft den neueren Code gegen die vorhandenen Daten und führt occ upgrade selbstständig aus. Unterbrechen Sie diesen Vorgang nicht. Wenn die Logs keine Ausgaben mehr zeigen, führen Sie docker compose exec -u www-data app php occ status aus und prüfen Sie versionstring sowie die Aktivierung der Apps.

Zwei Regeln helfen Ihnen: Erhöhen Sie erst eine Hauptversion und verifizieren Sie diese, bevor Sie die nächste erhöhen. Ändern Sie niemals das Tag im app-Service, ohne das Tag im cron-Service entsprechend anzupassen. Zwei verschiedene Nextcloud-Versionen gegen eine einzige Datenbank führen zu Datenkorruption.

Die tatsächlichen Fehlermeldungen

"Your data directory is readable by other users. Please change the permissions to 0770." Das per bind-mount eingebundene Verzeichnis besitzt Leserechte für die Gruppe oder andere Benutzer. sudo chmod 0770 /srv/nextcloud/data und sudo chown -R 33:33 /srv/nextcloud/data.

"Your data directory is invalid. Ensure there is a file called .ocdata in the root." Der bind-mount zeigt auf einen Pfad, der von Nextcloud nie initialisiert wurde — ein Tippfehler im Pfad oder ein neues, leeres Verzeichnis wurde gegen eine funktionierende Instanz ausgetauscht. Prüfen Sie, ob der Host-Pfad mit der volume-Zeile übereinstimmt.

"Access through untrusted domain." Der Hostname in der Anfrage steht nicht in trusted_domains. NEXTCLOUD_TRUSTED_DOMAINS gilt nur bei der Erstinstallation; setzen Sie ihn danach live: occ config:system:set trusted_domains 1 --value=cloud.example.com.

502 Bad Gateway, mit connect() failed (111: Connection refused) while connecting to upstream in /var/log/nginx/error.log. nginx erreicht nichts unter 127.0.0.1:8080. Entweder initialisiert sich der Container noch (prüfen Sie docker compose logs app), er ist beendet worden (docker compose ps) oder die publish-Zeile entspricht nicht dem proxy_pass Port. Bestätigen Sie dies mit ss -ltnp | grep 8080.

Eine Redirect-Schleife oder "insecure"-Warnungen in der Admin-Übersicht. OVERWRITEPROTOCOL: https fehlt oder TRUSTED_PROXIES enthält nicht das Docker-Gateway-Subnetz. Siehe den Abschnitt zum Proxy oben.

LockedException: "files/..." is locked. Wenn REDIS_HOST gesetzt ist, konfiguriert das Image Redis als Locking-Backend; veraltete Locks treten dann selten auf. Ohne diese Einstellung liegen die Locks in der Datenbanktabelle oc_file_locks, und eine während des Schreibvorgangs abgebrochene Anfrage hinterlässt dort Einträge. Prüfen Sie, ob Redis tatsächlich verwendet wird — occ config:system:get memcache.locking sollte die Redis-Klasse zurückgeben — bevor Sie Lock-Zeilen manuell löschen.

"The PHP memory limit is below the recommended value of 512MB." Erhöhen Sie PHP_MEMORY_LIMIT und erstellen Sie den Container neu. Beachten Sie, was dies für Ihr maximales Limit bedeutet.

Probleme bei Skalierung

Die erste Hürde ist das Vergrößern des Datenverzeichnisses über das verfügbare Volume hinaus. Die Vergrößerung eines Volumes auf einem VPS erfordert eine Resize-Operation sowie ein Filesystem-Grow. Dies ist bei einer vollen Festplatte (100 % Auslastung) deutlich schwieriger zu planen. Richten Sie Alarme für die Festplattenauslastung ein, bevor der Speicher voll ist.

Die zweite Hürde ist oc_filecache. Das Auflisten von Dateien und die Synchronisations-Scans werden bei steigender Zeilenanzahl langsamer. Die Lösung liegt in der Datenbankoptimierung: Speichern Sie Postgres auf schnellem Speicher, weisen Sie ausreichend Shared Memory zu und löschen Sie veraltete Daten und Versionen mittels Retention-Einstellungen, anstatt sie unbegrenzt zu sammeln.

Die dritte Hürde ist die Generierung von Vorschauen, die mit anderen Prozessen konkurriert. Nutzen Sie auf kleinen Systemen nur wenige Preview-Provider und führen Sie occ preview:generate-all niemals während der Arbeitszeiten aus.

Darüber hinaus benötigen Zusatzdienste eigene Instanzen. Collabora und die Volltextsuche sind eigenständige Dienste mit spezifischem Speicherbedarf. Wenn Sie diese auf demselben System wie Ihre einzige Dateikopie installieren, vergrößern Sie die Fehlerdomäne ohne Vorteil. Wechseln Sie zu S3-kompatiblem Primärspeicher, sobald das lokale Volume nicht mehr ausreicht. Beachten Sie dabei, dass dies Backups komplexer macht: Die Datenbank enthält weiterhin die Metadaten und muss synchron mit dem Bucket gesichert werden.

Sobald die Instanz echte Benutzer bedient, sollten Sie Uptime Kuma vorschalten, um Ausfallzeiten zu bemerken, bevor die Sync-Clients reagieren. Eine Private Cloud lässt sich gut mit einem eigenen Mailserver kombinieren. Falls Sie Dienste nicht manuell miteinander verbinden möchten, bieten Cloudron, CasaOS und Coolify Plattformen an, die dies für Sie übernehmen.

FAQ

Kann ich Nextcloud mit SQLite statt Postgres betreiben?

Das ist möglich und das offizielle Image erlaubt dies. Ein einzelner Desktop-Sync-Client mit parallelen Anfragen führt jedoch zu SQLSTATE[HY000]: General error: 5 database is locked und HTTP 500 Fehlern. SQLite setzt eine schreibende Sperre für die gesamte Datenbank. Nextcloud führt jedoch ständig Schreibvorgänge aus (Dateisperren, Activity-Zeilen, Job-Status). Starten Sie mit Postgres oder MariaDB; occ db:convert-type ist verfügbar, stellt aber eine langwierige Migration der Live-Daten dar, die nur vollständig erfolgreich ist.

Wie viel RAM benötigt ein Nextcloud VPS tatsächlich?

Planen Sie die Größe basierend auf der Anzahl gleichzeitiger Anfragen, nicht auf der Benutzeranzahl. Der maximale resident memory entspricht etwa der Anzahl der parallelen Anfragen multipliziert mit PHP_MEMORY_LIMIT, plus Postgres shared buffers, plus ein Backend pro Verbindung, plus den Spitzenwerten bei der Vorschaubild-Generierung. Ein 2 GB System reicht für eine kleine Instanz aus, wenn Sie die Vorschau-Generierung begrenzen und Swap hinzufügen. Bei der Nutzung von Collabora oder Volltextsuche müssen Sie zusätzliche resident services einplanen.

Warum schlagen große Uploads hinter dem nginx reverse proxy fehl?

Meist sind zwei Einstellungen am Proxy die Ursache: client_max_body_size ist auf den Standardwert von 1 MB eingestellt, was die Anfrage abschneidet, und kurze proxy_read_timeout / proxy_send_timeout Werte unterbrechen lange Übertragungen. Setzen Sie beide Werte großzügig an, stellen Sie proxy_request_buffering off auf stream statt spool und erhöhen Sie PHP_UPLOAD_LIMIT im App-Container entsprechend.

Warum kommt es bei Nextcloud zu Redirect-Loops oder Warnungen bezüglich des reverse proxy?

Der Container sieht nginx nicht unter 127.0.0.1, sondern das Docker bridge gateway im Bereich von 172.x. Wenn diese Adresse in TRUSTED_PROXIES fehlt, wird der X-Forwarded-Proto: https Header ignoriert. Nextcloud generiert daraufhin http:// URLs, die vom Proxy zurückgeworfen werden. Setzen Sie TRUSTED_PROXIES auf das korrekte Bridge-Subnetz und fixieren Sie OVERWRITEPROTOCOL: https.

Kann ich Nextcloud direkt von Version 29 auf 31 upgraden?

Nein. Nextcloud unterstützt pro Upgrade nur eine Hauptversion. Das Überspringen von Versionen führt zu einem Fehler bei Updates between multiple major versions and downgrades are unsupported. und versetzt die Instanz in den Maintenance Mode. Erstellen Sie ein Backup, erhöhen Sie das Tag um jeweils eine Hauptversion bei den Diensten app und cron sowie bei docker compose pull && docker compose up -d, verifizieren Sie dies mit occ status und wiederholen Sie den Vorgang.