Eine Anmerkung zum Tutorial: Wir ermutigen unsere Benutzer, Tutorials auszuprobieren, aber sie werden nicht vollständig von unserem Team unterstützt – wir können nicht immer Unterstützung bieten, wenn etwas schief läuft. Prüfe unbedingt, mit welchem Betriebssystem und welcher Version es getestet wurde, bevor du weitermachst.

In diesem Tutorial schauen wir uns an, wie wir Nextcloud zusammen mit einem Nginx Reverse Proxy und Let’s Encrypt SSL in einer CentOS 7 dockerisierten Umgebung installieren.

Was ist Nextcloud?

NextCloud ist eine kostenlose Open Source Cloud-Software für die verschlüsselte Speicherung von Daten in einer Cloud oder auf eigenen Servern. Nextcloud ist eine Alternative zu Cloud-Speichern wie Dropbox, Google Drive und OneDrive und wurde erstmals im Jahr 2016 als ein Fork der Owncloud Cloud-Software veröffentlicht.

Wenn du dir Sorgen um deine Privatsphäre machst, kannst du zu NextCloud wechseln, die du auf deinem privaten Heimserver oder auf einem Virtual Private Server (VPS) installieren kannst. Die Dateien kann man via Nextcloud auf den Server hochladen und dann mit dem Desktop-Computer, Laptop oder Smartphone synchronisieren. Auf diese Weise hast du die volle Kontrolle über deine Daten.

NextCloud Besonderheiten

  • Kostenlos und OpenSource
  • End-to-End-Verschlüsselung, d.h. Dateien können auf dem Client-Gerät verschlüsselt werden, bevor sie auf den Server hochgeladen werden, so dass selbst wenn jemand deinen Server stiehlt, kann er deine Dateien nicht sehen.
  • Kann mit einer Online-Office-Suite (Collobora, OnlyOffice) integriert werden, so dass du deine Doc-, ppt- und xls-Dateien direkt aus NextCloud erstellen und bearbeiten kannst.
  • Der App Store enthält hunderte von Apps zur Erweiterung der Funktionalität (wie Kalender-App, Notizen- und Videokonferenz-App, etc.).
  • Die Sync-Clients sind für Linux, MacOS, Windows, iOS und Android verfügbar.

Nextcloud + Docker: Voraussetzungen

  • A VPS running CentOS 7.
  • A working Docker installation

Schritt 1: Installation von Docker und Docker Compose

Die neueste Version des Docker CE ist nicht im CentOS 7 Repository verfügbar. Daher müssen wir das Docker CE Repository mit dem folgenden Befehl hinzufügen:

sudo yum update
wget https://download.docker.com/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker.repo

Dann führen wir den folgenden Befehl aus, um Docker CE zu installieren:

sudo yum install docker-ce –y

Nach der Installation starten wir den Docker-Dienst und ermöglichen den Start während des Systemstarts.

sudo systemctl start docker
sudo systemctl enable docker

Um das neueste Docker-Compose mit dem Python-Befehl pip zu installieren, führen wir die folgenden Befehle im Terminal aus:

sudo yum install epel-release
sudo yum install python-pip
sudo pip install docker-compose

Schritt 2: Nextcloud installieren

Bevor wir mit der Definition von Diensten in der Datei docker-compose.yml beginnen, erstellen wir ein Netzwerk, damit die Container kommunizieren können. Dazu führen wir den folgenden Befehl im Terminal aus:

docker network create nextcloud_network

Da wir Nextcloud zusammen mit anderen damit verbundenen Containern containerisieren wollen, werden wir alle Dienste in der Datei docker-compose.yml inkrementell definieren und zusammenfügen.

Für dieses Tutorial werden wir die Dienste einzeln definieren, beginnend mit dem Nginx Reverse-Proxy:

  • Nginx reverse proxy
  • Let’s Encrypt
  • MariaDB
  • Nextcloud

Zuerst erstellen wir die Docker-Compose-Datei, in der wir alle Dienste definieren werden.

nano docker-compose.yml

Schritt 3: Konfiguration des Nginx Reverse-Proxy-Containers

In der soeben erstellten Datei, fügen wir folgendes ein:

version: '3'  

services:

  proxy:
    image: jwilder/nginx-proxy:alpine
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
    container_name: nextcloud-proxy
    networks:
      - nextcloud_network
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./proxy/conf.d:/etc/nginx/conf.d:rw
      - ./proxy/vhost.d:/etc/nginx/vhost.d:rw
      - ./proxy/html:/usr/share/nginx/html:rw
      - ./proxy/certs:/etc/nginx/certs:ro
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: unless-stopped

Schauen wir uns die Konfiguration, die in der obigen docker-compose.yml Datei erstellt wurde, im Detail an. Der Dienst für den Proxy verwendet das Image von jwilder/nginx-proxy.

Die Bezeichnung „com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy“ wird verwendet, damit der Let’s Encrypt-Container weiß, welcher nginx-Proxy-Container für die Zertifikatsgenerierung zu verwenden ist.

Dann gibt es ein Netzwerk mit dem Namen nextcloud_network, das von den Containern zur Kommunikation untereinander genutzt wird.

Der Abschnitt Volumes wird vom Container verwendet, um den virtuellen Host Nginx zu konfigurieren und um auf die Zertifikate zuzugreifen, die vom Let’s Encrypt Companion Container generiert werden.

Die /etc/localtime:/etc/localtime:ro wird verwendet, um die Host-Zeitzone innerhalb des Containers zu duplizieren.

Schritt 4: Konfiguration des Let’s Encrypt Containers

Nun, da wir den nginx-proxy Container eingerichtet haben, können wir das folgende in die Datei docker-compose.yml einfügen.

letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nextcloud-letsencrypt
    depends_on:
      - proxy
    networks:
      - nextcloud_network
    volumes:
      - ./proxy/certs:/etc/nginx/certs:rw
      - ./proxy/vhost.d:/etc/nginx/vhost.d:rw
      - ./proxy/html:/usr/share/nginx/html:rw
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: unless-stopped

Der Lets‘ Encrypt Container hängt von unserem ersten Dienst (Proxy) ab und ist ein Teil des Netzwerkes nextcloud_network.

Der restart: unless-stopped erlaubt es, die Container zu stoppen, es sei denn, wir führen manuell docker stop letsencrypt oder docker-compose down letsencrypt aus.

Schritt 5: Konfiguration des MariaDB-Containers

Damit Nextcloud korrekt funktioniert, müssen wir die Verbindung zu einer MariaDB Datenbank herstellen. Glücklicherweise können wir das auch zu unserer docker-compose.yml Datei hinzufügen:

db:
    image: mariadb
    container_name: nextcloud-mariadb
    networks:
      - nextcloud_network
    volumes:
      - db:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MYSQL_ROOT_PASSWORD=secret
      - MYSQL_PASSWORD=mysql
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    restart: unless-stopped

Der Servicebereich für MariaDB ist ziemlich selbsterklärend. Dieser Container ist auch Teil des Netzwerkes nextcloud_network. Wir haben auch die Umgebungsvariable für den Datenbanknamen, den Benutzernamen und das Passwort definiert, die Nextcloud verwendet, um sich mit der Datenbank zu verbinden.

Schritt 6: Konfiguration des Nextcloud Docker-Containers

Wir sind endlich soweit, den Nextcloud Docker Container in unserer docker-compose.yml Datei zu erstellen. Fügen wir folgendes am Ende der Datei hinzu.

app:
    image: nextcloud:latest
    container_name: nextcloud-app
    networks:
      - nextcloud_network
    depends_on:
      - letsencrypt
      - proxy
      - db
    volumes:
      - nextcloud:/var/www/html
      - ./app/config:/var/www/html/config
      - ./app/custom_apps:/var/www/html/custom_apps
      - ./app/data:/var/www/html/data
      - ./app/themes:/var/www/html/themes
      - /etc/localtime:/etc/localtime:ro
    environment:
      - VIRTUAL_HOST=nextcloud.YOUR-DOMAIN
      - LETSENCRYPT_HOST=nextcloud.YOUR-DOMAIN
      - LETSENCRYPT_EMAIL=YOUR-EMAIL
    restart: unless-stopped

Der nextcloud Service hängt von den anderen drei Containern ab. Um die Daten von Nextcloud während des Upgrades persistent zu machen und Zugriff auf Backups zu erhalten, verwenden wir ein Docker-Volume namens nextcloud, ähnlich wie wir ein Docker-Volume namens db für die MariaDB-Daten verwendet haben.

Hier haben wir in den Umgebungsvariablen VIRTUAL_HOST, LETSENCRYPT_HOST und LETSENCRYPT_EMAIL den virtuellen Host, Let’s Encrypt host, bzw. E-Mail definiert.

Der Proxy-Dienst erstellt die Subdomäne und verschlüsselt sie mit Let’s Encrypt-Zertifikaten für den Container, sofern wir eine gültige Domain und eine gültige E-Mail für diese drei Umgebungsvariablen angeben.

Zuletzt benötigen wir sowohl für Nextcloud als auch für MariaDB definierte Volumes für die Datenpersistenz, gefolgt von Netzwerken.

volumes:
  nextcloud:
  db:

networks:
  nextcloud_network:

Nachdem wir alle Dienstdefinitionen kombiniert haben, sollte die endgültige docker-compose.yml wie folgt aussehen:

version: '3' 

services:

  proxy:
    image: jwilder/nginx-proxy:alpine
    labels:
      - "com.github.jrcs.letsencrypt_nginx_proxy_companion.nginx_proxy=true"
    container_name: nextcloud-proxy
    networks:
      - nextcloud_network
    ports:
      - 80:80
      - 443:443
    volumes:
      - ./proxy/conf.d:/etc/nginx/conf.d:rw
      - ./proxy/vhost.d:/etc/nginx/vhost.d:rw
      - ./proxy/html:/usr/share/nginx/html:rw
      - ./proxy/certs:/etc/nginx/certs:ro
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/tmp/docker.sock:ro
    restart: unless-stopped
  
  letsencrypt:
    image: jrcs/letsencrypt-nginx-proxy-companion
    container_name: nextcloud-letsencrypt
    depends_on:
      - proxy
    networks:
      - nextcloud_network
    volumes:
      - ./proxy/certs:/etc/nginx/certs:rw
      - ./proxy/vhost.d:/etc/nginx/vhost.d:rw
      - ./proxy/html:/usr/share/nginx/html:rw
      - /etc/localtime:/etc/localtime:ro
      - /var/run/docker.sock:/var/run/docker.sock:ro
    restart: unless-stopped

  db:
    image: mariadb
    container_name: nextcloud-mariadb
    networks:
      - nextcloud_network
    volumes:
      - db:/var/lib/mysql
      - /etc/localtime:/etc/localtime:ro
    environment:
      - MYSQL_ROOT_PASSWORD=toor
      - MYSQL_PASSWORD=mysql
      - MYSQL_DATABASE=nextcloud
      - MYSQL_USER=nextcloud
    restart: unless-stopped
  
  app:
    image: nextcloud:latest
    container_name: nextcloud-app
    networks:
      - nextcloud_network
    depends_on:
      - letsencrypt
      - proxy
      - db
    volumes:
      - nextcloud:/var/www/html
      - ./app/config:/var/www/html/config
      - ./app/custom_apps:/var/www/html/custom_apps
      - ./app/data:/var/www/html/data
      - ./app/themes:/var/www/html/themes
      - /etc/localtime:/etc/localtime:ro
    environment:
      - VIRTUAL_HOST=nextcloud.YOUR-DOMAIN
      - LETSENCRYPT_HOST=nextcloud.YOUR-DOMAIN
      - LETSENCRYPT_EMAIL=YOUR-EMAIL
    restart: unless-stopped

volumes:
  nextcloud:
  db:

networks:
  nextcloud_network:

Schritt 7: Bringen wir alles zum Laufen!

Lassen wir nun den Docker-Compose vom Terminal aus ausführen, um die Container zu erstellen:

docker-compose up -d
Creating nextcloud-mariadb ... done
Creating nextcloud-proxy   ... done
Creating nextcloud-letsencrypt ... done
Creating nextcloud-app         ... done

Um zu überprüfen, ob alle Container laufen, geben wir folgenden Befehl ein:

$ docker ps -a
CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS              PORTS                                      NAMES
92222232c4be        nextcloud:latest                         "/entrypoint.sh apac…"   9 minutes ago       Up 9 minutes        80/tcp                                     nextcloud-app
89e96fe10ee6        jrcs/letsencrypt-nginx-proxy-companion   "/bin/bash /app/entr…"   9 minutes ago       Up 9 minutes                                                   nextcloud-letsencrypt
d059517f519c        jwilder/nginx-proxy:alpine               "/app/docker-entrypo…"   9 minutes ago       Up 9 minutes        0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   nextcloud-proxy
7e0945eb6608        mariadb                                  "docker-entrypoint.s…"   9 minutes ago       Up 9 minutes        3306/tcp                                   nextcloud-mariadb

Warten wir eine Minute, bis der Prozess der SSL-Zertifikatsgenerierung abgeschlossen ist, und laden dann den von uns gewählten Domainnamen in unserem Browser.

Wir geben den gewählten Admin-Benutzernamen und das Passwort ein und wählen MySQL als Datenbank in der Sektion Datenbank.

Wir geben den Benutzernamen, das Passwort und den Datenbanknamen ein, den wir über die Umgebungsvariablen MYSQL_USER, MYSQL_PASSWORD und MYSQL_DATABASE konfiguriert haben. Ändern den Wert des Hostnamens von localhost in db und klicken auf Finish Setup. Das System leitet uns dann zum Dashboard von Nextcloud weiter.

Jetzt können wir Dateien und Fotos auf unser eigenes Laufwerk auf unserem VPS hochladen und sie mit anderen teilen.

Um die Funktionalität des Nextcloud-Servers zu erweitern, können wir nun eine beliebige Anzahl der verfügbaren Apps, wie z.B. Lesezeichen, Kalender, Kontakte, Aufgaben, Notizen und mehr, die im Nextcloud App Store verfügbar sind, installieren.

Die Containerisierung von Nextcloud mit Docker ist nun abgeschlossen!