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>

12 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.

Schreibe einen Kommentar

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