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 )  

Eine Anleitung für die Installation von Docker ist auf folgender Seite zu finden: https://docs.docker.com/install/

Bei einem ganz neuen Debian-Release ist docker-ce eventuell noch nicht als "stable" verfügbar, durch das Hinzufügen von edge test, kann docker-ce dennoch installiert werden: 

sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/debian \
   $(lsb_release -cs) \
   stable edge test"

 

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 LEDE - 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 LEDE-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

Callibora 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
 

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!


veröffentlicht am 17.07.2018 von Bernhard
geändert am 23.12.2019 von Bernhard



Kommentare


(sortiert nach Bewertung / Datum) [alle Kommentare(neueste zuerst)]
✍anonym
erstellt am 09.02.2020 10:02
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)

✍anonym
erstellt am 05.11.2019 11:11
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

✍anonym
erstellt am 09.10.2019 22:10
User: Hallo 
Benötige mal deine Hilfe

✍anonym
erstellt am 09.10.2019 22:10
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?

Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu. Mehr Details