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).
DEINE-SERVER-IP).8080 (Weboberfläche),
8883 (MQTT/TLS für noodo) und 1700/udp (Gateway).Am Server anmelden und Docker einrichten:
curl -fsSL https://get.docker.com | sudo shDamit du Docker ohne sudo nutzen kannst, den eigenen Benutzer zur Docker-Gruppe hinzufügen
und einmal neu anmelden:
sudo usermod -aG docker $USERWir 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
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
cd /opt/chirpstack && sudo docker compose up -dNach ein paar Sekunden ist die Weboberfläche erreichbar unter
http://DEINE-SERVER-IP:8080. Erst-Login: admin / admin.
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 fail2banNoch 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.
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 anlegen — im Tenant (nicht im globalen „Network Server"-Bereich): Tenants → ChirpStack → Device profiles → Add device profile. Die Felder verteilen sich auf Reiter:
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).0)
— damit Kommandos jederzeit zustellbar sind.Uplink-SF7 = noodo-Firmware (sendet fest SF7); Downlink-SF7 = rx2_dr=5 (Schritt a).
Das Gateway empfängt parallel auf allen Spreizfaktoren.
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:
DEINE-SERVER-IP1700Das „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:
ug65-standort-1)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.
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):
mqtts://DEINE-SERVER-IP:8883 · Benutzer/Passwort aus Schritt 4b/opt/chirpstack/configuration/mosquitto/config/certs/ca.crt2. ChirpStack-API (Befehle senden + Geräte verwalten):
8090) muss für den noodo-Server
erreichbar sein./tenants/<ID>/…).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.
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.