Rohedaten Blog     Über     Archiv     Hilfe     Feed

Update von Owncloud zu Nextcloud im Docker-Container, MySQL und LDAP auf dem Host

Lange Zeit betrieb ich auf meinem CentOS 7-Server Owncloud aus den EPEL-Repositories. Da hier nun allerdings aufgrund der alten PHP-Version 5.4 das Handtuch geworfen wurde, musste ich mich nach Alternativen umsehen. Da noch andere Komponenten auf dem Server PHP verwenden, hatte ich nicht die Option, einfach auf eine neuere PHP-Version umzusteigen, da hieraus sicher Probleme mit Abhängigkeiten resultiert hätten.

Nach etwas Recherche stieß ich auf ein Docker-Image von Nextcloud. Vorteilhaft dabei ist, dass, sofern die Daten außerhalb des Images gespeichert werden, das Updaten sehr einfach ist. Man muss dann nur das alte Image löschen, das neue laden und starten. Anschließend einfach wie gewohnt mittels occ update das Update anstoßen.

Ich möchte also ein Update von Owncloud zur Nextcloud im Docker-Container. Nutzerdaten und Shares sollen übernommen werden, die Datenbank und Authentifizierung sollen weiterhin auf dem Host via MariaDB bzw. LDAP laufen.

Um einem validen Update-Pfad zu folgen müssen wir erst auf Nextcloud 11 updaten, und können von dieser dann zur 12.

Spezifikation des Docker-Containers

Um die Argumente zum Start des Docker-Containers zu übergeben, nutzen wir docker-compose. Wir erstellen irgendwo auf dem System, ich habe mich für den Ordner opt entschieden, einen Ordner nextcloud. In diesem legen wir die Datei docker-compose.yml mit folgendem Inhalt an:

version: '2'
services:
  app:  
    image: nextcloud:11
    volumes:
      - /var/lib/nextcloud/data:/var/www/html/data
      - /var/lib/nextcloud/apps:/var/www/html/apps
      - /etc/nextcloud:/var/www/html/config
    ports:
      - 8080:80
    extra_hosts:
      - "host:192.168.0.1"
    restart: always
    networks:
      - dockernet
    container_name: nextcloud
networks:
    dockernet:
        external: true

Diese spezifiziert, dass wir einen Docker Container basierend auf dem Nextcloud 11 Image haben möchten. Untervolumes geben wir an, wo das von Owncloud bereits genutzte Verzeichnis für die Nutzerdaten und die Konfiguration zu finden ist.

ports gibt an, dass Port 80 des Containers auf Port 8080 des Hosts weitergeleitet werden soll. networks gibt das Netzwerk an, über das wir mit der Datenbank und dem LDAP-Server auf dem Host kommunizieren. Dieses legen wir noch mit Docker an:

docker network create -d bridge --subnet 192.168.0.0/24 --gateway 192.168.0.1 dockernet

Dieser Befehl legt eine neue Netzwerkschnittstelle an. Auf dem Host hat diese einen recht kryptischen Namen wie br-64ce773f68df. Um diesen herauszufinden können wir ip a bemühen. Dies wird potentiell das einzige Interface mit der Adresse 192.168.0.1 sein.

Firewall

Damit der Docker-Container über die eben angelegte Netzwerkschnittstelle mit der Datenbank und dem LDAP-Server kommunizieren kann, editieren wir noch die Firewall-Regeln:

firewall-cmd --permanent --zone=trusted --add-interface=br-64ce773f68df
firewall-cmd --reload

In der trusted Zone sind standardmäßig alle Ports offen.

Datenbank anpassen

Nun müssen wir noch dafür sorgen, dass sich Nextcloud auch mit der Datenbank auf dem Host verbindet. Die Datenbank findet man nicht mehr unter localhost, sondern unter dem in der docker-compose-Datei spezifizierten Hostnamen host. Dies ist entsprechend in die config.php von Nextcloud einzutragen.

MariaDB war weiterhin bei mir so eingestellt, dass nur lokale Benutzer akzeptiert wurden. Deshalb noch schnell die Nutzertabelle anpassen:

UPDATE mysql.user SET Host ='192.168.0.%' WHERE User like 'owncloud';

owncloud dabei an den Namen des Owncloud-Datenbankbenutzers anpassen.

Je nachdem kann es auch sein, dass MariaDB bis dato nur auf das lokale Netzwerkinterface gebindet ist. Dann muss man das noch in der my.cnf abändern.

Erreichbarkeit von außen

Wir möchten natürlich die Cloud nicht auf Port 8080 betreiben, sondern auf einer eigenen Subdomain. Hierzu lassen wir Apache einfach als Proxy fungieren, der dann auch gleich noch für TLS-Verschlüsselung sorgt.

<VirtualHost *:80>
  ServerName cloud.rohedaten.de
  RewriteEngine On
  RewriteRule ^/?(.*) https://%{SERVER_NAME}:443/$1 [R,L]
</VirtualHost>

<VirtualHost *:443>
  ServerName cloud.rohedaten.de
  ProxyPass / http://127.0.0.1:8080/ retry=0
  ProxyPassReverse / http://127.0.0.1:8080/
</VirtualHost>

Update von Owncloud 9 zu Nextcloud 11

Nachdem die ganze Vorarbeit geschehen ist, können wir Owncloud löschen und den Nextcloud-Container mittels docker-compose up starten.

Mit dem Browser schauen wir, ob alles erreichbar ist. Wenn alles geklappt hat, sollte der Update-Screen erscheinen und wir können entweder direkt über den Browser, oder aber den occ-Befehl updaten:

docker exec -i -t --user www-data nextcloud /bin/bash
php occ upgrade 

Update auf Nextcloud 12

Nach erfolgreichem Update auf Nextcloud 11, fahren wir den Container mit docker stop nextcloud herunter, und löschen ihn mit docker rm nextcloud. Anschließend ändern wir die Nextcloud-Version in der docker-compose.yml auf 12. Mit docker-compose pull ziehen wir das 12er Image und starten es mit docker-compose up. Dann machen wir einmal die Update-Prozedur durch und sind anschließend up to date.

Automatischer Start

Zu guter letzt, damit Nextcloud immer mit dem System startet, erstellen wir noch einen Systemd-Service (Dank an Kopfkrieg). In die Datei /etc/systemd/system/docker-container@.service schreiben wir folgendes:

[Unit]
Description=Docker Container %I
Requires=docker.service
After=docker.service

[Service]
Restart=always
ExecStart=/usr/bin/docker start -a %i
ExecStop=/usr/bin/docker stop -t 2 %i

[Install]
WantedBy=default.target

und starten das ganze mit (Davor natürlich den durch docker-compose gestarteten Container stoppen)

systemctl enable docker-container@nextcloud.service
systemctl start docker-container@nextcloud.service