Nextcloud ist eine Open-Source-Lösung für eigene Datei-Synchronisation, Kalender und Kollaboration — voll selbst gehostet. Diese Anleitung führt durch eine Nextcloud-AIO-Installation (All-in-One) auf einem Ubuntu-Server mit Docker, einem Nginx-Reverse-Proxy davor und einem Let's-Encrypt-Zertifikat für den TLS-terminierten Zugriff über deine eigene Domain. AIO bündelt Nextcloud, Datenbank, Redis, Talk, Collabora und Backup in einem geprüften Setup — deutlich weniger Wartung als manuelle PHP-Installation.

Einführung und Voraussetzungen

Wir installieren Nextcloud All-in-One nach der offiziellen Anleitung. Vorteil gegenüber einer manuellen Nextcloud-Installation: Datenbank, Redis, Cron, Talk, Collabora und der Backup-Mechanismus laufen vorkonfiguriert in eigenen Containern, gesteuert durch einen Master-Container.

Voraussetzungen

  • Server: Ubuntu Server (22.04 oder 24.04) mit SSH-Zugang und sudo-Rechten.
  • Domain: Eine Domain oder Subdomain, deren A-Record auf die öffentliche IP deines Servers zeigt — im Beispiel cloud.mydomain.com.
  • Nginx: Auf dem Host installiert und lauffähig — er übernimmt TLS-Terminierung und Reverse Proxy zum AIO-Container.
  • Ports offen: Eingehend 80/tcp (ACME), 443/tcp (HTTPS) sowie zunächst 8080/tcp für die initiale AIO-Web-UI. Optional 3478/tcp+udp für Talk (TURN).
  • Hardware: Mindestens 2 vCPU, 4 GB RAM, 40 GB Disk. Mehr empfohlen, wenn Collabora oder Talk genutzt werden.

PHP, MySQL, Redis selbst installieren? Nein. AIO bringt alles in Containern mit. Auf dem Host braucht es kein PHP, keine Datenbank und kein Redis — nur Docker, Nginx und Certbot.

Installation — Docker

Wir installieren Docker über das offizielle Convenience-Skript:

Bash
curl -fsSL https://get.docker.com | sudo sh

Danach ist der Docker-Daemon installiert und gestartet. Test mit einem Hello-World-Image:

Bash
sudo docker run hello-world

Eigenen Benutzer in die docker-Gruppe aufnehmen (optional)

Wenn du Docker-Befehle ohne sudo ausführen möchtest, nimmst du deinen Benutzer in die Gruppe docker auf:

Bash
sudo usermod -aG docker $USER
newgrp docker

Anschließend ist docker run hello-world ohne sudo möglich. Die Gruppenmitgliedschaft greift für neue Login-Sessions vollständig — nach dem nächsten SSH-Reconnect ist sie überall aktiv.

Warum nicht rootless? Es gibt mit dockerd-rootless-setuptool.sh einen Rootless-Modus für Docker. Für Nextcloud AIO ist er ungeeignet, weil der Master-Container den Docker-Socket einbindet und mit Root-Privilegien des Daemons arbeitet, um die anderen Container zu erzeugen. Rootless würde die Setup-Schritte deutlich komplizieren und wird vom AIO-Projekt nicht unterstützt.

DNS und Minimal-Vhost für Certbot

Bevor wir das Zertifikat ausstellen, muss die Domain auf den Server zeigen. Setze einen A-Record (und ggf. AAAA für IPv6):

TypNameValue/ZielTTL
Acloud203.0.113.423600
AAAAcloud2001:db8::423600

Hinweis: 203.0.113.42 und 2001:db8::42 sind Dokumentations-IPs (RFC 5737 / RFC 3849). Ersetze sie durch die tatsächliche IP deines Servers.

Anschließend legen wir den Minimal-Vhost an, damit Certbot die ACME-Challenge auf Port 80 ausliefern kann:

Bash
sudo nano /etc/nginx/sites-available/cloud.mydomain.com
Nginx /etc/nginx/sites-available/cloud.mydomain.com
server {
    listen 80;
    listen [::]:80;
    server_name cloud.mydomain.com;
    root /var/www/html;
}

Symlink aktivieren, prüfen, neu laden:

Bash
sudo ln -s /etc/nginx/sites-available/cloud.mydomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

SSL-Zertifikat (Certbot)

Certbot installieren und Zertifikat per Webroot-Authenticator ausstellen — Nginx muss dabei nicht gestoppt werden:

Bash
sudo apt install certbot -y
sudo certbot certonly --webroot -w /var/www/html -d cloud.mydomain.com

Nach erfolgreicher Ausstellung liegen die Zertifikatsdateien hier:

Pfade
/etc/letsencrypt/live/cloud.mydomain.com/fullchain.pem
/etc/letsencrypt/live/cloud.mydomain.com/privkey.pem

Renewal läuft automatisch via systemd-Timer. Probelauf:

Bash
sudo certbot renew --dry-run

Reverse Proxy für Nextcloud AIO

Nextcloud AIO erwartet, dass der Reverse Proxy auf den Container-Port 11000 (interner Apache des Nextcloud-Containers, nicht der Master) leitet. Wir ersetzen die Datei /etc/nginx/sites-available/cloud.mydomain.com durch die finale Konfiguration:

Nginx /etc/nginx/sites-available/cloud.mydomain.com
map $http_upgrade $connection_upgrade {
    default upgrade;
    ''      close;
}

server {
    listen 80;
    listen [::]:80;
    server_name cloud.mydomain.com;

    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }

    location / {
        return 301 https://$host$request_uri;
    }
}

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

    ssl_certificate     /etc/letsencrypt/live/cloud.mydomain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/cloud.mydomain.com/privkey.pem;

    # Uploads beliebig groß (Nextcloud-Empfehlung für Cloud-Storage).
    client_max_body_size      0;
    proxy_request_buffering   off;
    proxy_buffering           off;
    proxy_read_timeout        86400s;
    proxy_connect_timeout     60s;
    proxy_send_timeout        300s;

    # Sicherheits-Header (Nextcloud-konform).
    add_header Referrer-Policy                   "no-referrer"       always;
    add_header X-Content-Type-Options            "nosniff"           always;
    add_header X-Download-Options                "noopen"            always;
    add_header X-Frame-Options                   "SAMEORIGIN"        always;
    add_header X-Permitted-Cross-Domain-Policies "none"              always;
    add_header X-Robots-Tag                      "noindex, nofollow" always;
    add_header X-XSS-Protection                  "1; mode=block"     always;

    fastcgi_hide_header X-Powered-By;

    location / {
        proxy_pass         http://127.0.0.1:11000$request_uri;
        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_set_header   X-Forwarded-Port  $server_port;

        # Nextcloud nutzt WebSockets (Notify-Push).
        proxy_set_header   Upgrade    $http_upgrade;
        proxy_set_header   Connection $connection_upgrade;
    }
}

Konfiguration übernehmen:

Bash
sudo nginx -t
sudo systemctl reload nginx

Solange noch kein Container auf 127.0.0.1:11000 läuft, antwortet Nginx mit 502 Bad Gateway. Das ist erwartet — wir starten AIO im nächsten Schritt.

Nextcloud-AIO-Master-Container starten

Der Master-Container ist die Steuerzentrale: Er bringt eine eigene Web-UI auf Port 8080 mit, über die du danach die einzelnen Container (Nextcloud, DB, Redis, Talk, Collabora, …) konfigurierst und ausrollst.

Bash AIO-Master starten (Vordergrund, für die initiale Einrichtung)
sudo docker run \
    --init \
    --sig-proxy=false \
    --name nextcloud-aio-mastercontainer \
    --restart always \
    --publish 8080:8080 \
    --env APACHE_PORT=11000 \
    --env APACHE_IP_BINDING=127.0.0.1 \
    --env SKIP_DOMAIN_VALIDATION=true \
    --env NEXTCLOUD_DATADIR=/srv/nextcloud/data \
    --volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
    --volume /var/run/docker.sock:/var/run/docker.sock:ro \
    ghcr.io/nextcloud-releases/all-in-one:latest

Im Vordergrund? Ja, bewusst — so siehst du die Logs während der Einrichtung. Sobald alles eingerichtet ist, starten wir den Container in Abschnitt 8 detached neu.

Erklärung der wichtigsten Optionen

--name nextcloud-aio-mastercontainer Eindeutiger Containername — vom AIO-Skript so erwartet, sollte nicht geändert werden.
--restart always Container startet automatisch nach Reboots oder Crashes neu.
--publish 8080:8080 AIO-Web-UI auf Host-Port 8080. Wird nur für initiale Einrichtung und spätere Verwaltung gebraucht — nicht für die Nutzer-Cloud.
APACHE_PORT=11000 Interner Apache des Nextcloud-Containers lauscht auf 11000 — passt zum proxy_pass im Nginx-Block.
APACHE_IP_BINDING=127.0.0.1 Bindet Apache nur an Loopback. Nextcloud ist damit nicht direkt aus dem Internet erreichbar, sondern nur via Reverse Proxy.
SKIP_DOMAIN_VALIDATION=true AIO prüft sonst über einen externen Endpoint, ob die Domain auf den Server zeigt. Bei korrekt gesetztem DNS unnötig — und in einigen Netzwerk-Setups schlägt der Check fälschlich an. Direktes Setzen erspart Iterationen.
NEXTCLOUD_DATADIR=/srv/nextcloud/data Pfad für Nutzdaten auf dem Host. Sinnvoll, wenn /srv auf einer separaten Daten-Disk liegt.
-v nextcloud_aio_mastercontainer:/mnt/docker-aio-config Persistentes Docker-Volume für die AIO-Konfiguration — überlebt Container-Restarts und -Updates.
-v /var/run/docker.sock:/var/run/docker.sock:ro Read-only-Zugriff auf den Docker-Socket. Master-Container nutzt ihn, um die übrigen Container (Nextcloud, DB, Redis …) zu erzeugen.

AIO-Wizard durchlaufen

Die AIO-Web-UI öffnest du über die IP des Servers, nicht über die Domain — sie läuft auf Port 8080 mit selbstsigniertem Zertifikat:

URL
https://<server-ip>:8080

Browser-Warnung erwartet: Der AIO-Master nutzt ein selbstsigniertes Zertifikat — die Warnung kannst du für diesen Schritt akzeptieren. Die produktive Cloud-URL https://cloud.mydomain.com bekommt später ein gültiges Let's-Encrypt-Cert.

Nach dem Login mit dem angezeigten Initial-Passwort:

  1. Domain eintragencloud.mydomain.com. Da wir oben SKIP_DOMAIN_VALIDATION=true gesetzt haben, läuft dieser Schritt ohne Domain-Check durch.
  2. Optionale Container auswählen — Talk, Collabora, Imaginary, Whiteboard, ClamAV, Fulltextsearch je nach Bedarf.
  3. Container starten — der Wizard zieht alle nötigen Images und startet sie. Reihenfolge wird durch Abhängigkeiten bestimmt; rechne mit einigen Minuten.

Erfolgreiches Ergebnis sieht so aus:

Container-Status
Containers
* Apache (Running)
* Database (Running)
* Nextcloud (Running)
* Notify Push (Running)
* Redis (Running)
* Collabora (Running)
* Talk (Running)
* Imaginary (Running)
* Whiteboard (Running)
Your containers are up-to-date.

Nach dem Setup zeigt AIO einmalig das initiale Admin-Passwort für Nextcloud selbst — sicher notieren. Das Passwort lässt sich später unter Persönliche Einstellungen → Sicherheit ändern.

Container in den Hintergrund schicken

Sobald die initiale Einrichtung läuft, kannst du den Master-Container detached neu starten — dann kannst du dich vom Server abmelden, ohne dass er stoppt.

Aktuellen Container stoppen und entfernen (das Volume bleibt erhalten — die gesamte Konfiguration steckt darin):

Bash Stoppen und entfernen
sudo docker stop nextcloud-aio-mastercontainer
sudo docker rm nextcloud-aio-mastercontainer

Identisches Run-Kommando, jetzt mit --detach:

Bash AIO-Master detached starten
sudo docker run --detach \
    --init \
    --sig-proxy=false \
    --name nextcloud-aio-mastercontainer \
    --restart always \
    --publish 8080:8080 \
    --env APACHE_PORT=11000 \
    --env APACHE_IP_BINDING=127.0.0.1 \
    --env SKIP_DOMAIN_VALIDATION=true \
    --env NEXTCLOUD_DATADIR=/srv/nextcloud/data \
    --volume nextcloud_aio_mastercontainer:/mnt/docker-aio-config \
    --volume /var/run/docker.sock:/var/run/docker.sock:ro \
    ghcr.io/nextcloud-releases/all-in-one:latest

Anmeldung und Hygiene-Tipps

Nextcloud ist nun unter https://cloud.mydomain.com erreichbar. Login mit Benutzer admin und dem in Abschnitt 7 angezeigten Initial-Passwort.

Nextcloud - Passwort ändern

Mimetype-Migration (häufige Warnung nach Update)

Nach Nextcloud-Updates erscheint unter Administrationseinstellungen → Verwaltung → Übersicht gelegentlich folgende Meldung:

Hinweis
One or more mimetype migrations are available.
Occasionally new mimetypes are added to better handle certain file types.
Migrating the mimetypes take a long time on larger instances so this is
not done automatically during upgrades.
Use the command occ maintenance:repair --include-expensive to perform the migrations

Lösung: Den Befehl im laufenden Nextcloud-Container ausführen.

Bash
sudo docker exec --user www-data nextcloud-aio-nextcloud \
    php occ maintenance:repair --include-expensive

Status anschließend prüfen:

Bash
sudo docker exec --user www-data nextcloud-aio-nextcloud php occ status

Backups & Updates

AIO bringt einen Backup-Container (BorgBackup-basiert) mit — konfigurierbar in der AIO-Web-UI auf https://<server-ip>:8080. Dort kannst du eine Backup-Location (lokal oder Borg-Repo via SSH) hinterlegen, ein Encryption-Passwort setzen und den ersten Backup-Run starten. Updates aller Container laufen ebenfalls über die AIO-UI — kein manuelles docker pull nötig.

Wichtig: Das angezeigte Borg-Encryption-Passwort sicher hinterlegen. Ohne es lässt sich aus den Backups nichts mehr wiederherstellen.

Damit ist Nextcloud produktiv aufgesetzt: Reverse Proxy mit gültigem TLS, Daten persistent in eigenen Volumes, Backups eingerichtet, Updates per UI.

/ Weiter

Zurück zu Self-Hosted Apps

Zur Übersicht