diff --git a/README.md b/README.md index 72af019..e6eb1f6 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,13 @@ Das Logfile kann via **tail -f log/noise.log** im Verzeichnise **noisesensors** * **readin** Über diesen Container werden alle 5 min. die aktuellen Daten von *sensor.community* abgeholt und in den beiden Datenbanken gespeichert +* **readarchive** +Gegenstück zu *readin*: liest rückwirkend die Tagesdateien von *archive.sensor.community* ein, um Lücken zu füllen. Kein Dauerdienst, sondern ein Lauf mit Parametern — deshalb hängt er im Compose am Profil `tools` und wird von `docker compose up` nicht mitgestartet: +~~~ +docker compose run --rm readarchive -t noise -s 2026-07-22 -e 2026-07-23 -d influx +~~~ +Parameter: `-s` Startdatum, `-e` Enddatum (**exklusiv**), `-t` Sensortyp, `-d` Ziel (`mongo`, `influx` oder `both`). Ohne Argumente gilt der Default `-t noise` für den Vortag. Ein Tag dauert etwa zwei Minuten. Schlägt ein Influx-Write fehl, werden die betroffenen Sensoren am Ende aufgelistet und der Exit-Code ist ≠ 0. + * **logrotate** Mit Hilfe dieses Containers werde die Log-Files im Unterverzeichnis *log* täglich rotiert. Es werden 7 Versionen behalten, ältere gelöscht. @@ -99,12 +106,75 @@ Logindaten: Entsprechen der im Portainer hinterlegten. ## Sourcen für die Container -Das gesamte Projekt ist im GitHub unter **laermsensor-stack** abgelegt. Für jeden der 3 Container existiert darunter ein Verzeichnis: -**readin**, **sensorapi** und **noise**. In diesen Verzeichnisse sind alle benötigten Sourcen enthalten. +Das gesamte Projekt ist im GitHub unter **laermsensor-stack** abgelegt. Für jeden der 4 Container existiert darunter ein Verzeichnis: +**readin**, **readarchive**, **sensorapi** und **noise**. In diesen Verzeichnissen sind alle benötigten Sourcen enthalten. -Sollte was geändert werden, so muss mit **deploy.sh** der Container neu erzeugt und auf die Registry (siehe oben) gepushed werden. +Daneben gibt es **common** mit den Modulen, die sich *readin* und *readarchive* teilen: `mongo.js`, `influx_post.js`, `logit.js` und `statistics.js`. Sie lagen früher in beiden Komponenten doppelt und sind auseinandergelaufen. Wer dort etwas ändert, ändert es für beide — nach einer Änderung also **beide** Container neu bauen. -Das vierte hier liegende Verzeichnis **noisesensors** ist nur dummy, es spiegelt die Dateistruktur für das aktuelle Stack ab, wie oben beschrieben (wird mit Hilfe von **noise.tgz** erzeugt). +Sollte was geändert werden, so muss mit **deploy.sh** der Container neu erzeugt und auf die Registry (siehe oben) gepushed werden. Der Build-Kontext von *readin* und *readarchive* ist wegen `common/` das Wurzelverzeichnis des Repositories; `deploy.sh` wechselt selbst dorthin und kann aus dem Komponentenverzeichnis aufgerufen werden. + +`deploy.sh` nimmt optional ein Tag als Argument: +~~~ +./deploy.sh # nur :latest +./deploy.sh 2026-08-01 # :2026-08-01 und zusätzlich :latest +~~~ +**Ein Tag mitgeben.** Wird nur `latest` gepusht, überschreibt jeder Build den vorherigen Stand und es gibt keinen Weg zurück (siehe *Update eines laufenden Stacks*). + +Das Verzeichnis **noisesensors** ist nur dummy, es spiegelt die Dateistruktur für das aktuelle Stack ab, wie oben beschrieben (wird mit Hilfe von **noise.tgz** erzeugt). + +## Update eines laufenden Stacks + +Betrifft eine Installation, die bereits läuft und auf einen neueren Stand gebracht werden soll. + +### 1. Rollback-Möglichkeit sicherstellen + +**Vor allem anderen.** Zeigt in der Registry nur `latest` auf das Image, existiert der laufende Stand nach dem Pull nirgends mehr. Prüfen, welche Tags es gibt: + +~~~ +curl -H "Authorization: Basic " \ + https://docker.citysensor.de/v2/readin/tags/list +~~~ + +Fehlt ein benanntes Tag für den laufenden Stand, ihn zuerst benennen und pushen. Das alte Image findet sich auf dem Build-Rechner meist noch unbenannt (`docker images | grep readin`): + +~~~ +docker tag docker.citysensor.de/readin: +docker push docker.citysensor.de/readin: +~~~ + +### 2. docker-compose.yml im Portainer angleichen + +Den Stand aus `noisesensors/docker-compose.yml` dieses Repositories übernehmen. Zu beachten: + +* **Zwingend** bei einem Update von einem Stand vor August 2026: das Volume von *readin* muss auf `/opt/app/readin/data` zeigen, nicht mehr auf `/opt/app/data`. Das Layout im Image spiegelt seit der Einführung von `common/` das Repository. Bleibt der alte Pfad stehen, schreibt readin `aktdata.json` in die Container-Schicht statt auf den Host. +* Optional der Service **readarchive** mit `profiles: ["tools"]`. +* **Nicht** aufnehmen: ein Mount auf `/etc/influxdb2`. Das Entrypoint von influxdb legt dort beim Setup das CLI-Profil `default` an. Ist bereits eines vorhanden, scheitert der Setup — und das Entrypoint löscht daraufhin `influxd.bolt` und `engine/` im Datenverzeichnis und startet neu. Weil der Mount das Aufräumen überlebt, wiederholt sich das endlos und der Datenbestand ist bei jeder Runde weg. + +### 3. Nur den geänderten Container ziehen + +Nicht den ganzen Stack neu starten — Mongo und Influx bleiben unangetastet: + +~~~ +docker compose pull readin +docker compose up -d readin +~~~ + +Im Portainer entspricht das dem Aktualisieren des Stacks mit *Re-pull image and redeploy*. + +### 4. Verifizieren + +Der nächste Lauf kommt binnen fünf Minuten: + +~~~ +tail -20 /noisesensors/log/readin.log +ls -l /noisesensors/data/aktdata.json +~~~ + +Erwartet werden `Influx-Write-Time` und `Program end` sowie ein frischer Zeitstempel an `aktdata.json` — letzterer belegt, dass der Volume-Pfad stimmt. + +### 5. Rollback + +Image-Tag im Stack auf den in Schritt 1 gesicherten Stand setzen, die Volume-Zeile auf den alten Pfad zurückdrehen, redeploy. ## Versionen @@ -112,6 +182,7 @@ Das vierte hier liegende Verzeichnis **noisesensors** ist nur dummy, es spiegelt ---- | ---- | ---- 1.0.0 | 2023-11-30 | 2.0.0 | 2026-07-25 | Anpassung an Stack-Änderungen + 2.1.0 | 2026-08-01 | readarchive dazu, gemeinsame Module unter common/, Zeitstempel in UTC