(0)
Artikel
bewerten
(100% positiv)
(4)

Docker Nextcloud SSL

private Cloud für zu Hause

Inhalt dieses Artikels:

    Um mit meiner NAS Kontakte, Termine und Fotos zu synchronisieren habe ich Nextcloud getestet. Dank Docker ist die Installation einfacher und flexibler denn je.

    Als Basis 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 Kontainer 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:

    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)

    letzte Änderung dieses Artikels: 09.08.2018 13:46



    Feedback: