Docker Nextcloud SSL - letsencrypt https
Um mit meiner NAS Kontakte, Termine und Fotos zu synchronisieren habe ich Nextcloud getestet. Dank Docker ist die Installation einfacher und flexibler denn je. (siehe auch: NAS im Eigenbau )
Docker kann auf denunterschiedlichsten Plattformen betrieben werden, zusätzliche Informationen zu Docker und zur Docker Installation, siehe: Docker
Als Basis für Nextcloud habe ich folgende Konfig auf Github gefunden:
git clone https://github.com/ichiTechs/Dockerized-SSL-NextCloud-with-MariaDB.git
Der Befehl sollte in dem Ordner ausgeführt werden in dem Nextcloud installiert werden soll, "git clone" erstellt darin noch einen Unterordner.
Docker-compose.yml
Die Datei docker-compose.yml beinhaltet die Konfig für die Container, wie z.B. den Datenbank-Benutzer, die Domäne und Netzwerksettings für die Kommunkation der einzelnen Container untereinander. Die Datei sollte entsprechend vor dem ersten Start angepasst werden. Für das hier beschriebene Setup mit Let's Encrypt SSL-Zertifikat wird ein DNS-Eintrag auf die IP der Nextcloud-Installation vorausgesetzt. D.h. wer im Besitz einer Domäne ist kann z.B. einen A-Record einer Subdomain auf die öffentliche IP der Nextcloud-Installation zeigen lassen. Alternativ könne auch Dienste wie DynDNS dazu verwendet werden. Nun aber zur IP: In meinem Fall habe ich die öffentliche IP meines Providers verwendet und am Router ein Port-Forwarding des Ports 443 auf die IP meiner NAS erstellt.
Update
mit folgendem Befehl werden die Container heruntergeladen:
docker-compose pull
Erstellen der Konfig und Start der Container
Folgender Befehlt erstellt die Container mit der in der docker-compose.yml hinterlegten Konfig.
docker-compose up -d
Updaten mit:
docker-compose down
docker-compose pull
docker-compose up -d
Unter Umständen wird beim nächsten Aufruf der Weboberfläche Nextcloud upgedated:
Ev. müssen div. Apps erneut aktiviert werden, entweder über die GUI, oder per Command:
docker exec --user www-data nextcloud_fpm php occ app:enable twofactor_totp calendar news contacts onlyoffice phonetrack previewgenerator spreed audioplayer
Files scannen
docker exec --user www-data nextcloud_fpm php occ files:scan --all
Geburtstagskalender neu aufbauen:
docker exec --user www-data nextcloud_fpm php occ dav:sync-birthday-calendar User
Datenbank Dump
docker exec db mysqldump --user=root --password=Password -h localhost nextcloud > dump.sql.gz
Router OpenWrt- interne IP
Nachdem meine NAS und somit die NextCloud-Installation zu Hause direkt über das WLAN erreichbar ist, ohne Umweg: WLAN - Router - Internet - Router, mach es natürlich Sinn die Installation direkt aufzurufen, dazu reicht ein zusätzlicher DNS-Eintrag am Router: Split-DNS. Die NextCloud-Domain wird im WLAN somit mit einer internen IP aufgelöst.
Hier als Beispiel die Anpassung meines auf OpenWrt-basierenden Router:
vi /etc/config/dhcp
config 'domain'
option name 'next.domain.xx'
option ip 192.168.1.5
config 'domain'
option name 'office.domain.xx'
option ip 192.168.1.5
config 'domain'
option name 'document.domain.xx'
option ip 192.168.1.5
Windows Webdav
\\next.domain.xx@SSL\DavWWWRoot\remote.php\dav\files\user
Tuning
Brute Force Protection und Reverse Proxy:
in Protokollierung:
/config/config.php:
hinzufügen von:
'trusted_proxies' => array('172.18.0.2'),
'forwarded_for_headers' => array('HTTP_X_FORWARDED_FOR')
Connections:
root@soxn:/nextcloud# nano nginx.conf
events {
worker_connections 768;
}
changed to 2048;
Client_max_body_size
File uploadsize.conf
client_max_body_size 10G;
docker-compose.yml
services:
proxy:
image: jwilder/nginx-proxy
container_name: proxy
ports:
- 80:80
- 443:443
volumes:
- ./proxy/conf.d:/etc/nginx/conf.d
- ./proxy/vhost.d:/etc/nginx/vhost.d
- ./proxy/html:/usr/share/nginx/html
- ./proxy/certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./uploadsize.conf:/etc/nginx/conf.d/uploadsize.conf:ro
Redis
config/apcu.config.php
<?php
$CONFIG = array (
'memcache.local' => '\OC\Memcache\APCu',
'redis' => array(
'host' => 'redis',
'port' => 6379,
),
'memcache.locking' => '\OC\Memcache\Redis',
);
Docker .env
Wird in dem Ordner in dem sich die docker-compose.yml Datei befindet eine .env-Datei angelegt, können damit Docker-Parameter geändert werden:
#.env
COMPOSE_HTTP_TIMEOUT=200
Callabora hinzufügen
folgenden Block in docker-compose.yml einfügen:
collabora:
image: collabora/code
container_name: collabora
expose:
- 9980
cap_add:
- MKNOD
environment:
- domain=next.deineDomain
- VIRTUAL_HOST=office.deineDomain
- VIRTUAL_NETWORK=nginx-proxy
- VIRTUAL_PORT=9980
- VIRTUAL_PROTO=https
- LETSENCRYPT_HOST=office.deineDomain
- LETSENCRYPT_EMAIL=deineEmail-Addresse
networks:
- proxy-tier
restart: always
OnlyOffice hinzufügen
onlyoffice:
image: onlyoffice/documentserver
container_name: onlyoffice
stdin_open: true
tty: true
expose:
- '80'
- '443'
environment:
- VIRTUAL_HOST=document.domain.xx
- VIRTUAL_NETWORK=nginx-proxy
- LETSENCRYPT_HOST=document.domain.xx
- LETSENCRYPT_EMAIL=email@domain.xx
- JWT_ENABLED=true
- JWT_SECRET=secretwithoutnumbers
- JWT_HEADER=Authorization
networks:
- proxy-tier
restart: always
NGINX Bad Gateway
Workaround:
Bash-Script:
#!/bin/bash
url="https://document.DOMAIN"
keyword="Bad Gateway"
if curl -s "$url" | grep "$keyword"
then
# if the keyword is in the conent
echo " ERROR"
docker restart onlyoffice
else
echo "the website is working fine"
fi
sudo crontab -e
*/10 * * * * . /nextcloud/check.sh > /dev/null 2>&1
Preview Images
Anzeigen der zuletzt geänderten Dateien:
find . -type f -cmin 5
Setting lesen: docker exec --user www-data nextcloud_fpm php -d memory_limit=4G occ config:app:get previewgenerator squareSizes
docker exec --user www-data nextcloud_fpm php -d memory_limit=4G occ config:app:set --value "256" previewgenerator squareSizes
docker-compose.yml
version: '2'
services:
proxy:
image: jwilder/nginx-proxy
container_name: proxy
ports:
- 80:80
- 443:443
volumes:
- ./proxy/conf.d:/etc/nginx/conf.d
- ./proxy/vhost.d:/etc/nginx/vhost.d
- ./proxy/html:/usr/share/nginx/html
- ./proxy/certs:/etc/nginx/certs:ro
- /var/run/docker.sock:/tmp/docker.sock:ro
- ./uploadsize.conf:/etc/nginx/conf.d/uploadsize.conf:ro
networks:
- proxy-tier
restart: always
letsencrypt-companion:
image: jrcs/letsencrypt-nginx-proxy-companion
container_name: letsencrypt-companion
volumes_from:
- proxy
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./proxy/certs:/etc/nginx/certs:rw
restart: always
web:
image: nginx
container_name: nextcloud_webserver
volumes:
- ./nginx.conf:/etc/nginx/nginx.conf:ro
links:
- app
volumes_from:
- app
environment:
- VIRTUAL_HOST=next.domain.xxx
- VIRTUAL_NETWORK=nginx-proxy
- VIRTUAL_PORT=80
- LETSENCRYPT_HOST=next.domain.xxx
- LETSENCRYPT_EMAIL=email@domain.xxx
networks:
- proxy-tier
restart: always
app:
image: nextcloud:fpm
container_name: nextcloud_fpm
links:
- db
- redis
# - collabora
- onlyoffice
volumes:
- ./nextcloud/apps:/var/www/html/apps
- ./nextcloud/config:/var/www/html/config
- ./nextcloud/data:/var/www/html/data
#- ./www.conf:/usr/local/etc/php-fpm.d/www.conf #change pm.max_children
- /daten:/daten
networks:
- proxy-tier
restart: always
redis:
image: redis
container_name: redis
restart: always
ports:
- "6379:6379"
volumes:
- ./nextcloud/redis:/data
entrypoint: redis-server --appendonly yes
networks:
- proxy-tier
restart: always
# collabora:
# image: collabora/code
# container_name: collabora
# expose:
# - 9980
# cap_add:
# - MKNOD
# environment:
# - domain=next.domain.xxx
# - VIRTUAL_HOST=office.domain.xxx
# - VIRTUAL_NETWORK=nginx-proxy
# - VIRTUAL_PORT=9980
# - VIRTUAL_PROTO=https
# - LETSENCRYPT_HOST=office.domain.xxx
# - LETSENCRYPT_EMAIL=email@domain.xxx
# networks:
# - proxy-tier
# restart: always
onlyoffice:
image: onlyoffice/documentserver
container_name: onlyoffice
stdin_open: true
tty: true
expose:
- '80'
- '443'
environment:
- VIRTUAL_HOST=document.domain.xx
- VIRTUAL_NETWORK=nginx-proxy
- LETSENCRYPT_HOST=document.domain.xx
- LETSENCRYPT_EMAIL=email@domain.xx
- JWT_ENABLED=true
- JWT_SECRET=secretwithoutnumbers
- JWT_HEADER=Authorization
networks:
- proxy-tier
restart: always
db:
image: mariadb
container_name: db
volumes:
- ./nextcloud/db:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=xxxx
- MYSQL_DATABASE=nextcloud
- MYSQL_USER=nextcloud
- MYSQL_PASSWORD=xxxx
networks:
- proxy-tier
restart: always
networks:
proxy-tier:
external:
name: nginx-proxy
Internal Server Error
Nach einem Stromausfall hatte ich folgendes Problem:
Internal Server Error The server encountered an internal error and was unable to complete your request. Please contact the server administrator if this error reappears multiple times, please include the technical details below in your report. More details can be found in the server log.
Der Redis-Container hat dabei ständig neugestartet. Im Log konnte ich folgenden Eintrag finden:
Bad file format reading the append only file: make a backup of your AOF file, then use ./redis-check-aof --fix <filename>
Nachdem ich den Redis-Ordner ./nextcloud/redis gelöscht habe, konnte die Installation wieder gestartet werden.
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
Mit den Standardsettings wurde im Log des nextcloud:fpm Containers folgende Warnung angzeigt:
WARNING: [pool www] server reached pm.max_children setting (5), consider raising it
Das Limit kann in der FPM-Config-Datei www.conf erhöht werden, diese ist im nextcloud:fpm Container versteckt:
Um die Datei anzuzeigen, können wir uns in den Container verbinden:
docker exec --user www-data -it nextcloud_fpm bash
Damit die Änderungen an der Konfig-Datei auch nach einem Reboot vorhanden sind, kann die Datei außerhalb des Containers abgelegt werden, dazu muss die Datei aber vorhanden sein:
mit cat /usr/local/etc/php-fpm.d/www.conf den Inhalt der www.conf anzeigen lassen und im Root Ordner www.conf anlegen:
Folgende Zeile in nextcloup_fpm hinzufügen:
- ./www.conf:/usr/local/etc/php-fpm.d/www.conf #added 4 max-childs-config
mit nano.conf kann die www.conf angepasst werden:
Nachdem ich in meiner NAS 8GB Ram habe habe ich folgende Werte angepasst:
pm.max_children = 80 (vorher 5)
pm.start_servers = 2
pm.min_spare_servers = 2 (voher 1)
pm.max_spare_servers = 15 (vorher 3)
Sicherheits und Einrichtungswarnungen
docker exec --user www-data nextcloud_fpm php occ maintenance:mode --on
docker exec --user www-data nextcloud_fpm php occ db:convert-filecache-bigint
docker exec --user www-data nextcloud_fpm php occ maintenance:mode --off
docker exec --user www-data nextcloud_fpm php occ db:add-missing-indices
Docker als Benutzer / ohne Root-Rechte
sudo groupadd docker
sudo gpasswd -a $USER docker
OrdnerSync Rasperry PI
Installieren:
sudo apt install owncloud-client-cmd
und eintragen in crontab:
crontab -e
* * * * * owncloudcmd /lokalerOrdner https://user:password@nextcloudURL/remote.php/webdav/Ordner >/dev/null 2>&1

{{percentage}} % positiv

DANKE für deine Bewertung!
Fragen / Kommentare
(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
User: Jens Ich bekomme nach der Installation immer nur ein 504 Gateway Time-out, wo sollte ich mit der Suche ansetzen? (Installiert ist nur: proxy, companion, db, fpm & webserver)
User: Raphael Vielen Dank für das hilfreiche Manual! Den Absatz um die pm.max_children zu ändern hab ich, so denke ich, nicht ganz verstanden. Stimmt das so:? Man verbindet sich mit dem Docker Container und bearbeitet darin die www.conf datei, indem man die Zeile mit dem Verweis auf die neue Config Datei hinzufügt. Anschließend legt man eine www.conf Date im root ordner des Servers (außerhalb des containers) an und fügt die 4 Zeilen mit den pm.max children ein. Aber wird nicht bei jedem neuen build des containers die www.conf im docker auf die ursprüngliche Version zurückgesetzt? Würde mich über eine Antwort freuen... raphael_unterrainer(AT)hotmail.com
User: Hallo Benötige mal deine Hilfe
User: Zinnik Hallo ich habe ein Problem mit der nextcloud im docker auf einer qnap nas. Ich kann kein letsencrypt zertifikat erstellen. Kannst du mir helfen?