← Alle Anleitungen

LoRaWAN-Server (ChirpStack) einrichten

Nicht jedes Gateway sitzt neben einer Netzwerkdose. Über LoRaWAN erreichen weit entfernte noodo-Gateways trotzdem dein System: ein kleiner ChirpStack-Server empfängt den Funk (über ein LoRaWAN-Gateway) und reicht alles verschlüsselt per MQTT an noodo weiter. Diese Anleitung richtet ChirpStack mit Docker ein, stellt festes SF7 ein, sichert das MQTT mit TLS + Login ab und bindet ein Gateway an (am Beispiel des Milesight UG65).

Für wen? Diese Anleitung richtet sich an Installateure/Administratoren. Du brauchst einen kleinen Linux-Server (Ubuntu 22.04+) und ein LoRaWAN-Gateway. Den Lizenz-/Zugang zum noodo-System bekommst du wie gewohnt über uns.
1

Voraussetzungen

  • Server: Ubuntu 22.04+ (oder Debian), ca. 2 CPU-Kerne / 4 GB RAM / 15 GB Disk, mit fester öffentlicher IP (im Folgenden DEINE-SERVER-IP).
  • LoRaWAN-Gateway (Konzentrator), das die Funksignale empfängt — z. B. ein Milesight UG65. ChirpStack selbst hat kein Funkmodul.
  • Auf dem Server müssen 3 Ports nach außen erreichbar sein: 8080 (Weboberfläche), 8883 (MQTT/TLS für noodo) und 1700/udp (Gateway).
2

Docker installieren

Am Server anmelden und Docker einrichten:

curl -fsSL https://get.docker.com | sudo sh

Damit du Docker ohne sudo nutzen kannst, den eigenen Benutzer zur Docker-Gruppe hinzufügen und einmal neu anmelden:

sudo usermod -aG docker $USER
3

ChirpStack holen & auf EU868 stellen

Wir nutzen das offizielle ChirpStack-Docker-Setup als Basis:

sudo apt-get install -y git
sudo git clone https://github.com/chirpstack/chirpstack-docker.git /opt/chirpstack
sudo chown -R $USER:$USER /opt/chirpstack
cd /opt/chirpstack

In configuration/chirpstack/chirpstack.toml die aktiven Regionen auf nur EU868 reduzieren (das spart Speicher und Startzeit):

perl -0777 -pi -e 's/enabled_regions=\[.*?\]/enabled_regions=[\n    "eu868",\n  ]/s' \
  configuration/chirpstack/chirpstack.toml
4

MQTT absichern (TLS + Login)

Standardmäßig ist der MQTT-Broker offen und unverschlüsselt. Wir richten zwei getrennte Zugänge ein: intern (nur für ChirpStack selbst, im Docker-Netz, ohne Login) und extern mit TLS + Benutzer/Passwort — nur darüber spricht noodo mit dem Broker.

a) Eigene Zertifikate (eigene CA + Server-Zertifikat mit deiner Server-IP). Vorher die IP setzen:

export SERVER_IP=DEINE-SERVER-IP
cd /opt/chirpstack
CERT=configuration/mosquitto/config/certs
mkdir -p "$CERT"

# Eigene CA
openssl req -new -x509 -days 3650 -nodes -newkey rsa:2048 \
  -keyout "$CERT/ca.key" -out "$CERT/ca.crt" -subj "/CN=noodo-chirpstack-CA"

# Server-Zertifikat (mit IP-SAN)
openssl req -new -nodes -newkey rsa:2048 \
  -keyout "$CERT/server.key" -out "$CERT/server.csr" -subj "/CN=$SERVER_IP"
printf 'subjectAltName=IP:%s\nextendedKeyUsage=serverAuth\n' "$SERVER_IP" > "$CERT/san.ext"
openssl x509 -req -in "$CERT/server.csr" -CA "$CERT/ca.crt" -CAkey "$CERT/ca.key" \
  -CAcreateserial -days 3650 -sha256 -extfile "$CERT/san.ext" -out "$CERT/server.crt"
rm -f "$CERT/server.csr" "$CERT/san.ext"

b) MQTT-Benutzer anlegen (Passwort wird erzeugt — notieren!):

MQTT_PW=$(openssl rand -hex 24)
echo "MQTT-Benutzer: noodo"
echo "MQTT-Passwort: $MQTT_PW      <-- NOTIEREN (kommt ins noodo-System)"
sudo docker run --rm -v "$PWD/configuration/mosquitto/config:/cfg" eclipse-mosquitto:2 \
  mosquitto_passwd -b -c /cfg/passwd noodo "$MQTT_PW"

c) Broker-Konfiguration schreiben (intern offen, extern TLS+Login):

cat > configuration/mosquitto/config/mosquitto.conf <<'CONF'
per_listener_settings true
persistence false
log_dest stdout

# Intern: nur im Docker-Netz, NICHT nach außen veröffentlicht
listener 1883
allow_anonymous true

# Extern: TLS + Benutzer/Passwort — nur hierüber kommt noodo rein
listener 8883
allow_anonymous false
password_file /mosquitto/config/passwd
cafile /mosquitto/config/certs/ca.crt
certfile /mosquitto/config/certs/server.crt
keyfile /mosquitto/config/certs/server.key
tls_version tlsv1.2
CONF

# Dateirechte für den Mosquitto-Container
sudo chown -R 1883:1883 configuration/mosquitto/config

d) In docker-compose.yml beim Dienst mosquitto den veröffentlichten Port von 1883 auf 8883 ändern — so ist der interne Broker nie von außen offen:

sed -i 's|- "1883:1883"|- "8883:8883"|' /opt/chirpstack/docker-compose.yml
5

Starten

cd /opt/chirpstack && sudo docker compose up -d

Nach ein paar Sekunden ist die Weboberfläche erreichbar unter http://DEINE-SERVER-IP:8080. Erst-Login: admin / admin.

Sofort ändern: nach dem ersten Login das Admin-Passwort setzen (oben rechts → Profil/Benutzer) — die Oberfläche ist über das Internet erreichbar.
6

Server absichern

Firewall einrichten: SSH erlauben (mit Brute-Force-Drossel), sonst nur die nötigen Ports.

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit 22/tcp          # SSH: erlaubt, blockt bei zu vielen Versuchen
sudo ufw allow 8080/tcp        # ChirpStack-Weboberfläche
sudo ufw allow 8883/tcp        # MQTT (TLS, für noodo)
sudo ufw allow 1700/udp        # LoRa-Gateway
sudo ufw --force enable

Zusätzlicher Schutz gegen SSH-Brute-Force:

sudo apt-get install -y fail2ban

Noch sicherer: 8080 und 8883 auf feste IP-Adressen beschränken (z. B. 8883 nur für den noodo-Server). Bei wechselnder eigener IP 22 offen lassen — ufw limit + fail2ban fangen Angriffe ab.

7

Festes SF7 (senden & empfangen)

noodo nutzt bewusst durchgängig SF7 (höchste Datenrate, kürzere Reichweite) — in beide Richtungen. Das Gateway empfängt ohnehin parallel auf allen Spreizfaktoren (SF7–SF12).

a) Downlink (Server → Gerät) auf SF7. Kommandos an dauerhaft lauschende (Class-C-)Geräte gehen über das RX2-Fenster. Dessen Datenrate steht in der Region-Datei — auf DR5 (SF7) setzen und ChirpStack neu starten:

sed -i -E 's/^([[:space:]]*rx2_dr[[:space:]]*=[[:space:]]*)[0-9]+/\15/' \
  /opt/chirpstack/configuration/chirpstack/region_eu868.toml
cd /opt/chirpstack && sudo docker compose restart chirpstack

b) Geräteprofil anlegenim Tenant (nicht im globalen „Network Server"-Bereich): Tenants → ChirpStack → Device profiles → Add device profile. Die Felder verteilen sich auf Reiter:

  • Reiter „General": Name z. B. noodo-eu868; Region: EU868; MAC version passend zum Gerät (z. B. LoRaWAN 1.0.3, Regional parameters A); ADR algorithm: „Default ADR algorithm (LoRa only)"; Supported data-rates → nur DR5 (SF7) auswählen (= harte SF7-Sperre).
  • Reiter „Join (OTAA / ABP)": „Device supports OTAA" an.
  • Reiter „Class-C": „Device supports Class-C" an (Confirmed downlink timeout = 0) — damit Kommandos jederzeit zustellbar sind.
  • Submit.
Es gibt kein „ADR aus"? Stimmt — ChirpStack v4 hat keinen Aus-Schalter; das Feld „ADR algorithm" wählt nur, welcher Algorithmus läuft. ADR greift ohnehin nur, wenn das Gerät es anfordert — die noodo-Firmware sendet fest SF7 ohne ADR, ChirpStack ändert die Datenrate also nicht. Mit Supported data-rates = nur DR5 (SF7) ist SF7 zusätzlich serverseitig festgenagelt.
Siehst du „Add vendor" statt „Add device profile"? Dann bist du unter Network Server → Device-profile templates — wechsle in den Tenant „ChirpStack" und dort auf Device profiles.

Uplink-SF7 = noodo-Firmware (sendet fest SF7); Downlink-SF7 = rx2_dr=5 (Schritt a). Das Gateway empfängt parallel auf allen Spreizfaktoren.

8

Gateway hinzufügen — am Beispiel Milesight UG65

a) UG65 ins Netz bringen. In der UG65-Weboberfläche (Auslieferung meist http://192.168.23.150) unter Network → Interface → WLAN als Client in dein WLAN einbuchen (oder LAN verwenden). Das Gateway braucht eine Internetverbindung, um den Server zu erreichen.

b) Gateway-EUI ablesen — unter Packet Forwarder bzw. LoRaWAN → Network Server steht die Gateway EUI (16 Hex-Zeichen, z. B. 24E124FFFE______). Diese gleich notieren.

c) Auf deinen ChirpStack zeigen. Im UG65 unter Packet Forwarder einen neuen Eintrag hinzufügen (den bereits vorhandenen nicht ändern) und auf deinen ChirpStack richten:

  • Enable anhaken (aktiviert diesen neuen Eintrag).
  • Type: Semtech (UDP-Packet-Forwarder) — passt zum Gateway-Bridge auf dem Server.
  • Server Address: DEINE-SERVER-IP
  • Port Up & Port Down: 1700
  • Frequenzplan / Region: EU868
  • Speichern.

Das „Type"-Menü bietet (z. B. bei Milesight) auch ChirpStack-v4 an — dann spräche das Gateway direkt per MQTT/TLS: sicherer, aber mehr Einrichtung. Mit Semtech läuft es sofort, und die LoRa-Frames sind ohnehin Ende-zu-Ende verschlüsselt. Der Router braucht kein Port-Forwarding — das Gateway verbindet sich selbst nach außen.

d) In ChirpStack registrieren. Weboberfläche → Tenant „ChirpStack" → Gateways → Add gateway:

  • Name: frei wählbar (z. B. ug65-standort-1)
  • Gateway EUI: die EUI aus Schritt b
  • Speichern.

Kommt dabei „Origin does not have permission to use Geolocation service", liegt das nur daran, dass die Weboberfläche über HTTP läuft (Geolocation braucht HTTPS). Einfach ignorieren — Name + EUI genügen; der Standort auf der Karte ist nur Anzeige und optional.

Sobald der UG65 funkt, springt das Gateway in ChirpStack auf online (Spalte „Last seen") — der Funkweg steht.

Fertig — mit noodo verbinden

Der ChirpStack-Server läuft, ist abgesichert und empfängt dein Gateway. noodo spricht mit ChirpStack über zwei Kanäle — die Werte trägst du im noodo-Admin unter Verwaltung → LoRaWAN ein:

1. MQTT (Uplinks von den Geräten):

  • Adresse: mqtts://DEINE-SERVER-IP:8883 · Benutzer/Passwort aus Schritt 4b
  • CA-Zertifikat: /opt/chirpstack/configuration/mosquitto/config/certs/ca.crt

2. ChirpStack-API (Befehle senden + Geräte verwalten):

  • API-Adresse: die ChirpStack-REST-API (Standard-Port 8090) muss für den noodo-Server erreichbar sein.
  • API-Token: ChirpStack-UI → Tenant „ChirpStack" → API keys → Add → Token kopieren.
  • Tenant-ID: steht in der ChirpStack-UI in der Adresszeile (/tenants/<ID>/…).
Wichtig für Produktion: Im Docker-Compose ist die REST-API auf 127.0.0.1:8090 gebunden (nur lokal). Gib sie für noodo frei — aber nicht als offenes HTTP, sondern über HTTPS (hinter deinem Reverse-Proxy/Domain) und am besten auf die noodo-Server-IP beschränkt; geschützt ist die API nur durch den Token.

Kommst du nicht weiter? Schreib uns — wir helfen gern.

Ein Gateway als LoRa-Notweg einrichten

Ist der ChirpStack-Server verbunden, aktivierst du LoRa pro BLE-Gateway in der noodo-App: Geräte → beim Gateway das Menü → „LoRa-Notweg einrichten". noodo richtet das Gateway dann automatisch ein (ChirpStack-Gerät, Schlüssel, Multicast-Gruppe) — das passiert beim nächsten Kontakt und kann eine Minute dauern. Danach zeigt die Geräte-Karte den LoRa-Status (verbunden · GW #n).

Wozu? Fällt bei einem Gateway das LAN/WLAN aus (kein Internet mehr), werden Suchen, Signalisieren und Öffnen seiner Türen automatisch über LoRaWAN abgewickelt — du musst nichts umschalten. Die Status-LED des Gateways leuchtet dann türkis (nur LoRa) bzw. grün/türkis geteilt, wenn beide Wege aktiv sind.

LoRa ist langsamer: Funk unterliegt dem Duty-Cycle — eine Öffnung dauert über LoRa typischerweise 20–40 s (nicht Sekunden wie über LAN). Die App zeigt dabei einen Countdown und einen Hinweis. LoRa ist der Notweg; wo LAN/WLAN anliegt, läuft alles weiter darüber. Tipp: Mehrere Türen zusammen öffnen (Mehrfachauswahl) kostet über LoRa fast genauso wenig Zeit wie eine einzelne — also bündeln.