Container stoppt bei Verbindungsproblemen
Closed this issue · 8 comments
Hallo zusammen,
meine Soletrus Installation läuft nun seit 3 Wochen auf einem Proxmox Server unter Alpine Cobtainer.
Seit 2 Tagen werden aber Daten auf einmal nicht mehr geliefert. Die Weboberfläche funktioniert, aber keine Inhalte.
Wenn ich mit "docker compose up -d" wieder starte ist die Verbindung wieder da.
Rückmeldung des Starts:
[+] Running 0/1
⠙ Network solectrus_default Creating 0.1s
WARN[0000] Found orphan containers ([solectrus-senec-collector-1]) for this project. If you rem[+] Running 7/8 this service in your compose file, you can run this command with the --remove-o ⠹ Network solectrus_default Created 36.1s
✔ Container solectrus-redis-1 Healthy 13.4s
✔ Container solectrus-watchtower-1 Starte... 3.3s
✔ Container solectrus-influxdb-1 Healthy 33.9s
✔ Container solectrus-db-1 Healthy 13.4s
✔ Container solectrus-app-1 Started 35.7s
✔ Container solectrus-mqtt-collector-1 St... 35.7s
✔ Container solectrus-forecast-collector-1 Started 35.3s
Wenn ich das Log bis zum Datenabruch ansehe:
mqtt-collector-1 | 2024-03-17 18:17:22 +0000 {"house_power"=>392}
mqtt-collector-1 | #<Thread:0x0000718896ce1e50 /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/client.rb:276 run> terminated with exception (report_on_exception is true):
mqtt-collector-1 | /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/packet.rb:222:in `getbyte': Connection reset by peer @ io_fillbuf - fd:5 (Errno::ECONNRESET)
mqtt-collector-1 | from /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/packet.rb:222:in `read_byte'
mqtt-collector-1 | from /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/packet.rb:30:in `read'
mqtt-collector-1 | from /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/client.rb:471:in `receive_packet'
mqtt-collector-1 | from /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/client.rb:278:in `block in connect'
Offenbar ist der MQTT-Broker kurzzeitig nicht erreichbar gewesen. Idealerweise sollte der MQTT-Collector bei unerwarteten Abbrüchen automatisch neu gestartet wird. Das erreicht man über die restart
-Option in der docker-compose.yml, wo entweder always
oder unless-stopped
eingetragen werden sollte, z.B. so:
restart: unless-stopped
Außerdem auffällig ist die Warnung zum verwaisten SENEC-Collector. Hattest du den Service früher mal, aber dann in der docker-compose.yml
entfernt? Das hier könnte helfen:
docker system prune
Ich habe in der Datei docker-compose.yml diesen Eintrag mit restart: unless-stopped angepasst
mqtt-collector:
image: ghcr.io/solectrus/mqtt-collector:latest
labels:
- 'com.centurylinklabs.watchtower.scope=solectrus'
depends_on:
influxdb:
condition: service_healthy
links:
- influxdb
environment:
- INFLUX_HOST
- INFLUX_SCHEMA
- INFLUX_PORT
- INFLUX_TOKEN=${INFLUX_TOKEN_WRITE}
- INFLUX_ORG
- INFLUX_BUCKET
- INFLUX_MEASUREMENT=${INFLUX_MEASUREMENT_PV}
- MQTT_HOST
- MQTT_PORT
- MQTT_SSL
- MQTT_USERNAME
- MQTT_PASSWORD
- MQTT_TOPIC_HOUSE_POW
- MQTT_TOPIC_GRID_POW
- MQTT_TOPIC_BAT_CHARGE_CURRENT
- MQTT_TOPIC_BAT_FUEL_CHARGE
- MQTT_TOPIC_BAT_POWER
- MQTT_TOPIC_BAT_VOLTAGE
- MQTT_TOPIC_CASE_TEMP
- MQTT_TOPIC_CURRENT_STATE
- MQTT_TOPIC_MPP1_POWER
- MQTT_TOPIC_MPP2_POWER
- MQTT_TOPIC_MPP3_POWER
- MQTT_TOPIC_INVERTER_POWER
- MQTT_TOPIC_WALLBOX_CHARGE_POWER
- MQTT_FLIP_BAT_POWER
restart: unless-stopped
logging:
options:
max-size: '10m'
max-file: '3'
Letzter Eintrag im Log bevor nicht mehr in der Oberfläche dargestellt wurde:
mqtt-collector-1 | #<Thread:0x00007fd3f6781640 /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/client.rb:276 run> terminated with exception (report_on_exception is true):
mqtt-collector-1 | /usr/local/bundle/gems/mqtt-0.6.0/lib/mqtt/packet.rb:222:in `getbyte': Connection reset by peer @ io_fillbuf - fd:5 (Errno::ECONNRESET)
Wenn ich dich richtig verstehe, hast du in der docker-compose.yml
den Eintrag für restart
ergänzt, weil er vorher nicht da war. Hast du danach auch neu gestartet? Ohne ein docker compose up -d
wird die Änderung nicht übernommen.
Die Fehlermeldung zeigt, dass es wohl Verbindungsprobleme mit dem MQTT-Broker gab. Der MQTT-Collector hat sich dann beendet, was dann dazu führte, dass SOLECTRUS keine Daten mehr bekam. Wichtig ist, dass der MQTT-Collector dauerhaft läuft. Wenn das nicht der Fall ist, können auch keine Daten angezeigt werden. Ob und welche Container laufen, lässt sich mit docker compose ps
herausfinden.
Der Eintrag
restart: unless-stopped
Stand vorher auf always
Ich hatte dich so verstanden, dass ich diesen auf unless-stopped stellen soll
War das nun falsch?
Was ich beim durchforsten der Logs noch festgestellt hatte, mir wurde aufgezeigt zu wenig Speicher zu haben.
Habe nun den Seicher von 512 MB auf 2GB geschraubt.
Habe auch mal meinen MQTT Broker ein update verpasst und diesen neu gestartet.
Dessen Logs waren aber eigentlich ok.
Mal schauen wann Solectrus wieder Schluckauf bekommt, weil keine Verbidung zum MQTT Broker hat.
Ob unless-stopped
oder always
- das macht keinen großen Unterschied. Hauptsache, es gibt überhaupt einen restart
.
Zuwenig Speicher? Wo wird das angezeigt? Der RAM-Verbrauch des Collector-Containers sollte unter 50 MB liegen. Oder meinst du die Log-Größe? Die lassen sich begrenzen.
docker compose logs
War das eingetragen:
redis-1 | 1:C 20 Mar 2024 04:43:54.545 # WARNING Memory overcommit must be enabled! Without it, a background save or replication may fail under low memory condition. Being disabled, it can also cause failures without low memory condition, see jemalloc/jemalloc#1328. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
Seite heute in der Früh keinen Schluckauf mehr.
Entweder weil ich den Mqtt-Broker aktualisiert habe und neu gestartet wurde oder weil ich den Speicher im LXC Container hochgeschraubt habe,
Die Warnung von Redis ist keine Beschwerde über zu wenig Speicher, sondern nur ein Hinweis, dass es Probleme geben könnte, wenn u.a. der Speicher knapp wird. Man kann den Docker-Host konfigurieren, um das abzustellen, das ist aber nicht zwingend. Auch hat Redis gar nichts mit dem MQTT-Collector zu tun, sondern sorgt nur für das Caching im Dashboard.
Was mir weiterhin nicht ganz klar ist, ob der Container aufgrund irgendeines Fehlers beendet wurde und nicht neu gestartet wurde (trotz restart
-Option) oder ob der MQTT-Collector anderweitig Probleme hatte, der Container aber weiter lief.
Wie dem auch sei, ich arbeite gerade am MQTT-Collector und mache ihn robuster gegenüber Ausfälle.
Ja dann freue ich mich schon auf den robusten MQTT-Collector