Nextcloud unter Docker: Ein praxiserprobter Weg zur eigenen Cloud – und seine Tücken
Nextcloud ist in vielen Unternehmen die erste Wahl, wenn es um datenschutzkonforme Zusammenarbeit und Dateisynchronisation geht. Open Source, erweiterbar, selbst gehostet – die Prinzipien überzeugen. Doch die eigentliche Hürde liegt nicht in der Software selbst, sondern in ihrem Betrieb. Wer einmal versucht hat, eine Nextcloud-Instanz per Hand auf einem Server aufzusetzen, kennt das Gefühl: Abhängigkeiten, PHP-Versionen, Datenbankkonfiguration, Redis, Cronjobs – das wird schnell zum Flickenteppich. Docker verspricht hier Abhilfe. Aber schafft die Containerisierung wirklich einen stabilen, wartbaren Betrieb? Oder tauscht man ein Problem gegen ein anderes? Wir haben uns die gängigen Praktiken rund um Nextcloud mit Docker genau angesehen.
Warum überhaupt Docker für Nextcloud?
Die Vorteile liegen auf der Hand: Ein Docker-Container kapselt die Anwendung samt aller Abhängigkeiten. Kein manuelles Zusammenstellen einer PHP-Umgebung, kein Kampf mit entlegenen Bibliotheken. Das Nextcloud-Image der offiziellen Maintainer wird regelmäßig aktualisiert, enthält die richtige PHP-Version und alle benötigten Erweiterungen. Zudem lassen sich weitere Dienste wie Datenbank (PostgreSQL oder MariaDB), Redis für Speicherung von Sessions und Dateilocks, oder ein eigener Caching-Server als separate Container starten – alles orchestriert mit Docker Compose. Das macht den ersten Start unheimlich einfach. Ein Befehl, und die Cloud läuft.
Doch mit der Einfachheit kommen neue Aufgaben. Docker ist kein Allheilmittel. Die Netzwerkkonfiguration, persistente Datenhaltung und insbesondere die Performance von Dateioperationen fordern den Administrator heraus. Viele Nextcloud-Docker-Installationen laufen nach dem Prinzip „ein Container für alles“ – das wird schnell zur Ressourcenfalle. Wer Nextcloud ernsthaft betreibt, sollte sich mit der Architektur befassen, bevor er das erste docker-compose up -d absetzt.
Das offizielle Image und seine Alternativen
Im Docker Hub findet man mehrere Nextcloud-Images. Das offizielle nextcloud Image (betreut durch die Nextcloud GmbH) ist der Standard. Es basiert auf Alpine Linux und liefert eine PHP-FPM-Umgebung. Daneben gibt es Community-Images wie linuxserver/nextcloud, das oft etwas mehr Komfort (z. B. integrierter Cron) bietet, aber nicht immer die neuesten Nextcloud-Versionen zeitnah ausrollt. Ich rate zur offiziellen Variante – allein schon wegen der Updates. Ein interessanter Aspekt ist die Variante mit Apache (der Standard) oder Nginx. Das offizielle Image setzt auf Apache, was für kleine Installationen völlig ausreicht. Für größere Umgebungen oder wenn man bereits Nginx als Reverse Proxy einsetzt, kann das Image nextcloud:apache oder nextcloud:fpm gewählt werden – Letzteres benötigt dann einen separaten Webserver im Container oder einen vorgeschalteten Proxy. Nicht zuletzt zeigt sich hier, dass Docker zwar die Komplexität reduziert, aber nicht eliminiert – man muss sich trotzdem mit Webservern auskennen.
Das Setup: Container, Volumes und das Netzwerk
Eine typische Docker-Compose-Datei für Nextcloud sieht ungefähr so aus:
version: '3.8'
services:
db:
image: postgres:13
container_name: nextcloud-db
restart: always
volumes:
- db_data:/var/lib/postgresql/data
environment:
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=geheim
redis:
image: redis:alpine
container_name: nextcloud-redis
restart: always
app:
image: nextcloud:latest
container_name: nextcloud-app
restart: always
ports:
- 8080:80
volumes:
- nextcloud_data:/var/www/html
- ./config:/var/www/html/config
environment:
- POSTGRES_HOST=db
- POSTGRES_DB=nextcloud
- POSTGRES_USER=nextcloud
- POSTGRES_PASSWORD=geheim
- REDIS_HOST=redis
depends_on:
- db
- redis
volumes:
db_data:
nextcloud_data:
Dieses Setup ist ein guter Startpunkt. Aber es gibt einige Fallstricke: Der Ordner nextcloud_data enthält nicht nur die Benutzerdaten, sondern auch den gesamten Anwendungscode. Beim Update des Containers wird das /var/www/html Volume mit dem neuen Code überschrieben? Ja, aber nur, wenn man die Image-Version ändert und die Daten im Volume nicht von Hand manipuliert. In der Praxis führt das oft zu inkonsistenten Zuständen – weil im Volume altes Konfigurationsmaterial liegt. Daher ist es besser, die eigentlichen Daten (Uploads, Apps, Konfiguration) auf getrennte Volumes zu legen. Das offizielle Docker-Image unterstützt das via NEXTCLOUD_DATA_DIR und NEXTCLOUD_CONFIG_DIR. Eine durchdachte Struktur spart später viel Ärger.
Persistenz ist nicht gleich Persistenz: Daten speichern und sichern
Ein oft übersehener Punkt: Die Container sind flüchtig, aber die Daten sollen bleiben. Volumes sind der richtige Weg – doch viele setzen auf bind mounts von Host-Verzeichnissen. Das ist prinzipiell in Ordnung, erfordert aber die richtigen Berechtigungen. Der Nextcloud-Container läuft standardmäßig als www-data (UID 33). Wenn man also ein Verzeichnis vom Host mountet, müssen die Dateien dem Besitzer 33:33 gehören. Das wird gerne vergessen, und dann funktionieren Uploads nicht – oder die Datenbank-Abfragen laufen ins Leere. Ich empfehle, für Daten und Konfiguration eigene Volumes zu nutzen, diese aber regelmäßig auf den Host zu sichern (z. B. mit docker run --rm -v nextcloud_data:/source -v /backup:/dest alpine cp -a /source /dest). Der Umgang mit Backups in der Container-Welt ist anders als bei klassischen Setups – aber nicht komplizierter, wenn man sich einmal damit angefreundet hat.
Der Reverse Proxy: Nginx, Traefik oder Apache?
Nextcloud direkt auf Port 80 oder 443 laufen zu lassen ist selten die beste Idee. In der Regel hat man bereits einen Webserver oder Load Balancer im Einsatz, der SSL-Terminierung und Routing übernimmt. Docker erlaubt es, Nextcloud hinter einem Reverse Proxy zu betreiben – das ist meist sauberer, als den Container selbst SSL verwalten zu lassen. Besonders beliebt ist Traefik, das automatisch mit Docker Labels arbeitet und Let’s-Encrypt-Zertifikate ausstellt. Aber auch Nginx oder Caddy sind tolle Alternativen. Ein wichtiger Aspekt ist die korrekte Weiterleitung von Headern: Nextcloud benötigt die Trusted Proxies-Einstellung, damit es die echte Client-IP erkennt (sonst sehen alle Anfragen wie vom Docker-Netzwerk-Gateway aus). Und natürlich muss der Proxy die OverwriteHost– und OverwriteProtocol-Parameter setzen. Ohne diese Konfiguration gibt es Fehler beim Login, bei der Kalender-Synchronisation und in der Nextcloud-App. Das ist ein häufiges Problem – und wird leider in vielen Blog-Artikeln nur am Rande erwähnt.
Ein praxisnahes Beispiel: Wenn Sie Traefik nutzen, können Sie im Docker-Compose einfach ein Label hinzufügen:
labels:
- "traefik.enable=true"
- "traefik.http.routers.nextcloud.rule=Host(`cloud.meinefirma.de`)"
- "traefik.http.services.nextcloud.loadbalancer.server.port=80"
Zusätzlich muss dann in der config.php der nächsten Zeile stehen:
'trusted_proxies' => ['10.0.0.0/8', '172.16.0.0/12', '192.168.0.0/16'],
'overwriteprotocol' => 'https',
'overwritehost' => 'cloud.meinefirma.de',
Diese Kombination wirkt häufig – aber eben auch nicht immer, je nach Netzwerkkonfiguration. Wir haben festgestellt, dass die Reihenfolge der Arrays wichtig ist und dass Docker-Netzwerke mit mehreren Overlays spezielle Beachtung brauchen. Das ist kein Hexenwerk, erfordert aber etwas Systemverständnis.
Datenbank: MariaDB oder PostgreSQL?
Nextcloud unterstützt beide. In der Praxis hat PostgreSQL bei großen Instanzen mit vielen Dateien die Nase vorn, vor allem bei dateibasierten Sperren. MariaDB (bzw. MySQL) arbeitet mit Nextcloud ebenfalls gut, aber bei Lastspitzen kann es zu Deadlocks kommen. Viele Docker-Beispiele zeigen MariaDB, weil das Setup in den Anfangszeiten von Nextcloud die Standardwahl war. Ich persönlich bevorzuge PostgreSQL, weil es sich besser mit Redis kombinieren lässt und die Transaktionslogik robuster ist. Aber das ist eher Geschmackssache. Wichtig: Beide Datenbanken sollten mit einem separaten Docker-Volume betrieben werden, und die Konfiguration sollte Transaktionsisolation und Zeichensätze umfassen (utf8mb4 bei MariaDB, UTF8 bei PostgreSQL).
Caching, Cron und Hintergrundjobs
Eine Nextcloud ohne Redis ist wie ein Auto ohne Öl: es läuft, aber nicht lang. Redis übernimmt das Caching von Dateilisten, Sperren und die Sessionverwaltung. Wer das weglässt, wird bei mehr als ein paar Benutzern quälend langsame Ladezeiten erleben. Docker macht die Integration einfach: Ein Redis-Container, vernetzt mit dem Nextcloud-Containe, und REDIS_HOST gesetzt. Das war’s. Aber: Redis sollte nicht ohne Passwort betrieben werden – auch nicht im Docker-Netzwerk, wenn andere Container potenziell darauf zugreifen könnten. Das wird oft vergessen.
Cron: Nextcloud benötigt regelmäßige Hintergrundaufgaben – das Löschen von alten Dateien, das Ausführen von App-Jobs, Update-Checks. Der Cron-Job sollte nicht im Container selbst laufen (der ist für den Webzugriff optimiert), sondern entweder als separater Cron-Container oder vom Host aus per docker exec ausgelöst werden. Das offizielle Image bietet hierfür einen Entrypoint an, der einen internen Cron startet, wenn man die Umgebungsvariable CRON_PERIOD setzt. Das ist bequem, aber ich rate zu einem dedizierten Cron-Container, der nur den cron.php-Befehl ausführt – das trennt die Verantwortlichkeiten sauberer. Viele Admins in Foren bestätigen: Wer den internen Cron nutzt, stößt früher oder später auf Performance-Probleme, weil der PHP-Prozess ständig neu gestartet wird.
Performance-Tuning unter Docker
Nextcloud unter Docker kann durchaus flott sein – wenn man ein paar Stellschrauben dreht. Das Dateisystem ist oft der Flaschenhals. Container, die auf OverlayFS laufen, haben besonders bei vielen kleinen Dateien (wie sie Nextcloud typischerweise erzeugt) mehr Overhead als native Dateisysteme. Abhilfe schafft die Umstellung auf bind mounts für das Datenverzeichnis, also direkte Host-Verzeichnisse. Das Opfer: Man muss sich um Berechtigungen kümmern. Der Gewinn: Die I/O-Performance ist deutlich besser – teilweise 30–50 Prozent schneller bei der Dateisynchronisation. Wer mit großen Dateien arbeitet, wird es kaum bemerken. Aber bei vielen kleinen Dateien (z. B. Office-Dokumenten, Bildern) ist der Unterschied spürbar.
Ein weiterer Punkt: PHP-FPM. Standardmäßig läuft ein PHP-Prozess pro Request. In einem Container kann das zu Speicherproblemen führen, wenn viele gleichzeitige Uploads stattfinden. Hier hilft die Konfiguration von pm.max_children und pm.max_requests – entweder über eine eigene php.ini oder über Docker-Umgebungsvariablen. Viele Nextcloud-Images bieten aber keine direkte Schnittstelle dafür. Man muss dann das Volumen des Containers erweitern oder ein benutzerdefiniertes Image bauen. Nicht schön, aber machbar.
Sicherheit: Updates, Netzwerkisolierung und Authentifizierung
Nextcloud erhält regelmäßig Sicherheitsupdates – oft mehrmals im Monat. Im Docker-Betrieb bedeutet das: Image pullen, Container neu starten. Das klingt einfach, aber der Teufel steckt in den Volumes. Wenn man den Container ohne Mount-Pfade startet, installiert der Entrypoint die neueste Version und aktualisiert die Datenbank. Doch in manchen Versionen traten Probleme auf, wenn das Volume bereits ältere Konfigurationsdateien enthielt. Die Nextcloud-Entwickler empfehlen, bei Major-Upgrades das Volume zu leeren und die Datenbank manuell zu migrieren – ein Schritt, der in der Docker-Welt oft unangenehm ist. Gerade deshalb sollte man Updates in einer Staging-Umgebung testen, bevor man live geht.
Netzwerkisolierung: Container sollten nicht unnötig Ports nach außen öffnen. Die Datenbank und Redis brauchen keine öffentlichen Ports – sie kommunizieren nur intern. Das ist mit Docker Compose standardmäßig der Fall. Trotzdem sieht man immer wieder Konfigurationen, in denen der Datenbank-Container seinen Port 5432 an den Host bindet. Das ist ein unnötiges Sicherheitsrisiko. Auch Nextcloud selbst sollte nur hinter einem Proxy erreichbar sein – ohne direkten Port-Zugriff von außen.
Authentifizierung: Nextcloud bietet LDAP/Active-Directory-Integration, Zwei-Faktor-Authentifizierung und App-Passwörter. All das funktioniert in Docker problemlos. Die LDAP-Erweiterung muss jedoch im Container installiert sein (über Apps oder vorinstalliert). Wer viele Benutzer verwaltet, sollte auf jeden Fall Redis für Sessions einsetzen – sonst ist die Anmeldung bei vielen parallelen Logins ein Flaschenhals.
Monitoring und Logging – den Überblick behalten
Ein weiterer Aspekt, der bei Docker-Installationen oft stiefmütterlich behandelt wird: Wie überwache ich den Zustand von Nextcloud? Die Container-Logs (docker logs nextcloud-app) sind der erste Anlaufpunkt. Aber bei vielen Benutzern wird es schnell unübersichtlich. Besser ist es, die Logs an eine zentrale Sammelstelle zu schicken – etwa über den Docker-Treiber gelf oder direkt per Syslog. Oder man nutzt eine Monitoring-Lösung wie Prometheus (mit Nextcloud-Exporter) oder Checkmk. Letzteres ist in der deutschen Verwaltung weit verbreitet. Ein eigener Health-Check-Endpunkt existiert in Nextcloud unter /status.php. Der kann von Docker selbst für healthcheck-Direktiven genutzt werden – etwa:
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/status.php"]
interval: 30s
timeout: 10s
retries: 3
Das ist eine einfache, aber effektive Methode, um zu erkennen, when der Container nicht mehr reagiert.
Ein kleiner Tipp: Die data/nextcloud.log Datei wird standardmäßig im Daten-Volume abgelegt. Wenn man sie nicht rotiert, kann sie mehrere Gigabyte groß werden – gerade bei vielen Sync-Fehlern. Also entweder Log-Rotation über den Host einrichten oder die Logging-Stufe in der config.php auf warning setzen.
Backup – die ultimative Absicherung
Docker erleichtert das Backup nicht automatisch. Man muss die Volumes und die Datenbank separat sichern. Eine bewährte Methode: vor dem Backup den Container anhalten (docker-compose down) oder zumindest die Schreibrechte entziehen. Dann die Volumes mit tar packen und die Datenbank via pg_dump (oder mysqldump) exportieren. Es gibt auch Tools wie docker-volume-backup oder docker-backup für automatisierte Snapshots. Aber Vorsicht: Ein Docker-Volume ist kein Snapshot-fähiges Dateisystem – Konsistenz ist nur gegeben, wenn während des Backups keine Schreiboperationen laufen. Also entweder Service stoppen oder ein DB-Dump aus einem laufenden Container mit --lock-tables (MariaDB) oder --no-islive (PostgreSQL) erzeugen.
Betrieb in der Praxis: Skalierung und Updates
Nextcloud in Docker kann man horizontal skalieren – mehrere App-Container hinter einem Load Balancer, Redis und Datenbank als geteilte Dienste. Das ist zwar kein Standard, wird aber in größeren Umgebungen praktiziert. Docker Swarm oder Kubernetes kommen dann ins Spiel. Die offiziellen Images unterstützen das, aber die Konfiguration wird aufwändiger: Das Daten-Volume muss dann von allen Containern gemeinsam genutzt werden können (z. B. via NFS oder S3). Nextcloud selbst kann mit files_external externe Speicher anbinden, aber die Applikationsdaten (data-Verzeichnis) sollten auf einem gemeinsam genutzten Speicher liegen. Das ist mit Docker und NFS möglich, aber nicht trivial – vor allem die Dateisperren (file locking) setzen ein verteiltes Locking-System voraus, das Nextcloud standardmäßig nicht mitbringt. Hier kommt Redis als Locking-Backend ins Spiel. Es funktioniert, aber jeder zusätzliche Container erhöht die Latenz.
Updates dagegen sind bei Docker relativ einfach: docker-compose pull, docker-compose up -d. Allerdings sollte man zwischen Major-Versionen (z. B. 26 -> 27) die Release-Notes lesen – es kann Änderungen an der Datenbank geben, die einen manuellen Eingriff erfordern. Docker führt keine Datenbankmigration aus; Nextcloud macht das beim ersten Start des neuen Containers. Solange der entsprechende Entrypoint funktioniert, ist das automatisch. Aber wenn der Container abstürzt, weil ein DB-Index bereits existiert, steht man dumm da. Auch hier gilt: Vor dem Update ein Backup machen – und besser noch, die neue Version in einem separaten Netzwerk testen.
Kleine Fehler und wie man sie umgeht
In der Praxis begegnen einem immer wieder die gleichen Probleme: Der Datei-Upload bricht mit 503 ab – meist fehlt der PHP-Speicher oder die upload_max_filesize ist zu niedrig gesetzt. Im Docker-Image kann man diese Werte über die .htaccess oder die .user.ini im Volume anpassen. Oder man setzt sie über Docker-Umgebungsvariablen? Die offiziellen Images unterstützen das leider nicht direkt. Man muss also die Konfigurationsdateien manuell editieren. Das ist ein Punkt, an dem Docker sein Versprechen der Einfachheit ein Stück weit einbüßt.
Ein anderes Ärgernis: Die App-Installation schlägt fehl, weil die PHP-Erweiterung imagick fehlt. Standardmäßig ist sie im Image enthalten? In manchen Versionen nicht. Ein kurzer docker exec -it nextcloud-app php -m | grep imagick gibt Aufschluss. Falls nicht, muss man ein eigenes Image bauen oder auf die Community-Version ausweichen.
Und dann ist da noch die Datenbank-Kodierung. Nextcloud erwartet UTF-8 mit utf8_unicode_ci (MariaDB) oder UTF8 (PostgreSQL). Wenn die Datenbank im Container mit einem anderen Charset initialisiert wurde, gibt es später kryptische Fehler bei der Suche. Das vermeidet man, indem man die Datenbank-Container mit den richtigen Umgebungsvariablen konfiguriert: MYSQL_CHARSET=utf8, MYSQL_COLLATION=utf8_unicode_ci. Bei PostgreSQL reicht die Standardkonfiguration meist aus.
Lohnt sich der Aufwand? Ein persönliches Fazit
Ich habe Nextcloud in den letzten Jahren auf verschiedene Arten betrieben: klassisch mit LAMP-Stack auf einem dedizierten Server, als Snap-Paket (eine Katastrophe, wenn man bestimmte Erweiterungen braucht), und schließlich mit Docker. Die Docker-Variante ist meiner Erfahrung nach die flexibelste – vorausgesetzt, man investiert zu Beginn etwas Zeit in die richtige Konfiguration. Die Containerisierung bringt eine Klarheit in die Abhängigkeiten, die man beim manuellen Setup nicht hat. Updates sind einfacher, die Trennung von Diensten sauberer. Allerdings darf man nicht blind auf Standardkonfigurationen vertrauen. Wer die Nextcloud einfach nur schnell mal testen will, für den reicht ein docker run -p 8080:80 nextcloud. Wer aber einen produktiven Betrieb plant, muss sich mit den Details auseinandersetzen – mit Dateisystem-Performance, Netzwerk-Props, Backup-Strategien und Monitoring.
Die Community ist groß, hilfsbereit, aber auch zersplittert. Viele Lösungen in Foren sind veraltet oder beziehen sich auf inkompatible Image-Varianten. Am besten liest man die offizielle Docker-Dokumentation von Nextcloud zusammen mit den Docker-eigenen Best Practices. Und dann probiert man es einfach aus – am besten in einer VM, bevor es ernst wird.
Nextcloud mit Docker ist kein Selbstläufer, aber eine sehr gute Basis. Wie bei vielen Infrastruktur-Entscheidungen gilt auch hier: Das Werkzeug ist so gut wie der, der es einsetzt.