Private Cloud mit Seafile und Radicale auf einem Raspberry Pi (Teil 2)

Im ersten Teil der Artikelserie „Private Cloud mit Seafile und Baïkal Radicale auf einem Raspberry Pi“ ging es darum, den Raspberry Pi zum Laufen zu bekommen und vorzubereiten. In diesem 2. Teil soll es nun um die Inbetriebnahme des Kalender- und Kontakte-Servers gehen. Bei diesem setzte ich seit Jahren auf den Baïkal-Server, welcher wenig Ressourcen beansprucht und stabil läuft. Eigentlich sollte diese Anleitung auch für diesen geschrieben werden. Während der Recherche stellte sich aber heraus, dass Baïkal nicht mehr weiterentwickelt wird. Anleitungen für Software, welche nicht mehr weiterentwickelt werden und damit schnell veraltet sind, machen keinen Sinn und so werde ich die Anleitung für eine ebenso schlanke Open-Source-Alternative schreiben: Radicale. Bis man den Server installieren kann, sind aber noch ein paar Vorarbeiten zu leisten. Es werden folgende Schritte notwendig sein:

  1. Den Raspberry Pi vom Internet erreichbar machen
  2. Erstellen eines SSL-Zertifikats
  3. Aufsetzen eines Nginx-Webservers
  4. Das PiDrive mounten
  5. Radicale installieren und einrichten

 

Schritt 1: Den Raspberry Pi vom Internet erreichbar machen

Bisher war der RasPi gut versteckt im eigenen Heimnetzwerk und man konnte nur über die interne IP-Adresse auf ihn zugreifen. Für die Nutzung als Wolke ist natürlich eine Zugriff aus dem Internet unerlässlich.

Schritt 1a: DynDNS-Adresse erzeugen
Da die Meisten einen Internetanschluss mit dynamischer IP-Adresse haben, wird sich die IP-Adresse spätestens alle 24 h ändern. Um nicht permanent die Internetadresse anpassen zu müssen, bedient man sich eines DynDNS-Dienstes. Mit Hilfe eines solchen Dienstes, kann man einem Internetanschluss eine feste Internetadresse zuweisen, ohne jeden Tag die IP-Adresse ändern zu müssen. Ich persönlich nutze dafür den Dynamic-DNS-Service spDYN von Securepoint, einem kostenlosen Angebot, mit dem ich bis jetzt durchweg gute Erfahrungen gemacht habe.

Meldet man sich bei diesem Dienst an, kann man eine Adresse in der Form meineAdresse.spdns.de erhalten (oder eine der anderen Domains, die angeboten werden). Am Beispiel für den o.g. Dienst gibt man einfach einen Host-Namen an, welcher dann die Subdomain zu der Hauptdomain bildet, welche man ebenfalls in dem Dialog auswählen kann (s. Abbildung). In der Bedienoberfläche des Routers kann man die aktuelle IP-Adresse ablesen und gibt diese im Feld IP an. Damit wäre der Dienst (zumindest) bei spDYN bereits eingerichtet.

Einen neuen Host hinzufügen

Schritt 1b: DynDNS-Dienst im Router aktivieren
Damit der DynDNS-Dienst aber auch weiß, wie bei einer IP-Adressenänderung die neue IP-Adresse lautet, muss man im Router dies auch einrichten, damit dieser die neue IP-Adresse weitergibt. Am Beispiel der Fritz!Box sieht das folgendermaßen aus (s. Abbildung):

Einstellungen für einen DynDNS-Dienst in der Fritz!Box

In der Regel stellt der DynDNS-Anbieter eine Update-URL bereit (bei spDYN: https://update.spdyn.de/nic/update?hostname=<domain>&myip=<ipaddr>), die man der Fritz!Box mitteilen muss. Weiterhin müssen DynDNS-Domainname und Benutzername des Dienstes angegeben werden. Als Kennwort gibt man hier nicht das Kennwort für die Administrationsoberfläche des DynDNS-Dienst-Nutzerkontos an. Für den Domainnamen stellt der DynDNS-Anbieter einen Update-Token bereit, welchen man in der Fritz!Box als Kennwort eingibt. Nach dem Speichern in der Fritz!Box sollte auf diese nun über die Dyn-DNS-Adresse aus dem Internet zugegriffen werden können.

Schritt 1c (optional): Eigene Domain auf die DynDNS-Adresse aufschalten
Will man seine eigene Domain für die zukünftige Wolke verwenden, muss man ein wenig in den DNS-Einstellungen der Domain tätig werden (Dieser Schritt ist nicht zwingend notwendig, wenn man mit der DynDNS-Adresse zufrieden ist). Ich persönlich nutze für meine Domainverwaltung den Dienst INWX, der bisher tadellos funktioniert hat.

In der Domainverwaltung gibt man im Bereich DNS-Einträge (u.U. heißt der Punkt auch anders wie Nameserver etc., das ist von Anbieter zu Anbieter unterschiedlich) als Name die Subdomain an, unter der die Wolke aufgerufen werden soll (in diesem Beispiel cloud). Als Typ wählt man CNAME und als Wert die DynDNS-Adresse (s. Abbildung). Nach dem Abspeichern wird es einige Zeit dauern, bis die neue Domain aufrufbar ist, aber der Router sollte nun auch unter der eigenen Domain erreichbar sein (in diesem Beispiel http://cloud.hotzpotz.de)

DNS-Eintrag für Dyn-DNS-Adresse bei INWX

Um zu prüfen, ob die unternommenen Schritte von Erfolg gekrönt waren, kann man die beiden Adressen mal anpingen. Es sollte bei beiden das gleiche Ergebnis herauskommen und die eigene IP-Adresse auftauchen.

 

Schritt 1d: Port 443 im Router freigeben
In der Fritz!Box-eigenen Firewall muss für den RasPi zunächst der Port 443 für die SSL-Übertragung freigegeben werden. Dafür geht man in der Admin-Oberfläche auf Internet >> Freigaben. Im Reiter Port-Freigaben muss man zunächst seinen RasPi hinzufügen.

In dem Fenster, in dem man das Gerät hinzufügt, kann man auch gleich Ports freigeben. Dort wählt man die Option Portfreigabe, als Anwendung HTTPS-Server und als Port 443 (s. Abbildung). Bestätigt man dies mit OK und fügt danach das Gerät hinzu, ist der Port gleich freigegeben.

SSL-Port-Freigabe in der Fritz!Box

Schritt 2: Erstellen eines SSL-Zertifikats

Schritt 2a: Erstellen des Zertifikats
Zum Erstellen eines SSL-Zertifikats bedient man sich am besten der kostenlosen Zertifizierungsstelle Let’s Encrypt. Zunächst installiert man certbot:

Im Anschluss kann man sofort mit der Zertifikaterstellung beginnen:

Hinter der Option -d muss die Domain folgen, für die das Zertifikat ausgestellt werden soll (in diesem Beispiel cloud.hotzpotz.de). Das Zertifikat wird dann im Verzeichnis /etc/letsencrypt/live/cloud.hotzpotz.de/ abgelegt als fullchain.pem.

Schritt 2b: Erstellen eines Cronjobs zur regelmäßigen Erneuerung des Zertifikats
Da ein Zertifikat von Let’s Encrypt nur 90 Tage gültig ist, muss es regelmäßig erneuert werden. Das lässt sich am besten durch einen Cronjob automatisieren:

Mit obigem Befehl kann man die crontab editieren. Dabei wird man, falls man es das erste mal macht, nach dem zu nutzenden Editor gefragt. Wer keine besondere Vorlieben hat, macht mit nano nicht viel falsch. In der crontab setzt man am Ende folgende Zeile:

Zur Erklärung:

  • 0 3 * * *: der Cronjob wird jeden Tag um 3 Uhr früh ausgeführt
  • certbot renew: der Befehl zum aktualisieren des Zertifikats
  • –standalone: Authentifizierungs-Plugin; nur mit dem standalone-Plugin ist eine Authentifizierung über den Port 443 mit (dem noch zu installierenden) Nginx möglich
  • –pre-hook: vor dem Aktualisieren soll der Nginx-Server gestoppt werden
  • –post-hook: nach dem Aktualisieren soll der Nginx-Server wieder gestartet werden
  • -q: da das Zertifikat nur innerhalb etwa eines Monats vor Ablauf aktualisiert werden kann, würden Versuche vorher zu Fehlermeldungen führen, welche mit der Option -q (für quiet) unterdrückt werden

 

Schritt 3: Aufsetzen eines Nginx-Webservers

Schritt 3a: Installation von Nginx
Zunächst installiert man das Paket nginx:

Um den RasPi nicht zu überlasten, müssen die maximalen Prozesse angepasst werden:

Nun muss der Webserver nur noch gestartet werden und dann war es das auch schon:

Zum Testen kann man mal schnell die lokale IP-Adresse des RasPi in den Browser eingeben. Dann sollte eine Willkommens-Seite des Nginx-Servers zu sehen sein.

Schritt 3b: SSL-Zertifikat in Nginx einbinden
Zum Einbinden des in Schritt 2 erstellten SSL-Zertifikats ruft man mit nano die Webserver-Konfiguration auf:

Dort sucht man folgenden Abschnitt:

und fügt danach folgenden Abschnitt ein (statt cloud.hotzplotz.de sollte man seine eigene Domain einsetzen):

Danach kann man die Konfiguration mit Strg+X, Y und Enter speichern. Mit einem Restart von Nginx lädt man die neue Konfiguration:

Zum Test kann man die eigene Domain (also im Beispiel wäre dies dann https://cloud.hotzpotz.de) im Browser eingeben und sollte die gleiche Nginx-Willkommensseite angezeigt bekommen wie schon in Schritt 3a.

 

Schritt 4: Das PiDrive mounten

Als Datenträger für die Wolke habe ich mich für ein PiDrive von Western Digital entschieden, welches extra für den Betrieb mit einem Raspberry Pi konzipiert ist. Zur Einführung des PiDrive hat WD u.a. eine Größe von 314 GB angeboten (in Anlehnung an die Zahl Pi), welche ich auch verwende. Mittlerweile gibt es diese Größe nicht mehr, dafür andere. Um das PiDrive als Datenlaufwerk zu nutzen, sind folgende vorbereitende Schritte notwendig:

Schritt 4a: PiDrive finden, formatieren und mounten
Mit folgendem Befehl kann man erstmal schauen, wo das PiDrive liegt:

Es folgt die Ausgabe von einigen Partitionen. U.a. sollte dann auch ein Eintrag in folgender Form zu finden sein:

Die Größe deutet schon an, dass es sich hier um das PiDrive handeln muss. Es liegt also auf /dev/sda. Zunächst formatiert man das Laufwerk im Ext4-Format. In diesem Beispiel wird die Festplatte als eine 314-GB-große Partition formatiert:

Um das Laufwerk zu mounten, erstellt man zunächst einen Mountpunkt (im Beispiel /mnt/data) und mountet dann das PiDrive auf dieses Verzeichnis:

Im Teil 1 beim Einrichten des RasPi wurde ja der Benutzername geändert. Mit dem Befehl id prüft man, welche UID und GID dieser Nutzer hat. Dabei kommt in etwa folgendes Ergebnis raus:

Wahrscheinlich wird die UID und GID wie bei den meisten und im obigen Beispiel auch 1000 sein. Diese Angaben braucht man, um die Zugriffsrechte für das PiDrive zu setzen:

Damit ist das PiDrive fertig eingerichtet!

Schritt 4b: Das PiDrive dauerhaft mounten
Mit jedem Neustart des RasPi müsste man allerdings jedesmal das PiDrive manuell neu mounten. Um dies zu umgehen, muss man den Mountpunkt in die fstab eintragen, aus welcher beim Start des RasPi jedesmal die einzuhängenden Partitionen gelesen werden. Dazu muss man erst einmal die UUID der Partition wissen:

In der erscheinenden Ausgabe sollte dann u.a. ein Abschnitt in folgender Form auftauchen:

Die hier angezeigte UUID des PiDrive schreibt man dann in die fstab.

Die fstab sollte dann in etwa folgendermaßen aussehen:

Damit wäre auch das PiDrive dauerhaft eingehängt und man kann (endlich) zum eigentlichen Teil übergehen: der Installation von Radicale.

 

Schritt 5: Radicale installieren und einrichten

Schritt 5a: Python und Radicale installieren
Radicale ist in Python geschrieben, sodass zunächst Python installiert werden muss. Anschließend kann dann Radicale mittels pip installiert werden.

Vom Prinzip her wäre Radicale jetzt bereits lauffähig, aber man muss noch ein wenig Arbeit in die Konfiguration und die Absicherung stecken, damit es auch von außen nutzbar wird.

Schritt 5b: Radicale konfigurieren
Radicale ist standardmäßig so konfiguriert, dass es nur über localhost aufrufbar ist. Zum Konfigurieren legt man zunächst ein Radicale-Verzeichnis unter etc an (Zeile 1). Die Kalender- und Kontaktedaten sollen auf dem PiDrive gespeichert werden, wofür man dort vorbereitend ein Verzeichnis erstellt (Zeile 2). Im Anschluss kann die Konfigurationsdatei erstellt werden (Zeile 3):

In die config-Datei schreibt man folgende Zeilen:

Mit der [server]-Zeile kann der Radicale-Server auch im lokalen Netzwerk über die IP-Adresse des RasPis und den Port 5232 aufgerufen werden (je nach im Router vergebener IP-Adresse z.B. http://192.168.2.86:5232). Mit der [storage]-Zeile legt man den Speicherort der Daten fest.

Mit folgender Zeile kann man den Radicale-Server zum ersten Mal testweise starten:

Gibt man zur Kontrolle die IP-Adresse des RasPi mit dem Port in den Webbrowser ein (s.o.), sollte ein Anmeldefenster erscheinen. Damit Radicale auch mit jedem Neustart des RasPi mitgestartet wird, richtet man Radicale als Dienst ein.

Schritt 5c: Radicale als Dienst einrichten
Um den Radicale-Dienst einzurichten, erzeugt man mit nano die Datei radicale.service:

und fügt die folgenden Abschnitte ein:

Mit Strg+X, Y und Enter speichert man die Datei. Mit folgenden Befehlen aktiviert und startet man den Dienst und kontrolliert, ob er ohne Fehler läuft:

 

Schritt 5d: Radicale absichern
Zur Absicherung der Authentifizierung nutzt man bcrypt, wofür einige Abhängigkeiten nachinstalliert werden müssen:

Diese Methode muss auch in der Konfiguration hinterlegt werden. Dazu öffnet man die Config-Datei mit einem Editor und fügt den Abschnit [auth] ein:

Da nur nginx installiert ist, wird das System den Befehl htpasswd nicht kennen, sodass man ihm diesen erst beibringen muss. Dafür wird ein Paket nachinstalliert:

Nun kann man mit htpasswd eine Benutzerdatei erzeugen, wobei der zweite Befehl optional genutzt werden kann, falls man mehr als einen Benutzer anlegen möchte. Dabei werden auch gleich die Passwörter mit erzeugt:

Da die gesamte Kommunikation mit Radicale per SSL abgesichert werden soll, muss man dies in der Config-Datei noch hinterlegen. Man öffnet also mit nano wieder diese Datei und fügt die unterhalb von [server] stehenden Zeilen dem bereits bestehenden Abschnitt [server] hinzu (als Pfad für die Zertifikate/Schlüssel nutzt man jene aus Schritt 3b):

 

Schritt 5e: Radicale für den Zugriff aus dem Internet einrichten
Bisher kann auf den Radicale-Server nur aus dem lokalem Netzwerk zugegriffen werden. Als letzten Schritt richtet man das Ganze so ein, dass man auch von außerhalb des Netzwerkes (also dem Internet) darauf zugreifen kann.

Dazu ruft man die Standard-Webserver-Konfiguration mit nano auf:

sucht folgenden Abschnitt heraus:

und fügt dahinter folgenden Inhalt ein (statt cloud.hotzpotz.de wie immer die eigene Domain einfügen):

Die Datei speichert man mit Strg+X, Y und Enter. Um die neue Konfiguration zu aktivieren, muss der nginx-Webserver neu gestartet werden (1. Zeile). Zusätzlich muss auch der Radicale-Server neu gestartet werden, da man ja im Schritt 5d die Konfiguration geändert hat (2. Zeile):

Nun ist der Radicale-Server theoretisch über das Internet erreichbar. Theoretisch deshalb, weil man im Router noch den Port für Radicale freigeben muss, damit die Anfragen vom Router auch an Radicale weitergeleitet werden. Wie man das macht, ist von Router zu Router unterschiedlich. Am Beispiel der Fritz!Box wurde das bereits in Schritt 1d erklärt, nur dass man statt des Ports 443 den Port 5232 freigibt.

Ist der Port freigegeben, kann man in einem Webbrowser die Adresse seiner Domain mit dem freigegebenen Port eingeben (in meinem Beispiel wäre es https://cloud.hotzpotz.de:5232). Es erscheint dann die Anmeldemaske des Radicale-Servers. Dort kann man sich mit einem der unter Schritt 5d angelegten Benutzer anmelden und Kalender oder Adressbücher erstellen. Ist ein Kalender oder Adressbuch angelegt worden, wird eine (kryptische) URL angezeigt, welche z.B. in Thunderbird zur Verwendung im Kalender genutzt werden kann.

Damit wäre der Radicale-Server vollständig und funktionstüchtig eingerichtet. Viel Spaß damit.

Private Cloud mit Seafile und Radicale auf einem Raspberry Pi (Teil 2)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.