Nextcloud mit Docker und Docker-Compose installiert

Nachdem ich zunehmend den Eindruck habe, dass der Owncloud-Fork Nextcloud 1. aktiver und 2. mehr auf Sicherheit bedacht ist als der Vorgänger Owncloud, habe ich mir Nextcloud mit Docker installiert. Das ging ziemlich einfach und “strightforward”.

Unten das docker-compose-File. Hier ein paar Anmerkungen:

  • Die Mariadb wird mit einem root-Passwort aus MYSQL_ROOT_PASSWORD und einem User mit Zugriff auf eine neue DB (Username/Passwort und DB-Name aus db.env) eingerichtet.
  • Nextcloud erhält Zugriff über die gleichen Variablen in db.env.
  • Die Daten lege ich ein separates Volume .../data.
  • Backup der DB erstelle ich vollautomatisch über das Docker-Image dsteinkopf/backup-all-mysql.
  • Backup der Dateien erfolgt über ohnehin bei mir existierende Backup-Mechanismen, die das gesamte Basisverzeichnis der Docker-Volumes (bei mir /opt/dockervolumes) sichern.
  • Die Volumes /etc/timezone und /etc/localtime sorgen dafür, dass der Container mit der Zeitzone des Hosts läuft.
  • Alles steckt in einem eigenen, gemeinsamen Netz nextcloudnet.
  • Die Erreichbarkeit von außen und die SSL-Verschlüsselung erreiche ich via separatem Reverse-Proxy (Config-File: siehe unten) mit letsencrypt-Automatik. Damit Nextcloud gut darüber arbeitet war noch Folgendes in /opt/dockervolumes/nextcloud/var_www_html/config/config.php nötig:
    • trusted_domains muss noch die außen sichtbare Domain enthalten.
    • overwrite.cli.url muss ebenfalls die öffentliche URL enthalten.
    • overwriteprotocol: https.
  • Außerdem habe ich in der genannten config.php noch den Mailserver konfiguriert:
     'mail_from_address' => 'nextcloud',
      'mail_smtpmode' => 'smtp',
      'mail_smtpauthtype' => 'LOGIN',
      'mail_domain' => 'my.public.domain',
      'mail_smtpsecure' => 'tls',
      'mail_smtpauth' => 1,
      'mail_smtphost' => 'my.mail.server',
      'mail_smtpport' => '25',
    
  • P.S. Es wäre sicher sinnvoll, alle Passworte aus dem Compose-File herauszuhalten, aber die Mühe habe ich mir für meine eigene “kleine” Umgebung nicht gemacht.

Ich hoffe, ich habe an alles gedacht – das ganze läuft so inzwischen seit ein paar Wochen bei mir stabil.

Links

docker-compose.yml für Nextcloud

version: '2' 

services:

  db:
    image: mariadb
    restart: always
    volumes:
      - /opt/dockervolumes/nextcloud/mysql:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=sehrgeheimroot
    env_file:
      - db.env
    networks:
      - nextcloudnet

  backup-mysql:
    image: dsteinkopf/backup-all-mysql:latest
    restart: always
    environment:
      - BACKUP_INTERVAL=86400
      - BACKUP_FIRSTDELAY=4000
      - 'MYSQL_CONNECTION_PARAMS=--user=root --host=db --password=sehrgeheim123'
    links:
      - db
    volumes:
      - /opt/dockervolumes/nextcloud/mysql-backup:/var/dbdumps
    networks:
      - nextcloudnet

  nextcloud:
    image: nextcloud:apache
    restart: always
    ports:
      - 8094:80
    links:
      - db
    volumes:
      - /opt/dockervolumes/nextcloud/var_www_html:/var/www/html
      - /opt/dockervolumes/nextcloud/data:/var/www/html/data
      - /etc/localtime:/etc/localtime:ro
      - /etc/timezone:/etc/timezone:ro
    environment:
      - MYSQL_HOST=db
      - NEXTCLOUD_ADMIN_USER=admin
      - NEXTCLOUD_ADMIN_PASSWORD=sehrgeheim456
    env_file:
      - db.env
    networks:
      - nextcloudnet


networks:

  nextcloudnet:
    # empty

Das zugehörig db.env sieht so aus:

db.env

MYSQL_USER=nextcloud
MYSQL_PASSWORD=sehrgeheim123
MYSQL_DATABASE=nextcloud

Reverse-Proxy-Config

<IfModule mod_ssl.c>
<VirtualHost *:443>

        #  General setup for the virtual host
        DocumentRoot "/var/www"
        ServerName my-nextcloud.steinkopf.net
        ServerAdmin webmaster@steinkopf.net
        ErrorLog /var/log/apache2/my-nextcloud.steinkopf.net_error.log
        TransferLog /var/log/apache2/my-nextcloud.steinkopf.net_access.log

        Include /etc/apache2/dstk-all-sites-incl.conf

        # see https://doc.owncloud.org/server/8.1/admin_manual/configuration_server/harden_server.html
        Header always add Strict-Transport-Security "max-age=15768000"

        # RewriteLogLevel 3

        RewriteEngine On
        ProxyRequests Off

        ProxyPass        / http://docker-prod.steinkopf.net:8094/
        ProxyPassReverse / http://docker-prod.steinkopf.net:8094/

        SSLCertificateFile /etc/letsencrypt/live/my-nextcloud.steinkopf.net/fullchain.pem
        SSLCertificateKeyFile /etc/letsencrypt/live/my-nextcloud.steinkopf.net/privkey.pem
        Include /etc/letsencrypt/options-ssl-apache.conf
</VirtualHost>
</IfModule>

17 thoughts on “Nextcloud mit Docker und Docker-Compose installiert

  1. Danke. Das stimmt natürlich… ist für eine “low traffic”-Installation wohl weniger wichtig – für den “Echtbetrieb” schon eher. Und es gilt wohl für DB- und für Filesytem-Backup. Ich denke drüber nach…

  2. Das ist recht einfach gemacht, per “docker in docker” und per: ‘docker exec –user www-data nextclouddocker php occ maintenance:mode –on’

    1. Richtig. Bei mir sieht das konkret so aus:
      docker exec --user www-data nextcloud_nextcloud_1 php occ maintenance:mode --off

  3. hallo, bin ein docker neuling….

    habe eine nc.yml db.env erstellt und mit “docker-compose -f nc.yml up -d” gestartet.

    lt.docker-portainer läuft das auch.

    was oder wie gehe ich mit der “Reverse-Proxy-Config” um? wo wird die eingebaut bzw muss ich die im vserver bearbeiten/erstellen?

    vg hardy

    1. Das hängt davon ab, ob Du überhaupt einen Reverse-Proxy brauchst. Meine docker-Hosts sind nicht vom Internet aus erreichbar, daher habe ich für die Erreichbarkeit und zur SSL-Behandlung einen Reverse-Proxy. Dieser ist bei mir eine völlig separate Maschine und global erreichbar. Über die o.g. Konfig (die eher als Skizze dienen soll) werden die von außen kommenden requests an die Nextcloud-Installation im Container weiter geleitet. Mit letsencrypt bzw. certbot habe ich die SSL-Einrichtung samt Zertifikaten erreicht – aber das ist eine andere “Geschichte“.

      P.S. Da Du von portainer schreibst: Es macht natürlich immer zusätzlich Sinn, mit docker-compose logs ... zu beobachten, was in den Container genau passiert.

  4. Hallo Dirk,
    ich habe mir mit deiner Hilfe ein docker-compose.yml zusammengestellt. Leider scheitere ich schon beim “docker-compose up -d”.
    Ich erhalte immer eine Fehlermeldung bei der MariaDB und nginx….

    ERROR: for 5f47dfa859db_nextcloud_proxy_1 Cannot start service proxy: error while creating mount source path ‘/mnt/raid/Docker-Volumes/nextcloud/nginx-html’: mkdir /mnt/raid: read-only file system

    ERROR: for db Cannot start service db: error while creating mount source path ‘/mnt/raid/Docker-Volumes/nextcloud/mariadb’: mkdir /mnt/raid: read-only file system

    ERROR: for proxy Cannot start service proxy: error while creating mount source path ‘/mnt/raid/Docker-Volumes/nextcloud/nginx-html’: mkdir /mnt/raid: read-only file system

    Woran kann das denn liegen? Die Rechte meines Zielverzeichnisses sehen so aus:
    drwxrwx–x 2 bernd root 4096 Nov 4 11:24 Docker-Volumes/

    Gruß Bernd

    1. read-only file system klingt für mich als wäre das ganze entsprechende Filesystem als nicht schreibbar gemountet. Kann das sein? Schau mal u.a. mit mount nach.

  5. Hallo
    tolle Anleitung. Ich bin noch neu und frage mich wieso es unter Nexcloud, Volumes diese Zeile braucht:

    - opt_dockervolumes_nextcloud_data:_var_www/html_data

    Hätte diese Zeile nicht gereicht:
    – opt_dockervolumes_nextcloud_var_www_html:_var_www_html

    Ausserdem habe ich in anderen compose-files folgendes gesehen:
    volumes:
    ” – nextcloud:_var_www_html”

    und dafür zum Schluss des Files noch Einträge wie diese:
    volumes:
    nextcloud:

    Weisst du was es damit auf sich hat?
    (sorry, ich konnte eine Backlsashs einfügen)

    Gruss
    Santo

    1. Freut mich, wenn es Dir was gebracht hat 🙂

      … frage mich wieso es unter Nexcloud, Volumes diese Zeile braucht:

      - opt_dockervolumes_nextcloud_data:_var_www/html_data

      Hätte diese Zeile nicht gereicht:

      – opt_dockervolumes_nextcloud_var_www_html:_var_www_html

      Das stimmt, eigentlich braucht es die data-Zeile nicht. Ich habe sie dennoch separat aufgeführt, damit das data-Verzeichnis in einem eigenen Volume landet und getrennt behandelt werden kann. So habe ich inzwischen das data-Verzeichnis auf einem anderen (größeren) Laufwerk abgelegt.

      Ausserdem habe ich in anderen compose-files folgendes gesehen:

      volumes:
      ” – nextcloud:_var_www_html”
      

      und dafür zum Schluss des Files noch Einträge wie diese:

      volumes:
        nextcloud:
      

      Weisst du was es damit auf sich hat?

      Damit wird im compose-File angegeben, dass das Volume außerhalb des compose-Files definiert und eingerichtet wurde und hier nur referenziert. Das geht z.B. mit

      docker volume create \
      --driver local \
      --opt type=cifs \
      --opt o=addr=192.168.99.99,ro \
      --opt device=//192.168.99.99/nextclouddata \
      --opt o=uid=101,username=nextcloudserver,password=xxx,nounix,file_mode=0550,dir_mode=0550 \
      nextcloud
      

      mehr hier: https://docs.docker.com/engine/reference/commandline/volume_create/

  6. Hello I followed your tutorial and it worked great, I have been using it for a while but now the db won’t start. it says ” Could not open mysql.plugin table: “File ‘./mysql/plugin.MAD’ not found”
    I am trying to fix it but docker for windows won’t let me enter the container because it just restarts. How can I restore the backup? thanks!

    1. I also know these situations where nothing can be done because a container is continuously restarting. I always try to add a command: sleep 9999 to the compose file. This makes docker start the container but not run the real content. So you can enter the container and have a look.

      Hope that helps.

      (Sorry for the late answer.)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert