Kategorien
How To

Nightscout ins Internet bringen

Achtung: Diese Anleitung ist (bisher) nur für MyFritz von AVM (für Fritz!Boxen) gedacht, einige Schritte sind jedoch analog zur Einrichtung von DynDNS.

Voraussetzungen

  • Du hast Nightscout auf Port 1337 auf einem Ubuntu Server laufen (Siehe zum Beispiel: Nightscout auf einem RasPi installieren)
  • Du hast einen Router (Fritz!Box ist ganz cool fürs erste notwendig, andere gehen i.d.R auch)
  • Du hast eine Verbindung zum Internet

Plan und gewünschtes Ergebnis

Unser Ergebnis ist folgendes: wir haben 2 Freigaben zu unserem Raspberry Pi bzw. Nightscout Server via MyFritz: Port 80 und 443. Die Freigaben brauchen wir, damit wir von außerhalb unseres Netzwerkes Zugriff auf die Nightscout-Instanz bekommen. Mit Nightscouts Authentifizierung via Token bekommen auch nur wir Zugang zu unseren Daten, denn maximale Sicherheit ist beim Serverbetrieb im Internet Prio 0

Auf dem RasPi läuft ein Reverse Proxy (nginx) der auf Port 80 und 443 hört und sich zusammen mit dem Certbot um SSL kümmert. Der Reverse Proxy leitet dann die Requests von außen intern an Port 1337 (Port unserer Nightscout Instanz) weiter

Port 443 brauchen wir deswegen, weil wir natürlich SSL für die Verbindung zum Nightscout-Server aus dem Internet nutzen wollen. SSL ist aus gutem Grund (Edward Snowden sei Dank) inzwischen bei allen professionellen Webservern der Standard und sorgt dafür, dass unsere Daten immer verschlüsselt übertragen werden und damit nicht auf dem Transportweg durch das Internetz mitgelesen werden können.

Was ist ein Reverse Proxy?

Ein Reverse Proxy ist ein stück Software, welches Anfragen empfängt, je nach Konfiguration anpasst und dann an einen Server weiterleitet.

Dieses Anpassen ist bei uns wichtig, damit das SSL Gewusel funktioniert

Schritt 1: MyFritz einrichten

Da ich das Rad nicht neu erfinden will und muss kann für den ersten Schritt folgende Anleitung von AVM verwendet werden:

https://avm.de/service/myfritz/faqs/myfritz-konto-erstellen-und-in-fritzbox-einrichten/

Am Ende sollte deine Fritz!Box den MyFritz Account “installiert” haben

Unter Internet/MyFritz-Konto sieht man dann ein grünes Licht Ihre Fritzbox ist bei MyFritz angemeldet und es erscheint die MyFritz-Adresse im Format xxxxxxxxxxxxx.myfritz.net. Die lange Zeichenkette wird individuell von AVM ausgewürfelt und kann leider nicht geändert werden. Wem das nicht passt, der muss auf einen anderen DynDNS Dienst ausweichen. Diese Dienstleistung war früher hinter jeder Ecke kostenlos zu bekommen heutzutage muss man ein wenig im Internet graben, damit man sowas kostenlos findet. Gibt man ein paar Euros kann man sich den Dienstleister sogar aussuchen. Die Anbindung des RasPi und mit dem Nightscout-Server und DynDNS-Services beschreiben wir hier demnächst vielleicht noch genauer aber als erste Anlaufstelle dient der DynDNS-Dienstleister deines Vertrauens – der hat nämlich dafür immer eine Anleitung parat

Schritt 2: Freigaben erstellen

Zunächst gehst du bei deiner Fritz!Box Oberfläche zu Internet > Freigaben > Portfreigaben

Danach klickst du den Button „Gerät für Freigaben hinzufügen“ (meist ganz rechts unten). Es sollte sich jetzt ein Fenster öffnen

Unter Gerät suchst du nun deinen Server heraus, dieser heißt im Normalfall ubuntu oder raspberry

Relativ weit unten rechts kommt dann ein Knopf auf dem „Neue Freigabe“ steht, diesen würde ich an deiner Stelle jetzt klicken.

Jetzt sollte sich ein kleines aber feines Fenster geöffnet haben, dort aktivierst du die Option „MyFRITZ!-Freigabe“ (nicht „Portfreigabe“) und wählst als Anwendung „HTTP-Server“ aus, „Verzeichnis (optional)“ musst du leer lassen

Dann kannst du auch schon auf „OK“ klicken (das kleine Fenster schließt sich jetzt (hoffentlich)

Zur Feier des Tages machen wir jetzt fast das gleiche nochmal (ab “Relativ weit unten rechts …”) nur wählen wir anstatt “HTTP-Server” “HTTPS-Server” aus

Jetzt solltest du in der “Freigaben”-Tabelle 2 Freigaben mit grüner Ampel sehen – mit HTTP auf Port 80 und HTTPS auf Port 443 (falls das 4 sind ist das auch okay, liegt an IPv6). Es dauert ein paar Sekunden bis die Ampeln grün sind – einfach kurz warten und auf Aktualisieren klicken, und dann haben wir wieder freie Fahrt voraus

Zuletzt klickst du auf “OK” rechts unten, danach öffnet sich eine andere Seite, dort klickst du auf “Übernehmen” (so wie immer rechts unten)

Schritt 3: Wie ist meine Domain??

Das ist eine gute Frage, die du dir da gerade stellst

Diese Information brauchen wir nämlich im nächsten Schritt

Um das herauszufinden, gehst du wieder unter Internet > Freigaben > Portfreigaben neben deinem Raspberry Pi auf den kleinen Stift. Jetzt siehst du in der “Freigaben” Tabelle ganz unten die zwei (oder vier) Freigaben, bei einer der beiden (oder der vier) klickst du auf den Stift. In dem geöffneten Fenster siehst du ein Feld in das du nicht tippen kannst mit der Beschriftung “MyFRITZ!-Adresse”. Dort drinnen siehst du nun eine Zeichenkette im Format http<s oder kein s>://<raspiname>.<irgendein-kryptischer-code>.myfritz.net:<443 oder 80>

Deine Domain (die du bald brauchst und daher rauskopierst, oder du bist ein Genie und kannst es Dir im Kopf merken) ist dann <raspiname>.<irgendein-kryptischer-code>.myfritz.net

So schaut ein konkretes Beispiel aus: http://ubuntu-server-superraspi[.](<http://raspi3b-ubuntu-server.rgw4a44gkaoqp4el.myfritz.net/>)123xyz123xyz123x.myfritz.net:80

… und die alles entscheidende Domain wir wir daraus brauchen ist in diesem Beispiel: ubuntu-server-superraspi.123xyz123xyz123x.myfritz.net

Schritt 4: Reverse Proxy!!!

So weit sind wir schon? Krass!

Zunächst installieren wir den im Internet-Kampfalltag bewährten Reverse Proxy  nginx auf dem mit SSH eingeloggten RasPi mit dem Befehl: (Passwort eingeben nicht vergessen)

sudo apt install nginx -y

Die Aktion dauert locker viele Minuten in denen keine Windows-Sanduhren sondern viel spannendere Text-Ausgaben den Fortschritt vermelden. In der Wartezeit sagen die Genies unter uns die oben gemerkte Domain noch ein paarmal laut auf damit sie gleich zum Einsatz kommen kann.

Denn danach öffnen wir die Datei /etc/nginx/sites-available/default mit (z.B.) nano:

sudo nano /etc/nginx/sites-available/default

Hier löschst du erstmal (mit mehrfachem Druck auf Ctrl+K) alles was du siehst und fügst folgendes ein: (example.commit deiner erwähnten Domain ersetzen, das Semikolon am Ende bleibt)

server {
    listen 80;

    server_name example.com;

    location / {
        proxy_pass http://127.0.0.1:1337;
        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection 'upgrade';
        proxy_set_header Host $host;
        proxy_cache_bypass $http_upgrade;
    }
}

Den Spaß speicherst du dann wie gewohnt mit ctrl+O, Enter und ctrl+X

Danach starten wir nginx mit sudo service nginx restart neu (Falls das funktioniert hat wird absolut gar nichts ausgegeben)

Schritt 5: Kurzer Test

Zum testen kannst du jetzt mal in deinem Browser http://<meine-domain>/ eingeben. Du solltest jetzt Nightscout sehen. Wenn das klappt, dann hast Du bis hier alles richtig gemacht und Deine Nightscout-Instanz ist jetzt von überall aus dem Internet erreichbar und dank MyFritz auch immer unter der gleichen (wenn auch etwas kryptischen) Adresse, egal ob heute oder morgen mit anderer IP-Adresse. Du siehst auch, dass der Nightscout-Server jetzt ohne den Port 1337 in der Adresse erreichbar ist – das hat der Reverse Proxy nginx hingezaubert, denn der lauscht auf Port 80 (der Standard-Port) und reicht dann die Anfrage an den Nightscout-Server der lokal auf dem Raspi immer noch auf Port 1337 (und nicht 80) hört weiter. Der Proxy reicht also durch – und zwar in beide Richtungen und sorgt nebenbei dafür, dass keine bösen Pakete Deinen Nightscout-Instanz oder sonstige Dienste auf dem Raspi-Ubuntu-Server erreichen. Jetzt fehlt nur noch der aller-letzte Schritt: Der Datenaustausch muss noch verschlüsselt werden damit weder Mark Zuckerberg noch KimJongUn beim Durchreichen der Daten durch deren Server mitlesen können. Wer damit kein Problem hat der kann sich das auch sparen aber muss sich dann auch ein Schild mit der Aufschrift «Mit ist alles egal» auf die Stirn kleben. Wer was auf sich hält, der macht hier weiter

Schritt 6: Reverse Proxy (nochmal): Certbot & Let’s Encrypt

Für die administration von den SSL-Zertifikaten verwenden wir den Certbot – der holt nämlich die kostenlosen und bewährten SSL-Zertifikate von Let’s Encrypt vollautomatisch und sorgt auch dafür, daß die Dinger regelmäßig aktualisiert werden (weil sonst laufen die sicherheitsbedingt irgendwann aus, nämlich momentan immer nach 90 Tagen). Wer näheres über Let’s Encrypt wissen will was und wer dahintersteckt, dem sei https://en.wikipedia.org/wiki/Let’s_Encrypt zur Lektüre empfohlen

Zusammengefasste Installation:

Schritt 6.1: Snapd installieren (falls noch nicht installiert, einfach machen falls unsicher)

sudo apt update &&
sudo apt install snapd

Und Snapd Core installieren

sudo snap install core &&
sudo snap refresh core

Schritt 6.2: Certbot installieren

sudo snap install --classic certbot && 
sudo ln -s /snap/bin/certbot /usr/bin/certbot

Schritt 6.3: Certbot installiert

Juhu!

Weiter gehts

Jetzt überlassen wir die SSL magie dem certbot, dafür führen wir jetzt sudo certbot --nginx aus.

Als erstes musst du deine E-Mail-Adresse angeben, das musst du, da falls du doofe Sachen machst die dich anschreiben können oder falls dein Zertifikat ausläuft.

Dann musst du die “Terms of service” akzeptieren. Falls du das nicht willst ist die Anleitung hier zu ende, falls schon drücke y.

Danach kommt eine sehr kleine Tabelle, in der deine MyFritz Domain stehen sollte. Falls ja kannst du Enter drücken.

Danach wird der certbot versuchen eine Verbindung zu deinem Server herzustellen um zu überprüfen, dass du die Domain besitzt.

Dann erstellt er den privaten und öffentlichen Schlüssel und das SSL-Zertifikat, lässt dieses Signieren und lädt diese signierte Kopie dann herunter, hier wird also die Magie eingeschaltet, die verschlüsselten HTTPS-Verkehr mit deinem Nightscout-Server auf die Straße bringt. Das nutzt heute die halbe Welt und jetzt auch Du.

Zuletzt kannst du noch nginx neu starten: sudo service nginx restart

Schritt 7: Testen

Du kannst jetzt in deinem Lieblingsbrowser https://<meine-domain>/ tippen und auf das berüchtigte kleine Schloss hoffen und mal draufklicken um zu bestätigen, dass das Zertifikat sicher ist

Schritt 8: Feiern

Hab “spaß” mit deiner neuen Nightscout Instanz im Internetz!

Kategorien
How To

Nightscout installation auf einem Raspberry Pi 4

Falls du Hilfe brauchst oder in der Cloud hosten möchtest, kannst du dich auf der Kontaktseite oder unter der E-Mail „hello@diaplay.de“ melden!

Dieses DIY-Tutorial zeigt präzise wie du Nightscout mithilfe von Docker Compose auf einem Raspberry Pi installierst.

Schritt 1: Raspberry Pi Kaufen

Kaufe dir einen Raspberry Pi mit mindestens 2 GB. Gut für unsere Wirtschaft ist da (zum Beispiel) der Anbieter Reichelt: RPI 4B 2G oder Berrybase: RPI 4B 2G.

Ältere Raspberry Pis funktionieren meistens auch, einen Versuch ist es wert.

(Ein gutes Netzteil ist natürlich auch nötig, alternativ gibt es All-in-One Sets: AllInOne bei Reichelt )

Nicht zu vergessen ist eine Micro-SD-Karte mit mindestens 8 GB Speicher.

Schritt 2: OS auf SD Karte installieren

Schritt 2.1: Raspberry Pi Imager herunterladen

Lade dir den kostenlosen SD-Imager von Raspberry Pi herunter: Link ( Download bei Install Raspberry Pi OS using Raspberry Pi Imager )

Bei Windows lädst du eine .exe Datei herunter, die du danach auführen musst. Nach der Installation findest du im Windows Startmenü das Programm mit dem Namen Raspberry Pi Imager

Schritt 2.2: SD Karte Flashen

Stecke zuerst deine Micro-SD-Karte in deinen Laptop/PC. Öffne das Programm Raspberry Pi Imager.

Dort wählst du bei OS WählenOther general Purpose OS„, dann „Ubuntu“ und dann Ubuntu Server 22.04.1 LTS (Wichtig! 64-bit) aus.

Danach wählst du deine SD-Karte mit dem Button SD-Karte Wählen aus.

Klicke danach auf den Button Schreiben, das musst du ggf nochmal bestätigen.

Der Schreibprozess dauert eine Weile ( max. 30 min ).

Alternative zu Schritt 2:

Lade dir die 64-Bit version von Ubuntu Server hier herunter und packe die iso bzw img auf die SD Karte mit z.B. win32Imager

Schritt 3: Raspberry Pi Vorbereiten

Stecke die neu beschriebene SD-Karte in den SD-Karten-Slot des Raspberry Pi’s, schließe ein Ethernetkabel an deinen Router und den Raspberry Pi an und versorge ihn mit Strom.

Die LEDs des Raspberry Pis, sowie die LEDs beim Ethernet-Stecker sollten blinken/leuchten.

Schritt 4: SSH Verbindung herstellen

SSH ist ein einfacher und sicherer Weg um auf das Terminal des Raspberry Pis zuzugreifen.

Das vermutlich einfachste Programm ist PuTTY, welches hier heruntergeladen werden kann.

Nachdem du Putty installiert hast, kannst du PuTTY Öffnen.

Du siehst jetzt dieses Fenster:

Bei Host Name (or IP address) musst du ubuntu eingeben und dann auf Open klicken.

Achtung: Manche Router unterstützen den hostnamen nicht und müssen per IP-Addresse aufgerufen werden. Diese zu finden geht meist im Router selber oder mit Tools wie https://www.advanced-port-scanner.com/de/.

(Eine Alternative wäre das Terminal, dabei musst du den Befehl ssh ubuntu@ubuntu ausführen)

Schritt 4b: SSH Login

Falls du dich das erste mal mit dem Raspberry Pi verbindest bekommst du ein Fenster mit einer Warnung, diese kannst du ignorieren und auf Ja oder Yes drücken

Du bekommst jetzt ein Fenster in dem Steht login as:, dort gibst du ubuntu ein und klickst auf Enter. Das Passwort musst du als nächstes eingeben, dieses ist beim ersten Start ubuntu

(Nicht wundern: während du das Passwort eingibst erscheint dieses nicht im Terminal)

Danach wirst du aufgefordert das alte Passwort erneut einzugeben und ein neues auszuwählen (Wichtig: Das Passwort wird beim eingeben nicht angezeigt und der Cursor bewegt sich nicht). Als neues Passwort habe ich einfach mal raspberry ausgewählt, du kannst aber auch jedes andere sichere Passwort verwenden

Nachdem du das neues Passwort erneut bestätigt hast, wirst du ausgeloggt und musst dich mit PuTTY erneut einloggen, siehe Schritt 4

(Wichtig: Ab jetzt kannst du als Passwort nur noch dein neues verwenden, da du dies gerade geändert hast)

Du solltest jetzt eingeloggt sein und hast damit ein Terminal

Schritt 5: Installation von einigen Tools

Dies kann eine halbe Ewigkeit (~1 Stunde) brauchen.

Randnotiz: Das kopieren von den Befehlen in das Terminal kannst du so machen: du kopierst den Text mit Ctrl+C und fügst ihn in PuTTY mit einem Klick der rechten Maustaste ein.

Wir installieren jetzt erstmal Docker (kurz nachdem du Enter drückst musst du das bereits erwähnte Passwort eintippen und Enter drücken):

curl https://get.docker.com/ | sh

(Quelle: Docker Docs https://docs.docker.com/engine/install/ubuntu/)

Danach passen wir noch ein paar Rechte an und starten den Pi neu (vergiss nicht dich nach dem Neustart wieder per SSH einzuloggen):

sudo usermod -aG docker $USER &&
sudo reboot

Schritt 6: Nightscout & Mongo installieren

Zuerst erstellen wir einen Ordner in dem wir die Docker Konfigurationsdatei und die Daten der Datenbank speichern:

cd /home/$USER/ &&
mkdir nightscout &&
cd nightscout &&
mkdir db

Danach machen wir eine Datei in diesem Ordner mit den folgenden Befehlen:

cd /home/$USER/nightscout &&
nano docker-compose.yaml

In dem (via nano) geöffneten Dokument fügen wir (für’s erste) folgendes ein

version: '3.9'

services:
  nightscout:
    image: markxoe/nightscout-cgm-remote-monitor-raspberrypi:latest
    environment:
      TZ: Europe/Berlin
      MONGO_CONNECTION: mongodb://mongo:27017/nightscout
      API_SECRET: eintotalsicheresPasswort!
      BG_HIGH: 220
      BG_LOW: 60
      BG_TARGET_TOP: 180
      BG_TARGET_BOTTOM: 80
      INSECURE_USE_HTTP: "true"
      AUTH_DEFAULT_ROLES: denied
      ENABLE: delta direction rawbg
    ports:
      - "1337:1337"
    links:
      - mongo
    restart: always
  mongo:
    image: mongo:bionic
    restart: always
    volumes:
      - "./db:/data/db"

Danach speichern wir die Datei in dem wir Strg+O (großes o, keine Null), danach Enter und dann Strg+X auf der Tastatur drücken.

In dem Text stehen nach environment: einige Zeilen mit Einstellungen. Eine davon ist der API_SECRET, mehr dazu aber weiter unten

Jetzt laden wir noch die Images vom Docker hub mit diesem Befehl herunter: (Kann eventuell bis zu 45 minuten dauern)

docker compose pull

Schritt 7: Nightscout Starten

Jetzt kannst du endlich folgenden Befehl eingeben und damit Nightscout starten:

docker compose up -d

In der Konsole sollte dann so etwas wie

Running 2/2
Container nightscout-mongo-1 Started
Container nightscout-nightscout-1 Started

ausgegeben werden.

Getestet kann das ganze dann mit dem Browser und der URL http://ubuntu:1337/ werden. Falls du bei Schritt 4b Probleme mit dem Hostname ubuntu hattest, musst du hier wieder die IP-Addresse verwenden.

Achtung: Falls du Einstellungen in der Datei docker-compose.yml vornimmst, musst du nach dem Ändern docker compose up -d eingeben, um die Einstellungen anzuwenden.

Schritt 8: Einstellungen vornehmen

Die Einstellungen müssen in der Datei docker-compose.yml vorgenommen werden. Zum editieren empfehle ich für nicht-vim-Nutzer „nano“, andere Editoren gehen aber auch.

Achtung: Vergiss nicht nach Änderungen an den Einstellungen den Befehl docker compose up -d auszuführen, um diese Anzuwenden!

Fun fact: Nach Änderungen an Einstellungen musst du nichts mehr herunterladen, d.h. das Anwenden geht sehr schnell.

Zum Öffnen der Datei wieder folgenden Befehl verwenden:

nano docker-compose.yml

Es gibt folgende wichtige Einstellungen:

  • API_SECRET
    • 12 Zeichen langer Text, sowas wie das Admin passwort
    • Sollte nicht einfach zu erraten sein -> man kann mit ihm daten in Nightscout ändern!
  • ENABLE
  • INSECURE_USE_HTTP
    • Muss auf „true“ gesetzt sein, solange man kein SSL direkt mit Nightscout verwendet bzw. Nightscout hinter einen sog. reverse proxy setzt (würde ich empfehlen) Anleitung dazu gibt es hier: Nightscout ins Internet bringen
  • AUTH_DEFAULT_ROLES
    • Sicherheitsbedingte Einstellung, ist sie auf denied gestellt braucht man einen oder den Token um auf Daten zuzugreifen (für Nutzung im Internet empfohlen), diese kann aber auch auf z.B. readable gesetzt werden, so kann aber jeder auf die Daten zugreifen.

Gespeichert wird die Datei wieder mit Strg+O, dann Enter und dann Strg+X. Danach muss noch docker compose up -d ausgeführt werden um die Einstellungen anzuwenden

Schritt 8,5: Updates

Updates gehören zu den Dingen die schnell nervig werden können. Systemupdates kann man automatisch ausführen lassen, dazu gibt es einige Anleitungen, wie zum Beispiel hier:  https://www.linuxcapable.com/how-to-install-configure-unattended-upgrades-on-ubuntu-22-04-lts/ (Danke Marco!)

Falls du mal spontan Lust auf Updates bekommen solltest kannst du dafür diesen Befehl ausführen (kann eventuell mehrere Ewigkeiten dauern):

sudo apt update && 
sudo apt upgrade

Um Updates für Nightscout und Mongo zu laden kannst du folgenden Befehl verwenden (kann eventuell einige hundert Sekunden brauchen):

docker compose pull && 
docker compose up -d

ToDo: Automatische Nightscout & MongoDB updates via cronjob

Schritt 9 (optional): Nightscout ins Internet bringen

Bisher kannst du Nightscout nur bei dir lokal verwenden, das ist doof, wenn du oder dein(e) Diabetiker(in) nicht zuhause (b)ist.

Um Nightscout im Internet verfügbar zu machen, kannst du diese Anleitung verwenden: Nightscout ins Internet bringen

Schritt 10: mit Uploader/ xDrip etc. verwenden

Die meisten Applikationen brauchen die URL des Servers sowie der/die/das API_SECRET.

Die URL des Servers ist http://ubuntu:1337/ bzw bei manchen Routern http://<ip-addresse>:1337/ wobei <ip-addresse> mit der IP addresse des Raspberry Pis ersetzt werden muss. Ach ja, aktuell kannst du Nightscout nur lokal verwenden, um das auch von Außen zu nutzen ist noch ein wenig Aufwand nötig, siehe weiter unten.

Falls du Nightscout außerhalb verwenden willst musst du bereits erwähnte Anleitung verwenden um dies zu tun, die Domain ist dann dementsprechend anders, mehr dazu in der Anleitung

Die API_SECRET ist (zurzeit) bei uns

eintotalsicheresPasswort!

Dieser kann und soll aber bitte auch geändert werden, siehe Schritt 8.

Bei Fragen oder Verbesserungen einfach Kontaktieren