Cover Image

Ich nutze zuhause ein RabbitMQ Server um gewisse Aufgaben in meinem Node-RED in Queues zu schreiben, damit diese asynchron verarbeitet werden können. Einige der Daten sollen dauerhaft vorgehalten werden. Heute fiel mit auf, dass in meinem RabbitMQ die Verbindung zu RabbitMQ nicht als aktiv angezeigt wurde. Ich war quasi offline.

Fehlersuche

Ein Blick auf den Server zeigte mir, dass ich keine korrekte restart policy in der docker-compose.yml eingetragen hatte. Nach einem restart: unless-stopped und docker compose up -d lief der Server wieder.

Der Node-RED Server zeigte aber weiterhin keine Verbindung an. Also schnell die Logs im RabbitMQ Server aufgemacht. Und diese da, die Zugangsdaten passten nicht.

rabbitmq  | 2022-04-07 14:12:20.054369+00:00 [info] <0.963.0> accepting AMQP connection <0.963.0> (192.168.1.168:45000 -> 192.168.1.175:5672)
rabbitmq  | 2022-04-07 14:12:20.058424+00:00 [erro] <0.957.0> Error on AMQP connection <0.957.0> (192.168.1.168:44996 -> 192.168.1.175:5672, state: starting):
rabbitmq  | 2022-04-07 14:12:20.058424+00:00 [erro] <0.957.0> PLAIN login refused: user 'nodered' - invalid credentials
rabbitmq  | 2022-04-07 14:12:20.060832+00:00 [erro] <0.960.0> Error on AMQP connection <0.960.0> (192.168.1.168:44998 -> 192.168.1.175:5672, state: starting):
rabbitmq  | 2022-04-07 14:12:20.060832+00:00 [erro] <0.960.0> PLAIN login refused: user 'nodered' - invalid credentials

Aber wie kann das sein?

Also in die Management Oberfläche von RabbitMQ eingeloggt. Und was sahen meine Augen da? Der Benutzer und der VHost den ich in RabbitMQ angelegt hatte, waren wieder weg.

Also schnell alles wieder in der Admin-Oberfläche angelegt. Schon konnte mein Node-RED wieder auf RabbitMQ zugreifen.

Diesmal war ich aber schlauer und habe den RabbitMQ sicherheitshalber einmal durchgestartet. Und was muss ich sehen? Die Daten waren wieder weg.

Meine docker-compose.yaml sah folgendermaßen aus:

version: "3.2"
services:
  rabbitmq:
    image: rabbitmq:3-management-alpine
    env_file: rabbitmq.env
    restart: unless-stopped
    ports:
        - 5672:5672
        - 15672:15672
    volumes:
      - ./volumes/data:/var/lib/rabbitmq

Das ganze hatte ich streng nach Anleitung gemacht. Warum waren immer alle Daten weg? Das Volume wurde auch korrekt geladen.

Der Sache auf die Schliche gekommen

Doch dann wurde es mir klar. Der RabbitMQ Server erzeugt den Pfad zu seiner Datenbank immer mit dem Hostname. Das ist bei Docker, wenn man nichts angibt, immer die Container-ID.

RabbitMQ Docker Volume  - Container ID

Immer, wenn der Container neu erstellt wird, erzeugt es quasi eine neue Datenbank. Damit sind die Daten meines RabbitMQ Servers zwar noch physikalisch vorhanden, werden aber nicht mehr geladen. Und man generiert somit auch Datenschrott.

Die Lösung war für mich relativ einfach. Ich habe einfach einen festen Hostname gesetzt.

version: "3.2"
services:
  rabbitmq:
    # Fester Name
    hostname: rabbitmq    
    
    # ...

Fester Hostname in Pfad

So, passt es nun. Wenn der Container nun neu erstellt wird, bleiben die Daten aber weiterhin erhalten.

Falls jemand eine bessere Idee hat, oder es eine gute Konfigurationseinstellung gibt, lasst es mich wissen.