Integration of collabora online on a Nextcloud behind NAT on a KVM hypervisor

This one had me struggle quite a bit.
I felt like this is something that cannot possibly be super hard to setup.
Before running Nextcloud in a VM I remember the setup to be quite trivial.

And once again it has proven to be true that there are only three networking issues. DNS DNS and DNS. But lets take a step back.

I am running a Nextcloud for my family and wanted to integrate collabora.

This is the How-To I used: https://www.linuxbabe.com/cloud-storage/integrate-collabora-online-server-nextcloud-ubuntu-16-04

Collabora, much like Google Docs or Office365, enables you to edit documents online in your browser. Collabora is a child of Libreoffice Online. The Idea is to still perform well even if 20 people or more are working on a document simultaneously.

The average collabora installation guide is using the collabora\code docker container. It expect you to run it in a "classical" nextcloud setup in wich the Apache or Nginx Server is run on the Aplication Layer of the Host Operating System of the Server.

In such a setup the docker container is running in the kernelspace of the host machine that is hooked up to the internet.

If we now add a layer of virtualisation things become a little more tricky.

The docker container is still running in the same kernelspace as the nextcloud instance. However the NAT is having some effects on the DNS resolution.

The docker container gets run using the hostname for the subdomain that will be used by the webserver for the rewrite rules interacting with the docker container.

sudo docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=nextcloud\\.your-domain\\.com' --restart always --cap-add MKNOD collabora/code

If we run this setup without nat, the docker container can resolve nextcloud.your-domain.com to 127.0.0.1.

Then the container can speak to the nextcloud using the loopback interface.
Behind a nat, this is not working.

A simple change does the trick.
We will have to edit the hosts file inside the docker conainer.

EDIT: Docker has a parameter to perform this task (since version 17) called --add-host. Using this option your changes wont be lost if the container restarts (e.g. if the host reboots). Lets say the IP of your Nextcloud behind the NAT is 192.168.122.10. Then you will have to start the container like this:

sudo docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=nextcloud\\.your-domain\\.com' --restart always --cap-add MKNOD --add-host=nextcloud.your-domain.com:192.168.122.10 --add-host=office.your-domain.com:192.168.122.10 collabora/code

General container debugging

EDIT: I will leave this bit in for general purpose docker container debugging.

Check docker ps -a to find the name the collabora docker container has been assigned. Then start a shell inside the container using docker exec -i -t <ContainerName> /bin/bash.

There we edit the /etc/hosts file and add two lines.
One for office.your-domain.com and one for nextcloud.your-domain.com. It worked best for me using the IP address of the virtual machine.

Beeing lazy I did run apt update and apt install vi to have an editor inside of the container. You could also just echo it into the hosts file.

Afterwards you also need to edit the /etc/hosts file of the VM.
To be able to properly communicate with the container I had to have office.your-domain.com resolve to 127.0.0.1 rather then my public IP.

Cheers,
Ori


Integration von Collabora Online auf einer Nextcloud hinter NAT auf KVM

Ich habe mir an diesem Thema etwas die Zähne ausgebissen.
Das kann doch nicht so schwer sein dachte ich mir.
Bevor ich Nextcloud virtualisiert habe erinnere ich daran, dass das Setup relativ trivial war.

Ich bin nach folgender Anleitung vorgegangen: https://www.linuxbabe.com/cloud-storage/integrate-collabora-online-server-nextcloud-ubuntu-16-04

Und wieder stellte sich heraus, es gibt nur drei Probleme im Netzwerk.
DNS, DNS und DNS. Aber treten wir einen Schritt zurück.

Ich betreibe eine Nextcloud für meine Familie und wollte dort Collabora Einrichten.

Collabora ermöglicht es, ähnlich wie Google Docs oder Office365, Dokumente online im Browser zu editieren. Vater des Kindes ist Libreoffice Online. Collabora hat zum Ziel auch dann noch gut zu performen, wenn es mehr als 20 Personen Zeitgleich nutzen.

Die standart Collabora Installationsanleitung ist darauf ausgelegt, dass Collabora als Docker Container läuft. Es wird von einem "Klassischen" Nextcloud setup ausgegangen, bei dem der Apache oder Nginx Webserver "Bare Metal" also direkt in der Anwendungsschicht des Hostbetriebssytems läuft.

Bei so einem Setup würde der Docker Container dann im Kernelspace des Hosts laufen.

Wenn wir jetzt allerdings eine Virtualisierungsschicht hinzufügen wird das ganze etwas komplexer.

Es läuft zwar noch immer der Docker Container im gleichen Kernelspace wie die Nextcloud Instanz, allerdings hat das NAT besondere Auswirkungen auf die DNS Auflösung.

Der Container wird mit dem Hostname der Subdomain für die Collabora Instanz gestartet.

sudo docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=nextcloud\\.your-domain\\.com' --restart always --cap-add MKNOD collabora/code

Wenn wir dies im Setup ohne NAT ausführen, kann der Docker Container nextcloud.your-domain.com zu 127.0.0.1 auflösen.

Dann kann der Container über die Loopbackaddresse mit der Nextcloud Instanz sprechen. Hinter dem NAT kann er dies allerdings nicht umsetzen.

Eine mögliche Lösung ist es, die Hosts Datei des Docker Containers um eine statische IP Addresse zu erweitern.

EDIT: Docker bietet (seit Version 17) eine Funktion an um dies zu erledigen. Sie nennt sich --add-host. So gehen die Einstellungen auch bei Neustart des Containers (z.b. durch Neustart des Hosts) nicht verloren. Sagen wir die IP eurer Nextcloud hinter dem NAT ist 192.168.122.10. Somit müsst ihr den Container folgendermaßen starten:

sudo docker run -t -d -p 127.0.0.1:9980:9980 -e 'domain=nextcloud\\.your-domain\\.com' --restart always --cap-add MKNOD --add-host=nextcloud.your-domain.com:192.168.122.10 --add-host=office.your-domain.com:192.168.122.10 collabora/code

Generelles Container-debugging

EDIT: Ich lasse diesen Teil mal als generellen Container Debugging Teil in dem Artikel.

Geht auf die Maschine mit dem Docker Container und startet eine bash innerhalb des Containers.

Mit docker ps -a schauen wir uns an, welchen Namen der Container hat.
Anschließend starten wir mit docker exec -i -t <ContainerName> /bin/bash innerhalb des Containers eine shell. Dort editieren wir dann die /etc/hosts datei. Tragt office.your-domain.com und nextcloud.your-domain.com jeweils die IP Adresse der Virtuellen Maschine ein.

Ich habe mir der faulheit halber einfach mit apt update und apt install vi einen Texteditor hierzu im Container nachinstalliert. Ihr könnt es natürlich auch rein echoen.

Anschließend solltet Ihr noch die /etc/hosts datei der VM editieren.
Damit Ihr direkt mit dem Container sprecht, solltet Ihr office.your-domain.com direkt gegen 127.0.0.1 auflösen lassen.

Dann klappts auch mit den Nachbarn.

Cheers,
Ori


Nextcloud mit OCC updaten

UPDATE November 2019: occ ist aktuell nicht mit php 7.3 kompatibel. Nehmt php7.1 oder fügt der einfachheit halber folgendes eurer .bashrc hinzu: alias occ='sudo -u www-data php7.1 /var/www/html/occ'

In diesem Artikel möchte ich kurz zeigen, wie man eine NextCloud mit OCC updaten kann.
Ich möchte natürlich zunächst mal auf den Update Atikel und den OCC Artikel von NextCloud verweisen.

OCC hat im Namen noch den Ursprung von Nextcloud und steht für Own Cloud Console.
Es ist ein PHP Script welches euch ermöglicht auf der Kommandozeile diverse Aktionen in der Nextcloud auszuführen.

So auch das einspielen von Updates.
Zunächst solltet Ihr schauen wo sich euer occ script befindet, es sollte in eurem Nextcloud base directory sein.

Bei mir liegt es unter /var/www/nextcloud/

Schauen wir erstmal auf welcher Version wir uns aktuell befinden.
Mit sudo -u führen wir php aus und starten mit php das script /var/www/nextcloud/occ mit dem Parameter -V

sudo -u www-data php /var/www/nextcloud/occ -V

Eine man page gibt es leider nicht, aber mit occ -h bekommt ihr einen help dialog angezeigt.
occ list gibt euch eine liste der verfügbaren befehle.

Da diese liste ziemlich lang ist, spare ich mir hier mal einen ai

Hier sehen wir, dass die Nextcloud "Begleitschafe" auf der Version 14.0.0 läuft.
Als nächstes wollen wir die Nextcloud in den maintenance mode versetzen.
Dies stoppt alle Apps die auf der Nextcloud laufen und bereitet sie für ein update vor.

Jetzt ladet mit wget das die aktuelle Version von Nextcloud herunter.
Aktuell ist das bei mir Nexcloud 15.0.5. Das könnt ihr einfach prüfen, wenn Ihr schaut, welches file euch Nextcloud grade als Server Image zum Download anbietet.

wget https://download.nextcloud.com/server/releases/nextcloud-15.0.5.zip

Komfortabler weise, könnt Ihr aber auch einfach ein wget auf das latest.zip file machen.

wget https://download.nextcloud.com/server/releases/latest.zip

Und wenn wir jetzt mal ein md5sum über beide files machen, sehen wir, dass sie identisch sind.

Entpackt das Verzeichnis jetzt irgendwohin, wo euer aktuelles nextcloud verzeichnis nicht liegt.

unzip nextcloud.zip

Stoppt jetzt euren Webserver.

Apache
sudo service apache2 stop

Nginx
sudo service nginx stop

Anschließend benennt ihr euer aktuelles nextcloud Verzeichnis um.

sudo mv /var/www/nextcloud/ /var/www/nextcloud-old

Kopiert anschließend das entpackte nextcloud Verzeichnis an die Stelle des alten.

sudo mv /home/ori/nextcloud /var/www/nextcloud

Jetzt kopieren wir die config.php aus dem alten Verzeichnis in das neue.

sudo cp /var/www/nextcloud-old/config/config.php /var/www/nextcloud/config/config.php

Schaut euch jetzt in dieser config.php datei an, was bei der variable datadirectory geschrieben steht.
Falls sie sich in dem umbenannten Verzeichnis befand, verschiebt sie von /nextcloud-old nach /nextcloud.

Jetzt passen wir noch die Dateiberechtigungen an, so dass www-data (euer webserver) wieder mit /var/www/nextcloud arbeiten kann.

sudo chown -R www-data:www-data /var/www/nextcloud
sudo find /var/www/nextcloud/ -type d -exec chmod 750 {} \;
sudo find /var/www/nextcloud/ -type f -exec chmod 640 {} \;

Startet jetzt euren Webserver.

Apache
sudo service apache2 start

Nginx
sudo service nginx start

Jetzt könnt Ihr den eigentlichen Upgrade Prozess starten.

sudo -u www-data php /var/www/nextcloud/occ upgrade

Und anschließend sollte die Version auf dem aktuellen Stand sein.

Jetzt könnt Ihr euch wieder in der Cloud anmelden.

Einige Apps werden fehlen, diese müsst ihr erneut runterladen und aktivieren.

Cheers,
Ori


Von Factorio

Ich spiele in meiner Freizeit unter Anderem ein Spiel namens Factorio.
Kurz zusammengefasst ist Factorio ein Spiel in dem es darum geht eine Produktion zu automatisieren.

Dieses Video erklärt das Konzept des Spiels sehr gut.

https://www.youtube.com/watch?v=KVvXv1Z6EY8

Das Spiel lässt sich mit mehreren Spielern auf einem Server spielen.
Es gibt einen super Docker Container für Factorio, der es einem erlaubt im Handumdrehen einen Server aufzusetzen.

Leider gibt es kein einfaches Feature andere Spieler Maps auf den Server laden zu lassen, also habe ich mit Nextcloud mal eine Lösung zusammengeklöppelt.

Was Ihr braucht:

  • Einen Docker Host auf dem der dtandersen/factorio Container läuft
  • Eine ressource, von der Ihr Savegames herunterladen und eine Datei prüfen könnt

Die Idee:

  • Der Docker Host führt jede Minute ein script (siehe unten) aus

Fügt hierzu in der /etc/crontab folgende Zeile hinzu und benutzt den Pfad, wo Ihr das script abgelegt habt.

* * * * * root /path/to/script.sh

  • In diesem Script wird der Inhalt einer Textdatei in einer Ressource eurer Wahl über ssh geprüft
  • Ist der Inhalt dieser Datei nicht 1, passiert nichts
  • Ist der Inhalt dieser Datei 1 wird das Script ausgeführt

Das Script:

  • Stoppt docker
  • Verschiebt die aktuelle map in ein Backupverzeichnis
  • löscht das aktuelle Savegame
  • Vebindet sich mit einer ressource, *.zip herunter und legt es in das Savegameverzeichnis
  • Ändert den Owner des Savegames, so dass der Docker Container damit arbeiten kann
  • Startet docker wieder
  • Schreibt ein Log in die Ressource

Verzeichnisse:

  • Savegame location, gemounted vom Container /opt/factorio/save

Ihr müsst das Script noch von Hand anpassen, genauso wie ssh keys generieren.
Es ist nicht schön, es ist nicht sauber aber es funktioniert.

 

Cheers,
Ori

 

#!/bin/bash
factorio=$(ssh root@IP 'cat path/to/Checkme.txt')

if (echo $factorio | grep -q "1")
then
service docker stop
cp /opt/factorio/saves/save.zip /opt/factorio/backup_save/save.zip
rm -rf /opt/factorio/saves/*
scp root@IP:/path/to/savegame/\*.zip /opt/factorio/saves/.
chown -R 845:845 /opt/factorio/saves

service docker start

ssh root@192.168.122.79 'echo "0" > path/to/Checkme.txt'
ssh root@192.168.122.79 'echo "Server rebooted at $(date +\%d-\%m-\%Y-\%H-\%M-\%S)" >> path/to/RebootLog.txt'
factorio=0
else
echo "DEBUG ME SEMPAI"
fi


Migrating a calendar from one nextcloud to another

This article will show you how to download a calendar from a nextcloud and upload it to another.

Export

First login to the nextcloud that you want to export the calendar from and change to the calendar app.
Klick on the three dots on the left hand side and select Download.

The calendar will be downloaded to your machine as a .ics file.
If you plan on exporting multiple calendars, you should rename these files.

Import

If you have exported all the calendars that you want to export, login to the new nextlcloud.
Change to the calendar app and go to Settings & Import in in the lower left hand corner.

The settings will expand and you can choose Import Calendar.
Upload the .ics file you have previously downloaded.

In the window opening after the upload you can decider if you want to import the calendar items into a existing calendar or create a new one.
I choose New calendar in this example.

By clicking on the green check symbol the import process starts.
Please do not interrupt it.

Afterwards the import should be complete.
Please keep in mind that your new calendar is not shared with anyone on the new cloud yet.
If you did share it on the old NextCloud and want to share it on this one as well, you will have to share it again.

Cheers,
Ori


Android calendar and contacts synchronisation

In this post I will show you how to setup your android to sync with the nextcloud.

The idea is to be able to see the NextCloud calendar appointments on the Adroid device and be able to add new ones on it.

Since adding CalDAV (calendar) and CardDAV (contacts) to android is not supported nativley you will have to install a 3rd party tool. I choose to use the open source tool DAVdroid for that.

If you have a few bucks to spare, are lazy or both please buy the app in the app store and support the developers.

(If you do, you can skip the first 6 steps)

Since DAVdroid is open source you can get the app for free. This is how you get the apk.

1) Visit the DAVdroid seite and click on Open Source > download the App on F-Droid

2) Download the APK

3) Your device will warn you about instaling software from unknown sources.
Go to settings.

4) Here you can allow the installation from unknown sources "once".

5) Disable the android battery life optimizer as it can interrupt the DAVdroid sync.

6) Click the plus in DAVdroid

8) Here you can insert the connection details of your NextCloud

https://<URL>/nextcloud/remote.php/dav/principals/users/USER/

If you are unsure, just copy them.
Go to the calendar and click on Settings & Import in the lower left corner.

At the URL replace USER with the login name !

9)Now define wether you want to sync calendar and/or contacts and click on the two arrows on the top to trigger a manual synchronisation.

Thats it.
The connection is established and contacts should get uploaded.

Also calendar objects should start appearing and you should be able to create them.

 

Cheers,
Ori


Setup iOS filesync

In this aritcle I want to show you how you can setup a filesync on an iOS device.
The idea is that famely members can use the nextcloud to access photos made by an iPad or drop files on the device.

Preparing the accounts

Login to your NextCloud using an administrative account and go to Users.

Create a new user for the iPad.
This user will later be used to sync the iPad with the NextCloud.

 

Setting up the synchronisation

Download the NextCloud app from the app store.

Login to the app using the newly created NextCloud app.

Delete the default folders and create a folder that you want to share with others.
I called this folder iPadFN.

Go to '...', select share and then select the users or groups that you want to share the devices content with.

Then enter the folder you just shared.
Create some folders for the type of files you want to share.
In my case this would be books and photos.

Select the three dots on the folder you want to upload your pictures to.
Click on folder for automatic upload.
You need to do this BEFORE you change the settings of what gets uploaded.

Then go to More > Settings > Automatic Uploads and tweak the settings the way you want them.
In the end select upload entire camera storage.
This will apply the changes and is probably going to take a while.

Thats it, the setup is complete.
When the device is connected to a wifi pictures should get uploaded automaticly.

Now you just have to drop some files in the shared folder...

 

 

... and they get synched to the device.

 

Cheers,
Ori


Android Kalender- und Kontaktsynchronisation

In diesem Artikel zeige ich euch, wie Ihr den Kalender in der Nextcloud mit dem Kalender auf eurem Android synchronisiert.
Die Idee ist, dass ihr auf eurem Telefon sofort in der Cloud eingetragene Termine seht und selbst hinzufügen könnt.

Da Android die Einbindung von CalDAV (Kalender) und CardDAV (Kontakte) nicht unterstützt müssen wir diese Funktion erst installieren.
Hierfür nutzen wir DAVdroid. Wenn ihr das Kleingeld habt, unterstützt bitte die Entwickler, indem ihr die Software im PlayStore kauft.
(Ihr könnt die ersten 6 Schritte dann überspringen)

DAVdroid ist open source.
In diesem Artikel zeige ich, wie Ihr die APK gratis bekommt und dann die NextCloud anbindet.

1) DAVdroid Seite besuchen und bei Open Source
auf download the App on F-Droid klicken

 

 

2) Hier die APK herunterladen

 

3) Euer Handy warnt euch davor,
Software aus unbekannten Quellen zu installieren.

Geht zu Einstellungen

4) Hier sagt Ihr jetzt, dass euer Handy "einmalig"
eine Software aus unbekannter Quelle installieren darf

5) Die Akku Leistungsoptimierung von Android deaktivieren,
da sie sonst die Synchronisierung von DAVdroid stoppt

6) In DAVdroid auf das Plus klicken

8) Hier die Verbindungsdaten der Nextcloud eingeben

https://<URL>/nextcloud/remote.php/dav/principals/users/USER/

Wenn Ihr euch nicht sicher seid, kopiert Sie aus der NextCloud.
Geht dazu in den Kalender und erweitert unten links die Ansicht "Settings &Import"

Achtung: Bei URL eure Nextcloud und bei USER in der Serveradresse den Loginnamen verwenden!

9)Jetzt festlegen, ob ihr die Kontakte der Nextcloud
und die Kalender synchronisieren wollt und oben rechts auf die Pfeile klicken um die Synchronisation manuell anzustoßen

 

Damit ist die Verbindung hergestellt und Ihr könnt Kontakte hochladen.

 

Auch Termine sollten jetzt in eurem Kalender sichtbar werden und Ihr könnt neue Einträge anlegen.

 

Cheers,
Ori


iOS Dateisynchronisation herstellen

In diesem Artikel möchte ich euch zeigen, wie Ihr mit NextCloud eine Dateisynchronisation von einem iOS Gerät einrichten könnt.
Die Idee ist es, dass alle Personen in meinem Haushalt über die NextCloud auf die Fotos eines iPad zugreifen und Daten auf das Gerät laden können.

Account vorbereiten

Meldet euch hierzu an eurer NextCloud mit einem Administrativen Account an und geht auf Benutzer / Users.

Legt einen neuen Benutzer für das iPad an.
Dieser wird verwendet um die Daten der iPads mit der NextCloud zu synchronisieren.

Synchronisation einrichten

Ladet euch auf dem iOS Gerät die NextCloud App aus dem App store herunter.

Meldet euch mit dem neu erstellten Account in der NextCloud App an.

Löscht die Standard Ordner und Dateien und legt einen Ordner an, den Ihr für andere Personen freigeben wollt.
Ich habe diesen Ordner iPadFN genannt.

Geht auf '...', wählt Teilen aus klickt anschließend auf Benutzer oder Gruppen hinzufügen und fügt hinzu, mit wem Ihr den Inhalt des Geräts teilen wollt.

Wechselt anschließend in den geteilten Ordner und legt neue Ordner für die Art der Dateien an, die Ihr synchronisieren wollt.
In meinem Fall sind das Bücher und Photos.

Geht bei dem Ordner in den eure Photos hochgeladen werden sollen auf die drei Punkte und wählt Ordner für automatisches hochladen aus.
Es ist wichtig, dass ihr diesen Schritt ausführt BEVOR Ihr die Einstellungen für automatisches Hochladen anpasst.

Danach geht auf Mehr > Einstellungen > Automatisches Hochladen und passt die Einstellungen so an, wie Ihr sie haben wollt.
Wählt als letztes Den kompletten Kameraspeicher hochladen aus.
Wenn Ihr diese Option auswählt werden die Änderungen übernommen und angewendet, dies kann erstmal eine Weile dauern.

Damit ist die Einrichtung schon abgeschlossen.
Wenn das Gerät mit dem W-Lan verbunden ist, sollten Fotos die Ihr mit dem iPad macht, sofort in die Cloud geladen werden.

Jetzt müsst Ihr nur noch Dokumente in den Ordner legen ...

 

 

... und könnt sie euch direkt mit dem iPad ansehen.

 

Cheers,
Ori


Kalender von einer Nextcloud auf die andere verschieben

In diesem Artikel soll es darum gehen, wie man Kalender in der Nextcloud exportieren und importieren kann.

Export

Meldet euch zunächst auf der Nextcloud an, von der Ihr den Kalender exportieren wollt und wechselt in die Kalender App.
Hier klickt ihr auf der linken Seite die drei Punkte ... an wählt Download.

Der Kalender wird dann als eine .ics Datei auf euren Computer heruntergeladen.
Wenn Ihr vorhabt mehrere Kalender zu exportieren empfiehlt es sich, die Dateien nach dem Herunterladen umzubenennen.

Import

Wenn Ihr alle Kalender exportiert habt, die Ihr umziehen wollt, meldet euch bei der neuen Nextcloud an.
Wechselt dort in die Kalender App und klickt in der Fußzeile Settings & Import an.

Hierdurch erweitert sich die Ansicht bei Settings & Import.
Klickt auf Import Calendar und wählt den Kalender aus, den Ihr importieren wollt.

In dem folgenden Dialog könnt Ihr euch entscheiden, ob die Termine in einen bestehenden Kalender übernommen werden sollen.
Ich wähle hier New calendar, damit ein neuer Kalender angelegt wird.

Mit einem Klick auf das grüne Häkchen wird der Importvorgang angestoßen.
Unterbrecht diesen bitte nicht.

Anschließend sollte der Import eures Kalenders abgeschlossen sein.
Bedenkt, dass die Kalender-Freigaben nicht auf die neue Cloud mit übertragen wurden.
Ihr müsst eure Kalender also neu Freigeben.

Cheers,
Ori