Zum Inhalt springen
labkompass

LAB · Vermessen

Nextcloud 34 vermessen: Ressourcen, Transfer und ein Restore in drei Anläufen

Was Nextcloud 34 wirklich kostet: 168 MiB RAM im Leerlauf, 935 MB Installation, 140 MiB/s Upload — und 3,24 Dateien pro Sekunde bei vielen kleinen Dateien. Dazu ein Backup-Restore, der erst im dritten Versuch funktionierte.

Von Niclas Hennrich ·

  • 6-Kern-x86-Desktop-CPU (35 W TDP)
  • 16 GB RAM
  • NVMe-SSD

Softwarestand: Nextcloud 34.0.3 · PostgreSQL 16 · Redis 8 · Docker Engine 29.7.2 · Docker Compose 5.5.0 · Debian 13


LAB-Messwert · gemessen am

RAM im Leerlauf, alle vier Container

Messwert
168,3 MiB

Messmethode: docker stats über den laufenden Stack (app, db, redis, cron) · Last: Frisch installiert, keine Nutzdaten, keine Anfragen

Einzelwerte: Nextcloud 115,7 · PostgreSQL 40,7 · Redis 10,2 · Cron 1,7

LAB-Messwert · gemessen am

RAM des Nextcloud-Containers unter 1-GB-Upload

Messwert
284 MiB

Messmethode: docker stats während der Transfermessung · Last: Laufender 1-GB-Upload über WebDAV

Gleichzeitig rund 47 % einer CPU; Datenbank und Redis nahezu 0 %

LAB-Messwert · gemessen am

Speicherbedarf der frischen Installation

Messwert
935 MB

Messmethode: du auf dem Volume · Last: Direkt nach occ maintenance:install, keine eigenen Dateien

Davon 573 MB mitgelieferte Apps und 156 KB Konfiguration; Datenbank zusätzlich 15 MB, Container-Images rund 3 GB

LAB-Messwert · gemessen am · 7,28 s

Upload 1 GB

Messwert
140,7 MiB/s

Messmethode: curl über WebDAV gegen 127.0.0.1 — Loopback, ohne Netzwerkbegrenzung · Last: Eine Datei, sequentiell

Beschreibt Server- und Speicherleistung, nicht was ein Client im LAN erreicht

LAB-Messwert · gemessen am · 2,70 s

Download 1 GB

Messwert
378,9 MiB/s

Messmethode: curl über WebDAV gegen 127.0.0.1 — Loopback, ohne Netzwerkbegrenzung · Last: Eine Datei, sequentiell

LAB-Messwert · gemessen am · 308,07 s

Upload 1000 Dateien à 10 KB

Messwert
3,24 Dateien/s

Messmethode: curl über WebDAV gegen 127.0.0.1, ein Aufruf pro Datei · Last: 1000 Dateien, sequentiell, je eigene Verbindung und eigene Anmeldung

12 MB brauchten 42-mal länger als 1 GB am Stück. Ein echter Sync-Client parallelisiert und ist schneller — die Größenordnung des Unterschieds bleibt.

LAB-Messwert · gemessen am

Backup-Dauer bei 3,1 GB Quelldaten

Messwert
84,78 s

Messmethode: pg_dump + pg_dumpall --roles-only + tar czf des Volumes · Last: Wartungsmodus aktiv, Instanz währenddessen nicht erreichbar

Datenbank 0,28 s (406 KB), Rollen 0,11 s (583 B), Dateien 83,87 s (2,17 GB). Die Zeit steckt praktisch vollständig im Packen.

LAB-Messwert · gemessen am

Restore-Dauer in eine leere Instanz

Messwert
33,38 s

Messmethode: Rollen, dann Datenbank-Dump, dann tar des Volumes; Verifikation über MD5-Prüfsummen · Last: Dritte, komplett leere Instanz mit eigenen Volumes

Datenbank 2,01 s, Dateien 31,37 s. 1067 Dateien in 7 Ordnern, Prüfsummen identisch — aber erst im dritten Anlauf.

Kurz gesagt: Nextcloud 34 ist genügsamer als sein Ruf — 168 MiB RAM im Leerlauf, unter 20 Sekunden bis zur laufenden Instanz. Zwei Dinge sind unangenehm: Der Grundzoll auf der Platte liegt bei rund 4 GB, bevor die erste eigene Datei da ist, und bei vielen kleinen Dateien bricht der Durchsatz auf 3,24 Dateien pro Sekunde ein. Der Restore-Test war der eigentliche Gewinn: Er hat drei Anläufe gebraucht.

Warum diese Messung #

Für den Guide Nextcloud selbst hosten war die Frage offen, was Nextcloud tatsächlich kostet. Die eigene Produktivinstanz taugt dafür nicht — sie ist über Monate gewachsen und beantwortet weder die Frage nach dem Installationsaufwand noch die nach dem Grundverbrauch.

Also eine eigene Testinstanz: zweiter Compose-Stack neben der produktiven, eigene Volumes, eigenes Netz, eigener Port, eigene Zugangsdaten. Nach den Messungen restlos zurückgebaut. Die Produktivinstanz war zu keinem Zeitpunkt beteiligt.

Der Teststand #

Vier Dienste: Nextcloud 34 (Apache-Variante), PostgreSQL 16, Redis 8 und ein Cron-Container. Host ist ein 6-Kern-x86-Desktop mit 35 W TDP, 16 GB RAM und NVMe-SSD unter Debian 13.6, Docker 29.7.2 mit Compose 5.5.0.

Testdaten waren durchgehend Zufallsdaten aus /dev/urandom — nicht komprimierbar, damit Größenangaben nicht durch Kompression geschönt werden.

Einschränkungen, damit die Zahlen richtig gelesen werden:

  • Die Transfermessungen liefen über Loopback gegen 127.0.0.1. Sie beschreiben Server- und Speicherleistung, nicht was ein Client im LAN erreicht.
  • Die Messung mit vielen kleinen Dateien lief sequentiell, ein eigener curl-Aufruf mit eigener Verbindung und eigener Anmeldung pro Datei. Ein echter Desktop-Client parallelisiert.
  • Die Images lagen bereits lokal vor. Die Startzeiten enthalten keinen Registry-Download.
  • Je ein Lauf pro Messwert, keine Mittelung über mehrere Durchgänge.

Was am meisten überrascht hat #

Die Installation ist trivial. docker compose up -d in 0,81 Sekunden, nach 7,95 Sekunden antwortet HTTP, die Installation selbst dauert 11,76 Sekunden. Zusammen keine 20 Sekunden.

Die Grundkonfiguration ist besser als ihr Ruf. Von vier Warnungen ließen sich drei mit je einem Befehl erledigen. Redis musste überhaupt nicht konfiguriert werden — das offizielle Image setzt memcache.distributed und memcache.locking allein aufgrund der Umgebungsvariable für den Redis-Host. Die einzige Warnung, die stehen blieb, war die zu fehlenden HTTP-Sicherheitsheadern: Die braucht HTTPS und damit einen Reverse Proxy.

Viele kleine Dateien sind die Schwäche. 1000 Dateien à 10 KB — zusammen 12 MB — brauchten 308 Sekunden. Dieselbe Instanz nimmt 1 GB am Stück in 7,3 Sekunden entgegen. Jede Datei ist eine eigene HTTP-Anfrage mit eigener Anmeldung, eigener Sperre und eigener Datenbanktransaktion. Wer Nextcloud an einem Quellcode-Baum misst, bekommt ein völlig anderes Bild als bei Videos.

Die Datenbank wächst kaum mit. Nach 1067 Dateien war sie von 15 auf 17 MB gewachsen. Zum Vergleich die Produktivinstanz: 7592 Dateien, 46 MB.

Der Restore-Test #

Der Teil, der sich am meisten gelohnt hat. Backup aus der Testinstanz, Restore in eine dritte, komplett leere Instanz. Er hat im dritten Anlauf funktioniert.

Anlauf 1 — HTTP 500. Der Nextcloud-Installer legt eine eigene Datenbankrolle an und trägt sie in die config.php ein. Rollen sind in PostgreSQL aber Cluster-Objekte und stecken nicht im pg_dump einer einzelnen Datenbank. Im frischen Zielcontainer existierte nur die aus der Compose-Datei erzeugte Rolle. Es fehlten 583 Bytes, die ein pg_dumpall --roles-only in 0,11 Sekunden mitsichert.

Anlauf 2 — permission denied for table oc_appconfig. Die Rollen waren jetzt da, aber nach dem Schema eingespielt. Der Dump enthält zwar ALTER TABLE … OWNER TO-Anweisungen, die liefen aber ins Leere, weil die Rolle zu diesem Zeitpunkt noch nicht existierte. Alle 131 Tabellen gehörten danach dem falschen Benutzer. Richtige Reihenfolge: erst Rollen, dann Datenbank mit korrekter Eigentümer-Rolle anlegen, dann den Dump einspielen.

Anlauf 3 — Wartungsmodus. Die wiederhergestellte Instanz meldete maintenance: true, WebDAV antwortete mit 503. Kein Fehler, sondern Logik: Das Backup war korrekt im Wartungsmodus erstellt worden, also stand der Zustand in der gesicherten config.php und kam mit zurück. occ maintenance:mode --off gehört in die Restore-Checkliste.

Verifiziert wurde über MD5-Prüfsummen zweier Dateien, vor dem Backup notiert und nach dem Restore erneut gebildet — einmal direkt und einmal nach einem Download über WebDAV.

Fazit #

Ein Backup, das nur pg_dump nextcloud macht, ist bei Nextcloud nicht wiederherstellbar — und man merkt es erst im Ernstfall. Das ist der Befund, der aus dieser Messreihe hängen bleibt, nicht die Durchsatzwerte.

Für die Hardwarefrage: Nextcloud 34 läuft mit unter 170 MB RAM im Leerlauf auf jedem Mini-PC. Die Plattenkosten liegen nicht bei den Nutzdaten, sondern beim Rahmen — rund 3 GB Images plus 935 MB Installation, davon 573 MB Apps, die man überwiegend nicht benutzt.

Wie das praktisch aufgesetzt wird, steht im Guide Nextcloud selbst hosten.

Zum Setup gehört