Ich habe sehr lange an dem Installationsscript gearbeitet. Nachdem ich die Rückmeldung bekommen habe, das die Installation doch sehr kompliziert sei, habe ich Docker zur Hilfe genommen um das zu ändern. Um das ganze so einfach wie möglich zu machen braucht ihr nur folgendes machen:
Da weder der Spring selbst noch der Dacia-Server in der Lage sind, zeitgesteuert zu arbeiten, und ein Handy für Maschinensteuerung nicht ideal ist, wurde aus diesem Grund der Proxy-Server entwickelt. Er kann mehrere Springs gleichzeitig managen und übernimmt die Kommunikation mit dem Dacia-Server.
Damit das funktioniert, benötigt der Proxy eine Datenbank. Und zwar keine relationale Datenbank wie MariaDB, sondern eine dokumentenorientierte Datenbank. Ich hatte mich zunächst für MongoDB entschieden. Sie lässt sich leicht installieren und konfigurieren. Diese Datenbank läuft bei mir auf einem Linux-System mit ARM-Prozessor, also einem kleinen Raspberry Pi. Der ist sehr sparsam im Stromverbrauch und ausreichend schnell für diese Aufgabe. Es hat sich jedoch herausgestellt, dass für meine Anforderungen die Datenbank nicht optimal war. So wird ab der Version 1.3 eine neue Datenbank, die SimpleDataBase verwendet. Eine Datenbank, die ich speziell für dieses Programm entwickelt habe. Sie ist sehr schnell, braucht kaum Ressourcen und läuft ohne Probleme auf einem kleinen Pi.
Die Datenbank ist der Dreh- und Angelpunkt. Der Client kommuniziert mit dem Proxy-API, und der Proxy-API kommuniziert mit der Datenbank. Der Proxy-Dacia wiederum kommuniziert mit dem Dacia-Server und der Datenbank.
App <=> Proxy-API <=> SimpleDataBase <=> Proxy-Dacia <=> DaciaServer
Die Verbindung zwischen der App und dem Proxy-API ist TLS-verschlüsselt. Das Ganze funktioniert nur mit öffentlichen Zertifikaten. Deshalb wird auch ein Domainname benötigt, über den auf den Proxy zugegriffen werden kann. Dieser Name ist dann über ein Zertifikat abgesichert. Da ich keine feste IP habe, benutze ich einen DynDNS-Dienst. Welcher Dienst verwendet wird, ist egal; ich habe mich für ydns entschieden. Es geht aber auch jeder andere Dienst. Das Zertifikat wird von Let's Encrypt erstellt, das genauso wie der DynDNS-Dienst und das Linux nichts kostet. Folgende Schritte müssen durchgeführt werden.
Damit nicht nur Daten von innen nach außen gelangen, sondern auch umgekehrt, brauchen wir eine Portweiterleitung. Das bedeutet, dass die Daten, die von außen kommen, im Heimnetz genau auf dem Gerät landen, auf dem auch der Proxy installiert ist. Des Weiteren werden für die Verschlüsselung Zertifikate benötigt. Und zwar brauchen wir offizielle Zertifikate, keine selbstsignierten. Damit das funktioniert, wird auch ein Domainname benötigt. Da die IP-Adresse bei den meisten von uns regelmäßig wechselt, brauchen wir einen DynDNS-Dienst, der die wechselnde IP-Adresse mit dem Namen abgleicht. Fangen wir an mit der Portweiterleitung.
Damit die Kommunikation von außen (also aus dem Internet) zu eurem Proxy-Server zu Hause funktioniert, muss der Router wissen, welches Gerät die Datenpakete erhalten soll. Das erreicht man mit einer Portweiterleitung.
Der Router bekommt eine Anfrage für Port 6443. Mit der Weiterleitung wird ihm gesagt: "Schicke alle Pakete für diesen Port bitte an den Computer mit der IP-Adresse 192.168.1.100 (wenn der Proxy auf dieser IP installiert ist)".
Portweiterleitung am Beispiel einer Fritz!Box:
Wichtig für Let's Encrypt: Für die Einrichtung muss Port 80 (HTTP) auf den Server weitergeleitet werden. Dieser kann nach erfolgreicher Zertifikats-Einrichtung wieder geschlossen werden. Da der Port jedoch für jede Erneuerung, die ca. alle 60 Tage stattfindet, benötigt wird, kann er auch offen gelassen werden.
Es wird ein zweiter Port benötigt für den Datenaustausch. Dieser kann beliebig bis 65535 sein. Der Standardport für HTTPS, das ist das Protokoll, das wir verwenden, ist 443. Es kann jedoch jeder beliebige andere Port, normalerweise über 1024, verwendet werden. Da die Standard-Ports meistens als erste angegriffen werden, kann es durchaus Sinn machen, einen anderen Port zu verwenden. Ich verwende gerne die Ports 4443, 5443, etc. So ist für mich auch deutlich, wofür die Ports gebraucht werden.
Anmerkung: Da Instalaltionsscript kümmert sich um die Zertifikationserzeugung über Let's Encrypt mit hilfe vonertbot. Ihr bekommt davon nichts mit.
Wie finde ich meine IP-Adresse? Auf deinem Proxy-Server in der Konsole den Befehl
ip address
eingeben. Dann nach der Zeile suchen, die mit "inet" beginnt und deine lokale IP (z.B. 192.168.xxx.xxx) anzeigt.
Die meisten Internet-Anschlüsse haben eine sich ändernde (dynamische) IP-Adresse. Damit man den Server trotzdem immer unter der gleichen Adresse erreichen kann, braucht man einen DynDNS-Dienst.
ich habe im Installtionsscript bereits für duckdns.org, ydns und ipv64 eine Konfiguration vorbereitet. Es muß also nur eine domain bei einem dieser Anbieter eingetragen werden, und die Domain mit den tsprechenden Daten in die Konfigurationsdatei eingetragen werden. Ales andere macht dann das Instalaltionsscript.
Die einfache Lösung (für Fritz!Box-Nutzer): Jede Fritz!Box hat einen kostenlosen DynDNS-Dienst integriert. Du findest deine Adresse unter: Internet -> Freigaben -> FritzBox Dienste. Dort steht der persönliche Name der Box, z.B. wirreszeuch.myfritz.net. Diesen Namen kannst Du verwenden.
Alternative (für alle anderen Router): Falls der Router keinen eigenen Dienst anbietet, muss man sich bei einem DynDNS-Anbieter (z.B. noip.com oder duckdns.org) registrieren. Dort bekommt man einen Domainnamen (z.B. meinserver.ddns.net). Diesen Namen und die Zugangsdaten kann man dann meist im Router eintragen, damit er die Änderungen deiner IP-Adresse automatisch an den Anbieter meldet. Bei mir hat das nie funktioniert. Ich lasse alle 15 Minuten ein Script auf dem Proxy laufen, welches die Adresse abgleicht. Dies ist auch bei IPv6 die einzige Möglichkeit. Bei Fragen: Das Forum hilft gerne, und ich auch.
Wichtig: Ein Script, welches die IP-Adresse abgleicht, muss auf dem gleichen Rechner ausgeführt werden, auf dem der Name auch gebraucht wird, **sobald IPv6 verwendet wird]. Begründung: Jeder IPv6-Rechner wird über seine IP aus dem Internet angesprochen. Nicht so wie bei IPv4, bei der die Rechner die IP des Routers bekommen!
Damit das Ganze wirklich einfach wird, habe ich im Installationsscript für den Proxy eine Konfigurationsdatei, die bereits Vorformulierungen für diese drei Anbieter hat. Es muss dann in die Datei nur der Domain-Name und der Token (bei ydns Anmeldename & Passwort) eingetragen werden. Alles andere macht dann das Script. Die Daten, die benötigt werden, werden auf der Webseite beim Anlegen der Domain angezeigt. Näheres in der Docker-Anleitung.
Aufgrund meiner Erfahrungen in den letzten Tagen, als ich mehrere Dienste getestet habe, werde ich hier genauer darauf eingehen und verschiedene Dienste kurz erläutern. Besonders das Erneuern der Adresse wird teilweise unnötig kompliziert beschrieben. Deshalb gehe ich hier auf einige Dienste kurz ein.
duckdns.org Funktioniert leider nicht immer. Nachdem man sich registriert hat, kann man sich in der GUI bis zu 5 Adressen aussuchen und testen. Das geht folgendermaßen:
Der ydns Dienst hat sich als sehr zuverlässig erwiesen. Meine Erfahrung ist, dass er zuverlässiger ist als duckdns. Da ich aber aufgrund der nicht so guten Erfahrungen mit duckdns länger nicht gearbeitet habe, kann sich das natürlich auch geändert haben. Auch hier muss man sich anmelden. Sobald man eine Domain erzeugt hat, wird angezeigt, welche IP aktuell hinterlegt ist. Ein A steht für IPv4, AAAA für IPv6.
Ein Nachteil soll nicht verschwiegen werden: Es kann sein, dass das Erzeugen von Let's Encrypt-Zertifikaten nicht funktioniert, da die maximale Anzahl von ydns.eu-Zertifikaten erreicht wurde. Dann muss man warten und es später noch einmal versuchen. Das habe ich weder bei duckdns noch bei ipv64 erlebt. Es wird angezeigt, ab wann man it wieder versuchen kann. Das bedeutet, dass eventuell 12 Std. gewartet werden muss. Wenn das Installationsscript für den Proxy-Server ausgeführt wird, dann kommt irgendwann eine rote Warnmeldung. Das kann eventuell auch bei den anderen passieren.
ipv64 ist auch kostenlos, hat dabei einige Beschränkungen. So darf die IP maximal 64x am Tag upgedatet werden. Das sollte jedoch keine Rolle spielen, da normalerweise die IP nur einmal je Tag gewechselt wird.
Ein Problem bei ipv64 ist, dass nur 64x ein DNS-Update pro Tag gemacht werden darf. Oben rechts befindet sich ein Zähler DynDNS Update Limit / 24h. Führt das Script aus und beobachtet, wie der Zähler hochgeht. Ein Refresh der Webseite nicht vergessen! Das bedeutet, dass man bei ipv64 nur alle 22,5 Minuten ein Update machen darf. Aber auch dafür gibt es eine Lösung: Man testet, ob die eigene IP mit der Namensauflösung übereinstimmt. Wenn nicht, genau dann wird das Script ausgeführt. Mehr dazu unten. Ein weiteres Problem bei IPv64, das ich festgestellt habe: Es dauert teilweise Stunden, bis eine Änderung sich rumgesprochen hat. Das geht bei den beiden anderen wesentlich schneller.
Anmerkung: Das wird alles vom Installationsscript automatisiert. Ziel ist es, dass der Befehl in eine Datei geschrieben wird, und diese Datei wird dann z.B. alle 15min aufgerufen und es wird geschaut, ob die IP sich geändert hat. Zuerst erzeugen wir eine Datei mit entsprechendem Inhalt. Nehmen wir an, mit curl -G "https://ipv64.net/nic/update?key=meinKey" wird die Namensauflösung angepasst. Nun einfach in der Kommandozeile im Home-Verzeichnis des Users eingeben:
nano update.sh
Nun folgenden Text eingeben:
#!/bin/bash
curl -G "https://ipv4.ipv64.net/nic/update?key=meinipv4key"
curl -G "https://ipv6.ipv64.net/nic/update?key=meinIpv6key"
und mit Ctrl+x wird der Editor beendet und das Ganze wird gespeichert. Damit die Datei ausführbar gemacht wird, muss noch
chmod 775 update.sh
eingegeben werden. Um zu testen, ob es funktioniert:
./update.sh
eingeben. Wenn ich mich im selben Ordner befinde, in dem auch die Datei ist, die ich ausführen möchte, dann muss ein ./ vorangestellt werden.
Angenommen wir haben eine Datei update.sh, die in unserem Home-Verzeichnis liegt, und die soll alle 15 min aufgerufen werden. Dann wird das gemacht mit:
crontab -e
wird der Editor für die wiederholenden Ereignisse geöffnet.
*/15 * * * * /home/username/update.sh
Bedeutet, dass alle 15 min das Script ausgeführt wird. Wichtig: die Zeile mit einem Return abschließen! Nun F10 drücken zum Speichern. Nun wird alle 15min die Datei update.sh aufgerufen werden. Wichtig! Die Datei update.sh muss ausführbar sein. Es muss also ./update.sh funktionieren.
Anmerkung: Auch das wird vom Installationsscript getestet. Um zu testen, ob alles auch funktioniert mit der Domain und der eigenen IP-Adresse, kann es getestet werden. Am besten auf dem Computer testen, auf dem die Domain auch gebraucht wird. Besonders wenn auch IPv6 verwendet wird, wird es sonst nicht funktionieren. Hier wird die v4 und v6 Adresse angezeigt:
wget -4 -O - -q http://icanhazip.com
curl icanhazip.com
Mit
ping domainname
kann man feststellen, ob der Name korrekt aufgelöst wird.
Ein etwas besseres Script. Es testet zuverlässiger und vergleicht auch gleich. Das ist grade bei IPv6 teilweise nicht so einfach.
Dies war die Einleitung. Nun geht es weiter. Es gibt zwei Wege, den Proxy zu installieren.
Wenn ihr gerne wissen wollt, wie alles funktioniert und etwas Ahnung habt, nicht scheut, selbst einen Webserver zu installieren und konfigurieren, dann könnt ihr den Proxy mit allem selbst installieren: Hier geht es zur normalen Installation Volle Installation
Das Ganze geht auch sehr sehr viel einfacher. Es muss nur Docker auf einem Linux-System installiert werden. Dann wird die docker.tar.gz raufkopiert und entpackt. In einer Datei werden die Domain und eine Mailadresse eingetragen. Dann kann es auch schon losgehen.