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 undsudo-Rechten.Domain:Eine Domain oder Subdomain, deren A-Record auf die öffentliche IP deines Servers zeigt — im Beispielcloud.mydomain.com.Nginx:Auf dem Host installiert und lauffähig — er übernimmt TLS-Terminierung und Reverse Proxy zum AIO-Container.Ports offen:Eingehend80/tcp(ACME),443/tcp(HTTPS) sowie zunächst8080/tcpfür die initiale AIO-Web-UI. Optional3478/tcp+udpfü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:
curl -fsSL https://get.docker.com | sudo shDanach ist der Docker-Daemon installiert und gestartet. Test mit einem Hello-World-Image:
sudo docker run hello-worldEigenen 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:
sudo usermod -aG docker $USER
newgrp dockerAnschließ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.sheinen 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):
| Typ | Name | Value/Ziel | TTL |
|---|---|---|---|
| A | cloud | 203.0.113.42 | 3600 |
| AAAA | cloud | 2001:db8::42 | 3600 |
Hinweis:
203.0.113.42und2001:db8::42sind 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:
sudo nano /etc/nginx/sites-available/cloud.mydomain.comserver {
listen 80;
listen [::]:80;
server_name cloud.mydomain.com;
root /var/www/html;
}Symlink aktivieren, prüfen, neu laden:
sudo ln -s /etc/nginx/sites-available/cloud.mydomain.com /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginxSSL-Zertifikat (Certbot)
Certbot installieren und Zertifikat per Webroot-Authenticator ausstellen — Nginx muss dabei nicht gestoppt werden:
sudo apt install certbot -y
sudo certbot certonly --webroot -w /var/www/html -d cloud.mydomain.comNach erfolgreicher Ausstellung liegen die Zertifikatsdateien hier:
/etc/letsencrypt/live/cloud.mydomain.com/fullchain.pem
/etc/letsencrypt/live/cloud.mydomain.com/privkey.pemRenewal läuft automatisch via systemd-Timer. Probelauf:
sudo certbot renew --dry-runReverse 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:
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:
sudo nginx -t
sudo systemctl reload nginxSolange noch kein Container auf
127.0.0.1:11000läuft, antwortet Nginx mit502 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.
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:latestIm 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
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:
https://<server-ip>:8080Browser-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.combekommt später ein gültiges Let's-Encrypt-Cert.
Nach dem Login mit dem angezeigten Initial-Passwort:
- Domain eintragen —
cloud.mydomain.com. Da wir obenSKIP_DOMAIN_VALIDATION=truegesetzt haben, läuft dieser Schritt ohne Domain-Check durch. - Optionale Container auswählen — Talk, Collabora, Imaginary, Whiteboard, ClamAV, Fulltextsearch je nach Bedarf.
- 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:
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):
sudo docker stop nextcloud-aio-mastercontainer
sudo docker rm nextcloud-aio-mastercontainerIdentisches Run-Kommando, jetzt mit --detach:
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:latestAnmeldung und Hygiene-Tipps
Nextcloud ist nun unter https://cloud.mydomain.com erreichbar. Login mit Benutzer admin und dem in Abschnitt 7 angezeigten Initial-Passwort.

Mimetype-Migration (häufige Warnung nach Update)
Nach Nextcloud-Updates erscheint unter Administrationseinstellungen → Verwaltung → Übersicht gelegentlich folgende Meldung:
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 migrationsLösung: Den Befehl im laufenden Nextcloud-Container ausführen.
sudo docker exec --user www-data nextcloud-aio-nextcloud \
php occ maintenance:repair --include-expensiveStatus anschließend prüfen:
sudo docker exec --user www-data nextcloud-aio-nextcloud php occ statusBackups & 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.