In diesem Tutorial zeige ich, wie Nightscout auf einem VPS-Server mit Ubuntu 24.04, MongoDB 8 (aktuelles Release 8.0.11) Datenbank und Node 18.20.8 installiert wird.

Der Verwendete Server in diesem Tutorial ist ein günstiges 1blu-VPS „Eco“ Setup mit 2 Core Prozessor und 4 GB Ram. Regulärer Preis 3,99€/Monat, derzeit wieder als Aktion für 1€/Monat für 12 Monate.

https://www.1blu.de/vps/eco/


 


Grundsätzlich ist die Anleitung nahezu identisch zur Ursprünglichen Anleitung Nightscout auf Ubuntu VPS-Server mit Nginx jedoch ist der Schritt MongoDB installieren abweichend, da MongoDB nicht mehr im Ubuntu Image enthalten ist.
Für die Konfiguration verwende ich Putty um die Verbindung mit dem Server herzustellen.
Wie in der Ursprünglichen Anleitung wird in Putty die IP-Adresse des Server angegeben und die Zugangsdaten die ich vom Serverbetreiber (1Blu) erhalten habe. In der Regel ist der Standard Nutzer Admin.

Wenn wir mit Putty kontakt zum Server aufgebaut haben, beginnen wir mit den Grundlagen.
Das $ braucht nicht mit kopiert zu werden, dient nur als Hinweis dass dies der zu kopierende Text ist.


Apache 2 deinstallieren
Zunächst wird Apache 2 deinstalliert, dazu stoppen wir den Apache Service.

$ sudo service apache2 stop

Deinstallation durchführen:

$ sudo apt-get purge apache2 apache2-utils

ebenfalls vorhandene Reste löschen:

$ sudo rm -rf /etc/apache2
$ sudo rm -rf /usr/sbin/apache2
$ sudo rm -rf /usr/lib/apache2
$ sudo rm -rf /etc/apache2
$ sudo rm -rf /usr/share/apache2
$ sudo rm -rf /usr/share/man/man8/apache2.8.gz

Nach Dateien und Verzeichnisse zum Apache finden

$ whereis apache2

Sollten noch Verzeichnisse Angezeigt werden, diese ebenfalls löschen.


Ubuntu aktualisieren

$ apt update

Wenn Updates vorhanden sind, diese installieren

$ apt upgrade

Wichtige Komponenten installieren
Firewall (Einrichtung der Firewall erfolgt später):

$ apt install ufw

Nginx Webserver:

$ apt install nginx

Nano:

$ apt-get install nano

Git:

$ apt install git

Python:

$ apt install python3

GCC, falls nicht schon vorhanden:

$ apt install gcc

$ apt-get install gnupg curl


MongoDB 8.0 Installieren

Im ersten Schritt importieren wir den MongoDB public GPG key:

$ curl -fsSL https://www.mongodb.org/static/pgp/server-8.0.asc | \
sudo gpg -o /usr/share/keyrings/mongodb-server-8.0.gpg \
--dearmor

Anschließend erstellen wir die Liste für Ubuntu

$ echo "deb [ arch=amd64,arm64 signed-by=/usr/share/keyrings/mongodb-server-8.0.gpg ] https://repo.mongodb.org/apt/ubuntu noble/mongodb-org/8.0 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-8.0.list

Nachdem die Liste erstellt ist, aktualisieren wir die Paketdatenbank und installieren MongoDB

$ apt-get update

$ apt-get install -y mongodb-org

Nach der erfolgreichen Installation starten wir MongoDB

$ systemctl start mongod

$ systemctl daemon-reload

Nun Prüfen wir den MongoDB Status

$ systemctl status mongod

Es sollte eine Erfolgsmeldung erscheinen:

Active: active (running)

strg+c zurück zur Eingabe


Mongo Datenbank erstellen
(„Benutzername“ und „Passwort“ nach Wunsch ändern und merken/aufschreiben)

Mit dem Befehl mongosh rufen wir die Mongo Shell auf.

$ mongosh

Neue Datenbank erstellen:
> use Nightscout

Datenbank Benutzer und Passwort anlegen:
> db.createUser({user: "Benutzername", pwd: "Passwort", roles:["readWrite"]})

Mongo Shell verlassen
> quit()


Nutzer erstellen

Als nächstes wird ein neuer Ubuntu Benutzer erstellt (Mainuser=Benutzername).

Neuen Benutzer anlegen:

$adduser mainuser

mainuser Root Berechtigung erteilen:

$usermod -aG sudo mainuser

Berechtigung prüfen:

$su mainuser

grep '^sudo' /etc/group

Als Mainuser eingeloggt bleiben!


Nodejs installieren

$ sudo apt install nodejs
$ sudo apt install build-essential checkinstall
$ sudo apt install libssl-dev
$ wget -qO- https://raw.githubusercontent.com/creationix/nvm/v0.40.3/install.sh | bash

– restart konsole – login mit mainuser –

$ source /etc/profile
$ nvm ls-remote
$ nvm install 18.20.8
$ nvm list
$ nvm use 18.20.8

NPM installieren

$ sudo apt install npm


Git Clonen

Wenn man mit Mainuser eingeloggt ist, befindet man sich im Korrekten Verzeichnis.
Mit pwd kann man dennoch Überprüfen in welchem Verzeichnis man sich befindet:

$ pwd
> /home/mainuser

Wenn nicht im home/mainuser Verzeichnis

§ cd /home/mainuser


Git Kopieren/Clonen

Mit Git Clone kopieren wir uns die Nightscout Dateien von Github.

$ git clone https://github.com/nightscout/cgm-remote-monitor.git

Wir wechseln ins Nightscout Verzeichnis:

$ cd cgm-remote-monitor

Anschließend starten wir die Installation:

$ npm install


Nightscout start.sh erzeugen

Nach der erfolgreichen Installation benötigen wir noch die start.sh um Nightscout zu starten.

$ nano start.sh

folgenden Text kopieren, einfügen und speichern. „benutzer“ “passwort“ und „Datenbankname“ der MongoDatenbank ändern/angeben.
12-stellige-API-Secret-Code wunschgemäß Angeben, dies ist das Passwort von deiner späteren Nightscout Installation.
Welche Plugins/Module benötigt werden hängt vom Anwender individuell ab.
In dieser start.sh ist der Aufruf der Nightscout Instanz ohne Passwort nicht möglich.
Soll der Aufruf ohne Passwort erhalten bleiben, muss die Zeile „export AUTH_DEFAULT_ROLES=“denied““ gelöscht werden.
Die hier aufgeführten Plugins/Module sind für mich Optimal. Eine Auflistung der möglichen Plugins gibt´s auf github
https://github.com/nightscout/cgm-remote-monitor#plugins :

#!/bin/bash

# environment variables
export DISPLAY_UNITS="mg/dl"
export MONGO_CONNECTION="mongodb://benutzer:passwort@localhost:27017/Datenbankname"
export BASE_URL="127.0.0.1:1337"
export API_SECRET="12-stellige-API-Secret-Code"
export PUMP_FIELDS="reservoir battery status"
export DEVICESTATUS_ADVANCED=true
export ENABLE="careportal loop iob cob openaps pump bwg rawbg basal cors direction timeago devicestatus ar2 profile boluscalc food sage iage cage alexa basalprofile bgi directions bage upbat googlehome errorcodes reservoir battery openapsbasal"
export TIME_FORMAT=24
export INSECURE_USE_HTTP=true
export LANGUAGE=de
export EDIT_MODE=on
export PUMP_ENABLE_ALERTS=true
export PUMP_FIELDS="reservoir battery clock status"
export PUMP_RETRO_FIELDS="reservoir battery clock"
export PUMP_WARN_CLOCK=30
export PUMP_URGENT_CLOCK=60
export PUMP_WARN_RES=50
export PUMP_URGENT_RES=10
export PUMP_WARN_BATT_P=30
export PUMP_URGENT_BATT_P=20
export PUMP_WARN_BATT_V=1.35
export PUMP_URGENT_BATT_V=1.30
export OPENAPS_ENABLE_ALERTS=false
export OPENAPS_WARN=30
export OPENAPS_URGENT=60
export OPENAPS_FIELDS="status-symbol status-label iob meal-assist rssi freq"
export OPENAPS_RETRO_FIELDS="status-symbol status-label iob meal-assist rssi"
export LOOP_ENABLE_ALERTS=false
export LOOP_WARN=30
export LOOP_URGENT=60
export SHOW_PLUGINS=careportal
export SHOW_FORECAST="ar2 openaps"
export AUTH_DEFAULT_ROLES="denied"

# start server
/home/mainuser/.nvm/versions/node/v18.20.8/bin/node server.js


Mit strg+X wird Nano beendet, mit  Y bestätigen wir das Speichern. Nach dem Speichern müssen die Datei-Rechte auf 755 geändert werden.

$ chmod 775 start.sh

Anschließend wird die start.sh getestet.
$ ./start.sh

Nach Erfolgsmeldung strg+c


Nightscout Service einrichten
Beim Nightscout Service einrichten gibt es zum „Type“ verschiedene Aussagen. Ich nutze von beginn an dem Type „simple“.
In diversen Foren wird der Typ „forked“ empfohlen. Der Type „simple“ sollte normalerweise reichen. Startet Nightscout nicht, so kann man den Type nachträglich noch auf „forked“ ändern. Nach jeder Änderung des Nightscout Service oder der start.sh-Datei muss der Nightscout Service neu gestartet werden (sudo systemctl restart nightscout.service).

$ sudo nano /etc/systemd/system/nightscout.service

Kopieren, einfügen und speichern:

[Unit]
Description=Nightscout Service
After=network.target

[Service]
Type=simple
WorkingDirectory=/home/mainuser/cgm-remote-monitor
ExecStart=/home/mainuser/cgm-remote-monitor/start.sh

[Install]
WantedBy=multi-user.target


Speichern und beenden mit: „strg+X“ – „Y“ – „enter“
Deamon Reload:

$ sudo systemctl daemon-reload

Nigtscout Service aktivieren und starten:

$ sudo systemctl enable nightscout.service
$ sudo systemctl start nightscout.service

Nightscout Service Status anzeigen lassen:

$ sudo systemctl status nightscout.service

Ausgabe:

? nightscout.service – Nightscout Service
Loaded: loaded (/etc/systemd/system/nightscout.service; enabled; vendor preset: enabled)
Active: active (running)
[..]


Domain dem Host zuweisen
(Hauptdomain und eine Subdomain für ns).
Für die Nightscount Instanz nutze ich eine Subdomain. Bei 1blu ist eine Domain in Form von „v1223465.1blu.de“ beim VPS-Server enthalten.
Diese kann man in der Regel verwenden. Je nach Server Anbieter kann es vorkommen, dass Let´s Encrypt für die Subdomain des Hosters keine Zertifikate ausstellt.

$ sudo nano /etc/hosts

[…]
IP.deines.Servers Domain.de

IP.deines.Servers subdomain.domain.de

[…]

Speichern mit „strg+X“ – „Y“ – „enter“

Als nächstes deaktivieren wir die „default“ Standard Konfiguration.

$ sudo unlink /etc/nginx/sites-enabled/default

Nun erstellen wir eine neue Kofiguration

$ sudo nano /etc/nginx/sites-available/Domain.de.conf

Diesen Teil Kopieren und auf Deine Domain ändern:

server {
listen 80 default_server;
listen [::]:80 default_server;

root /var/www/html;
index index.html index.htm index.nginx-debian.html;

server_name domain.de;
location / {
try_files $uri $uri/ =404;
}
}


Als nächstes die Subdomain einrichten (Weiterleitung auf Port unverschlüsselt)

$ sudo nano /etc/nginx/sites-available/subdomain.Domain.de.conf

Diesen Text kopieren, server_name auf deine Subdomain vorher ändern:

server {
listen 80;

server_name subdomain.domain.de www.subdomain.doamin.de;

location / {
proxy_pass http://127.0.0.1:1337;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Forwarded-Proto "https";
}
}


Als nächstes die Nginx Konfiguration für die Domains aktivieren:

$ sudo ln -s /etc/nginx/sites-available/Domain.de.conf /etc/nginx/sites-enabled/
$ sudo ln -s /etc/nginx/sites-available/subdomain.Domain.de.conf /etc/nginx/sites-enabled/

Nginx neustarten, damit die Konfiguration wirksam wird.

$ sudo service nginx restart


Certbot für Nginx installieren und Zertifikat anfordern
Falls noch nicht installiert, certbot/python3 installieren:

$ sudo apt install certbot python3-certbot-nginx

Zertifikat anfordern:
Zertifikat für die Hauptdomain:

$ sudo certbot --nginx -d Domain.de -d www.Domain.de

Bei der ersten Zertifikatserstellung muss die Nutzungsbedingung akzeptiert werden.
Ebenfalls wird deine Email Adresse angefragt, diese ist einzugeben.
Werbung von Partnern kann mit nein beantwortet werden.

Redirect mit 2 bestätigen! Heißt das automatisch jeder Aufruf deiner Seite auf SSL Verschlüsselung geleitet wird.

–> Email Adresse eingeben „Enter“
–> Nutzungsbedingungen bestätigen „A“+“Enter“
–> Newsletter/Neuigkeiten „N“+“Enter“
–> Nach einem Moment auswählen ob alle Anfragen auf https umgeleitet werden sollen.
1 = Nein 2=Ja mit „Enter bestätigen

Danach Zertifikat für die Subdomain anfordern:

$ sudo certbot --nginx -d subdomain.Domain.de -d www.subdomain.Domain.de

Redirekt mit 2 bestätigen.
Certbot Timer prüfen:

$ sudo systemctl status certbot.timer

Erneuerungsprozess testen

$ sudo certbot renew --dry-run


Firewall konfigurieren/aktivieren
Um die Firewall zu konfigurieren Putty neu starten und mit root Account einloggen!
Der Port 27017 erlaubt den externen Zugriff auf Mongo DB z.B. mit Robot3T.
Nginx und OpenSSH erlauben das aufrufen des Servers und die Verbindung via Putty bzw. Kosole/FTP.
Der Port 1337 ist für Nightscout. (Hier streiten sich die Meinungen ob Sinnvoll ist oder nicht.)

$ ufw allow 1337
$ ufw allow 'Nginx Full'
$ ufw allow 27017
$ ufw allow OpenSSH

Als nächstes aktivieren wir die Firewall:

$ ufw enable

Wichtig: Firewall darf erst aktiviert werden wenn die Freigaben erteilt wurden.
Um einzusehen ob die Firewall aktiviert und die o.a. Einstellungen erlaubt sind, Status überprüfen:

$ ufw status

Das Ergebnis sollte so aussehen:

Status: active

To Action From
— —— —-
1337 ALLOW Anywhere
27017 ALLOW Anywhere
OpenSSH ALLOW Anywhere
Apache Full ALLOW Anywhere
Nginx Full ALLOW Anywhere
1337 (v6) ALLOW Anywhere (v6)
27017 (v6) ALLOW Anywhere (v6)
OpenSSH (v6) ALLOW Anywhere (v6)
Apache Full (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)


Jetzt sollte auf beim Aufruf der Hauptdomain (automatisch verschlüsselt) die nginx Testseite erscheinen und beim Aufruf der Subdomain die Nightscout Installation erscheinen (ohne Angabe des Ports 1337, da oben schon eine Weiterleitung eingerichtet ist)

Optional kann man einmal den Sever neu starten,
Der Bootvorgang bis Nightscout wieder voll erreichbar ist, kann bis zu 5 Minuten in Anspruch nehmen.