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:
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:
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
m | Minute (0-59) | In welcher Minute einer Stunde. |
h | Stunde (0-23 | In welcher Stunde eines Tages |
dom | Day of the Month (1-31) | An welchem Tag des Monats. |
mon | Month (1-12) | In welchem Monat. |
dow | Day 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.