Wähle einen Artikel
Nextcloud per Docker auf VPS / vServer installieren
Nextcloud per Docker auf VPS / vServer installieren

VPS von dogado - gehostet in Deutschland

Behalte die Kontrolle über deinen vServer/VPS und steuere deine Online-Präsenz souverän. Profitiere von Hochgeschwindigkeits-NVME-SSDs, die bis zu 6-mal schneller sind als herkömmliche.

Server-Racks mit blauer Beleuchtung, Frontpaneele mit Laufwerkschächten, Lüftungsgitter und Netzwerkausrüstung.

0. Überblick

1. Nextcloud installieren

1.1 Einleitung

Nextcloud (https://nextcloud.com/) ist eine Open-Source-Software, welche es ermöglicht, eine private Cloud zu betreiben. Der Vorteil von Nextcloud ist, dass es genauso einfach zu bedienen ist wie beispielsweise Dropbox, aber alle Daten auf dem eigenen Server gespeichert werden. So weiß man jederzeit, wer Zugriff auf die eigenen Dateien hat und wo diese gespeichert sind.

Nextcloud wird auch in einer kostenpflichtigen Enterprise-Version angeboten, welche zusätzlichen Support bietet.

Nextcloud kann über einen internen Store beliebig erweitert werden. So ist es zum Beispiel möglich, OnlyOffice zu integrieren, Kalender oder Kontakte zu verwalten oder Videokonferenzen zu betreiben.

In dieser Anleitung werde ich euch zeigen, wie ihr Nextcloud in der kostenlosen Version per Docker schnell bereitstellen könnt.

1.2 Infos zu yml-Dateien

Bei yml-Dateien ist es sehr wichtig, dass die Zeilen alle richtig eingerückt sind. Die Zeilen MÜSSEN immer mit der Leertaste eingerückt werden. Es dürfen KEINE Tabs enthalten sein. Ihr könnt den nachfolgenden Code immer online „überprüfen“ lassen. Die meisten Fehler entstehen nämlich durch die falsche Formatierung. Ein Dienst zum Überprüfen ist zum Beispiel: https://codebeautify.org/yaml-validator

1.3 Vorbereitung

Diese Anleitung basiert auf dem aktuellen Betriebssystem Debian 13. Nextcloud werden wir unter Docker realisieren. Dies ermöglicht uns später sehr schnelle Updates und eine schnelle Installation.

Um Nextcloud neben anderen Diensten auf unserem Server betreiben zu können, nutzen wir hier den Reverse Proxy Traefik. Die Anleitung dazu findet ihr hier: Traefik Reverseproxy auf vServer installieren

Wir führen anschließend alle Befehle als Benutzer root aus. Um zum „root“ zu wechseln, gebt ihr Folgendes ein:

sudo -i

1.3.1 Verzeichnis erstellen

Wir erstellen uns ein neues Verzeichnis, in welchem wir später alle Daten von Nextcloud abspeichern. Dazu geben wir Folgendes in der Konsole ein:

mkdir -p /opt/containers/nextcloud/{database,app,daten}

Ihr könnt hier auch ein anderes Verzeichnis verwenden. Ihr müsst dann aber die gesamte Anleitung entsprechend anpassen.

1.3.2 docker-compose.yml erstellen

Nun können wir mit der eigentlichen „Installation“ von Nextcloud beginnen. Dazu öffnet ihr folgende Datei:

nano /opt/containers/nextcloud/docker-compose.yml

Nun kopiert ihr folgenden Code in die Datei. Dieser Code ist unser Bauplan für unsere Nextcloud-Container.

services:
  nextcloud-db:
    image: mariadb:11.4
    container_name: nextcloud-db
    restart: unless-stopped
    command:
      - --transaction-isolation=READ-COMMITTED
      - --innodb-log-file-size=256M
      - --slow-query-log=ON
      - --long-query-time=2
    environment:
      - TZ=Europe/Berlin
      - MARIADB_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
      - MARIADB_DATABASE=nextcloud
      - MARIADB_USER=nextcloud
      - MARIADB_PASSWORD=${MYSQL_PASSWORD}
      - MARIADB_AUTO_UPGRADE=1
    volumes:
      - ./database:/var/lib/mysql
    networks:
      - default

  nextcloud-redis:
    image: redis:8-alpine
    container_name: nextcloud-redis
    restart: unless-stopped
    command: redis-server --requirepass ${REDIS_PASSWORD}
    networks:
      - default

  nextcloud-app:
    image: nextcloud:35-apache
    container_name: nextcloud-app
    restart: unless-stopped
    depends_on:
      - nextcloud-db
      - nextcloud-redis
    environment:
      - TZ=Europe/Berlin
      - MYSQL_HOST=nextcloud-db
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
      - MYSQL_PASSWORD=${MYSQL_PASSWORD}
      - REDIS_HOST=nextcloud-redis
      - REDIS_HOST_PASSWORD=${REDIS_PASSWORD}
      - TRUSTED_PROXIES=${PROXY_SUBNET}
      - APACHE_DISABLE_REWRITE_IP=1
      - OVERWRITEPROTOCOL=https
      - OVERWRITECLIURL=https://${NEXTCLOUD_DOMAIN}
    volumes:
      - ./app:/var/www/html
      - ./daten:/var/www/html/data
    networks:
      - proxy
      - default
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.nextcloud.rule=Host(`${NEXTCLOUD_DOMAIN}`)"
      - "traefik.http.routers.nextcloud.entrypoints=websecure"
      - "traefik.http.routers.nextcloud.middlewares=nextcloud-headers,nextcloud-dav"
      - "traefik.http.services.nextcloud.loadbalancer.server.port=80"
      - "traefik.http.middlewares.nextcloud-headers.headers.stsSeconds=31536000"
      - "traefik.http.middlewares.nextcloud-headers.headers.stsIncludeSubdomains=true"
      - "traefik.http.middlewares.nextcloud-headers.headers.stsPreload=true"
      - "traefik.http.middlewares.nextcloud-dav.redirectregex.permanent=true"
      - "traefik.http.middlewares.nextcloud-dav.redirectregex.regex=^https://(.*)/.well-known/(?:card|cal)dav"
      - "traefik.http.middlewares.nextcloud-dav.redirectregex.replacement=https://$${1}/remote.php/dav/"

  nextcloud-cron:
    image: nextcloud:35-apache
    container_name: nextcloud-cron
    restart: unless-stopped
    entrypoint: /cron.sh
    depends_on:
      - nextcloud-db
      - nextcloud-redis
    environment:
      - TZ=Europe/Berlin
    volumes:
      - ./app:/var/www/html
      - ./daten:/var/www/html/data
    networks:
      - default

networks:
  proxy:
    external: true

1.3.3 Domain und Passwörter anpassen

Damit ihr die Anpassungen nicht von Hand vornehmen müsst, nutzen wir ein kleines Skript. Dies generiert uns sichere Kennwörter und ermöglicht die Festlegung der Nextcloud-Domain. Gebt dazu Folgendes ein:

nano /opt/containers/nextcloud/setup.sh

Inhalt:

#!/bin/bash

cd /opt/containers/nextcloud

read -rp "Domain für Nextcloud (z. B. nextcloud.euredomain.de): " DOMAIN

cat > .env <<EOF
NEXTCLOUD_DOMAIN=${DOMAIN}
MYSQL_ROOT_PASSWORD=$(openssl rand -hex 24)
MYSQL_PASSWORD=$(openssl rand -hex 24)
REDIS_PASSWORD=$(openssl rand -hex 24)
PROXY_SUBNET=$(docker network inspect proxy --format '{{(index .IPAM.Config 0).Subnet}}')
EOF

chmod 600 .env

echo
echo "Fertig. Nextcloud wird unter https://${DOMAIN} erreichbar sein."

Führt das Skript anschließend mit folgendem Befehl aus:

bash /opt/containers/nextcloud/setup.sh 

Ihr solltet Folgendes sehen:

Domain für Nextcloud (z. B. nextcloud.euredomain.de): nextcloud.testbereich.net
Fertig. Nextcloud wird unter https://nextcloud.testbereich.net erreichbar sein.

Nun überprüft ihr, ob die .env-Datei mit eurer Eingabe sowie den Kennwörtern korrekt erstellt wurde:

cat /opt/containers/nextcloud/.env

Dies sollte in etwa so aussehen:

NEXTCLOUD_DOMAIN=nextcloud.testbereich.net
MYSQL_ROOT_PASSWORD=d9aeaf186b48d30ee324e15d86c736b63aaa30b90a44642d
MYSQL_PASSWORD=3510058a4b6174a5674714359ca9b36f238a137eef4edf0c
REDIS_PASSWORD=605ed958354c40c05e869916488c9834179d058a12f2709d
PROXY_SUBNET=172.18.0.0/16

1.3.4 Docker-Compose-Datei auf Fehler überprüfen

Ihr könnt mit einem Befehl überprüfen, ob eure Docker-Compose-Datei korrekt formatiert ist. Dazu gebt ihr folgende Befehle ein:

cd /opt/containers/nextcloud
docker compose config --quiet && echo "Syntax OK"

Als Ausgabe solltet ihr „Syntax OK“ sehen.

2. Traefik anpassen

Traefik ist standardmäßig so konfiguriert, dass es Anfragen nach 60 Sekunden abbricht. Dies ist für Webseiten oder andere Dienste in der Regel kein Problem. Beim Upload von größeren Dateien kann dies aber schnell zum Problem werden, weil eure Uploads immer abbrechen. Um dies zu verhindern, erhöhen wir die Zeit auf 10 Minuten. Dazu öffnet ihr folgende Datei:

nano /opt/containers/traefik/traefik.yml

Hier fügt ihr folgende Zeilen im Abschnitt „entryPoints“ → „websecure“ hinzu:

    transport:
      respondingTimeouts:
        readTimeout: 600s

Bei mir sieht es dann so aus:

Vorher:
  websecure:
    address: ":443"
    http:
      tls:
        certResolver: letsencrypt

Nachher:
  websecure:
    address: ":443"
    transport:
      respondingTimeouts:
        readTimeout: 600s
    http:
      tls:
        certResolver: letsencrypt

Damit die Änderungen wirksam werden, startet ihr Traefik neu:

docker restart traefik

3. Nextcloud starten

Gebt nun Folgendes ein, um euren Nextcloud-Container zu starten:

docker compose -f /opt/containers/nextcloud/docker-compose.yml up -d

Geht nun mit eurem Webbrowser auf eure Webseite (z. B. nextcloud.euredomain.de). Dort sollte nach einigen Sekunden Folgendes zu sehen sein:

Blauer Bildschirm mit Logo aus drei weißen Kreisen; Meldung Autoconfig-Datei erkannt; Felder Name & Passwort; Installieren

Nun legt ihr einen Benutzernamen sowie ein Passwort für euren Administrator-Account fest. Anschließend klickt ihr auf „Installieren“.

Nun könnt ihr noch wählen, ob die „empfohlenen Apps“ installiert werden sollen. Ich klicke hier auf „Überspringen“. Die Apps könnt ihr später alle bei Bedarf von Hand installieren.

Blauer Bildschirm mit weißer Karte 'Empfohlene Apps' und Liste von Apps mit Symbolen und Checkboxen.

Nun solltet ihr Folgendes sehen:

Screenshot eines Nextcloud-Dialogs: blaue Kopfzeile mit Logo; Datenschutz, Produktivität, Interoperabilität, Gemeinschaft; Buttons unten.

Damit ist die Installation von Nextcloud abgeschlossen.

Blauer Farbverlauf; zentriertes Fenster mit 'Guten Morgen' und Panel 'Empfohlene Dateien' mit Dateiliste und Icons.

4. Optimierung

Klickt nun oben rechts auf den „Kreis“ und wählt „Administrationseinstellungen“ aus.

Blauer Kopfbereich; weißes Profil-Menü mit Administrations-einstellungen; orange Umrandungen um zwei UI-Elemente.

Hier klickt ihr nun auf „Übersicht“ im linken Bereich.

Fenster der Windows-Einstellungen: linke blaue Navigationsliste, rechte Spalte mit gelben Warnsymbolen.

Jetzt bekommt ihr einige Tipps, was ihr noch „verbessern“ könnt. Wir gehen hier nur auf die „orangefarbenen Warnungen“ ein. Das Blaue sind Tipps, die ihr bei Bedarf selbst umsetzen könnt, wie eine Zwei-Faktor-Authentifizierung.

4.1 Telefonregion festlegen

Hier wird festgelegt, welche Ländervorwahl standardmäßig von Nextcloud für Telefonnummern genutzt werden soll. Dies legen wir auf Deutschland fest. Dazu reicht es, folgenden Befehl auszuführen:

docker exec -u www-data nextcloud-app php occ config:system:set default_phone_region --value="DE"

4.2 Wartungsfenster festlegen

Hier wird festgelegt, wann Nextcloud Hintergrundjobs ausführt. Dies ist am besten nachts, wenn niemand arbeitet. Nextcloud nutzt hier die UTC-Zeit. Das heißt: Tragt ihr „1“ ein, beginnt das Wartungsfenster um 1 Uhr UTC, also um 2 Uhr (Winterzeit) bzw. 3 Uhr (Sommerzeit) deutscher Zeit.

docker exec -u www-data nextcloud-app php occ config:system:set maintenance_window_start --type=integer --value=1

4.3 MIME-Type-Migration

Diese Warnung behebt ihr mit folgendem Befehl:

docker exec -u www-data nextcloud-app php occ maintenance:repair --include-expensive

4.4 Hintergrundjobs auf Cron umstellen

In unserer Docker-Compose-Datei gibt es einen eigenen Container für die Hintergrundaufgaben. Damit Nextcloud ihn nutzt, gebt ihr folgenden Befehl ein:

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

4.5 Bekannter Fehler: Datenbankprüfung

In der aktuellen Nextcloud-Version befindet sich noch ein Fehler, wodurch ihr folgende Warnung seht:

Gelbes Warnsymbol. Warnungen in der Systemkonfiguration. Datenbankkonfiguration; 1 Datenbanküberprüfung ist fehlgeschlagen.

Der Fehler (https://github.com/nextcloud/serverinfo/issues/1156) ist bereits bekannt und wird in einer neueren Version behoben sein.

5. Nextcloud-Sicherheitsscanner

Wir können nun noch überprüfen, ob unsere Nextcloud-Installation „sicher“ ist. Dazu geht ihr auf folgende Webseite: https://scan.nextcloud.com

Webseite mit Überschrift: Check the security of your private Nextcloud server; Text, Social-Icons, URL-Eingabefeld und Scan.

Gebt hier nun eure URL ein. Bei mir ist dies „nextcloud.testbereich.net“.

Nach kurzer Zeit erhaltet ihr dann euer Ergebnis. Bei mir sieht es so aus:

Screenshot einer Sicherheits-Check-Webseite; links Rating A+ grün, rechts URL und Nextcloud-Version mit Häkchen.

6. Nextcloud-Apps installieren

Hier zeige ich euch, wie ihr schnell weitere Apps / Erweiterungen in Nextcloud installieren könnt. Dazu klickt ihr wieder oben rechts auf den „Kreis“ und wählt „Apps“ aus.

UI-Menü mit Profil, Status setzen, Aussehen/Barrierefreiheit, persönliche und Administrations-Einstellungen, Apps, Konten.

Nun könnt ihr euch aber auch verschiedene Bereiche auswählen. Hier seht ihr dann immer ein Bild und einen kurzen Text zu der Erweiterung. Die Installation gelingt mit einem Klick auf „Herunterladen und aktivieren“.

Screenshot einer Nextcloud-Oberfläche mit blauen Bannern, Logo-Bereich und linkem Seitenmenü.

Bei uns findet ihr auch noch passende Erweiterungen für Nextcloud:

7. Nextcloud-Backup erstellen und wiederherstellen

7.1 Backup erstellen

Die einfachste Form des Backups ist, den gesamten Nextcloud-Ordner zu sichern. Darin enthalten sind alle eure Daten und Einstellungen. Damit ihr dies nicht von Hand machen müsst, nutzen wir ein kleines Skript. Dazu erstellt ihr folgende Datei:

nano /opt/containers/nextcloud/backup.sh

Inhalt:

#!/bin/bash

NEXTCLOUD=/opt/containers/nextcloud           # Nextcloud-Verzeichnis
LOKAL=/opt/containers/nextcloud-backup/ # Hier entsteht das Archiv

DATUM=$(date +%F_%H-%M)
ARCHIV=nextcloud-${DATUM}.tar.gz

cd "$NEXTCLOUD"
mkdir -p "$LOKAL"

echo "Wartungsmodus einschalten ..."
docker exec -u www-data nextcloud-app php occ maintenance:mode --on

echo "Container stoppen ..."
docker compose stop

echo "Archiv erstellen ..."
tar -czf "$LOKAL/$ARCHIV" -C "$(dirname "$NEXTCLOUD")" "$(basename "$NEXTCLOUD")"
chmod 600 "$LOKAL/$ARCHIV"

echo "Container starten ..."
docker compose start
sleep 20
docker exec -u www-data nextcloud-app php occ maintenance:mode --off

echo "Lokale Archive älter als 7 Tage löschen ..."
find "$LOKAL" -name 'nextcloud-*.tar.gz' -mtime +7 -delete

echo "Fertig"

Nun legen wir uns noch einen Ordner für unsere Backups an. Dieser befindet sich außerhalb unseres eigentlichen Nextcloud-Ordners, da wir sonst die Backups jedes Mal mitsichern würden.

mkdir -p /opt/containers/nextcloud-backup

Das Skript wird dort Backups anlegen und alle Backups löschen, die älter als 7 Tage sind. Dieses Verhalten könnt ihr in folgender Zeile anpassen:

find "$LOKAL" -name 'nextcloud-*.tar.gz' -mtime +7 -delete

Einfach die „7“ durch eine andere Zahl ersetzen oder die Zeile komplett löschen, wenn ihr die Backups dauerhaft speichern wollt.

Das Skript müsst ihr nun noch ausführbar machen:

chmod +x /opt/containers/nextcloud/backup.sh

Anschließend könnt ihr es starten:

/opt/containers/nextcloud/backup.sh

Während des Backups wird eure Nextcloud-Instanz in einen Wartungsmodus versetzt. Dies verhindert Änderungen während des Backups. In dieser Zeit ist eure Instanz aber nicht nutzbar. Die Ausgabe sieht so aus:

root@testbereich:/opt/containers/nextcloud# /opt/containers/nextcloud/backup.sh
Wartungsmodus einschalten ...
Maintenance mode enabled
Container stoppen ...
[+] stop 4/4
 ✔ Container nextcloud-cron  Stopped                                                                                                                                               10.2s
 ✔ Container nextcloud-app   Stopped                                                                                                                                                1.5s
 ✔ Container nextcloud-redis Stopped                                                                                                                                                0.3s
 ✔ Container nextcloud-db    Stopped                                                                                                                                                0.4s
Archiv erstellen ...
Container starten ...
[+] start 4/4
 ✔ Container nextcloud-db    Started                                                                                                                                                0.3s
 ✔ Container nextcloud-redis Started                                                                                                                                                0.5s
 ✔ Container nextcloud-cron  Started                                                                                                                                                0.2s
 ✔ Container nextcloud-app   Started                                                                                                                                                0.4s
Maintenance mode disabled
Lokale Archive älter als 7 Tage löschen ...
Fertig

Nach dem Backup könnt ihr euch den Ordner anzeigen lassen:

ls -l /opt/containers/nextcloud-backup/

So sollte es nach dem ersten Backup aussehen:

root@testbereich:/opt/containers/nextcloud# ls -l /opt/containers/nextcloud-backup/
total 345264
-rw------- 1 root root 353543947 Oct 15 09:30 nextcloud-2026-10-15_09-29.tar.gz

Es empfiehlt sich, das Backup noch an einen anderen Ort außerhalb eures Servers zu sichern.

7.2 Backup wiederherstellen

Ein vorhandenes Backup könnt ihr leicht innerhalb weniger Minuten wiederherstellen. Zuerst beendet ihr die aktuelle Nextcloud-Instanz:

cd /opt/containers/nextcloud
docker compose down

Anschließend verschiebt oder löscht ihr die aktuelle Instanz:

Verschieben
mv /opt/containers/nextcloud /opt/containers/nextcloud-alt

oder

Löschen
rm -R /opt/containers/nextcloud

Verschieben kann sinnvoll sein, da ihr so im Notfall immer noch auf die bisherige Instanz zugreifen könnt.

Lasst euch nun den Namen eures Backups anzeigen:

ls -l /opt/containers/nextcloud-backup/

Bei mir heißt die Datei: „nextcloud-2026-10-15_09-29.tar.gz“.

root@testbereich:/opt/containers/nextcloud# ls -l /opt/containers/nextcloud-backup/
total 345264
-rw------- 1 root root 353543947 Oct 15 09:30 nextcloud-2026-10-15_09-29.tar.gz

Jetzt stelle ich dieses Backup wieder her. Ihr müsst den Dateinamen bei euch anpassen.

tar -xzpf /opt/containers/nextcloud-backup/nextcloud-2026-10-15_09-29.tar.gz --numeric-owner -C /opt/containers

Jetzt könnt ihr in das wiederhergestellte Verzeichnis wechseln und Nextcloud starten. Anschließend beendet ihr noch den Wartungsmodus:

cd /opt/containers/nextcloud
docker compose up -d
sleep 20
docker exec -u www-data nextcloud-app php occ maintenance:mode --off

Jetzt sollte eure Nextcloud-Instanz wieder vollständig nutzbar sein.

8. Nextcloud aktualisieren

Grundsätzlich solltet ihr vor jedem Update ein Backup machen.

8.1 Updates innerhalb derselben Hauptversion

Diese Anleitung ist für Nextcloud-Version 35 geschrieben. Dies haben wir in Schritt 1.3.2 festgelegt:

  nextcloud-app:
    image: nextcloud:35-apache

  nextcloud-cron:
    image: nextcloud:35-apache

Wenn ihr nun Updates innerhalb der Version 35 machen wollt, dann genügen folgende Befehle:

cd /opt/containers/nextcloud
docker compose down
docker compose pull
docker compose up -d

Der erste Start nach dem Update dauert etwas länger, da einige Daten aktualisiert werden. Den Status könnt ihr mit folgendem Befehl überwachen:

docker compose logs -f nextcloud-app

8.2 Upgrade auf eine neue Version

Nextcloud hat hier die Besonderheit, dass ihr immer nur von einer Hauptversion auf die nächsthöhere Version springen könnt. Das heißt: von Nextcloud 35 auf Nextcloud 36. Ein direkter Sprung von Nextcloud 35 auf zum Beispiel eine zukünftige Version 37 ist nicht möglich. Solltet ihr dies versuchen, so wird eure Nextcloud-Instanz nicht mehr starten.

Die aktuelle Version könnt ihr bei Docker Hub einsehen:

Screenshot einer Docker Hub-Seite für Nextcloud mit Nextcloud-Logo, Überschrift, Navigationsleiste und rechter Seitenleiste.

Hier seht ihr die aktuell verfügbaren Versionen:

Webseite mit Liste von Tags; Aufzählungspunkte zeigen Versionsnummern mit Suffixen wie -apache, -fpm, -alpine.

Wenn ihr auf eine zukünftige Version 36 wechseln wollt, so öffnet ihr folgende Datei:

nano /opt/containers/nextcloud/docker-compose.yml

Ändert hier an zwei Stellen den Wert. Wichtig ist, dass beide Container das identische Image benötigen.

Vorher:
  nextcloud-app:
    image: nextcloud:35-apache
…
  nextcloud-cron:
    image: nextcloud:35-apache


Nachher:
  nextcloud-app:
    image: nextcloud:36-apache
…
  nextcloud-cron:
    image: nextcloud:36-apache

Anschließend startet ihr Nextcloud erneut:

cd /opt/containers/nextcloud
docker compose down
docker compose pull
docker compose up -d
Nächster Artikel
Nextcloud mit Elasticsearch installieren
Weitere passende Themen
Finde den passenden vServer zu deinem Projekt