Externer Mosquitto MQTT Broker (Docker mit ACLs)

Mosquitto 2 Installation (Docker)

Vorbereitung

Download des Mosquitto 2 Docker Image und erstellen der Ordner, die später in den laufenden Container eingebunden werden:

docker pull eclipse-mosquitto:2-openssl

sudo mkdir -p /opt/mosquitto/{data,log,config}

sudo chmod -R 777 /opt/mosquitto

tree -ph /opt/mosquitto

[drwxrwxrwx 4.0K]  /opt/mosquitto
├── [drwxrwxrwx 4.0K]  config
├── [drwxrwxrwx 4.0K]  data
└── [drwxrwxrwx 4.0K]  log

Erstellen der Konfigurationsdatei

Die Standard Konfiguration kann von Github heruntergeladen werden:

cd /opt/mosquitto/config

wget https://raw.githubusercontent.com/eclipse-mosquitto/mosquitto/2c671de72a0aebff0f3896a1b7dab2f2dfe51c26/mosquitto.conf

Und dann nach eigenen Bedürfnissen angepasst werden:

# Config file for mosquitto
#
# See mosquitto.conf(5) for more information.
#
per_listener_settings false
allow_zero_length_clientid true
auto_id_prefix zeroid-
check_retain_source true
max_inflight_messages 20
max_keepalive 65535
max_qos 2
max_queued_messages 1000
memory_limit 0
persistent_client_expiration 1d
queue_qos0_messages false
retain_available true
set_tcp_nodelay false
sys_interval 10
upgrade_outgoing_qos false
listener 1883
max_connections 1024
protocol mqtt
autosave_interval 7200
autosave_on_changes false
persistence false
persistence_file /mosquitto/config/mosquitto.db
log_dest file /mosquitto/log/logfile
log_type all
connection_messages true
log_timestamp true
log_timestamp_format %Y-%m-%dT%H:%M:%S
allow_anonymous false
password_file /mosquitto/config/passwordfile
acl_file /mosquitto/config/acl

Beschränken der Kamera MQTT Topics

Die Konfigurationsdatei hat bereits eine ACL (Access Control List) verlinkt, die noch angelegt werden muss, um festzulegen welche MQTT Topics der Kamera wir verwenden möchten:

nano /opt/mosquitto/config/acl
topic readwrite +/+/status/alarm/#
topic readwrite +/+/alarm/#
topic read $SYS/#

Hier können alle gewünschten Topics aufgelistet werden - entweder mit read, write oder readwrite Rechten. Man kann entweder alle gewünschten Topics separate auflisten oder „wildcards“ nutzen, um Gruppen von Topics hinzuzufügen.

Die beiden + Zeichen am Anfang bedeuten, dass man alle Topics anspricht, unabhängig vom MQTT Präfix und Klienten-ID. Das # Symbol am Ende bedeutet das alle Topics, die unter alarm/ liegen mit eingeschlossen werden. Es werden also alle Status und Befehl Alarm Topics durchgelassen. Alle Anderen - features/, smarthome/, system/ usw. - stehen somit nicht mehr zur Verfügung!

Diese Datei kann ganz nach Bedarf angepasst werden.

Erstellen der Login Daten

Mosquitto hat ein Tool mit dem das Login automatisch erstellt werden kann. Da wir aber Mosquitto in Docker nutzen und der Container noch nicht läuft, werde ich einfach erstmal Benutzername admin und Kennwort instar als Datei anlegen. Das ganze sieht dann so aus:

nano /opt/mosquitto/config/passwordfile
admin:$7$101$bvT+wpQDxOnSx37x$jzMPWSG/gJ5BnoBd6wEbbUrCfjhOrrRs7eXJnz99CfEIQXDBNf6otaXi9g0hBqXwz6obwz8E8uGTcXPsP4Emag==
tree -ph /opt/mosquitto
[drwxrwxrwx 4.0K]  /opt/mosquitto
├── [drwxrwxrwx 4.0K]  config
│   ├── [-rwxrwxrwx  132]  acl
│   ├── [-rwxrwxrwx  40K]  mosquitto.conf
│   └── [-rwxrwxrwx  119]  passwordfile
├── [drwxrwxrwx 4.0K]  data
├── [drwxrwxrwx 4.0K]  log

Später kann, wenn der Container läuft, kann man sich dann die Datei nochmal öffnen und ein beliebiges Kennwort in Klartext eingeben - hier nochmal mit admin:instar gezeigt:

vi /opt/mosquitto/config/passwordfile
admin:instar

Wenn man sich jetzt in den laufenden Container verbindet, steht einem das Kennwort Tool zur Verfügung mit dem man die Datei bearbeiten kann:

mosquitto_passwd -U /mosquitto/config/passwordfile

Wenn man die Datei jetzt nochmal öffnet, wird man sehen, dass das Kennwort nicht mehr im Klartext ist:

cat /mosquitto/config/passwordfile

Start des Containers

Nachdem man die Konfiguration erstellt hat, kann man den Container starten und alle erstellten Verzeichnisse mitsamt der erstellten Dateien in den Container linken:

docker run -it -p 1883:1883 -v "/opt/mosquitto/config:/mosquitto/config" -v "/opt/mosquitto/data:/mosquitto/data" -v "/opt/mosquitto/log:/mosquitto/log" eclipse-mosquitto:2-openssl

Wenn der Container nicht starten will hilft ein Blick ins Logbuch - oft hat man hier noch Probleme mit Schreib- oder Leserechten zu beseitigen:

tail -f /opt/mosquitto/log/logfile


2025-06-20T10:08:37: mosquitto version 2.0.21 starting
2025-06-20T10:08:37: Config loaded from /mosquitto/config/mosquitto.conf.
2025-06-20T10:08:37: Opening ipv4 listen socket on port 1883.
2025-06-20T10:08:37: Opening ipv6 listen socket on port 1883.
2025-06-20T10:08:37: mosquitto version 2.0.21 running