Diese Anleitung beschreibt Schritt für Schritt die Bereitstellung deines Nextcloud-Stacks inklusive Datenbank, Redis-Cache, Cronjob-Container, OnlyOffice und phpMyAdmin.
📋 Voraussetzungen
Bevor du startest, stelle sicher, dass folgende Komponenten auf deinem System bereitstehen:
- 🐳 Docker & Docker Compose installiert (Offizielle Anleitung)
- 🗄️ Festplatte/Mountpoint: Das Verzeichnis
/mnt/hdd/ muss existieren, beschreibbar sein und genügend Speicherplatz bieten.
- 🛡️ Sicherheitshinweis: Ändere vor dem Start unbedingt die Standardpasswörter (
MYSQL_ROOT_PASSWORD, MYSQL_PASSWORD, JWT_SECRET) in der docker-compose.yml ab!
🛠️ Schritt-für-Schritt Installation
📁 Schritt 1: Ordnerstruktur vorbereiten
Erstelle zuerst die notwendigen Verzeichnisse auf deiner externen Festplatte, damit Docker die Volumes korrekt einhängen kann und keine Berechtigungsprobleme auftreten.
sudo mkdir -p /mnt/hdd/nextcloud/custom_apps \
/mnt/hdd/nextcloud/config \
/mnt/hdd/nextcloud/data \
/mnt/hdd/mariadb \
/mnt/hdd/redis \
/mnt/hdd/onlyoffice/logs \
/mnt/hdd/onlyoffice/data \
/mnt/hdd/onlyoffice/lib \
/mnt/hdd/onlyoffice/db
Setze die korrekten Berechtigungen für das Nextcloud-Datenverzeichnis (wird vom Webserver-User www-data mit der UID 33 benötigt):
sudo chown -R 33:33 /mnt/hdd/nextcloud/
📝 Schritt 2: Projektordner & Konfiguration anlegen
Erstelle ein Verzeichnis für deine Docker-Konfiguration auf dem Server (z. B. in deinem Home-Verzeichnis) und wechsle hinein:
mkdir -p ~/nextcloud-stack && cd ~/nextcloud-stack
Erstelle die Datei docker-compose.yml:
nano docker-compose.yml
Füge den folgenden Inhalt ein (Nutze Strg+O -> Enter zum Speichern und Strg+X zum Schließen):
services:
nextcloud:
container_name: nextcloud
image: nextcloud:latest
restart: unless-stopped
ports:
- 8020:80
environment:
- TZ=Europe/Berlin
- PHP_MEMORY_LIMIT=4G
- PHP_UPLOAD_LIMIT=16G
- PHP_POST_MAX_SIZE=16G
- MYSQL_HOST=db
- MYSQL_DATABASE=ncdb
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nextcloud
- REDIS_HOST=nextcloud-redis
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
#- /mnt/hdd/nextcloud/apps:/var/www/html/apps
- /mnt/hdd/nextcloud/custom_apps:/var/www/html/custom_apps
- /mnt/hdd/nextcloud/config:/var/www/html/config
- /mnt/hdd/nextcloud/data:/var/www/html/data
entrypoint:
- /bin/sh
- -c
- |
echo "date.timezone=Europe/Berlin" > /usr/local/etc/php/conf.d/timezone.ini
echo "opcache.interned_strings_buffer=16" > /usr/local/etc/php/conf.d/nextcloud-opcache.ini
echo "opcache.max_accelerated_files=10000" >> /usr/local/etc/php/conf.d/nextcloud-opcache.ini
echo "opcache.memory_consumption=128" >> /usr/local/etc/php/conf.d/nextcloud-opcache.ini
echo "opcache.save_comments=1" >> /usr/local/etc/php/conf.d/nextcloud-opcache.ini
echo "opcache.revalidate_freq=1" >> /usr/local/etc/php/conf.d/nextcloud-opcache.ini
apt-get update
apt-get install -y ocrmypdf tesseract-ocr-deu
/entrypoint.sh apache2-foreground
depends_on:
- db
- nextcloud-redis
nextcloud-cron:
image: docker:latest
container_name: nextcloud-cron
restart: unless-stopped
environment:
- TZ=Europe/Berlin
volumes:
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
command: >
sh -c "while true;
do
docker exec -u www-data nextcloud php -d memory_limit=2G -f /var/www/html/cron.php;
sleep 300;
done"
depends_on:
- nextcloud
- db
db:
container_name: maria-db
image: mariadb:11.4
restart: unless-stopped
command: --innodb-read-only-compressed=OFF --innodb-buffer-pool-size=4G --transaction-isolation=READ-COMMITTED --binlog-format=ROW
environment:
- MYSQL_ROOT_PASSWORD=root
- MYSQL_DATABASE=ncdb
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=nextcloud
volumes:
- /mnt/hdd/mariadb:/var/lib/mysql
nextcloud-redis:
container_name: nextcloud-redis
image: redis:latest
restart: unless-stopped
command: redis-server
volumes:
- /mnt/hdd/redis:/data
phpmyadmin:
container_name: phpmyadmin
image: phpmyadmin/phpmyadmin
restart: unless-stopped
ports:
- 8081:80
environment:
- TZ=Europe/Berlin
- PMA_HOST=db
- UPLOAD_LIMIT=3G
depends_on:
- db
onlyoffice:
container_name: onlyoffice
image: onlyoffice/documentserver:latest
restart: unless-stopped
ports:
- 8080:80
environment:
- TZ=Europe/Berlin
- JWT_ENABLED=true
- JWT_SECRET=dein_super_geheimes_jwt_passwort
volumes:
- /mnt/hdd/onlyoffice/logs:/var/log/onlyoffice
- /mnt/hdd/onlyoffice/data:/var/www/onlyoffice/Data
- /mnt/hdd/onlyoffice/lib:/var/lib/onlyoffice
- /mnt/hdd/onlyoffice/db:/var/lib/postgresql
🚀 Schritt 3: Stack starten
Starte den gesamten Stack im Hintergrund (Detached Mode):
docker compose up -d
Hinweis: Der erste Start des Nextcloud-Containers dauert ein paar Minuten, da im Hintergrund Updates ausgeführt und ocrmypdf sowie die deutschen Tesseract-OCR-Pakete installiert werden.
🌐 Ports & Weboberflächen
Nachdem alle Container hochgefahren sind, kannst du die Dienste über folgende URLs in deinem Browser erreichen (Ersetze DEINE-SERVER-IP mit der tatsächlichen IP-Adresse deines Servers):
- 🔐 Nextcloud:
http://DEINE-SERVER-IP:8020
- 📊 phpMyAdmin:
http://DEINE-SERVER-IP:8081
- 📝 OnlyOffice Docs:
http://DEINE-SERVER-IP:8080
⚙️ Post-Installation (Wichtige Anpassungen)
1. Nextcloud Ersteinrichtung
- Rufe
http://DEINE-SERVER-IP:8020 auf.
- Vergebe einen Admin-Benutzernamen und ein sicheres Passwort.
- Da die Datenbank-Zugangsdaten bereits über Umgebungsvariablen mitgegeben wurden, konfiguriert sich die Instanz in der Regel automatisch. Falls nicht, trage folgende Werte ein:
- Datenbank-Benutzer:
nextcloud
- Datenbank-Passwort:
nextcloud (oder dein geändertes Passwort)
- Datenbank-Name:
ncdb
- Datenbank-Host:
db
2. Redis-Cache in Nextcloud aktivieren
Damit Nextcloud die Redis-Instanz für das Transactional File Locking nutzt, füge nach der Ersteinrichtung folgende Zeilen in deine /mnt/hdd/nextcloud/config/config.php vor dem schließenden ); Array ein:
'memcache.local' => '\OC\Memcache\APCu',
'memcache.distributed' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => [
'host' => 'nextcloud-redis',
'port' => 6379,
],
3. OnlyOffice in Nextcloud verbinden
- Logge dich als Admin in Nextcloud ein.
- Gehe zu Apps und installiere die App ONLYOFFICE.
- Gehe in die Administratoreinstellungen -> ONLYOFFICE.
- Trage bei Adresse von ONLYOFFICE Docs folgendes ein:
http://onlyoffice/ (interne Docker-Kommunikation).
- Klappe die erweiterten Einstellungen auf und trage bei Secret (JWT) dein definiertes Passwort ein (
dein_super_geheimes_jwt_passwort).
4. Cronjob-Einstellung prüfen
Gehe in den Nextcloud-Grundeinstellungen unter Systemverwaltung -> Grundeinstellungen und stelle sicher, dass bei Hintergrund-Aufgaben der Punkt Cron ausgewählt ist. Dein nextcloud-cron Container triggert diesen nun automatisch alle 5 Minuten.
🛑 Nützliche Befehle
- Status prüfen:
docker compose ps
- Logs einsehen (Live):
docker compose logs -f nextcloud
- Stack stoppen:
docker compose down
- Stack stoppen & Daten löschen (Achtung!):
docker compose down -v