Skip to main content

Eigene Cloud für Smartphone-Daten

1 Hintergrund

Smartphones sind schnell mit Daten überladen. Vorallem Fotos und Videos können schnell mal den Speicher von Smartphones an Ihre Grenzen bringen.

Und nun stellt sich die Frage, will ich diese Daten in der Cloud vom Smartphone-Hersteller oder von Google speichern. Das muss nicht sein. 

Wir werden nachfolgend aufzeigen, wie kostengünstig eine Infrastruktur für das Heimnetzwerk geschaffen werden kann, mit welcher die Daten vom Smartphone bequem mittels App übertragen werden können.

Unter Verwendung von Docker können die Dienste neben einigen kleinen Systemkonfigurationen ziemlich schnell eingerichtet werden, da das Einrichten eines Webservers und der Webapplikation entfallen.

Die benötigte Hardware kostet sowohl in Anschaffung als auch im Betrieb weniger als ein brauchbares NAS, wenn man die invesierte Zeit nicht rechnet.

2 Benötigtes Material

  • Raspberry Pi
  • Micro-SD Karte (mind. 8 GB)
  • Netzwerkkabel
  • 2 externe Festplatten à 1TB

Wenn das gesamte Material angeschafft werden muss, belaufen sich die ungefähren Kosten auf ca. 150.- bis 200.-. Je nach Komponenten die man wählt auch teurer.

3 Betriebssystem auf Micro SD-Karte flashen

In diesem Projekt werden wir Raspbian Stretch Lite verwenden. Dies ist sozusagen das Standard-Betriebssystem für diese Einplatinencomputer.

Zunächst sollte das System heruntergeladen werden. Das macht man am besten von der offiziellen Website:

https://www.raspberrypi.org/downloads/

Sobald die Archivdatei heruntergeladen wurde, kann diese entpackt werden. Nun sollte man eine Image-Datei haben, welche sich auf die Micro SD-Karten flashen lässt. Hierzu öffnet man das Terminal und lässt sich, nach dem Einlegen der Micro SD Karte, die Datenträger anzeigen:

 

sudo fdisk -l

 

Die Micro SD-Karte sollte als /dev/mmcblk0p anzeigt werden. Jetzt navigieren wir im Terminal in den Ordner, in welchem die Image-Datei liegt und können das Image auf die SD-Karte flashen:

 

sudo dd status=progress if=Dateiname.img of=/dev/mmcblk0p bs=4M oflag=sync

 

Sobald der Vorgang abgeschlossen ist, kann man die Micro SD-Karte entfernen und in den Raspberry Pi einsetzten.

4 Systemkonfiguration

Um das System zu konfigurieren, kann der Raspberry Pi an einen Bildschirm (HDMI) angeschlossen und als Eingabegerät eine USB-Tastatur verwendet werden. Sobald das Geräte am Strom angeschlossen ist, startet es auf und man kann sich mit dem Standardzugangsdaten einloggen. 

Benutzername:  pi
Passwort:raspberry

 

4.1 Benutzerpasswort ändern

Als erste Sicherheitsmassnahme sollte das Standardpasswort geändert werden. Dass Passwort für den Benutzer "pi" kann mit dem folgeden Befehl geändert werden:

 

passwd

 

Nun muss das neue Passwort 2x eingegeben werden.

4.2 Statische IP-Adresse festlegen

Raspbian arbeitet Standardmässig mi dem DHCP-Client dhcpcd. Dieser bezieht automatisch eine Adresse beim DHCP-Server. Es kann aber auch eine statische IP-Adresse für das Gerät konfiguriert werden. Hierzu öffnet man die Konfigurationsdatei "dhcpcd.conf" mit einem Editor (hier mit nano):

 

sudo nano /etc/dhcpcd.conf

 

Davon ausgehend, dass wir dem Gerät die IP-Adresse 192.168.1.99 vergeben wollen und dieses über einen Router mit der IP 192.168.1.1 ins Internet gelangt, ergänzen wir diese Datei mit den folgenden Zeilen:

 

interface eth0

static ip_address=192.168.1.99/24
static routers=192.168.1.1
static domain_name_servers=192.168.1.1

 

Mit Ctrl+o speichern und mit Ctrl+x schliesst man die Datei. Die IP-Adresse wird nach einem Neustart übernommen.

4.3 SSH-Zugang

Damit für die Wartung nicht extra ein Bildschirm und eine Tastatur am Gerät angeschlossen werden muss, richten wir einen SSH-Zugang ein. 

Als erstes muss geprüft werden, ob der SSH-Daemon läuft. Dies erreicht man mit:

 

sudo systemctl status ssh

 

Der Dienst läuft, wenn in der Zeile "Active" der folgende Eintrag steht:

 

Active: active (running) since ...

 

Sollte hier "inactive (dead)" stehen, muss der Daemon erst noch gestartet und aktiviert werden. Dies kann so gemacht werden:

 

sudo systemctl start ssh
sudo systemctl enable ssh

 

Der Daemon wird nun bei jedem  Neustart automatisch gestartet.

5 Am Standort plazieren

Der Raspberry Pi kann nun mit dem folgenden Befehl heruntergerfahren werden:

 

sudo poweroff

 

Nun kann dieser neben dem Router plaziert werden. Er wird mit einem Ethernet-Kabel an den Router angeschlossen und die externe Festplatte sollte am Raspberry Pi angeschlossen werden.

Jetzt kann der Gerät gestartet werden. 

6 Konfiguration - erste externe Festplatte

Als nächstes wird die externe Festplatte konfiguriert. Hierzu brauchen wir zuerst einen Einhängepunkt, wo die Platte standardmässig eingehängt wird.

Zunächst muss man sich via SSH mit dem Raspberry Pi verbinden. Also im Terminal folgendes eingeben:

 

ssh pi@192.168.1.99

 

Nach erfolgreicher Eingabe des Benutzerpassworts von "pi" sind wir nun als solcher auf dem Raspberry Pi eingeloggt. 

6.1 Festplatte vorbereiten

Zunächst sollten wir unsere Festplatte identifizieren. Wir listen also die verfügbaren Datenträger auf: 

 

sudo fdisk -l 

 

Da wir lediglich eine HDD angeschlossen haben, sollte die Festplatte die Beichnung /dev/sda haben und eine Partition /dev/sda1 enthalten. Damit unser System sauber mit der Festplatte arbeiten kann, werden wir alles auf dieser löschen (Daten und Partitionen) und eine neue Partition mit einem geeigneteren Dateisystem erstellen. 

Festplatte mit Nullen überschreiben: 

 

sudo dd status=progress if=/dev/zero of=/dev/sda bs=4M oflag=sync

 

Oder Festplatte mit Zufallsdaten überschreiben (dauert länger): 

 

sudo dd status=progress if=/dev/urandom of=/dev/sda bs=4m oflag=sync

 

Jetzt müssen wir erneut eine Partition auf der Festplatte erstellen. Dies kann mit dem Programm cfdisk gemacht werden. 

 

sudo cfdisk /dev/sda

 

Hier wählt man nun "New". Das Programm schlägt automatisch den gesamten verfügbaren Speicher vor, was wir mit Enter bestätigen. Um die Änderung vorzunehmen muss nun "Write" gewählt werden, welches mit "yes" bestätigt werden muss. Danach kann man das Programm verlassen. 

Jetzt ist zwar eine Partition vorhanden, diese muss aber noch mit dem gewünschten Dateisystem formatiert werden. Wir verwenden "ext4": 

 

sudo mkfs.ext4 /dev/sda1

 

Sobald der Vorgang abgeschlossen ist, ist die Festplatte bereit für die Verwendung. 

6.2 Einhängen

Nun werden wir im Root-Ordner einen neuen Ordner zum einhängen erstellen. Hier im Beispiel wird der Ordner "external" benannt. Dieser dient lediglich als Einhängepunkt für die externe Festplatte.

 

sudo mkdir /external

 

Jetzt kann die Festplatte eingehängt werden. 

 

sudo mount /dev/sda1 /external

 

Ein Blick in das zur Verfügung stehende Dateisytem sollte nun "/dev/sda1/" mit dem Mountpoint "/external" auflisten. 

 

df -h

 

Damit der Benutzer "pi" auch Schreibrechte hat, werden noch die Schreibrechte geändert: 

 

sudo chmod -R 777 /external

 

Somit haben alle die Zugang zum System haben die Rechte auf der Festplatte zu lesen, zu schreiben und Programme auszuführen. 

6.3 Permanente Einbindung

Mit dem Befehl "mount" werden Datenträger lediglich bis zum nächsten Ausschalten eingebunden. Da wir dies aber nicht jedes mal manuell eingeben möchten, muss die Festplatte beim Systemstart automatisch eingebunden werden. 

Hier stehen mehrere Möglichkeiten zur Verfügung. Damit das System auch sauber startet, wenn die Festplatte aus irgendeinem Grund nicht angeschlossen sein sollte, werden wir dies mit einem Cronjob umsetzen. 

Prüfen ob der Dienst läuft: 

 

systemctl status cron

 

Wie bereits beim SSH-Daemon sollte auch hier "Active: active (running) since ..." stehen. Wenn nicht muss der Daemon gestartet und aktiviert werden: 

 

sudo systemctl start cron 
sudo systemctl enable cron

 

Nun kann ein neuer Cronjob erfasst werden, welcher mit Root-Rechten ausgeführt werden soll: 

 

sudo crontab -e 

 

Die Datei muss um die folgende Zeile ergänzt werden: 

 

@reboot   mount /dev/sda1 /external

 

Die Datei speichern (Ctrl + O) und schliessen (Ctrl + X). Die Festplatte wird nun bei jedem Systemstart automatisch unter "/external" eingehängt. 

7 Installation von Docker und Docker-Compose

7.1 Repository einbinden

Als erstes müssen die Paketlisten aktualisiert werden:

 

sudo apt-get update

 

Dann müssen die folgenden Programme installiert werden, damit der Packagemanager Pakete über SSL-gesicherte Verbindungen laden kann:

 

sudo apt-get install apt-transport-https ca-certificates software-properties-common

 

Danach fügen wir den GPG-Key von Docker hinzu:

 

curl -fsSL yum.dockerproject.org/gpg | sudo apt-key add -

 

Und prüfen ob dieser korrekt ist:

 

sudo apt-key fingerprint 58118E89F3A912897C070ADBF76221572C52609D

 

Jetzt ergänzen wir die Quelliste des Packagemanagers mit dem Docker-Repository:

 

sudo add-apt-repository "deb apt.dockerproject.org/repo/ raspbian-$(lsb_release -cs) main"

7.2 Installation

Jetzt müssen die Paketlisten erneut aktualisiert werden:

 

sudo apt-get update 

 

Und schliesslich kann die Docker-Engine und Docker-Compose installiert werden:

 

sudo apt-get install docker-engine docker-compose

 

Nun sollte Docker installiert sein und der Docker Daemon sollte automatisch gestartet worden sein.

 

systemctl status docker

 

Wenn nicht kann dieser manuell gestartet werden. 

 

sudo systemctl start docker

 

Da wir alle Daten auf der externen Festplatte speichern und die Cloud-Applikation als Docker-Container läuft, sollte der Daemon deaktiviert werden und mittels Cronjob nach dem Einhängen der Festplatten gestartet werden. 

 

sudo systemctl disable docker

 

Nun muss hierfür ein Cronjob erfasst werden: 

 

sudo crontab -e

 

Die Datei wird mit dem folgenden Eintrag ergänzt: 

 

@reboot    systemctl start docker

 

Der Daemon wird nun beim Systemstart automatisch gestartet. 

7.3 Prüfen

Um zu prüfen, ob die Installation erfolgreich war werden wir den Standard hello-world Container laufen lassen.

 

sudo docker run hello-world

 

Nun sollte eine Nachricht mit "Hello from Docker...." asugegeben worden sein.

8 Nextcloud Container

Damit alles portierbar bleibt, werden wir den Container mit einem Compose-File, welches sich auf der externen Festplatte befindet, starten. Zunächst erstellen wir auf der externen Festplatte den Ordner "nextcloud" und wechseln in das neu erstellte Verzeichnis:  

 

mkdir /external/nextcloud
cd /external/nextcloud

 

In diesem Ordner erstellen wir nun die Datei "docker-compose.yml" mit einem Editor (hier nano):

 

nano docker-compose.yml

 

Die Datei soll folgenden Inhalt haben:

 

version: '3'

volumes:
  nextcloud:
services:
  app:
    image: nextcloud
    ports:
      - 8080:80
    volumes:
      - ./nextcloud:/var/www/html
    restart: always

 

Die vorangehende Compose-Konfigurations-Datei startet einen Container mit dem Image nextcloud, legt den verwendeten Port auf 8080 fest und hängt ein Volume ein, in welchem Daten gespeichert werden können (in diesem Fall wird wiederum ein Ordner "nextcloud" im Verzeichnis des Compose-Files erstellt).

Der Container kann nun gestartet werden:

 

sudo docker-compose up -d

 

Wenn man sich nicht im selben Verzeichnis aufhält, kann der Container mit dem folgenden Befehl gestartet werden:

 

sudo docker-compose -f /external/docker-compose.yml up -d

 

Die benötigten Images werden nun vom Docker Hub geladen und gestartet.

9 Nextcloud Konfiguration

Das Nextcloud Webinterface kann nun im Webbrowser der Wahl geöffnet werden. Die Adresse muss . In unserem Beispiel wäre dies:

192.168.1.99

Hier kann nun ein Admin-Benutzerkonto angelegt werden (als Beispiel legen wir den Benutzer "admin" mit dem Passwort "123456" an). Da wir keinen Datenbankserver eingerichtet haben, welcher verwendet werden könnte, müssen keine weiteren Einstellungen vorgenommen werden (Die Applikation verwendet dann standardmässig SQLite). Das Setup kann beendet werden (Finish setup). Nun muss man einen Moment warten, wärend alles erstellt wird.

Der Benutzer hat standardmässig englisch eingestellt. Um Einstellungen für den Benutzer zu ändern muss auf das Icon ganz rechts in der Menüleisten oben geklickt und Settings gewählt werden. Hier kann nun die Sprache auf deutsch geändert werden, falls gewünscht.

Unter dem gleichen Icon können unter User (Benutzer) neue Benutzer angelegt werden.

10 Smartphone konfigurieren

Als nächstes wird die Smartphone App installiert. Die ist für iOS und Android erhältlich. Einfach in itunes oder Play Store nach nextcloud suchen und die offizielle App installieren.

Zunächst muss das Smartphone im selben Netz sein, wie der Raspberry Pi. Also mit dem WLAN des Routers, an dem der Raspberry Pi angeschlossen wurde verbinden.

Beim Starten der App muss als erstes eine Server-Adresse eingegeben werden hier setzen wir (gemäss vorangehender Konfiguration) die folgende Adresse wie bereits unter Punkt 9 erwähnt:

http://192.168.1.99:8080

Nach der Eingabe von Benutzername und Passwort ist man bereits verbunden und kann den Dienst direkt nutzen. Fotos und Videos können jetzt auf die persönliche Cloud geladen und auf dem Smartphone gelöscht werden.

11 Überwachung

Um das System bzw. die Auslastung der Festplatte überwachen zu können, werden wir einen kleine Trick anwenden. Wir legen uns über das Nextcloud Webinterface einen Ordner "Ueberwachung" an. In diesem Ordner wiederum erstellen wir eine Textdatei mit den Namen "auslastung_hdd.txt". In diese werden später Systeminformationen über Speicherplatzbelegung geschrieben.

Als nächstes wieder über das Terminal via SSH mit dem Raspberry Pi verbinden:

 

ssh pi@192.168.1.99

 

Wir erlangen Root-Rechte:

 

sudo su

 

Um die Spalten identifizieren zu können, sollten wir uns zuerst einen Header in der Datei anlegen. Dieser Bezeichnet die Spalten:

 

df -h | egrep "*Filesystem*" > /external/nextcloud/data/Benutzername/files/Ueberwachung/auslastung_hdd.txt

 

Jetzt wurde in der Textdatei eine Kopfzeile eingefügt.

Dann wird ein Shellscript im Home-Ordner des Benutzers pi erstellt (hier mit dem Editor nano):

 

nano /home/pi/monitoring_hdd.sh

 

Dieses soll mit Datum versehen die Auslastung des verfügbaren Speicherplatzes der externen Festplatte unten an die Datei anhängen. 

 

#! /bin/bash
# Monitoring für HDD-Auslastung

# Als erstes setzen wir ein Datum, damit wir wissen, wann der Eintrag gemacht wurde.
date +%d.%m.%Y >> /external/nextcloud/data/Benutzername/files/Ueberwachung/auslastung_hdd.txt

# Danach tragen wir die Auslastung der unter /external eingehängten Festplatte ein. 
df -h | egrep "*external*" >> /external/nextcloud/data/Benutzername/files/Ueberwachung/auslastung_hdd.txt

 

Wenn alles niedergeschrieben ist, mit Ctrl+o speichern und mit Ctrl+x schliessen.

Das Script kann nun von jedem Ordner aus mittels folgendem Befehl gestartet werden:

 

sh /home/pi/monitoring_hdd.sh

 

Um dies nun zu automatisieren werden wir einen Cronjob hierfür erstellen, welcher das Script zu einem definierten Zeitpunkt ausführt. Dafür führen wir den folgenden Befehl aus:

 

sudo crontab -e

 

Wir können nun den Editor, welchen wir verwenden möchten auswählen. Danach befinden wir uns einer Datei, welche wir bearbeiten können. Es gilt folgende Syntax:

 

m 	h	dom	mon	dow	Command
mMinute (0-59)In welcher Minute einer Stunde.
hStunde (0-23In welcher Stunde eines Tages
dom   Day of the Month (1-31)An welchem Tag des Monats.
monMonth (1-12)In welchem Monat.
dowDay of the week (0-6)An welchem Wochentag. 0 = Sonntag usw.

Um das Script jede Woche, in der Nacht von Sonntag auf Montag um 1h00 auszuführen, müssen wir die Datei um folgenden Eintrag ergänzen:

 

0	1	*	*	1	sh /home/pi/monitoring_hdd.sh

 

Die Monitoring-Daten können nun via Webinterface oder die Smartphone App angeschaut werden, indem man die Textdatei auslastung_hdd.txt öffnet.

12 Backup der Daten

Es gibt mehrere Möglichkeiten ein Backup auszuführen - automatisiert, von Hand, man kopiert alle Dateien, erstellt Images und so weiter. Davon ausgehend, dass wir die Cloud benutzen um Fotos vom Smartphone weg zu verschieben und in der Regel keine Daten auf der Cloud gelöscht werden, bietet sich ein inkrementelles Backup mittels rsync an.

Hierfür benötigen wir die zweite externe Festplatte, welche zwar eingesteckt bleibt, jedoch lediglich eingehängt wird, sobald ein Backup gemacht wird (Wir gehen davon aus, dass diese mit einem kompatiblen Dateisystem formatiert wurde). Um diese Festplatte einzuhängen sollte zuerst ein Ordner erstellt werden. In diesem Beispiel der Ordner "/backup". 

 

sudo mkdir /backup

 

Jetzt werden wir die Festplatte einhängen (davon ausgehend, dass diese mit /dev/sdb bezeichnet wurde): 

 

sudo mount /dev/sdb1 /backup 

 

Und erteilen alle Rechte für alle Benutzer: 

 

sudo chmod -R 777 /backup

 

Nun können wir die Festplatte wieder aushängen: 

 

sudo umount /backup

 

Für das Backup selbst benötigen wir ein kleines Script. Dieses legen wir auch im Home-Ordner des Benutzers pi an:

 

nano /home/pi/backup.sh

 

In dieses Script schreiben folgendes:

 

#! /bin/bash
# Backup-Script

# Als erstes muss die Festplatte eingehängt werden.
mount /dev/sdb1 /backup

# Dann werden die Daten von der Festplatte 1 inkrementell auf die Festplatte 2 kopiert
rsync -aAX /external /backup

# Die Festplatte wird wieder ausgehängt
umount /backup

 

Im nächsten Schritt sollte festgelegt werden in welchem Intervall, die Daten gesichert werden sollen. Und ein Cronjob wird erstellt. In unserem Fall, werden wir das Backup jeden Tag um 10:00 Uhr durchführen (davon ausgehend, dass die Daten in der Regel am Abend bzw. über Nacht auf die Cloud geladen werden). 

 

sudo crontab -e

 

Die Datei ergänzen wir um den folgenden Eintrag. 

 

0          10          *         *        *          sh /home/pi/backup.sh

 

 

13 Wichtige Hinweise

13.1 Verbindung

Eine Verbindung ist lediglich mögich, wenn man sich im selben Netz befindet. Um den Dienst für ausserhalb zur Verfügung zu stellen gibt es mehrere Möglichkeiten. Einige sicherer als andere. 

13.2 Verschlüsselung

Achtung! Der Dienst sollte unbedingt mit einer verschüsselten Verbindung betrieben werden.