Nextcloud installieren

Autor des Abschnitts: @rettich, Ergänzungen: @cweikl

Auf einem Docker-Host sind folgende Schritte zur Installation notwendig:

  1. Erstellen eines Let’s Encrypt - Zertifikats.
  2. Erstellen einer Site für die Nextcloud in nginx.
  3. Erstellen und Starten der Nextcloud Docker App.

Hinweis

Im Folgenden musst du natürlich nextcloud.meine-schule.de durch deine URL ersetzen.

Erstellung des Zertifikats

Zuerst musst du dir einen Dienstenamen ausdenken und SSL-Zertifikate besorgen. Also z.B. nextcloud.meine-schule.de.

Dazu legst du einen DNS Eintrag für deine Dockerapp, z.B. nextcloud.meine-schule.de, der auf die IP des Docker-Hosts zeigt an. Das darf auch ein CNAME sein.

Trage diesen Host in die Datei /etc/dehydrated/domains.txt ein.

Führe den Befehl dehydrated -c aus. Jetzt hast du die Zertifikate im Verzeichnis /var/lib/dehydrated/certs/ zur Verfügung, der Docker Host aktualisiert diese per Cronjob.

Erstellen einer Site für die Nextcloud in nginx

Wir benutzen nginx als Reverse-Proxy. So können auf deinem Docker-Host viele Services wie beispielsweise mrbs.meine-schule.de und nextcloud.meine-schule.de unter der gleichen IP-Adresse laufen.

Wenn beispielsweise ein Benutzer die Seite nextcloud.meine-schule.de aufruft, schaut sich nginx die URL an, die aufgerufen wurde, und liefert dann die entsprechende Seite aus.

Melde dich als root auf deinem Docker-Host an.

Erstelle mit mkdir -p /srv/docker/nextcloud das Verzeichnis, in das alle Nextcloud-Dateien abgelegt werden.

Erzeuge die Datei /srv/docker/nextcloud/nextcloud.nginx.conf mit folgendem Inhalt:

server {
  listen 80;
  listen [::]:80;
  server_name nextcloud.meine-schule.de;

  location / {
    return 301 https://nextcloud.staufer-gymnasium.de$request_uri;
    }

  location ^~ /.well-known/acme-challenge {
    alias /var/www/dehydrated;
    }

  }

server {
  listen 443 ssl http2;
  listen [::]:443 ssl http2;
  server_name    nextcloud.meine-schule.de;
  ssl_certificate /var/lib/dehydrated/certs/nextcloud.meine-schule.de/fullchain.pem;
  ssl_certificate_key /var/lib/dehydrated/certs/nextcloud.meine-schule.de/privkey.pem;
  ssl_protocols TLSv1.2;
  ssl_prefer_server_ciphers on;
  location /.well-known/carddav {
    return 301 $scheme://$host/remote.php/dav;
  }
  location /.well-known/caldav {
    return 301 $scheme://$host/remote.php/dav;
  }
  location / {
     proxy_read_timeout 600s;
     client_max_body_size 0;
     proxy_set_header Connection "";
     proxy_set_header Host $host;
     proxy_set_header X-Real-IP $remote_addr;
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
     proxy_set_header X-Forwarded-Proto $scheme;
      add_header Strict-Transport-Security "max-age=31536000; includeSubDomains; preload";
      access_log /var/log/nginx/nextcloud.access.log;
      error_log /var/log/nginx/nextcloud.error.log;
     proxy_pass http://localhost:7771;
  }
}

Diese conf-Datei geht davon aus, dass deine Nextcloud auf localhost:7771 erreichbar sein wird. Den Port 7771 kannst du frei wählen. Dies muss identisch sein mit dem später in docker-compose.yml anzugebenen Port für nextcloud.

Jetzt musst du noch im Verzeichnis /etc/nginx/sites-enabled einen Link auf deine nextcloud.nginx.conf anlegen und nginx neu starten.

Melde dich wieder als root am Docker-Host an und lege mit ln -s /srv/docker/nextcloud/nextcloud.nginx.conf /etc/nginx/sites-enabled/nextcloud.meine-schule.de den Link an.

So, jetzt musst du nur noch mit systemctl restart nginx.service nginx neu starten.

Prüfe noch, welche Ports nun genutzt werden. Gebe dazu den Befehl netstat -tulp an.

Nextcloud mit docker-compose einrichten und starten

Jetzt musst du nur noch drei Dateien angelegen, die docker-compose sagen, was es machen soll.

Alles was wir jetzt machen, spielt sich im Verzeichnis /srv/docker/nextcloud ab. Später werden auch dort sämtliche Daten liegen. Für eine Datensicherung musst du nur dieses Verzeichnis sichern.

Melde dich wieder als root auf dem Docker-Host an und gehe mit cd /srv/docker/nextcloud in das Verzeichnis /srv/docker/nextcloud.

Die Datei Dockerfile

FROM nextcloud:stable
RUN apt-get update && apt-get install -y smbclient libsmbclient-dev imagemagick libmagickcore-6.q16-6-extra php-imagick && pecl install smbclient && docker-php-ext-enable smbclient && rm -rf /var/lib/apt/lists/*

Wenn du experimentierfreudig bist, kannst du statt stable auch latest schreiben.

Mit der zweiten Zeile werden die Vorbereitungen für die Einbindungen der Home-Verzeichnisse (Samba-Shares) durchgeführt.

Die Datei db.env

MYSQL_ROOT_PASSWORD=geheim
MYSQL_PASSWORD=geheim
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud

Hier sind die Zugangsdaten für die Datenbank hinterlegt.

Die Datei docker-compose.yml

  version: '3'

services:
  db2:
    image: mariadb
    command: --transaction-isolation=READ-COMMITTED --binlog-format=ROW
    restart: always
    volumes:
      - ./db:/var/lib/mysql
    env_file:
      - db.env

  redis2:
    image: redis:alpine
    restart: always

  app2:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    ports:
      - 7771:80
    volumes:
      - ./nextcloud:/var/www/html
    environment:
      - MYSQL_HOST=db2
      - REDIS_HOST=redis2
    env_file:
      - db.env
    depends_on:
      - db2
      - redis2

  cron2:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    volumes:
      - ./nextcloud:/var/www/html
    entrypoint: /cron.sh
    depends_on:
      - db2
      - redis2

volumes:
  db:
  nextcloud:

In der Datei docker-compose.yml werden die Services deiner Nextcloud beschrieben.

Das Verzeichnis /var/www/html des Webservers wird unter dem Verzeichnis /srv/docker/nextcloud/nextcloud auf dem Docker-Host abgelegt. Und das Datenverzeichnis /var/lib/mysql der Maria Datenbank wird unter dem Verzeichnis /srv/docker/nextcloud/db auf dem Docker-Host abgelegt.

Sollte für nginx noch eine default.conf aktiv sein, so findet sich diese im Verzeichnis /srv/docker/nextcloud als symbolischer Link. Diesen kannst Du löschen und nginx wie zuvor neu starten.

Damit sind alle Daten im Verzeichnis /srv/docker/nextcloud.

Wenn du im Verzeichnis /srv/docker/nextcloud bist, startest du die Nextcloud mit docker-compose up -d --build.

Jetzt must du mit einem Browser die Startseite https://nextcloud.meine-schule.de deiner neuen Nextcloud aufrufen und einen Benutzernamen und ein Passwort für den Nextcloud-admin angeben.

Server - Einstellungen

Nextcloud-App: Einstellungen

Da die Nextcloud hinter dem nginx-Proxy liegt und nicht weiß, ob die Benutzer die Nextcloud über http oder https aufrufen, wird eine Anmeldung über eine Nextcloud-Client-App scheitern. Mit einem Eintrag in /srv/docker/nextcloud/nextcloud/config/config.php kannst du das Problem lösen:

...
  'ldapProviderFactory' => 'OCA\\User_LDAP\\LDAPProviderFactory',
  # Das ist der Eintrag ########################
  'overwriteprotocol' => 'https',
  ##############################################
);

Nextcloud: Hinweise config.php

Melde dich an der Nextcloud als admin an und wähle links unter Verwaltung -> Übersicht aus. Es erscheinen ggf. Sicherheits- & Einrichtungswarnungen.

Solltest du hier einen Hinweis auf eine fehlende default phone region sehen, so kannst du in der config.hphp den Eintrag 'default_phone_region' => 'DE', ergänzen.

Nachstehendes Code-Beispiel der Datei /srv/docker/nextcloud/nextcloud/config/config.php zeigt, wo dieser Eintrag neben anderen Ergänzungen plaziert werden kann.

 'htaccess.RewriteBase' => '/',
'memcache.local' => '\\OC\\Memcache\\APCu',
'auth.bruteforce.protection.enabled' => true,
'blacklisted_files' =>
array (
  0 => '.htaccess',
  1 => 'Thumbs.db',
  2 => 'thumbs.db',
),
'cron_log' => true,
'default_phone_region' => 'DE',
'enable_previews' => true,
'enabledPreviewProviders' =>
array (
  0 => 'OC\\Preview\\PNG',
  1 => 'OC\\Preview\\JPEG',
  2 => 'OC\\Preview\\GIF',
  3 => 'OC\\Preview\\BMP',
  4 => 'OC\\Preview\\XBitmap',
  5 => 'OC\\Preview\\Movie',
  6 => 'OC\\Preview\\PDF',
  7 => 'OC\\Preview\\MP3',
  8 => 'OC\\Preview\\TXT',
  9 => 'OC\\Preview\\MarkDown',
),
'filesystem_check_changes' => 0,
'filelocking.enabled' => 'true',
'filelocking.ttl' => 3600,
'integrity.check.disabled' => false,
'apps_paths' =>
 ...

Danach ist der Docker-Container erneut zu starten: