Lesedauer 2 Minuten
5
(1)

Die Tage habe ich es geschafft, meine Nextcloud Instanz komplett in einen Docker Container, um zu ziehen. Als erstes komplettes Datenbank Backup gemacht.

Aktualität der Anleitung: 25.11.2021

Backup der Datenbank erstellen

sudo mysqldump –uroot –p nextcloud_db.sql > backup.sql

Als nächstes habe ich Docker–compose  installiert und eingerichtet.

Docker-compose und Nextcloud einrichten

sudo curl -L "https://github.com/docker/compose/releases/download/1.24.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
docker-compose --version

Dann habe ich ein Verzeichnis eingerichtet wo die zukünftige Konfiguration der Cloud abgespeichert wird.

cd /opt && sudo git clone https://github.com/Happyfeet01/Nextcloud-Docker && cd Nextcloud-Docker

Datenbank Passwort setzen

sudo vi db.env

Diese wird folgende Konfiguration wird rein geschrieben.

MYSQL_PASSWORD=passwort ändern # < -- abändern!
MYSQL_DATABASE=nextcloud
MYSQL_USER=nextcloud

Alle benötigten Ordner usw. werden automatisch erstellt sobald die Container erstellt werden.

<code>sudo docker-compose up –d</code>

Alles sollte nun laufen.

Nginx Konfiguration erstellen

sudo /etc/nginx/sites–available/cloud.domain.tld
server {
    server_name cloud.domain.tld;
    root /dev/null;
    index index.html;
    location / {
        proxy_pass http://localhost:9024/;
        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";
        client_max_body_size 0;
        access_log /var/log/nginx/nextcloud.access.log;
        error_log /var/log/nginx/nextcloud.error.log;
    }
    location /.well-known/carddav {
      return 301 $scheme://$host/remote.php/dav;
    }
    location /.well-known/caldav {
      return 301 $scheme://$host/remote.php/dav;
    }
    listen [::]:443 ssl http2; # managed by Certbot
    listen 443 ssl http2; # managed by Certbot
    ssl_certificate /etc/letsencrypt/live/cloud.domain.tld/fullchain.pem; # managed by Certbot
    ssl_certificate_key /etc/letsencrypt/live/cloud.domain.tld/privkey.pem; # managed by Certbot
    ssl_trusted_certificate /etc/letsencrypt/live/cloud.domain.tld/chain.pem;
    #include /etc/nginx/snippets/ssl.conf;
}
server {
    if ($host = cloud.domain.tld) {
        return 301 https://$host$request_uri;
    } # managed by Certbot
        listen 80;
        listen [::]:80;
        server_name cloud.domain.tld;
    return 404; # managed by Certbot
}

Als nächstes werden die Zertifikate erstellt, die wir für die Seite genötigen

Zertifikate erstellen

sudo certbot –certonly –d cloud.domain.tld
sudo service nginx reload

Jetzt sollte alles passen und laufen.

Um nun die Datenbank wieder zurückzuspielen benutzen wir folgendes Kommando.

 cat /home/backup/mysqldump/cloud.sql | docker exec -i nextcloud_app_1 mysql -unextcloud –p SecretPassword nextcloud

Das zurück spielen wird je nach Größe der datenbank etwas dauern, aber dann sollte alles wieder funktionieren. Wenn nicht schreibt es in die Kommentare.

NGinx config für Collabora

server {
    listen                  443 ssl http2;
    listen                  [::]:443 ssl http2;
    server_name             office.domain.tld;
        # SSL
    ssl_certificate         /etc/letsencrypt/live/office.domain.tld/fullchain.pem;
    ssl_certificate_key     /etc/letsencrypt/live/office.domain.tld/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/office.domain.tld/chain.pem;
    access_log /var/log/nginx/office.domain.tld.access_log;
    error_log /var/log/nginx/office.domain.tld.error_log info;
    # static files
    location ^~ /loleaflet {
        proxy_pass http://localhost:9980;
        proxy_set_header Host $http_host;
    }
    # WOPI discovery URL
    location ^~ /hosting {
        proxy_pass http://localhost:9980;
        proxy_set_header Host $http_host;
    }
   # main websocket
   location ~ ^/lool/(.*)/ws$ {
       proxy_pass http://localhost:9980;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "Upgrade";
       proxy_set_header Host $http_host;
       proxy_read_timeout 36000s;
   }

   # download, presentation and image upload
   location ~ ^/lool {
       proxy_pass http://localhost:9980;
       proxy_set_header Host $http_host;
   }

   # Admin Console websocket
   location ^~ /lool/adminws {
       proxy_pass http://localhost:9980;
       proxy_set_header Upgrade $http_upgrade;
       proxy_set_header Connection "Upgrade";
       proxy_set_header Host $http_host;
       proxy_read_timeout 36000s;
   }

   # Capabilities
   location ^~ /hosting/capabilities {
       proxy_pass http://localhost:9980;
       proxy_set_header Host $http_host;
   }
}
# HTTP redirect
server {
    listen      80;
    listen      [::]:80;
    server_name .office.domain.tld;
    location / {
        return 301 https://office.domain.tld$request_uri;
    }
}

Cronjob einrichten

Der Cron-Daemon dient der zeitbasierten Ausführung von Prozessen in Unix und unixartigen Betriebssystemen wie Linux, BSD oder macOS, um wiederkehrende Aufgaben – Cronjobs – zu automatisieren. Häufig führt der Cron-Daemon regelmäßig Computerprogramme für die Instandhaltung des Systems aus, üblicherweise auf Serversystemen, welche rund um die Uhr laufen.

Dies hab im Crontab für den Root User:

@hourly  docker exec -u33 nextcloud_app_1 php -f occ news:updater:update-feed <User>
@daily docker exec -u33 nextcloud_app_1 php -f  occ maps:scan-photos
@daily docker exec -u33 nextcloud_app_1 php -f  occ files:scan --all
@daily docker exec -u33 nextcloud_app_1 php -f  occ music:scan --all
@weekly docker exec -u33 nextcloud_app_1 php -f  occ versions:cleanup

Wie hilfreich war dieser Beitrag?

Klicke auf die Sterne um zu bewerten!

Durchschnittliche Bewertung 5 / 5. Anzahl Bewertungen: 1

Bisher keine Bewertungen! Sei der Erste, der diesen Beitrag bewertet.

lars

By lars

0 thoughts on “Umzug vom Nextcloud Server in einen Docker Container”
  1. Hallo Lars,
    eine beeindruckende Installation auf minimalem Weg!

    Ich versuche verzweifelt Nextcloud (mit allen Funktionen) in einen Docker zu kriegen,
    aber scheitere daran die Container untereinander kommunizieren zu lassen. D.h. NC kommt nicht mal zur (Maria)DB, egal ob ich die DB in der Bridge oder lokal auf dem Host installiere.
    Werde deine Variante dazu mal ausprobieren!

    Was ich bei deiner Installation jedoch nicht verstehe:
    – Wie spreche ich NC von außen an? Über Port 8090 ?
    – Wie funktioniert das dann mit dem Https ? (Geht ja schlecht über Port 80)

    Kann man das Ganze auch mit Apache gestalten, oder warum nimmst du nginx ?

    -> Wenn du mir jetzt noch zeigen kannst, wie ich nen Turn-Server (für Talk) sauber in den Docker bekomme (der muss aber glaube auch von außen erreichbar sein), wär ich überglücklich!

    VG Daniel

    1. Moin, danke erstmal für den Kommentar. Die verschiedenen Container haben über Networks Zugriff auf andere Container. z.B.:
      networks:
      – nextcloud-pro_network

      Alle Container wie auch Redis, Turnserver etc. müssen in dem gleichen Netzwerk sein.
      Über Ports wird die Cloud angesprochen kannst auch anstatt 8090:80 4443:443 nehmen dann geht alles über https. Ich hab allerdings 8090 und Nginx als Reverse Proxy eingerichtet.

      Hab allerdings ein selber erstelltes Nextcloud Image, wo der Turnserver und Aria2c direkt mit drin sind. Will das aber noch ändern.

      1. Ok, das mit dem Reverse-Proxy bekomme ich hin. Dann ist „proxy_pass http://localhost:8090/;“ also deine interne Weiterleitung zum NC-Container über 8090 (ohne SSL). Mir wäre es lieber die IP des Docker Containers „direkt“ anzusprechen (zB 172.17.0.2), ohne dass es im lokalen Netzwerk die Möglichkeit gibt „am Reverse-Proxy vorbei“ auf NC zuzugreifen.

        Das mit den: networks: – nextcloud-pro_network …ist mir zu hoch! Ich habe mit Bridge/Host und MACVLAN experimentiert, aber Container zu Container untereinander oder auch Container zu Serverhost (auch bei MACVLAN) bekomme ich nicht hin! Das liegt wohl an der Route in den IP-Tables des Systems. Das im Server und im Docker „dauerhaft“ (nach reboot) zu ändern bekomme ich nicht hin. Warum sieht dann deine Lösung mit „Networks“ so einfach aus? (Kann das nicht nachvollziehen.)

        Wie installiere ich den Turnserver, dass er von dem NC-Container, sowohl auch „extern“ erreichbar ist? (Mit einem 2. Reverse-Proxy Eintrag oder Container als „Host“ definieren?)

        VG Daniel

Schreibe einen Kommentar

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

Cookie Consent mit Real Cookie Banner