From 5e47ae2777851a489050ec2df98e38c19dc25b79 Mon Sep 17 00:00:00 2001 From: git Date: Thu, 2 Jul 2026 12:49:48 +1000 Subject: [PATCH] moved to NFS share for volume storage. Migrated all data --- apps/gitea/docker-compose.yml | 6 +- apps/gramps/docker-compose.yml | 52 +- apps/nextcloud/docker-compose.yml | 15 +- apps/nextcloud/entrypoint.sh | 13 + apps/passbolt/docker-compose.yml | 11 +- archive/dynamic-system/apps/shift-recorder | 1 + .../monitoring}/portainer/docker-compose.yml | 0 archive/{ => others}/autossh/Dockerfile | 0 .../{ => others}/autossh/docker-compose.yml | 0 .../dnscrypt-proxy/docker-compose.yml | 0 .../{ => others}/docker-compose-no-tz.yaml | 0 archive/{ => others}/docker-compose.yaml | 0 .../{ => others}/docuseal/docker-compose.yml | 0 archive/{ => others}/doh/docker-compose.yml | 0 archive/{ => others}/doods/Dockerfile | 0 archive/{ => others}/doods/config.yaml | 0 archive/{ => others}/doods/docker-compose.yml | 0 archive/{ => others}/doods/fetch_models.sh | 0 archive/{ => others}/dynu/dynu.sh | 0 archive/{ => others}/email-alerts/Dockerfile | 0 archive/{ => others}/esphome/Dockerfile | 0 .../esphome/create-default-config.sh | 0 .../esphome/default_configuration.yaml | 0 .../{ => others}/esphome/docker-compose.yml | 0 .../esphome/remote_transmitter-codes.yaml | 0 .../{ => others}/graylog/docker-compose.yml | 0 archive/{ => others}/hass/docker-compose.yml | 0 archive/{ => others}/lfs/Dockerfile | 0 archive/{ => others}/lfs/cross-toolchain.sh | 0 archive/{ => others}/mqtt/config.yaml | 0 archive/{ => others}/mqtt/docker-compose.yml | 0 .../{ => others}/netdata/docker-compose.yml | 0 archive/{ => others}/office365/Dockerfile | 0 .../{ => others}/pihole/docker-compose.yml | 0 .../{ => others}/portainer-agent-stack.yml | 0 .../portainer-compose-files/haproxy.yaml | 0 .../portainer-compose-files/keeweb.yaml | 0 .../portainer-compose-files/registry.yaml | 0 .../portainer-compose-files/searxng.yaml | 0 .../portainer-compose-files/webdav.yaml | 0 archive/{ => others}/portainer-compose.yaml | 0 .../{ => others}/portainer/docker-compose.yml | 0 archive/{ => others}/recreate-containers.sh | 0 archive/{ => others}/recreate-nextcloud.sh | 0 archive/{ => others}/recreate-passbolt.sh | 0 .../{ => others}/traccar/docker-compose.yml | 0 archive/{ => others}/ubuntu-gui/Dockerfile | 0 .../ubuntu-gui/docker-compose.yml | 0 archive/{ => others}/update-containers.sh | 0 .../{ => others}/webdav/docker-compose.yml | 0 core/authelia/docker-compose.yml | 5 +- core/crowdsec/docker-compose.yml | 9 +- core/traefik/docker-compose.yml | 13 +- default-environment.env | 3 + monitoring/docker-exporter/docker-compose.yml | 6 +- monitoring/gotify/docker-compose.yml | 7 +- monitoring/grafana/docker-compose.yml | 7 +- monitoring/grafana/output.txt | 630 -------- monitoring/influxdb/docker-compose.yml | 7 +- monitoring/node-red/data/.config.nodes.json | 430 ------ .../node-red/data/.config.nodes.json.backup | 430 ------ monitoring/node-red/data/.config.runtime.json | 5 - .../node-red/data/.config.runtime.json.backup | 4 - monitoring/node-red/data/.config.users.json | 29 - .../node-red/data/.config.users.json.backup | 29 - monitoring/node-red/data/.flows.json.backup | 1303 ----------------- .../node-red/data/.flows_cred.json.backup | 3 - ...61754520599ac0b0e11f3e4c4d4ac784e78d7d97fe | Bin 22123 -> 0 bytes ...c76cfc856119f7b440845a83c9f22d7d731643e62f | 1 - ...d88cb9c08d7867c52d3fceb6fc64cc5abde73b01a9 | 2 - ...3f37148db48f54e0828c1aef870973f6672895d689 | 2 - .../2026-04-05T01_36_15_515Z-debug-0.log | 29 - .../data/context/00b02bbd01c91485/flow.json | 3 - .../node-red/data/context/global/global.json | 3 - monitoring/node-red/data/flows.json | 1285 ---------------- monitoring/node-red/data/flows_cred.json | 3 - .../data/node_modules/.package-lock.json | 14 - .../node-red-debugger/CHANGELOG.md | 19 - .../node_modules/node-red-debugger/LICENSE | 178 --- .../node_modules/node-red-debugger/README.md | 105 -- .../node-red-debugger/dist/flow-debugger.html | 2 - .../node-red-debugger/dist/flow-debugger.js | 140 -- .../dist/flow-debugger.js.map | 1 - .../dist/lib/MessageQueue.js | 83 -- .../dist/lib/MessageQueue.js.map | 1 - .../node-red-debugger/dist/lib/debugger.js | 370 ----- .../dist/lib/debugger.js.map | 1 - .../node-red-debugger/dist/lib/location.js | 46 - .../dist/lib/location.js.map | 1 - .../node-red-debugger/dist/lib/types.js | 3 - .../node-red-debugger/dist/lib/types.js.map | 1 - .../dist/locales/en-US/flow-debugger.json | 27 - .../dist/locales/ja/flow-debugger.json | 27 - .../node-red-debugger/dist/nr-types.js | 3 - .../node-red-debugger/dist/nr-types.js.map | 1 - .../node-red-debugger/package.json | 37 - .../node-red-debugger/resources/style.css | 1 - monitoring/node-red/data/package-lock.json | 21 - monitoring/node-red/data/package.json | 9 - monitoring/node-red/data/settings.js | 623 -------- monitoring/node-red/data/test-container.sh | 47 - .../node-red/data/test-container.sh.old | 31 - monitoring/node-red/data/update-events.ndjson | 553 ------- monitoring/node-red/data/webhook.json | 1 - monitoring/node-red/docker-compose.yml | 6 +- monitoring/prometheus/docker-compose.yml | 12 +- monitoring/prometheus/prometheus.yml | 8 +- monitoring/prometheus/rules/alerts.yml | 28 - monitoring/telegraf/docker-compose.yml | 4 +- monitoring/uptime-kuma/docker-compose.yml | 7 +- 110 files changed, 146 insertions(+), 6611 deletions(-) create mode 100755 apps/nextcloud/entrypoint.sh create mode 160000 archive/dynamic-system/apps/shift-recorder rename {monitoring => archive/dynamic-system/monitoring}/portainer/docker-compose.yml (100%) rename archive/{ => others}/autossh/Dockerfile (100%) rename archive/{ => others}/autossh/docker-compose.yml (100%) rename archive/{ => others}/dnscrypt-proxy/docker-compose.yml (100%) rename archive/{ => others}/docker-compose-no-tz.yaml (100%) rename archive/{ => others}/docker-compose.yaml (100%) rename archive/{ => others}/docuseal/docker-compose.yml (100%) rename archive/{ => others}/doh/docker-compose.yml (100%) rename archive/{ => others}/doods/Dockerfile (100%) rename archive/{ => others}/doods/config.yaml (100%) rename archive/{ => others}/doods/docker-compose.yml (100%) rename archive/{ => others}/doods/fetch_models.sh (100%) rename archive/{ => others}/dynu/dynu.sh (100%) rename archive/{ => others}/email-alerts/Dockerfile (100%) rename archive/{ => others}/esphome/Dockerfile (100%) rename archive/{ => others}/esphome/create-default-config.sh (100%) rename archive/{ => others}/esphome/default_configuration.yaml (100%) rename archive/{ => others}/esphome/docker-compose.yml (100%) rename archive/{ => others}/esphome/remote_transmitter-codes.yaml (100%) rename archive/{ => others}/graylog/docker-compose.yml (100%) rename archive/{ => others}/hass/docker-compose.yml (100%) rename archive/{ => others}/lfs/Dockerfile (100%) rename archive/{ => others}/lfs/cross-toolchain.sh (100%) rename archive/{ => others}/mqtt/config.yaml (100%) rename archive/{ => others}/mqtt/docker-compose.yml (100%) rename archive/{ => others}/netdata/docker-compose.yml (100%) rename archive/{ => others}/office365/Dockerfile (100%) rename archive/{ => others}/pihole/docker-compose.yml (100%) rename archive/{ => others}/portainer-agent-stack.yml (100%) rename archive/{ => others}/portainer-compose-files/haproxy.yaml (100%) rename archive/{ => others}/portainer-compose-files/keeweb.yaml (100%) rename archive/{ => others}/portainer-compose-files/registry.yaml (100%) rename archive/{ => others}/portainer-compose-files/searxng.yaml (100%) rename archive/{ => others}/portainer-compose-files/webdav.yaml (100%) rename archive/{ => others}/portainer-compose.yaml (100%) rename archive/{ => others}/portainer/docker-compose.yml (100%) rename archive/{ => others}/recreate-containers.sh (100%) rename archive/{ => others}/recreate-nextcloud.sh (100%) rename archive/{ => others}/recreate-passbolt.sh (100%) rename archive/{ => others}/traccar/docker-compose.yml (100%) rename archive/{ => others}/ubuntu-gui/Dockerfile (100%) rename archive/{ => others}/ubuntu-gui/docker-compose.yml (100%) rename archive/{ => others}/update-containers.sh (100%) rename archive/{ => others}/webdav/docker-compose.yml (100%) delete mode 100644 monitoring/grafana/output.txt delete mode 100644 monitoring/node-red/data/.config.nodes.json delete mode 100644 monitoring/node-red/data/.config.nodes.json.backup delete mode 100644 monitoring/node-red/data/.config.runtime.json delete mode 100644 monitoring/node-red/data/.config.runtime.json.backup delete mode 100644 monitoring/node-red/data/.config.users.json delete mode 100644 monitoring/node-red/data/.config.users.json.backup delete mode 100644 monitoring/node-red/data/.flows.json.backup delete mode 100644 monitoring/node-red/data/.flows_cred.json.backup delete mode 100644 monitoring/node-red/data/.npm/_cacache/content-v2/sha512/b0/47/c1458664fa9b6a08e9035110b523127a96bd7285d19472dc702f5dc498b927412b0ecd3273708fbf9d61754520599ac0b0e11f3e4c4d4ac784e78d7d97fe delete mode 100644 monitoring/node-red/data/.npm/_cacache/content-v2/sha512/c2/c2/b64870ea5c5a42b5772106f51123cf684d3c8381de10ccc07d01168d111d0a1ab79ee26fda320b3027c76cfc856119f7b440845a83c9f22d7d731643e62f delete mode 100644 monitoring/node-red/data/.npm/_cacache/index-v5/15/a4/2638498d877ec2c8c3d88cb9c08d7867c52d3fceb6fc64cc5abde73b01a9 delete mode 100644 monitoring/node-red/data/.npm/_cacache/index-v5/48/03/b8903b717bbc1ad41b3f37148db48f54e0828c1aef870973f6672895d689 delete mode 100644 monitoring/node-red/data/.npm/_logs/2026-04-05T01_36_15_515Z-debug-0.log delete mode 100644 monitoring/node-red/data/context/00b02bbd01c91485/flow.json delete mode 100644 monitoring/node-red/data/context/global/global.json delete mode 100644 monitoring/node-red/data/flows.json delete mode 100644 monitoring/node-red/data/flows_cred.json delete mode 100644 monitoring/node-red/data/node_modules/.package-lock.json delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/CHANGELOG.md delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/LICENSE delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/README.md delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.html delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js.map delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js.map delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js.map delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js.map delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js.map delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/en-US/flow-debugger.json delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/ja/flow-debugger.json delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js.map delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/package.json delete mode 100644 monitoring/node-red/data/node_modules/node-red-debugger/resources/style.css delete mode 100644 monitoring/node-red/data/package-lock.json delete mode 100644 monitoring/node-red/data/package.json delete mode 100644 monitoring/node-red/data/settings.js delete mode 100755 monitoring/node-red/data/test-container.sh delete mode 100755 monitoring/node-red/data/test-container.sh.old delete mode 100644 monitoring/node-red/data/update-events.ndjson delete mode 100644 monitoring/node-red/data/webhook.json delete mode 100644 monitoring/prometheus/rules/alerts.yml diff --git a/apps/gitea/docker-compose.yml b/apps/gitea/docker-compose.yml index 7185480..f1ef2d1 100644 --- a/apps/gitea/docker-compose.yml +++ b/apps/gitea/docker-compose.yml @@ -11,7 +11,8 @@ services: - GITEA__server__ROOT_URL=${GITEA_ROOT_URL} - GITEA__actions__ENABLED=true volumes: - - ${PROJECT_ROOT}/apps/gitea/data:/data +# - ${PROJECT_ROOT}/apps/gitea/data:/data + - ${DOCKER_VOLUMES}/gitea/data:/data networks: - traefik @@ -47,7 +48,8 @@ services: - GITEA_RUNNER_LABELS=${GITEA_RUNNER_LABELS} - DOCKER_HOST=${DOCKER_SOCKET_PROXY_HOST} volumes: - - ${PROJECT_ROOT}/apps/gitea/runner-data:/data +# - ${PROJECT_ROOT}/apps/gitea/runner-data:/data + - ${DOCKER_VOLUMES}/gitea/runner:/data networks: - traefik diff --git a/apps/gramps/docker-compose.yml b/apps/gramps/docker-compose.yml index 55daee5..71b7b9c 100644 --- a/apps/gramps/docker-compose.yml +++ b/apps/gramps/docker-compose.yml @@ -26,14 +26,24 @@ services: GRAMPSWEB_CELERY_CONFIG__result_backend: redis://gramps-redis:6379/0 GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://gramps-redis:6379/1 volumes: - - ${PROJECT_ROOT}/apps/gramps/data/users:/app/users - - ${PROJECT_ROOT}/apps/gramps/data/index:/app/indexdir - - ${PROJECT_ROOT}/apps/gramps/data/thumbnail_cache:/app/thumbnail_cache - - ${PROJECT_ROOT}/apps/gramps/data/cache:/app/cache - - ${PROJECT_ROOT}/apps/gramps/data/secret:/app/secret - - ${PROJECT_ROOT}/apps/gramps/data/db:/root/.gramps/grampsdb - - ${PROJECT_ROOT}/apps/gramps/data/media:/app/media - - ${PROJECT_ROOT}/apps/gramps/data/tmp:/tmp +# - ${PROJECT_ROOT}/apps/gramps/data/users:/app/users +# - ${PROJECT_ROOT}/apps/gramps/data/index:/app/indexdir +# - ${PROJECT_ROOT}/apps/gramps/data/thumbnail_cache:/app/thumbnail_cache +# - ${PROJECT_ROOT}/apps/gramps/data/cache:/app/cache +# - ${PROJECT_ROOT}/apps/gramps/data/secret:/app/secret +# - ${PROJECT_ROOT}/apps/gramps/data/db:/root/.gramps/grampsdb +# - ${PROJECT_ROOT}/apps/gramps/data/media:/app/media +# - ${PROJECT_ROOT}/apps/gramps/data/tmp:/tmp + + - ${DOCKER_VOLUMES}/gramps-data/users:/app/users + - ${DOCKER_VOLUMES}/gramps-data/index:/app/indexdir + - ${DOCKER_VOLUMES}/gramps-data/thumbnail_cache:/app/thumbnail_cache + - ${DOCKER_VOLUMES}/gramps-data/cache:/app/cache + - ${DOCKER_VOLUMES}/gramps-data/secret:/app/secret + - ${DOCKER_VOLUMES}/gramps-data/db:/root/.gramps/grampsdb + - ${DOCKER_VOLUMES}/gramps-data/media:/app/media + - ${DOCKER_VOLUMES}/gramps-data/tmp:/tmp + labels: - "traefik.http.routers.gramps.rule=Host(`familytree.lan.ddnsgeek.com`)" - "traefik.enable=true" @@ -81,14 +91,24 @@ services: GRAMPSWEB_CELERY_CONFIG__result_backend: redis://gramps-redis:6379/0 GRAMPSWEB_RATELIMIT_STORAGE_URI: redis://gramps-redis:6379/1 volumes: - - ${PROJECT_ROOT}/apps/gramps/data/users:/app/users - - ${PROJECT_ROOT}/apps/gramps/data/index:/app/indexdir - - ${PROJECT_ROOT}/apps/gramps/data/thumbnail_cache:/app/thumbnail_cache - - ${PROJECT_ROOT}/apps/gramps/data/cache:/app/cache - - ${PROJECT_ROOT}/apps/gramps/data/secret:/app/secret - - ${PROJECT_ROOT}/apps/gramps/data/db:/root/.gramps/grampsdb - - ${PROJECT_ROOT}/apps/gramps/data/media:/app/media - - ${PROJECT_ROOT}/apps/gramps/data/tmp:/tmp +# - ${PROJECT_ROOT}/apps/gramps/data/users:/app/users +# - ${PROJECT_ROOT}/apps/gramps/data/index:/app/indexdir +# - ${PROJECT_ROOT}/apps/gramps/data/thumbnail_cache:/app/thumbnail_cache +# - ${PROJECT_ROOT}/apps/gramps/data/cache:/app/cache +# - ${PROJECT_ROOT}/apps/gramps/data/secret:/app/secret +# - ${PROJECT_ROOT}/apps/gramps/data/db:/root/.gramps/grampsdb +# - ${PROJECT_ROOT}/apps/gramps/data/media:/app/media +# - ${PROJECT_ROOT}/apps/gramps/data/tmp:/tmp + + - ${DOCKER_VOLUMES}/gramps-data/users:/app/users + - ${DOCKER_VOLUMES}/gramps-data/index:/app/indexdir + - ${DOCKER_VOLUMES}/gramps-data/thumbnail_cache:/app/thumbnail_cache + - ${DOCKER_VOLUMES}/gramps-data/cache:/app/cache + - ${DOCKER_VOLUMES}/gramps-data/secret:/app/secret + - ${DOCKER_VOLUMES}/gramps-data/db:/root/.gramps/grampsdb + - ${DOCKER_VOLUMES}/gramps-data/media:/app/media + - ${DOCKER_VOLUMES}/gramps-data/tmp:/tmp + networks: - gramps healthcheck: diff --git a/apps/nextcloud/docker-compose.yml b/apps/nextcloud/docker-compose.yml index f428adb..6dbc680 100644 --- a/apps/nextcloud/docker-compose.yml +++ b/apps/nextcloud/docker-compose.yml @@ -9,10 +9,15 @@ services: # env_file: # - ${SECRETS_ENV_FILE} volumes: - - ${PROJECT_ROOT}/apps/nextcloud/data:/var/www/html/data:rw - - ${PROJECT_ROOT}/apps/nextcloud/config:/var/www/html/config:rw +# - ${PROJECT_ROOT}/apps/nextcloud/data:/var/www/html/data:rw + - ${NEXTCLOUD_DATA}:/var/www/html/data:rw +# - ${PROJECT_ROOT}/apps/nextcloud/config:/var/www/html/config:rw + - ${DOCKER_VOLUMES}/nextcloud/config:/var/www/html/config:rw - type: tmpfs target: /tmp:exec +# - ${PROJECT_ROOT}/apps/nextcloud/entrypoint.sh:/entrypoint.sh +# - ${PROJECT_ROOT}/apps/nextcloud/custom_apps:/var/www/html/custom_apps + - ${DOCKER_VOLUMES}/nextcloud/custom_apps:/var/www/html/custom_apps depends_on: - nextcloud-db - nextcloud-redis @@ -80,7 +85,8 @@ services: # env_file: # - ${PROJECT_ROOT}/secrets/stack-secrets.env volumes: - - ${PROJECT_ROOT}/apps/nextcloud/database:/var/lib/mysql:rw +# - ${PROJECT_ROOT}/apps/nextcloud/database:/var/lib/mysql:rw + - ${DOCKER_DATABASES}/nextcloud/mysql:/var/lib/mysql:rw environment: - MYSQL_ROOT_PASSWORD_FILE=/run/secrets/nextcloud_db_root_password - MYSQL_PASSWORD_FILE=/run/secrets/nextcloud_db_password @@ -114,7 +120,8 @@ services: # secrets: # - nextcloud_redis_password volumes: - - ${PROJECT_ROOT}/apps/nextcloud/data/redis:/data:rw +# - ${PROJECT_ROOT}/apps/nextcloud/data/redis:/data:rw + - ${DOCKER_VOLUMES}/nextcloud/redis:/data:rw restart: always networks: - nextcloud diff --git a/apps/nextcloud/entrypoint.sh b/apps/nextcloud/entrypoint.sh new file mode 100755 index 0000000..3ca7467 --- /dev/null +++ b/apps/nextcloud/entrypoint.sh @@ -0,0 +1,13 @@ +#!/bin/bash +set -e + +OCC="/var/www/html/occ" + +php $OCC app:install memories || true +php $OCC app:enable memories || true + +php $OCC app:install recognize || true +php $OCC app:enable recognize || true + + +exec apache2-foreground diff --git a/apps/passbolt/docker-compose.yml b/apps/passbolt/docker-compose.yml index a42c38a..2fd7678 100644 --- a/apps/passbolt/docker-compose.yml +++ b/apps/passbolt/docker-compose.yml @@ -14,7 +14,8 @@ services: secrets: - passbolt_db_password volumes: - - ${PROJECT_ROOT}/apps/passbolt/data/database:/var/lib/mysql +# - ${PROJECT_ROOT}/apps/passbolt/data/database:/var/lib/mysql + - ${DOCKER_DATABASES}/passbolt:/var/lib/mysql networks: - passbolt healthcheck: @@ -45,8 +46,12 @@ services: secrets: - passbolt_db_password volumes: - - ${PROJECT_ROOT}/apps/passbolt/data/gpg:/etc/passbolt/gpg - - ${PROJECT_ROOT}/apps/passbolt/data/jwt:/etc/passbolt/jwt +# - ${PROJECT_ROOT}/apps/passbolt/data/gpg:/etc/passbolt/gpg +# - ${PROJECT_ROOT}/apps/passbolt/data/jwt:/etc/passbolt/jwt + + - ${DOCKER_VOLUMES}/passbolt-data/gpg:/etc/passbolt/gpg + - ${DOCKER_VOLUMES}/passbolt-data/jwt:/etc/passbolt/jwt + command: [ "/usr/bin/wait-for.sh", diff --git a/archive/dynamic-system/apps/shift-recorder b/archive/dynamic-system/apps/shift-recorder new file mode 160000 index 0000000..144ca87 --- /dev/null +++ b/archive/dynamic-system/apps/shift-recorder @@ -0,0 +1 @@ +Subproject commit 144ca876c0948bae7cabb402a23bac031169d2d7 diff --git a/monitoring/portainer/docker-compose.yml b/archive/dynamic-system/monitoring/portainer/docker-compose.yml similarity index 100% rename from monitoring/portainer/docker-compose.yml rename to archive/dynamic-system/monitoring/portainer/docker-compose.yml diff --git a/archive/autossh/Dockerfile b/archive/others/autossh/Dockerfile similarity index 100% rename from archive/autossh/Dockerfile rename to archive/others/autossh/Dockerfile diff --git a/archive/autossh/docker-compose.yml b/archive/others/autossh/docker-compose.yml similarity index 100% rename from archive/autossh/docker-compose.yml rename to archive/others/autossh/docker-compose.yml diff --git a/archive/dnscrypt-proxy/docker-compose.yml b/archive/others/dnscrypt-proxy/docker-compose.yml similarity index 100% rename from archive/dnscrypt-proxy/docker-compose.yml rename to archive/others/dnscrypt-proxy/docker-compose.yml diff --git a/archive/docker-compose-no-tz.yaml b/archive/others/docker-compose-no-tz.yaml similarity index 100% rename from archive/docker-compose-no-tz.yaml rename to archive/others/docker-compose-no-tz.yaml diff --git a/archive/docker-compose.yaml b/archive/others/docker-compose.yaml similarity index 100% rename from archive/docker-compose.yaml rename to archive/others/docker-compose.yaml diff --git a/archive/docuseal/docker-compose.yml b/archive/others/docuseal/docker-compose.yml similarity index 100% rename from archive/docuseal/docker-compose.yml rename to archive/others/docuseal/docker-compose.yml diff --git a/archive/doh/docker-compose.yml b/archive/others/doh/docker-compose.yml similarity index 100% rename from archive/doh/docker-compose.yml rename to archive/others/doh/docker-compose.yml diff --git a/archive/doods/Dockerfile b/archive/others/doods/Dockerfile similarity index 100% rename from archive/doods/Dockerfile rename to archive/others/doods/Dockerfile diff --git a/archive/doods/config.yaml b/archive/others/doods/config.yaml similarity index 100% rename from archive/doods/config.yaml rename to archive/others/doods/config.yaml diff --git a/archive/doods/docker-compose.yml b/archive/others/doods/docker-compose.yml similarity index 100% rename from archive/doods/docker-compose.yml rename to archive/others/doods/docker-compose.yml diff --git a/archive/doods/fetch_models.sh b/archive/others/doods/fetch_models.sh similarity index 100% rename from archive/doods/fetch_models.sh rename to archive/others/doods/fetch_models.sh diff --git a/archive/dynu/dynu.sh b/archive/others/dynu/dynu.sh similarity index 100% rename from archive/dynu/dynu.sh rename to archive/others/dynu/dynu.sh diff --git a/archive/email-alerts/Dockerfile b/archive/others/email-alerts/Dockerfile similarity index 100% rename from archive/email-alerts/Dockerfile rename to archive/others/email-alerts/Dockerfile diff --git a/archive/esphome/Dockerfile b/archive/others/esphome/Dockerfile similarity index 100% rename from archive/esphome/Dockerfile rename to archive/others/esphome/Dockerfile diff --git a/archive/esphome/create-default-config.sh b/archive/others/esphome/create-default-config.sh similarity index 100% rename from archive/esphome/create-default-config.sh rename to archive/others/esphome/create-default-config.sh diff --git a/archive/esphome/default_configuration.yaml b/archive/others/esphome/default_configuration.yaml similarity index 100% rename from archive/esphome/default_configuration.yaml rename to archive/others/esphome/default_configuration.yaml diff --git a/archive/esphome/docker-compose.yml b/archive/others/esphome/docker-compose.yml similarity index 100% rename from archive/esphome/docker-compose.yml rename to archive/others/esphome/docker-compose.yml diff --git a/archive/esphome/remote_transmitter-codes.yaml b/archive/others/esphome/remote_transmitter-codes.yaml similarity index 100% rename from archive/esphome/remote_transmitter-codes.yaml rename to archive/others/esphome/remote_transmitter-codes.yaml diff --git a/archive/graylog/docker-compose.yml b/archive/others/graylog/docker-compose.yml similarity index 100% rename from archive/graylog/docker-compose.yml rename to archive/others/graylog/docker-compose.yml diff --git a/archive/hass/docker-compose.yml b/archive/others/hass/docker-compose.yml similarity index 100% rename from archive/hass/docker-compose.yml rename to archive/others/hass/docker-compose.yml diff --git a/archive/lfs/Dockerfile b/archive/others/lfs/Dockerfile similarity index 100% rename from archive/lfs/Dockerfile rename to archive/others/lfs/Dockerfile diff --git a/archive/lfs/cross-toolchain.sh b/archive/others/lfs/cross-toolchain.sh similarity index 100% rename from archive/lfs/cross-toolchain.sh rename to archive/others/lfs/cross-toolchain.sh diff --git a/archive/mqtt/config.yaml b/archive/others/mqtt/config.yaml similarity index 100% rename from archive/mqtt/config.yaml rename to archive/others/mqtt/config.yaml diff --git a/archive/mqtt/docker-compose.yml b/archive/others/mqtt/docker-compose.yml similarity index 100% rename from archive/mqtt/docker-compose.yml rename to archive/others/mqtt/docker-compose.yml diff --git a/archive/netdata/docker-compose.yml b/archive/others/netdata/docker-compose.yml similarity index 100% rename from archive/netdata/docker-compose.yml rename to archive/others/netdata/docker-compose.yml diff --git a/archive/office365/Dockerfile b/archive/others/office365/Dockerfile similarity index 100% rename from archive/office365/Dockerfile rename to archive/others/office365/Dockerfile diff --git a/archive/pihole/docker-compose.yml b/archive/others/pihole/docker-compose.yml similarity index 100% rename from archive/pihole/docker-compose.yml rename to archive/others/pihole/docker-compose.yml diff --git a/archive/portainer-agent-stack.yml b/archive/others/portainer-agent-stack.yml similarity index 100% rename from archive/portainer-agent-stack.yml rename to archive/others/portainer-agent-stack.yml diff --git a/archive/portainer-compose-files/haproxy.yaml b/archive/others/portainer-compose-files/haproxy.yaml similarity index 100% rename from archive/portainer-compose-files/haproxy.yaml rename to archive/others/portainer-compose-files/haproxy.yaml diff --git a/archive/portainer-compose-files/keeweb.yaml b/archive/others/portainer-compose-files/keeweb.yaml similarity index 100% rename from archive/portainer-compose-files/keeweb.yaml rename to archive/others/portainer-compose-files/keeweb.yaml diff --git a/archive/portainer-compose-files/registry.yaml b/archive/others/portainer-compose-files/registry.yaml similarity index 100% rename from archive/portainer-compose-files/registry.yaml rename to archive/others/portainer-compose-files/registry.yaml diff --git a/archive/portainer-compose-files/searxng.yaml b/archive/others/portainer-compose-files/searxng.yaml similarity index 100% rename from archive/portainer-compose-files/searxng.yaml rename to archive/others/portainer-compose-files/searxng.yaml diff --git a/archive/portainer-compose-files/webdav.yaml b/archive/others/portainer-compose-files/webdav.yaml similarity index 100% rename from archive/portainer-compose-files/webdav.yaml rename to archive/others/portainer-compose-files/webdav.yaml diff --git a/archive/portainer-compose.yaml b/archive/others/portainer-compose.yaml similarity index 100% rename from archive/portainer-compose.yaml rename to archive/others/portainer-compose.yaml diff --git a/archive/portainer/docker-compose.yml b/archive/others/portainer/docker-compose.yml similarity index 100% rename from archive/portainer/docker-compose.yml rename to archive/others/portainer/docker-compose.yml diff --git a/archive/recreate-containers.sh b/archive/others/recreate-containers.sh similarity index 100% rename from archive/recreate-containers.sh rename to archive/others/recreate-containers.sh diff --git a/archive/recreate-nextcloud.sh b/archive/others/recreate-nextcloud.sh similarity index 100% rename from archive/recreate-nextcloud.sh rename to archive/others/recreate-nextcloud.sh diff --git a/archive/recreate-passbolt.sh b/archive/others/recreate-passbolt.sh similarity index 100% rename from archive/recreate-passbolt.sh rename to archive/others/recreate-passbolt.sh diff --git a/archive/traccar/docker-compose.yml b/archive/others/traccar/docker-compose.yml similarity index 100% rename from archive/traccar/docker-compose.yml rename to archive/others/traccar/docker-compose.yml diff --git a/archive/ubuntu-gui/Dockerfile b/archive/others/ubuntu-gui/Dockerfile similarity index 100% rename from archive/ubuntu-gui/Dockerfile rename to archive/others/ubuntu-gui/Dockerfile diff --git a/archive/ubuntu-gui/docker-compose.yml b/archive/others/ubuntu-gui/docker-compose.yml similarity index 100% rename from archive/ubuntu-gui/docker-compose.yml rename to archive/others/ubuntu-gui/docker-compose.yml diff --git a/archive/update-containers.sh b/archive/others/update-containers.sh similarity index 100% rename from archive/update-containers.sh rename to archive/others/update-containers.sh diff --git a/archive/webdav/docker-compose.yml b/archive/others/webdav/docker-compose.yml similarity index 100% rename from archive/webdav/docker-compose.yml rename to archive/others/webdav/docker-compose.yml diff --git a/core/authelia/docker-compose.yml b/core/authelia/docker-compose.yml index b73e969..93e6860 100644 --- a/core/authelia/docker-compose.yml +++ b/core/authelia/docker-compose.yml @@ -12,7 +12,10 @@ services: # - AUTHELIA_SESSION_SECRET=${AUTHELIA_SESSION_SECRET} # - AUTHELIA_STORAGE_ENCRYPTION_KEY=${AUTHELIA_STORAGE_ENCRYPTION_KEY} volumes: - - ${PROJECT_ROOT}/core/authelia:/config +# - ${PROJECT_ROOT}/core/authelia:/config + - ${DOCKER_VOLUMES}/authelia-data:/config/data + - ${PROJECT_ROOT}/core/authelia/configuration.yml:/config/configuration.yml:ro + - ${PROJECT_ROOT}/core/authelia/users_database.yml:/config/users_database.yml:ro networks: # - reverse_proxy - traefik diff --git a/core/crowdsec/docker-compose.yml b/core/crowdsec/docker-compose.yml index fe4cfb3..6128094 100644 --- a/core/crowdsec/docker-compose.yml +++ b/core/crowdsec/docker-compose.yml @@ -9,9 +9,12 @@ services: - COLLECTIONS=crowdsecurity/traefik # - CROWDSEC_LAPI_KEY=${CROWDSEC_LAPI_KEY} volumes: - - ${PROJECT_ROOT}/core/crowdsec/logs:/logs:ro - - ${PROJECT_ROOT}/core/crowdsec/data:/var/lib/crowdsec/data - - ${PROJECT_ROOT}/core/crowdsec/config:/etc/crowdsec +# - ${PROJECT_ROOT}/core/crowdsec/logs:/logs:ro +# - ${PROJECT_ROOT}/core/crowdsec/data:/var/lib/crowdsec/data +# - ${PROJECT_ROOT}/core/crowdsec/config:/etc/crowdsec + - ${DOCKER_VOLUMES}/crowdsec/logs:/logs:ro + - ${DOCKER_VOLUMES}/crowdsec/data:/var/lib/crowdsec/data + - ${DOCKER_VOLUMES}/crowdsec/config:/etc/crowdsec networks: # - reverse_proxy - traefik diff --git a/core/traefik/docker-compose.yml b/core/traefik/docker-compose.yml index f722b44..f3aa198 100644 --- a/core/traefik/docker-compose.yml +++ b/core/traefik/docker-compose.yml @@ -22,13 +22,18 @@ services: # - ${PROJECT_ROOT}/secrets/stack-secrets.env volumes: - - ${PROJECT_ROOT}/core/traefik/data/letsencrypt:/letsencrypt - - ${PROJECT_ROOT}/core/traefik/data/logs:/logs +# - ${PROJECT_ROOT}/core/traefik/data/letsencrypt:/letsencrypt +# - ${PROJECT_ROOT}/core/traefik/data/logs:/logs - ${PROJECT_ROOT}/core/traefik/certs:/etc/traefik/certs:ro - ${PROJECT_ROOT}/core/traefik/dynamic.yml:/etc/traefik/dynamic.yml:ro - ${PROJECT_ROOT}/core/traefik/traefik.yml:/etc/traefik/traefik.yml:ro - - ${PROJECT_ROOT}/core/traefik/data/plugins:/plugins-storage - +# - ${PROJECT_ROOT}/core/traefik/data/plugins:/plugins-storage + - ${DOCKER_VOLUMES}/traefik-data/letsencrypt:/letsencrypt + - ${DOCKER_VOLUMES}/traefik-data/logs:/logs +# - ${PROJECT_ROOT}/core/traefik/certs:/etc/traefik/certs:ro +# - ${PROJECT_ROOT}/core/traefik/dynamic.yml:/etc/traefik/dynamic.yml:ro +# - ${PROJECT_ROOT}/core/traefik/traefik.yml:/etc/traefik/traefik.yml:ro + - ${DOCKER_VOLUMES}/traefik-data/plugins:/plugins-storage healthcheck: test: traefik healthcheck --ping diff --git a/default-environment.env b/default-environment.env index 552fa77..2d45b6f 100644 --- a/default-environment.env +++ b/default-environment.env @@ -7,6 +7,8 @@ SECRETS_ENV_FILE=${PROJECT_ROOT}/secrets/stack-secrets.env # Core CROWDSEC_COLLECTIONS=crowdsecurity/traefik ERROR_PAGES_TEMPLATE_NAME=app-down +DOCKER_VOLUMES=/mnt/docker-volumes +DOCKER_DATABASES=/mnt/docker-databases # Gitea GITEA_USER_UID=1000 @@ -35,6 +37,7 @@ NEXTCLOUD_SMTP_AUTHTYPE=login NEXTCLOUD_REDIS_HOST=redis NEXTCLOUD_REDIS_HOST_PORT=6379 NEXTCLOUD_MARIADB_AUTO_UPGRADE=1 +NEXTCLOUD_DATA=/mnt/nextcloud-data # Passbolt PASSBOLT_MYSQL_RANDOM_ROOT_PASSWORD=true diff --git a/monitoring/docker-exporter/docker-compose.yml b/monitoring/docker-exporter/docker-compose.yml index 79574e9..284c3f8 100644 --- a/monitoring/docker-exporter/docker-compose.yml +++ b/monitoring/docker-exporter/docker-compose.yml @@ -16,7 +16,8 @@ services: volumes: - ~/.docker/config.json:/root/.docker/config.json:ro - - ${PROJECT_ROOT}/monitoring/docker-exporter/data:/data:rw +# - ${PROJECT_ROOT}/monitoring/docker-exporter/data:/data:rw + - ${DOCKER_VOLUMES}/docker-update-exporter-data:/data:rw - ${PROJECT_ROOT}:/compose:ro # - ${PROJECT_ROOT}/default-environment.env:/compose/default-environment.env:ro # - ${PROJECT_ROOT}/default-network.yml:/compose/default-network.yml:ro @@ -53,3 +54,6 @@ services: timeout: 5s retries: 3 start_period: 10s +#volumes: +# docker-update-exporter-data: +# external: true diff --git a/monitoring/gotify/docker-compose.yml b/monitoring/gotify/docker-compose.yml index 53e596b..d9dc75b 100644 --- a/monitoring/gotify/docker-compose.yml +++ b/monitoring/gotify/docker-compose.yml @@ -7,7 +7,9 @@ services: # env_file: # - ${PROJECT_ROOT}/secrets/stack-secrets.env volumes: - - ${PROJECT_ROOT}/monitoring/gotify/data:/app/data +# - ${PROJECT_ROOT}/monitoring/gotify/data:/app/data + - ${DOCKER_VOLUMES}/gotify-data:/app/data +# - gotify-data:/app/data environment: - TZ=${TZ} - GOTIFY_DEFAULTUSER_NAME=${GOTIFY_DEFAULTUSER_NAME} @@ -27,3 +29,6 @@ services: - "traefik.http.services.gotify.loadbalancer.server.port=80" ports: - 8080:80 +#volumes: +# gotify-data: +# external: true diff --git a/monitoring/grafana/docker-compose.yml b/monitoring/grafana/docker-compose.yml index 39fadf6..ec5b127 100644 --- a/monitoring/grafana/docker-compose.yml +++ b/monitoring/grafana/docker-compose.yml @@ -7,7 +7,8 @@ services: environment: - GF_SERVER_ROOT_URL=${GRAFANA_ROOT_URL} volumes: - - ${PROJECT_ROOT}/monitoring/grafana/data:/var/lib/grafana +# - ${PROJECT_ROOT}/monitoring/grafana/data:/var/lib/grafana + - ${DOCKER_VOLUMES}/grafana-data:/var/lib/grafana networks: # - traefik_reverse_proxy # - prometheus_edge @@ -48,3 +49,7 @@ services: # external: true # prometheus_edge: # external: true + +#volumes: +# grafana-data: +# external: true diff --git a/monitoring/grafana/output.txt b/monitoring/grafana/output.txt deleted file mode 100644 index f1078e0..0000000 --- a/monitoring/grafana/output.txt +++ /dev/null @@ -1,630 +0,0 @@ -tempo | failed parsing config: failed to parse configFile /etc/tempo/config.yaml: yaml: unmarshal errors: -tempo | line 24: field compactor not found in type app.Config -tempo | level=info ts=2026-02-28T03:38:16.504252277Z caller=main.go:106 msg="Starting Tempo" version="(version=v2.10.1, branch=main, revision=ad20e59db)" target=all -tempo | level=info ts=2026-02-28T03:38:16.506107792Z caller=server.go:284 msg="server listening on addresses" http=[::]:3200 grpc=[::]:9095 -tempo | level=info ts=2026-02-28T03:38:16.510179623Z caller=cache.go:55 msg="caches available to storage backend" parquet-footer=false bloom=false parquet-offset-idx=false parquet-column-idx=false trace-id-index=false parquet-page=false -tempo | level=info ts=2026-02-28T03:38:16.51381011Z caller=cache.go:55 msg="caches available to storage backend" parquet-footer=false bloom=false parquet-offset-idx=false parquet-column-idx=false trace-id-index=false parquet-page=false -tempo | level=warn ts=2026-02-28T03:38:16.515946735Z caller=modules.go:682 msg="Scheduler address is empty in single binary mode. Attempting automatic worker configuration." address=127.0.0.1:9095 -tempo | level=info ts=2026-02-28T03:38:16.515962445Z caller=backendworker.go:80 msg="backend worker starting" worker_id=4777f4a6f30e -tempo | level=info ts=2026-02-28T03:38:16.518963163Z caller=frontend.go:88 msg="creating middleware in query frontend" -tempo | level=info ts=2026-02-28T03:38:16.521703999Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:38:16.521732753Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:38:16.521738063Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:38:16.52174193Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:38:16.521750647Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:38:16.521756559Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | ts=2026-02-28T03:38:16Z level=info msg="OTel Shim Logger Initialized" component=tempo -tempo | level=warn ts=2026-02-28T03:38:16.527971627Z caller=modules.go:397 msg="Worker address is empty in single binary mode. Attempting automatic worker configuration. If queries are unresponsive consider configuring the worker explicitly." address=127.0.0.1:9095 -tempo | level=info ts=2026-02-28T03:38:16.528090421Z caller=worker.go:108 msg="Starting querier worker connected to query-frontend" frontend=127.0.0.1:9095 -tempo | level=warn ts=2026-02-28T03:38:16.528643676Z caller=modules.go:295 msg="metrics-generator is not configured." err="no metrics_generator.storage.path configured, metrics generator will be disabled" -tempo | level=info ts=2026-02-28T03:38:16.529205548Z caller=module_service.go:82 msg=starting module=cache-provider -tempo | level=info ts=2026-02-28T03:38:16.529235324Z caller=module_service.go:82 msg=starting module=optional-store -tempo | level=info ts=2026-02-28T03:38:16.529246304Z caller=module_service.go:82 msg=starting module=store -tempo | level=info ts=2026-02-28T03:38:16.529310496Z caller=module_service.go:82 msg=starting module=internal-server -tempo | level=info ts=2026-02-28T03:38:16.529363827Z caller=module_service.go:82 msg=starting module=server -tempo | level=info ts=2026-02-28T03:38:16.529446112Z caller=module_service.go:82 msg=starting module=overrides -tempo | level=info ts=2026-02-28T03:38:16.529477541Z caller=module_service.go:82 msg=starting module=memberlist-kv -tempo | level=info ts=2026-02-28T03:38:16.529508179Z caller=module_service.go:82 msg=starting module=overrides-api -tempo | level=info ts=2026-02-28T03:38:16.529517306Z caller=module_service.go:82 msg=starting module=live-store-ring -tempo | level=info ts=2026-02-28T03:38:16.529975612Z caller=module_service.go:82 msg=starting module=metrics-generator-ring -tempo | level=info ts=2026-02-28T03:38:16.530025126Z caller=ring.go:372 msg="ring doesn't exist in KV store yet" -tempo | level=info ts=2026-02-28T03:38:16.529669724Z caller=ring.go:372 msg="ring doesn't exist in KV store yet" -tempo | level=info ts=2026-02-28T03:38:16.530662269Z caller=module_service.go:82 msg=starting module=usage-report -tempo | level=info ts=2026-02-28T03:38:16.530661898Z caller=module_service.go:82 msg=starting module=partition-ring -tempo | level=info ts=2026-02-28T03:38:16.530845895Z caller=partition_ring_watcher.go:73 msg="partition ring doesn't exist in KV store yet" -tempo | level=info ts=2026-02-28T03:38:16.530989036Z caller=module_service.go:82 msg=starting module=live-store -tempo | level=info ts=2026-02-28T03:38:16.530999045Z caller=module_service.go:82 msg=starting module=query-frontend -tempo | level=info ts=2026-02-28T03:38:16.530994115Z caller=module_service.go:82 msg=starting module=querier -tempo | level=info ts=2026-02-28T03:38:16.531011028Z caller=module_service.go:82 msg=starting module=block-builder -tempo | level=info ts=2026-02-28T03:38:16.531029903Z caller=module_service.go:82 msg=starting module=backend-worker -tempo | level=info ts=2026-02-28T03:38:16.531033931Z caller=module_service.go:82 msg=starting module=distributor -tempo | level=info ts=2026-02-28T03:38:16.531047757Z caller=tempodb.go:633 msg="polling enabled" interval=5m0s blocklist_concurrency=50 -tempo | level=info ts=2026-02-28T03:38:16.531594119Z caller=module_service.go:82 msg=starting module=metrics-generator -tempo | level=info ts=2026-02-28T03:38:16.531614337Z caller=module_service.go:82 msg=starting module=backend-scheduler -tempo | level=info ts=2026-02-28T03:38:16.531618996Z caller=backendscheduler.go:109 msg="backend scheduler starting" -tempo | level=info ts=2026-02-28T03:38:16.534070025Z caller=poller.go:249 msg="blocklist poll complete" seconds=0.002997762 -tempo | level=info ts=2026-02-28T03:38:16.534101805Z caller=backendworker.go:183 msg="backend worker running" -tempo | ts=2026-02-28T03:38:16Z level=info msg="Starting GRPC server" component=tempo endpoint=[::]:4317 -tempo | level=info ts=2026-02-28T03:38:16.535267337Z caller=worker.go:184 msg="adding connection" addr=127.0.0.1:9095 -tempo | level=info ts=2026-02-28T03:38:16.536553646Z caller=worker.go:250 msg="total worker concurrency updated" totalConcurrency=20 -tempo | ts=2026-02-28T03:38:16Z level=info msg="Starting HTTP server" component=tempo endpoint=[::]:4318 -tempo | level=info ts=2026-02-28T03:38:16.538250531Z caller=backendscheduler.go:162 msg="backend scheduler running" -tempo | level=info ts=2026-02-28T03:38:16.538293953Z caller=app.go:214 msg="Tempo started" -tempo | level=info ts=2026-02-28T03:38:16.538315674Z caller=compaction.go:102 msg="compaction provider started" -tempo | level=info ts=2026-02-28T03:38:16.538325803Z caller=compaction.go:126 msg="compaction provider waiting for poll notification" -tempo | level=info ts=2026-02-28T03:38:16.538336152Z caller=retention.go:45 msg="retention provider started" -tempo | level=warn ts=2026-02-28T03:38:31.539059217Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.001238779s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:38:31.539333085Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=137.845499ms -tempo | level=warn ts=2026-02-28T03:38:47.706949743Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000246082s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:38:47.707402278Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=463.092807ms -tempo | level=warn ts=2026-02-28T03:39:03.90316531Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000234022s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:39:03.90345658Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=2.456866248s -tempo | level=info ts=2026-02-28T03:39:04.022018905Z caller=app.go:242 msg="=== received SIGINT/SIGTERM ===\n*** exiting" -tempo | level=info ts=2026-02-28T03:39:04.022341133Z caller=module_service.go:120 msg="module stopped" module=metrics-generator -tempo | level=info ts=2026-02-28T03:39:04.022392981Z caller=compaction.go:131 msg="compaction provider stopping" -tempo | level=info ts=2026-02-28T03:39:04.022421094Z caller=module_service.go:120 msg="module stopped" module=live-store -tempo | level=info ts=2026-02-28T03:39:04.022436252Z caller=backendscheduler.go:136 msg="stopping provider" provider=1 -tempo | level=info ts=2026-02-28T03:39:04.022477952Z caller=retention.go:50 msg="retention provider stopping" -tempo | level=info ts=2026-02-28T03:39:04.022483221Z caller=backendscheduler.go:136 msg="stopping provider" provider=0 -tempo | level=info ts=2026-02-28T03:39:04.022499622Z caller=backendscheduler.go:154 msg="all providers stopped" -tempo | level=info ts=2026-02-28T03:39:04.022514801Z caller=compaction.go:202 msg="compaction provider measure ticker stopping" -tempo | level=info ts=2026-02-28T03:39:04.023035023Z caller=module_service.go:120 msg="module stopped" module=distributor -tempo | level=info ts=2026-02-28T03:39:04.023143178Z caller=module_service.go:120 msg="module stopped" module=block-builder -tempo | level=warn ts=2026-02-28T03:39:04.023319751Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.481348854s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023397699Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485115377s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023419059Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485051917s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023433387Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485095891s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023447353Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485568464s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.02345667Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485115568s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.02346698Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485072817s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023476648Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485110168s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023486636Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485125947s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023501636Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485212231s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T03:39:04.023502868Z caller=module_service.go:120 msg="module stopped" module=optional-store -tempo | level=warn ts=2026-02-28T03:39:04.023508539Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485663543s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023539146Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485854102s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023551659Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485305717s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.02356266Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485318241s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.02357358Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485326275s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023587017Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.48529687s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023585083Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485268317s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023596484Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485287864s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T03:39:04.023606022Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.485293264s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T03:39:04.023644765Z caller=module_service.go:120 msg="module stopped" module=query-frontend -tempo | level=info ts=2026-02-28T03:39:04.023659914Z caller=module_service.go:120 msg="module stopped" module=overrides-api -tempo | level=warn ts=2026-02-28T03:39:04.023515852Z caller=server.go:1560 method=/frontend.Frontend/Process duration=47.481666904s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T03:39:04.023804989Z caller=frontend.go:339 msg="received shutdown notification from querier" querier=4777f4a6f30e -tempo | level=info ts=2026-02-28T03:39:04.024020695Z caller=module_service.go:120 msg="module stopped" module=querier -tempo | level=info ts=2026-02-28T03:39:04.037362837Z caller=module_service.go:120 msg="module stopped" module=partition-ring -tempo | level=info ts=2026-02-28T03:39:04.037395037Z caller=module_service.go:120 msg="module stopped" module=metrics-generator-ring -tempo | level=info ts=2026-02-28T03:39:04.037503452Z caller=module_service.go:120 msg="module stopped" module=live-store-ring -tempo | level=info ts=2026-02-28T03:39:04.436087499Z caller=backendscheduler.go:201 msg="backend scheduler stopping" -tempo | level=info ts=2026-02-28T03:39:04.436141891Z caller=module_service.go:120 msg="module stopped" module=backend-scheduler -tempo | level=warn ts=2026-02-28T03:39:10.605069202Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=44.344µs msg=gRPC err="rpc error: code = Internal desc = nil job received" -tempo | level=error ts=2026-02-28T03:39:10.605239002Z caller=backendworker.go:454 msg="error calling scheduler" err="error getting next job: rpc error: code = Internal desc = nil job received" backoff=8.910321994s -tempo | level=info ts=2026-02-28T03:39:14.488350709Z caller=main.go:106 msg="Starting Tempo" version="(version=v2.10.1, branch=main, revision=ad20e59db)" target=all -tempo | level=info ts=2026-02-28T03:39:14.488776793Z caller=cache.go:55 msg="caches available to storage backend" parquet-footer=false bloom=false parquet-offset-idx=false parquet-column-idx=false trace-id-index=false parquet-page=false -tempo | level=info ts=2026-02-28T03:39:14.48970103Z caller=server.go:284 msg="server listening on addresses" http=[::]:3200 grpc=[::]:9095 -tempo | level=info ts=2026-02-28T03:39:14.490096587Z caller=cache.go:55 msg="caches available to storage backend" parquet-footer=false bloom=false parquet-offset-idx=false parquet-column-idx=false trace-id-index=false parquet-page=false -tempo | level=warn ts=2026-02-28T03:39:14.492106423Z caller=modules.go:682 msg="Scheduler address is empty in single binary mode. Attempting automatic worker configuration." address=127.0.0.1:9095 -tempo | level=info ts=2026-02-28T03:39:14.492149043Z caller=backendworker.go:80 msg="backend worker starting" worker_id=4777f4a6f30e -tempo | level=info ts=2026-02-28T03:39:14.492516217Z caller=frontend.go:88 msg="creating middleware in query frontend" -tempo | level=info ts=2026-02-28T03:39:14.492620283Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:39:14.492661331Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:39:14.492681839Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:39:14.492700414Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:39:14.492715484Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=info ts=2026-02-28T03:39:14.492728578Z caller=sync_handler_cache.go:131 msg="init frontend cache" role=frontend-search enabled=false -tempo | level=warn ts=2026-02-28T03:39:14.493177155Z caller=modules.go:397 msg="Worker address is empty in single binary mode. Attempting automatic worker configuration. If queries are unresponsive consider configuring the worker explicitly." address=127.0.0.1:9095 -tempo | level=info ts=2026-02-28T03:39:14.493339051Z caller=worker.go:108 msg="Starting querier worker connected to query-frontend" frontend=127.0.0.1:9095 -tempo | ts=2026-02-28T03:39:14Z level=info msg="OTel Shim Logger Initialized" component=tempo -tempo | level=warn ts=2026-02-28T03:39:14.495105829Z caller=modules.go:295 msg="metrics-generator is not configured." err="no metrics_generator.storage.path configured, metrics generator will be disabled" -tempo | level=info ts=2026-02-28T03:39:14.495667199Z caller=module_service.go:82 msg=starting module=optional-store -tempo | level=info ts=2026-02-28T03:39:14.496941125Z caller=module_service.go:82 msg=starting module=internal-server -tempo | level=info ts=2026-02-28T03:39:14.497087782Z caller=module_service.go:82 msg=starting module=cache-provider -tempo | level=info ts=2026-02-28T03:39:14.497242835Z caller=module_service.go:82 msg=starting module=store -tempo | level=info ts=2026-02-28T03:39:14.497359636Z caller=module_service.go:82 msg=starting module=server -tempo | level=info ts=2026-02-28T03:39:14.497560034Z caller=module_service.go:82 msg=starting module=overrides -tempo | level=info ts=2026-02-28T03:39:14.49825639Z caller=module_service.go:82 msg=starting module=overrides-api -tempo | level=info ts=2026-02-28T03:39:14.498445827Z caller=module_service.go:82 msg=starting module=memberlist-kv -tempo | level=info ts=2026-02-28T03:39:14.498546206Z caller=module_service.go:82 msg=starting module=metrics-generator-ring -tempo | level=info ts=2026-02-28T03:39:14.498747066Z caller=ring.go:372 msg="ring doesn't exist in KV store yet" -tempo | level=info ts=2026-02-28T03:39:14.498816477Z caller=module_service.go:82 msg=starting module=live-store-ring -tempo | level=info ts=2026-02-28T03:39:14.498829101Z caller=module_service.go:82 msg=starting module=usage-report -tempo | level=info ts=2026-02-28T03:39:14.501249322Z caller=module_service.go:82 msg=starting module=query-frontend -tempo | level=info ts=2026-02-28T03:39:14.501273138Z caller=module_service.go:82 msg=starting module=backend-scheduler -tempo | level=info ts=2026-02-28T03:39:14.501281423Z caller=backendscheduler.go:109 msg="backend scheduler starting" -tempo | ts=2026-02-28T03:39:14Z level=info msg="Starting GRPC server" component=tempo endpoint=[::]:4317 -tempo | ts=2026-02-28T03:39:14Z level=info msg="Starting HTTP server" component=tempo endpoint=[::]:4318 -tempo | level=info ts=2026-02-28T03:39:14.501985883Z caller=ring.go:372 msg="ring doesn't exist in KV store yet" -tempo | level=info ts=2026-02-28T03:39:14.502072537Z caller=module_service.go:82 msg=starting module=partition-ring -tempo | level=info ts=2026-02-28T03:39:14.502101092Z caller=module_service.go:82 msg=starting module=backend-worker -tempo | level=info ts=2026-02-28T03:39:14.502101442Z caller=partition_ring_watcher.go:73 msg="partition ring doesn't exist in KV store yet" -tempo | level=info ts=2026-02-28T03:39:14.502119777Z caller=tempodb.go:633 msg="polling enabled" interval=5m0s blocklist_concurrency=50 -tempo | level=info ts=2026-02-28T03:39:14.502157537Z caller=module_service.go:82 msg=starting module=metrics-generator -tempo | level=info ts=2026-02-28T03:39:14.502189098Z caller=module_service.go:82 msg=starting module=distributor -tempo | level=info ts=2026-02-28T03:39:14.502216168Z caller=poller.go:249 msg="blocklist poll complete" seconds=7.9791e-05 -tempo | level=info ts=2026-02-28T03:39:14.502232729Z caller=backendworker.go:183 msg="backend worker running" -tempo | level=info ts=2026-02-28T03:39:14.502586187Z caller=module_service.go:82 msg=starting module=querier -tempo | level=info ts=2026-02-28T03:39:14.502630632Z caller=module_service.go:82 msg=starting module=live-store -tempo | level=info ts=2026-02-28T03:39:14.502740018Z caller=worker.go:184 msg="adding connection" addr=127.0.0.1:9095 -tempo | level=info ts=2026-02-28T03:39:14.503119545Z caller=worker.go:250 msg="total worker concurrency updated" totalConcurrency=20 -tempo | level=info ts=2026-02-28T03:39:14.504169348Z caller=module_service.go:82 msg=starting module=block-builder -tempo | level=info ts=2026-02-28T03:39:14.506269895Z caller=backendscheduler.go:162 msg="backend scheduler running" -tempo | level=info ts=2026-02-28T03:39:14.506302157Z caller=app.go:214 msg="Tempo started" -tempo | level=info ts=2026-02-28T03:39:14.5063145Z caller=compaction.go:102 msg="compaction provider started" -tempo | level=info ts=2026-02-28T03:39:14.506320521Z caller=compaction.go:126 msg="compaction provider waiting for poll notification" -tempo | level=info ts=2026-02-28T03:39:14.506328516Z caller=retention.go:45 msg="retention provider started" -tempo | level=warn ts=2026-02-28T03:39:29.508287056Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000581399s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:39:29.508572244Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=184.86286ms -tempo | level=warn ts=2026-02-28T03:39:45.052093517Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000133061s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:39:45.052342347Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=683.918431ms -tempo | level=warn ts=2026-02-28T03:40:01.617186207Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000246556s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:40:01.617444254Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=2.230026613s -tempo | level=warn ts=2026-02-28T03:40:21.738394906Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000616341s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:40:21.738738376Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=6.928753128s -tempo | level=warn ts=2026-02-28T03:41:00.303046594Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000840441s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:41:00.303269665Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=46.690005969s -tempo | level=warn ts=2026-02-28T03:42:09.822438562Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.001122933s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:42:09.822714043Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=55.06043985s -tempo | level=warn ts=2026-02-28T03:43:23.832379908Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000290546s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:43:23.83267209Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.189518589s -tempo | level=info ts=2026-02-28T03:44:14.51080544Z caller=poller.go:249 msg="blocklist poll complete" seconds=0.005466397 -tempo | level=info ts=2026-02-28T03:44:14.510866645Z caller=compaction.go:142 msg="received empty tenant" -tempo | level=warn ts=2026-02-28T03:44:32.167179641Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000322598s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:44:32.167467976Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=59.343922215s -tempo | level=warn ts=2026-02-28T03:45:44.442347133Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000682317s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:45:44.442597837Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=55.235447404s -tempo | level=warn ts=2026-02-28T03:46:55.621855189Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000935062s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:46:55.622113698Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=57.996223179s -tempo | level=warn ts=2026-02-28T03:48:03.715877703Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000435945s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:48:03.716165717Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.637759938s -tempo | level=info ts=2026-02-28T03:49:14.505419519Z caller=poller.go:249 msg="blocklist poll complete" seconds=6.9141e-05 -tempo | level=info ts=2026-02-28T03:49:14.505482128Z caller=compaction.go:142 msg="received empty tenant" -tempo | level=warn ts=2026-02-28T03:49:14.842107415Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000257167s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:49:14.842340856Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.010954393s -tempo | level=warn ts=2026-02-28T03:50:28.490571505Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000174599s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:50:28.490848819Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=56.688382421s -tempo | level=warn ts=2026-02-28T03:51:39.573560321Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000365972s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:51:39.573943555Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=59.697783583s -tempo | level=info ts=2026-02-28T03:52:47.227247458Z caller=tag_handlers.go:518 msg="search tag request" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:47.230208333Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772249867&end=1772250767&scope=&q= (500) 1.277885ms Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:47.230708187Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772249867&end=1772250767&scope=&q= (500) 37.201µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:47.230898016Z caller=tag_handlers.go:527 msg="search tag response" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 duration_seconds=0.003652292 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:47.230940145Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tags?end=1772250767&limit=5000&start=1772249867" duration=4.515183ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:47.231008214Z caller=server.go:2286 msg="GET /api/v2/search/tags?limit=5000 (500) 4.711182ms Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:55.046107322Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000358106s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:52:55.04635027Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=51.430516974s -tempo | level=info ts=2026-02-28T03:52:59.295759743Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.304296915Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q= (500) 119.124µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.304832928Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q= (500) 87.075µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.305196605Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query= range_seconds=0 duration_seconds=0.009433275 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.30531019Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772250779&limit=5000&start=1772249879&tag=resource.service.name" duration=9.561277ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.305348642Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&tag=resource.service.name (500) 9.666326ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.305855119Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:52:59.305855199Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.306587153Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q= (500) 123.874µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.309044746Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q= (500) 86.212µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.309177898Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 duration_seconds=0.003320204 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.309206162Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250779&limit=5000&start=1772249879&tag=name" duration=3.356933ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.309253811Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&tag=name (500) 3.44016ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.309659288Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 duration_seconds=0.003794991 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.309690206Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250779&limit=5000&start=1772249879&tag=status" duration=3.832993ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:52:59.364894892Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.365471181Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q= (500) 102.253µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.365832854Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q= (500) 53.241µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.366012043Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query= range_seconds=0 duration_seconds=0.001112984 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.366043211Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772250779&limit=5000&start=1772249879&tag=resource.service.name" duration=1.157266ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.366073419Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&tag=resource.service.name (500) 1.236056ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.374586756Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:52:59.374912371Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.375016809Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q= (500) 103.666µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.375473521Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q= (500) 57.058µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.375643352Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 duration_seconds=0.001053461 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.375670744Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250779&limit=5000&start=1772249879&tag=name" duration=1.093838ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.375692655Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&tag=name (500) 1.189688ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.375839072Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 duration_seconds=0.000923395 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.375865262Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250779&limit=5000&start=1772249879&tag=status" duration=953.653µs response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:52:59.430639585Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:52:59.430641929Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.431784919Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q= (500) 54.263µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.431784538Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q= (500) 92.496µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.432085166Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q= (500) 48.462µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.432098762Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q= (500) 43.912µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.43220327Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query= range_seconds=0 duration_seconds=0.001559207 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.43222465Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 duration_seconds=0.001584123 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.432240359Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772250779&limit=5000&start=1772249879&tag=resource.service.name" duration=1.604001ms response_size=0 status=500 -tempo | level=info ts=2026-02-28T03:52:59.432241802Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250779&limit=5000&start=1772249879&tag=name" duration=1.615052ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.4322619Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&tag=resource.service.name (500) 1.679032ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.432262761Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&tag=name (500) 1.68304ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.437788703Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:52:59.438468568Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 duration_seconds=0.00067752 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.438494086Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250779&limit=5000&start=1772249879&tag=status" duration=713.858µs response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:52:59.554734737Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.555499843Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 132.17µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.555983276Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 61.475µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.5561281Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001390236 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.556162785Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=resource.service.name" duration=1.445401ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.556196699Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.527045ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.570117374Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 -tempo | level=info ts=2026-02-28T03:52:59.570117354Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.571119107Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 54.263µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.57120513Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 duration_seconds=0.001085222 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.571256697Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=status" duration=1.154452ms response_size=130 status=200 -tempo | level=warn ts=2026-02-28T03:52:59.571389749Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 48.662µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.57159701Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 duration_seconds=0.001479817 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.571636224Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=name" duration=1.535432ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.571666902Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7B%7D&tag=name (500) 1.607797ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.604904298Z caller=search_handlers.go:225 msg="search request" tenant=single-tenant query={} range_seconds=3600 limit=20 spans_per_spanset=3 -tempo | level=warn ts=2026-02-28T03:52:59.605700042Z caller=server.go:2286 msg="GET /querier/api/search?start=1772250479&end=1772250779&limit=20&spss=3&q=%7B%7D (500) 129.284µs Response: \"error querying live-stores in Querier.SearchRecent: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.606087353Z caller=server.go:2286 msg="GET /querier/api/search?start=1772250479&end=1772250779&limit=20&spss=3&q=%7B%7D (500) 58.489µs Response: \"error querying live-stores in Querier.SearchRecent: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.606187743Z caller=server.go:2286 msg="GET /querier/api/search?start=1772249879&end=1772250179&limit=20&spss=3&q=%7B%7D (500) 45.105µs Response: \"error querying live-stores in Querier.SearchRecent: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.606188826Z caller=server.go:2286 msg="GET /querier/api/search?start=1772250179&end=1772250479&limit=20&spss=3&q=%7B%7D (500) 48.352µs Response: \"error querying live-stores in Querier.SearchRecent: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.606414472Z caller=server.go:2286 msg="GET /querier/api/search?start=1772250179&end=1772250479&limit=20&spss=3&q=%7B%7D (500) 36.369µs Response: \"error querying live-stores in Querier.SearchRecent: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.606446532Z caller=server.go:2286 msg="GET /querier/api/search?start=1772249879&end=1772250179&limit=20&spss=3&q=%7B%7D (500) 37.09µs Response: \"error querying live-stores in Querier.SearchRecent: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.606580405Z caller=search_handlers.go:184 msg="search response - no resp" tenant=single-tenant duration_seconds=0.001723747 status_code=500 error=null -tempo | level=info ts=2026-02-28T03:52:59.606602738Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/search?end=1772250779&limit=20&q=%7B%7D&start=1772247196" duration=1.748845ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.606631933Z caller=server.go:2286 msg="GET /api/search?end=1772250796&limit=20&q=%7B%7D&start=1772247196 (500) 1.819327ms Response: \"error querying live-stores in Querier.SearchRecent: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.644836935Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 -tempo | level=info ts=2026-02-28T03:52:59.644835402Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.646233004Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 58.19µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.646354614Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 duration_seconds=0.001516506 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.64637912Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=status" duration=1.555229ms response_size=130 status=200 -tempo | level=warn ts=2026-02-28T03:52:59.646532249Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 40.095µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.646628131Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 duration_seconds=0.001792909 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.646645163Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=name" duration=1.822845ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.646662535Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7B%7D&tag=name (500) 1.877126ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.651077217Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.651670158Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 67.368µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.651989281Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 71.174µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.652129425Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001046398 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.652183919Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=resource.service.name" duration=1.105269ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.652218053Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.183345ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.834908067Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.83583599Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 180.561µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.83622182Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 53.04µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.836628539Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001717005 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.83666094Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=resource.service.name" duration=1.762972ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.836695936Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.845125ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.844675474Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 -tempo | level=info ts=2026-02-28T03:52:59.844676606Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:52:59.845559664Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 94.889µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:52:59.846061863Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249879&end=1772250779&q=%7B%7D (500) 46.718µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:52:59.846141675Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 duration_seconds=0.001464176 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.846167934Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=status" duration=1.50822ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:52:59.846173765Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 duration_seconds=0.001499192 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:52:59.846215905Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250779&limit=5000&q=%7B%7D&start=1772249879&tag=name" duration=1.557683ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:52:59.846233909Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7B%7D&tag=name (500) 1.626814ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:54:06.387117532Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000155449s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:54:06.387384306Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.337824347s -tempo | level=info ts=2026-02-28T03:54:07.747790047Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:54:07.748598275Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249947&end=1772250847&q=%7B%7D (500) 118.444µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:54:07.74898729Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772249947&end=1772250847&q=%7B%7D (500) 90.04µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.749157522Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001365771 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:54:07.749184953Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772250847&limit=5000&q=%7B%7D&start=1772249947&tag=resource.service.name" duration=1.405937ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:54:07.749223236Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.496548ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.75446989Z caller=tag_handlers.go:518 msg="search tag request" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:54:07.754987538Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772249947&end=1772250847&scope=&q= (500) 70.694µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.754546215Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:54:07.755500718Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772249947&end=1772250847&scope=&q= (500) 28.594µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.755823719Z caller=tag_handlers.go:527 msg="search tag response" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 duration_seconds=0.001353137 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:54:07.755849367Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tags?end=1772250847&limit=5000&start=1772249947" duration=1.403232ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:54:07.755871819Z caller=server.go:2286 msg="GET /api/v2/search/tags?limit=5000 (500) 1.466611ms Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.756469869Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 duration_seconds=0.001920669 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:54:07.756492221Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250847&limit=5000&q=%7B%7D&start=1772249947&tag=status" duration=1.96836ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:54:07.767792876Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:54:07.768349809Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249947&end=1772250847&q=%7B%7D (500) 87.937µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:54:07.768676455Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249947&end=1772250847&q=%7B%7D (500) 54.313µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.768857398Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 duration_seconds=0.001062668 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:54:07.768881633Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250847&limit=5000&q=%7B%7D&start=1772249947&tag=name" duration=1.097895ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:54:07.768904576Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7B%7D&tag=name (500) 1.15937ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.805215311Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T03:54:07.80596677Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249947&end=1772250847&q=%7Bresource.service.name%3Dtraefik%7D (500) 89.989µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:54:07.806306162Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772249947&end=1772250847&q=%7Bresource.service.name%3Dtraefik%7D (500) 61.466µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.806466906Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001251445 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:54:07.806493576Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772250847&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772249947&tag=name" duration=1.294836ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:54:07.806545344Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.387872ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:54:07.810069784Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:54:07.8114648Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001388143 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:54:07.811500197Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772250847&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772249947&tag=status" duration=1.443909ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:54:14.505512462Z caller=poller.go:249 msg="blocklist poll complete" seconds=6.3169e-05 -tempo | level=info ts=2026-02-28T03:54:14.505573466Z caller=compaction.go:142 msg="received empty tenant" -tempo | level=warn ts=2026-02-28T03:55:17.230319246Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.00109829s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:55:17.23056488Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.331397281s -tempo | level=warn ts=2026-02-28T03:56:27.212672373Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000757225s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:56:27.212924711Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=54.995665223s -tempo | level=info ts=2026-02-28T03:57:35.447493981Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:57:35.448262373Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250155&end=1772251055&q=%7B%7D (500) 82.466µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.448835105Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250155&end=1772251055&q=%7B%7D (500) 57.639µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.448972244Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001477442 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.448997662Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251055&limit=5000&q=%7B%7D&start=1772250155&tag=resource.service.name" duration=1.516175ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:57:35.44902242Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.596868ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=error ts=2026-02-28T03:57:35.449625368Z caller=search_handlers.go:115 msg="search: could not create combiner" err="invalid TraceQL query: parse error at line 1, col 24: unknown identifier: traefik" -tempo | level=info ts=2026-02-28T03:57:35.449658121Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/search?end=1772251072&limit=20&q=%7Bresource.service.name%3Dtraefik%7D&start=1772247472" duration=2.110898ms response_size=0 status=400 -tempo | level=info ts=2026-02-28T03:57:35.452827149Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:57:35.453724735Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250155&end=1772251055&q=%7B%7D (500) 79.12µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.454072382Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250155&end=1772251055&q=%7B%7D (500) 73.098µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.454754481Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001925969 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.454809205Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251055&limit=5000&q=%7B%7D&start=1772250155&tag=resource.service.name" duration=1.993728ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:57:35.454834763Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 2.066896ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.464569659Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:57:35.464647065Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:57:35.465734159Z caller=tag_handlers.go:518 msg="search tag request" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:57:35.466270002Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250155&end=1772251055&scope=&q= (500) 51.658µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.466468006Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q= (500) 65.935µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.466467926Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q= (500) 68.098µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.466578975Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250155&end=1772251055&scope=&q= (500) 23.484µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.466683073Z caller=tag_handlers.go:527 msg="search tag response" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 duration_seconds=0.000949535 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.466703331Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tags?end=1772251055&limit=5000&start=1772250155" duration=1.013645ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:57:35.4667241Z caller=server.go:2286 msg="GET /api/v2/search/tags?limit=5000 (500) 1.062919ms Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.466757072Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q= (500) 46.428µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.467000492Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:57:35.467747053Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 duration_seconds=0.003097213 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.467810633Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251055&limit=5000&start=1772250155&tag=name" duration=3.183225ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:57:35.467847663Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&tag=name (500) 3.248088ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.46786673Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q= (500) 42.22µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.468069162Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query= range_seconds=0 duration_seconds=0.003499453 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.468109167Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251055&limit=5000&start=1772250155&tag=name" duration=3.552883ms response_size=0 status=500 -tempo | level=info ts=2026-02-28T03:57:35.468133974Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 duration_seconds=0.001130987 inspected_bytes=0 request_throughput=0 error=null -tempo | level=warn ts=2026-02-28T03:57:35.468138273Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&tag=name (500) 3.643706ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.468153011Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251055&limit=5000&start=1772250155&tag=status" duration=1.158009ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:57:35.48429799Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T03:57:35.484956764Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q=%7Bresource.service.name%3Dtraefik%7D (500) 104.417µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.485242635Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q=%7Bresource.service.name%3Dtraefik%7D (500) 50.867µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.485397968Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001097994 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.485429208Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251055&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250155&tag=name" duration=1.142479ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:57:35.485458763Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.215597ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.4890928Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:57:35.489884336Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.00078816 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.489910275Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251055&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250155&tag=status" duration=825.11µs response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:57:35.533791838Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 -tempo | level=info ts=2026-02-28T03:57:35.534540833Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query= range_seconds=0 duration_seconds=0.000745989 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.534565951Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251055&limit=5000&start=1772250155&tag=status" duration=783.882µs response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:57:35.563874004Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:57:35.564416319Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250155&end=1772251055&q=%7B%7D (500) 78.509µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:35.564750501Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250155&end=1772251055&q=%7B%7D (500) 53.641µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.564892479Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001016812 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.564919931Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251055&limit=5000&q=%7B%7D&start=1772250155&tag=resource.service.name" duration=1.055645ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:57:35.564948625Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.131119ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.573722094Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:57:35.573743404Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T03:57:35.574654356Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q=%7Bresource.service.name%3Dtraefik%7D (500) 72.246µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.574864683Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001118294 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.574890291Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251055&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250155&tag=status" duration=1.149151ms response_size=130 status=200 -tempo | level=warn ts=2026-02-28T03:57:35.575274137Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250155&end=1772251055&q=%7Bresource.service.name%3Dtraefik%7D (500) 91.864µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:57:35.575494063Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.00177241 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:57:35.575515052Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251055&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250155&tag=name" duration=1.803948ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:57:35.575546121Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.873881ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:57:36.820760121Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000451663s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:57:36.821000996Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=58.35515471s -tempo | level=info ts=2026-02-28T03:58:32.220909942Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:32.222185944Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250212&end=1772251112&q=%7B%7D (500) 113.223µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:32.222648478Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250212&end=1772251112&q=%7B%7D (500) 83.147µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:32.222821986Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001911723 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:32.22293528Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251112&limit=5000&q=%7B%7D&start=1772250212&tag=resource.service.name" duration=2.02115ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:32.223024188Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 2.182405ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:32.22766645Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:32.229001193Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250212&end=1772251112&q=%7Bresource.service.name%3Dtraefik%7D (500) 95.671µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:32.22933287Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250212&end=1772251112&q=%7Bresource.service.name%3Dtraefik%7D (500) 68.77µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:32.229489626Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001819599 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:32.229537877Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251112&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250212&tag=name" duration=1.893367ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:32.22980944Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 2.228621ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:32.230137901Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:32.230151897Z caller=tag_handlers.go:518 msg="search tag request" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:32.231243921Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250212&end=1772251112&scope=&q= (500) 42.661µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:32.231768121Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250212&end=1772251112&scope=&q= (500) 34.455µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:32.231879883Z caller=tag_handlers.go:527 msg="search tag response" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 duration_seconds=0.001727085 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:32.231927694Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tags?end=1772251112&limit=5000&start=1772250212" duration=1.798167ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:32.231954043Z caller=server.go:2286 msg="GET /api/v2/search/tags?limit=5000 (500) 1.85241ms Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:32.232134333Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001961206 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:32.232167276Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251112&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250212&tag=status" duration=2.034485ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:58:32.285507543Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:32.286381996Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 duration_seconds=0.000871818 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:32.286407925Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251112&limit=5000&q=%7B%7D&start=1772250212&tag=status" duration=916.472µs response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:58:32.294280212Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:32.29475576Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250212&end=1772251112&q=%7B%7D (500) 84.451µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:32.295220318Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250212&end=1772251112&q=%7B%7D (500) 54.984µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:32.295346977Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 duration_seconds=0.001065514 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:32.295370862Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251112&limit=5000&q=%7B%7D&start=1772250212&tag=name" duration=1.109325ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:32.295423582Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7B%7D&tag=name (500) 1.210067ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:45.987186027Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:45.987781302Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250225&end=1772251125&q=%7B%7D (500) 89.659µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:45.988143777Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250225&end=1772251125&q=%7B%7D (500) 45.104µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:45.988296276Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001109726 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:45.988326693Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251125&limit=5000&q=%7B%7D&start=1772250225&tag=resource.service.name" duration=1.153651ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:45.988367049Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.244051ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:45.993858696Z caller=tag_handlers.go:518 msg="search tag request" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:45.994205922Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250225&end=1772251125&scope=&q= (500) 48.631µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:45.994567956Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250225&end=1772251125&scope=&q= (500) 25.388µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:45.994712711Z caller=tag_handlers.go:527 msg="search tag response" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 duration_seconds=0.00085203 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:45.994736776Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tags?end=1772251125&limit=5000&start=1772250225" duration=901.995µs response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:45.994761041Z caller=server.go:2286 msg="GET /api/v2/search/tags?limit=5000 (500) 974.271µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:45.998993379Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:45.999499025Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250225&end=1772251125&q=%7B%7D (500) 96.371µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:45.999960998Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250225&end=1772251125&q=%7B%7D (500) 58.551µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:46.000109869Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query={} range_seconds=0 duration_seconds=0.001115388 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:46.000191904Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251125&limit=5000&q=%7B%7D&start=1772250225&tag=name" duration=1.204145ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:46.000245305Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7B%7D&tag=name (500) 1.295628ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:46.005858884Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:46.006440202Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 duration_seconds=0.000578262 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:46.00646579Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251126&limit=5000&q=%7B%7D&start=1772250226&tag=status" duration=617.327µs response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:58:46.038874293Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:46.039289979Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250226&end=1772251126&q=%7Bresource.service.name%3Dtraefik%7D (500) 80.222µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:46.039656171Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250226&end=1772251126&q=%7Bresource.service.name%3Dtraefik%7D (500) 69.872µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:46.039798289Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.00092052 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:46.039821953Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251126&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250226&tag=name" duration=957.809µs response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:46.039844978Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.035867ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:46.049178986Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:46.050280237Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001097534 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:46.050326674Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251126&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250226&tag=status" duration=1.151936ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T03:58:48.785841897Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:48.786673308Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250228&end=1772251128&q=%7B%7D (500) 100.36µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:48.786993352Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250228&end=1772251128&q=%7B%7D (500) 56.375µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.787118058Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.00127548 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:48.787142945Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251128&limit=5000&q=%7B%7D&start=1772250228&tag=resource.service.name" duration=1.314524ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:48.787165358Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.390929ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.794066079Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:48.794090214Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:48.795203578Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001109156 inspected_bytes=0 request_throughput=0 error=null -tempo | level=warn ts=2026-02-28T03:58:48.795226541Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250228&end=1772251128&q=%7Bresource.service.name%3Dtraefik%7D (500) 62.438µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.795230719Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251128&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250228&tag=status" duration=1.145034ms response_size=130 status=200 -tempo | level=warn ts=2026-02-28T03:58:48.795561594Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250228&end=1772251128&q=%7Bresource.service.name%3Dtraefik%7D (500) 70.834µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.795744581Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001676498 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:48.795765059Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251128&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250228&tag=name" duration=1.710554ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:48.79579207Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.790703ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=error ts=2026-02-28T03:58:48.83299873Z caller=search_handlers.go:115 msg="search: could not create combiner" err="invalid TraceQL query: parse error at line 1, col 24: unknown identifier: traefik" -tempo | level=info ts=2026-02-28T03:58:48.83304106Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/search?end=1772251146&limit=20&q=%7Bresource.service.name%3Dtraefik%7D&start=1772247546" duration=90.15µs response_size=0 status=400 -tempo | level=info ts=2026-02-28T03:58:48.874206161Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:48.87493086Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250228&end=1772251128&q=%7B%7D (500) 80.572µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:48.875247888Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250228&end=1772251128&q=%7B%7D (500) 64.743µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.875412961Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001204506 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:48.875441434Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251128&limit=5000&q=%7B%7D&start=1772250228&tag=resource.service.name" duration=1.249171ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:48.875475068Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.333641ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.883983787Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:48.883976754Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:48.88471521Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250228&end=1772251128&q=%7Bresource.service.name%3Dtraefik%7D (500) 98.757µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.8851653Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001185801 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:48.885194765Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251128&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250228&tag=status" duration=1.232518ms response_size=130 status=200 -tempo | level=warn ts=2026-02-28T03:58:48.88522882Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250228&end=1772251128&q=%7Bresource.service.name%3Dtraefik%7D (500) 64.813µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:48.885360759Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.00137542 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:48.885386357Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251128&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250228&tag=name" duration=1.404595ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:48.885410463Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.467232ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:49.014415446Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:49.015154923Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250229&end=1772251129&q=%7B%7D (500) 70.854µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:49.015511007Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250229&end=1772251129&q=%7B%7D (500) 65.524µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:49.015653155Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query={} range_seconds=0 duration_seconds=0.001236126 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:49.015676499Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251129&limit=5000&q=%7B%7D&start=1772250229&tag=resource.service.name" duration=1.27538ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:49.015698921Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7B%7D&tag=resource.service.name (500) 1.347867ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:49.024025686Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T03:58:49.024063037Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T03:58:49.024960494Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250229&end=1772251129&q=%7Bresource.service.name%3Dtraefik%7D (500) 119.997µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:49.025149951Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001083918 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:49.02517548Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251129&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250229&tag=status" duration=1.115689ms response_size=130 status=200 -tempo | level=warn ts=2026-02-28T03:58:49.02544081Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250229&end=1772251129&q=%7Bresource.service.name%3Dtraefik%7D (500) 98.416µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T03:58:49.025664895Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001639639 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T03:58:49.025713907Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251129&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250229&tag=name" duration=1.700363ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T03:58:49.025744665Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.778792ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T03:58:49.467994461Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000736018s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T03:58:49.468248942Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=51.485834687s -tempo | level=info ts=2026-02-28T03:59:14.505516299Z caller=poller.go:249 msg="blocklist poll complete" seconds=9.005e-05 -tempo | level=info ts=2026-02-28T03:59:14.505593114Z caller=compaction.go:142 msg="received empty tenant" -tempo | level=warn ts=2026-02-28T04:00:00.62141836Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000885343s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:00:00.62175716Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.674604584s -tempo | level=warn ts=2026-02-28T04:01:09.533862097Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.00112131s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:01:09.534125144Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=59.264069146s -tempo | level=info ts=2026-02-28T04:01:29.941563869Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=info ts=2026-02-28T04:01:29.941563849Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query="{status=ok}" range_seconds=0 -tempo | level=warn ts=2026-02-28T04:01:29.943318265Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250389&end=1772251289&q=%7Bstatus%3Dok%7D (500) 110.207µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:29.943868216Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250389&end=1772251289&q=%7Bstatus%3Dok%7D (500) 61.116µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:29.944076008Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query="{status=ok}" range_seconds=0 duration_seconds=0.002508052 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:29.944123869Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251289&limit=5000&q=%7Bstatus%3Dok%7D&start=1772250389&tag=resource.service.name" duration=2.576181ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T04:01:29.944211835Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7Bstatus%3Dok%7D&tag=resource.service.name (500) 2.752084ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:29.944825355Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.003260233 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:29.944849992Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251289&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250389&tag=status" duration=3.301083ms response_size=130 status=200 -tempo | level=info ts=2026-02-28T04:01:29.94544159Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik && status=ok}" range_seconds=0 -tempo | level=info ts=2026-02-28T04:01:29.94544145Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 -tempo | level=warn ts=2026-02-28T04:01:29.946054078Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250389&end=1772251289&q=%7Bresource.service.name%3Dtraefik+%26%26+status%3Dok%7D (500) 79.67µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:29.946098603Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250389&end=1772251289&q=%7Bresource.service.name%3Dtraefik%7D (500) 49.093µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:29.946857016Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250389&end=1772251289&q=%7Bresource.service.name%3Dtraefik%7D (500) 70.944µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:29.946905057Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250389&end=1772251289&q=%7Bresource.service.name%3Dtraefik+%26%26+status%3Dok%7D (500) 61.215µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:29.947220684Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik && status=ok}" range_seconds=0 duration_seconds=0.001777269 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:29.947235412Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik}" range_seconds=0 duration_seconds=0.001791837 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:29.947247615Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251289&limit=5000&q=%7Bresource.service.name%3Dtraefik+%26%26+status%3Dok%7D&start=1772250389&tag=name" duration=1.812708ms response_size=0 status=500 -tempo | level=info ts=2026-02-28T04:01:29.947258776Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251289&limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&start=1772250389&tag=name" duration=1.826764ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T04:01:29.947270758Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%20%26%26%20status%3Dok%7D&tag=name (500) 1.87809ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:29.947276138Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%7D&tag=name (500) 1.88339ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:29.960342984Z caller=tag_handlers.go:518 msg="search tag request" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 -tempo | level=warn ts=2026-02-28T04:01:29.960838761Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250389&end=1772251289&scope=&q= (500) 39.715µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:29.961101268Z caller=server.go:2286 msg="GET /querier/api/v2/search/tags?start=1772250389&end=1772251289&scope=&q= (500) 32.621µs Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:29.961265038Z caller=tag_handlers.go:527 msg="search tag response" tenant=single-tenant handler=SearchTagsV2 scope= range_seconds=0 duration_seconds=0.000922725 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:29.96129317Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tags?end=1772251289&limit=5000&start=1772250389" duration=973.351µs response_size=0 status=500 -tempo | level=warn ts=2026-02-28T04:01:29.961326062Z caller=server.go:2286 msg="GET /api/v2/search/tags?limit=5000 (500) 1.049643ms Response: \"error querying live-stores in Querier.SearchTags: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:33.604410488Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query="{status=ok}" range_seconds=0 -tempo | level=warn ts=2026-02-28T04:01:33.604981117Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250393&end=1772251293&q=%7Bstatus%3Dok%7D (500) 84.439µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:33.605337871Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/resource.service.name/values?start=1772250393&end=1772251293&q=%7Bstatus%3Dok%7D (500) 52.799µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:33.605460594Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=resource.service.name query="{status=ok}" range_seconds=0 duration_seconds=0.001049545 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:33.605484029Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/resource.service.name/values?end=1772251293&limit=5000&q=%7Bstatus%3Dok%7D&start=1772250393&tag=resource.service.name" duration=1.086664ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T04:01:33.605510328Z caller=server.go:2286 msg="GET /api/v2/search/tag/resource.service.name/values?limit=5000&q=%7Bstatus%3Dok%7D&tag=resource.service.name (500) 1.170984ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:33.613938413Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik && status=ok}" range_seconds=0 -tempo | level=info ts=2026-02-28T04:01:33.614308312Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 -tempo | level=warn ts=2026-02-28T04:01:33.615192815Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250393&end=1772251293&q=%7Bresource.service.name%3Dtraefik+%26%26+status%3Dok%7D (500) 106.932µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:33.615309065Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=status query={} range_seconds=0 duration_seconds=0.000996795 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:33.615334522Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/status/values?end=1772251293&limit=5000&q=%7B%7D&start=1772250393&tag=status" duration=1.027463ms response_size=130 status=200 -tempo | level=warn ts=2026-02-28T04:01:33.615558405Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250393&end=1772251293&q=%7Bresource.service.name%3Dtraefik+%26%26+status%3Dok%7D (500) 66.005µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:33.615953593Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{resource.service.name=traefik && status=ok}" range_seconds=0 duration_seconds=0.002014959 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:33.615976316Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251293&limit=5000&q=%7Bresource.service.name%3Dtraefik+%26%26+status%3Dok%7D&start=1772250393&tag=name" duration=2.050226ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T04:01:33.615996604Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bresource.service.name%3Dtraefik%20%26%26%20status%3Dok%7D&tag=name (500) 2.11554ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:33.684220173Z caller=tag_handlers.go:540 msg="search tag values request" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{status=ok}" range_seconds=0 -tempo | level=warn ts=2026-02-28T04:01:33.684911631Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250393&end=1772251293&q=%7Bstatus%3Dok%7D (500) 74.18µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:01:33.685479776Z caller=server.go:2286 msg="GET /querier/api/v2/search/tag/name/values?start=1772250393&end=1772251293&q=%7Bstatus%3Dok%7D (500) 116.079µs Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=info ts=2026-02-28T04:01:33.685639858Z caller=tag_handlers.go:550 msg="search tag values response" tenant=single-tenant handler=SearchTagValuesV2 tag=name query="{status=ok}" range_seconds=0 duration_seconds=0.001419274 inspected_bytes=0 request_throughput=0 error=null -tempo | level=info ts=2026-02-28T04:01:33.685697567Z caller=handler.go:135 msg="query stats" tenant=single-tenant method=GET traceID= url="/api/v2/search/tag/name/values?end=1772251293&limit=5000&q=%7Bstatus%3Dok%7D&start=1772250393&tag=name" duration=1.488815ms response_size=0 status=500 -tempo | level=warn ts=2026-02-28T04:01:33.685734456Z caller=server.go:2286 msg="GET /api/v2/search/tag/name/values?limit=5000&q=%7Bstatus%3Dok%7D&tag=name (500) 1.576119ms Response: \"error querying live-stores in Querier.SearchTagValues: error finding partition ring replicas: empty ring\\n\"" -tempo | level=warn ts=2026-02-28T04:02:21.401664876Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000979208s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:02:21.401988659Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=58.963135457s -tempo | level=info ts=2026-02-28T04:02:54.506996729Z caller=reporter.go:272 msg="reporting cluster stats" date=2026-02-28T04:02:54.506995536Z -tempo | level=warn ts=2026-02-28T04:03:30.924861907Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000152254s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:03:30.925110638Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=52.941417365s -tempo | level=info ts=2026-02-28T04:04:14.505701243Z caller=poller.go:249 msg="blocklist poll complete" seconds=6.7217e-05 -tempo | level=info ts=2026-02-28T04:04:14.505766966Z caller=compaction.go:142 msg="received empty tenant" -tempo | level=warn ts=2026-02-28T04:04:38.96769366Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000596524s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:04:38.967991853Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.427260392s -tempo | level=warn ts=2026-02-28T04:05:54.649236109Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000145477s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:05:54.649500619Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=59.111777322s -tempo | level=warn ts=2026-02-28T04:07:09.031108125Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.000783057s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:07:09.031392622Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=53.643106953s -tempo | level=warn ts=2026-02-28T04:08:16.800283365Z caller=server.go:1230 method=/tempopb.BackendScheduler/Next duration=15.00088407s msg=gRPC err="rpc error: code = NotFound desc = no jobs found" -tempo | level=error ts=2026-02-28T04:08:16.800508742Z caller=backendworker.go:454 msg="error calling scheduler" err="rpc error: code = NotFound desc = no jobs found" backoff=55.946244881s -tempo | level=info ts=2026-02-28T04:08:55.544817027Z caller=app.go:242 msg="=== received SIGINT/SIGTERM ===\n*** exiting" -tempo | level=info ts=2026-02-28T04:08:55.545170515Z caller=module_service.go:120 msg="module stopped" module=metrics-generator -tempo | level=info ts=2026-02-28T04:08:55.545143745Z caller=backendscheduler.go:136 msg="stopping provider" provider=0 -tempo | level=info ts=2026-02-28T04:08:55.545422351Z caller=module_service.go:120 msg="module stopped" module=live-store -tempo | level=info ts=2026-02-28T04:08:55.545509286Z caller=module_service.go:120 msg="module stopped" module=optional-store -tempo | level=info ts=2026-02-28T04:08:55.54555359Z caller=module_service.go:120 msg="module stopped" module=block-builder -tempo | level=warn ts=2026-02-28T04:08:55.545588966Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.03861475s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T04:08:55.545861381Z caller=compaction.go:142 msg="received empty tenant" -tempo | level=info ts=2026-02-28T04:08:55.545877252Z caller=compaction.go:131 msg="compaction provider stopping" -tempo | level=info ts=2026-02-28T04:08:55.545888232Z caller=compaction.go:202 msg="compaction provider measure ticker stopping" -tempo | level=warn ts=2026-02-28T04:08:55.546132804Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039274788s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T04:08:55.546235459Z caller=module_service.go:120 msg="module stopped" module=query-frontend -tempo | level=info ts=2026-02-28T04:08:55.546254915Z caller=module_service.go:120 msg="module stopped" module=overrides-api -tempo | level=info ts=2026-02-28T04:08:55.546299981Z caller=backendscheduler.go:136 msg="stopping provider" provider=1 -tempo | level=info ts=2026-02-28T04:08:55.546316602Z caller=backendscheduler.go:154 msg="all providers stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546425368Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039448657s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546452799Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039388243s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546466765Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039674203s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546477736Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.03989506s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546492986Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039421806s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546505519Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039507939s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T04:08:55.546601099Z caller=module_service.go:120 msg="module stopped" module=distributor -tempo | level=info ts=2026-02-28T04:08:55.546634613Z caller=frontend.go:339 msg="received shutdown notification from querier" querier=4777f4a6f30e -tempo | level=warn ts=2026-02-28T04:08:55.546518493Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039596125s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.54669618Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039697237s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546723351Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039625551s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546745622Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039909457s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546760261Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039945426s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546772995Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039820781s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546783324Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039696415s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546810495Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039784952s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T04:08:55.546674528Z caller=retention.go:50 msg="retention provider stopping" -tempo | level=warn ts=2026-02-28T04:08:55.546819051Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039939374s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546827608Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.040065051s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546845331Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.03982558s msg=gRPC err="queue is stopped" -tempo | level=warn ts=2026-02-28T04:08:55.546880507Z caller=server.go:1560 method=/frontend.Frontend/Process duration=29m41.039980712s msg=gRPC err="queue is stopped" -tempo | level=info ts=2026-02-28T04:08:55.547572095Z caller=module_service.go:120 msg="module stopped" module=querier -tempo | level=info ts=2026-02-28T04:08:55.561796142Z caller=module_service.go:120 msg="module stopped" module=partition-ring -tempo | level=info ts=2026-02-28T04:08:55.561812693Z caller=module_service.go:120 msg="module stopped" module=metrics-generator-ring -tempo | level=info ts=2026-02-28T04:08:55.662029127Z caller=module_service.go:120 msg="module stopped" module=live-store-ring -tempo | level=info ts=2026-02-28T04:08:55.979001962Z caller=backendscheduler.go:201 msg="backend scheduler stopping" -tempo | level=info ts=2026-02-28T04:08:55.979054602Z caller=module_service.go:120 msg="module stopped" module=backend-scheduler -tempo | failed parsing config: failed to parse configFile /etc/tempo/config.yaml: yaml: unmarshal errors: -tempo | line 36: field enabled not found in type frontend.SearchConfig -tempo | failed parsing config: failed to parse configFile /etc/tempo/config.yaml: yaml: unmarshal errors: -tempo | line 36: field enabled not found in type frontend.SearchConfig -tempo | line 37: field search_enabled not found in type app.Config -tempo | failed parsing config: failed to parse configFile /etc/tempo/config.yaml: yaml: unmarshal errors: -tempo | line 27: field compactor not found in type app.Config -tempo | line 36: field enabled not found in type frontend.SearchConfig -tempo | failed parsing config: failed to parse configFile /etc/tempo/config.yaml: yaml: unmarshal errors: -tempo | line 27: field compactor not found in type app.Config -tempo | line 36: field enabled not found in type frontend.SearchConfig diff --git a/monitoring/influxdb/docker-compose.yml b/monitoring/influxdb/docker-compose.yml index 763c4ad..85767f1 100644 --- a/monitoring/influxdb/docker-compose.yml +++ b/monitoring/influxdb/docker-compose.yml @@ -7,7 +7,8 @@ services: # env_file: # - ${PROJECT_ROOT}/secrets/stack-secrets.env volumes: - - ${PROJECT_ROOT}/monitoring/influxdb:/var/lib/influxdb2 +# - ${PROJECT_ROOT}/monitoring/influxdb:/var/lib/influxdb2 + - ${DOCKER_DATABASES}/influxdb-data:/var/lib/influxdb2 environment: DOCKER_INFLUXDB_INIT_MODE: ${INFLUXDB_INIT_MODE} DOCKER_INFLUXDB_INIT_USERNAME: ${INFLUXDB_INIT_USERNAME} @@ -43,3 +44,7 @@ services: secrets: influxdb_init_password: file: ${PROJECT_ROOT}/secrets/influxdb_init_password.txt + +#volumes: +# influxdb-data: +# external: true diff --git a/monitoring/node-red/data/.config.nodes.json b/monitoring/node-red/data/.config.nodes.json deleted file mode 100644 index b9d4a23..0000000 --- a/monitoring/node-red/data/.config.nodes.json +++ /dev/null @@ -1,430 +0,0 @@ -{ - "node-red": { - "name": "node-red", - "version": "5.0.0", - "local": false, - "user": false, - "nodes": { - "junction": { - "name": "junction", - "types": [ - "junction" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/05-junction.js" - }, - "inject": { - "name": "inject", - "types": [ - "inject" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/20-inject.js" - }, - "debug": { - "name": "debug", - "types": [ - "debug" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/21-debug.js" - }, - "complete": { - "name": "complete", - "types": [ - "complete" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/24-complete.js" - }, - "catch": { - "name": "catch", - "types": [ - "catch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/25-catch.js" - }, - "status": { - "name": "status", - "types": [ - "status" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/25-status.js" - }, - "link": { - "name": "link", - "types": [ - "link in", - "link out", - "link call" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/60-link.js" - }, - "comment": { - "name": "comment", - "types": [ - "comment" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/90-comment.js" - }, - "global-config": { - "name": "global-config", - "types": [ - "global-config" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/91-global-config.js" - }, - "unknown": { - "name": "unknown", - "types": [ - "unknown" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/98-unknown.js" - }, - "function": { - "name": "function", - "types": [ - "function" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/10-function.js" - }, - "switch": { - "name": "switch", - "types": [ - "switch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/10-switch.js" - }, - "change": { - "name": "change", - "types": [ - "change" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/15-change.js" - }, - "range": { - "name": "range", - "types": [ - "range" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/16-range.js" - }, - "template": { - "name": "template", - "types": [ - "template" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/80-template.js" - }, - "delay": { - "name": "delay", - "types": [ - "delay" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/89-delay.js" - }, - "trigger": { - "name": "trigger", - "types": [ - "trigger" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/89-trigger.js" - }, - "exec": { - "name": "exec", - "types": [ - "exec" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/90-exec.js" - }, - "rbe": { - "name": "rbe", - "types": [ - "rbe" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/rbe.js" - }, - "tls": { - "name": "tls", - "types": [ - "tls-config" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/05-tls.js" - }, - "httpproxy": { - "name": "httpproxy", - "types": [ - "http proxy" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/06-httpproxy.js" - }, - "mqtt": { - "name": "mqtt", - "types": [ - "mqtt in", - "mqtt out", - "mqtt-broker" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/10-mqtt.js" - }, - "httpin": { - "name": "httpin", - "types": [ - "http in", - "http response" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/21-httpin.js" - }, - "httprequest": { - "name": "httprequest", - "types": [ - "http request" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/21-httprequest.js" - }, - "websocket": { - "name": "websocket", - "types": [ - "websocket in", - "websocket out", - "websocket-listener", - "websocket-client" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/22-websocket.js" - }, - "tcpin": { - "name": "tcpin", - "types": [ - "tcp in", - "tcp out", - "tcp request" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/31-tcpin.js" - }, - "udp": { - "name": "udp", - "types": [ - "udp in", - "udp out" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/32-udp.js" - }, - "CSV": { - "name": "CSV", - "types": [ - "csv" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-CSV.js" - }, - "HTML": { - "name": "HTML", - "types": [ - "html" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-HTML.js" - }, - "JSON": { - "name": "JSON", - "types": [ - "json" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-JSON.js" - }, - "XML": { - "name": "XML", - "types": [ - "xml" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-XML.js" - }, - "YAML": { - "name": "YAML", - "types": [ - "yaml" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-YAML.js" - }, - "split": { - "name": "split", - "types": [ - "split", - "join" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/sequence/17-split.js" - }, - "sort": { - "name": "sort", - "types": [ - "sort" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/sequence/18-sort.js" - }, - "batch": { - "name": "batch", - "types": [ - "batch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/sequence/19-batch.js" - }, - "file": { - "name": "file", - "types": [ - "file", - "file in" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/storage/10-file.js" - }, - "watch": { - "name": "watch", - "types": [ - "watch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/storage/23-watch.js" - } - } - } -} \ No newline at end of file diff --git a/monitoring/node-red/data/.config.nodes.json.backup b/monitoring/node-red/data/.config.nodes.json.backup deleted file mode 100644 index 1cd282e..0000000 --- a/monitoring/node-red/data/.config.nodes.json.backup +++ /dev/null @@ -1,430 +0,0 @@ -{ - "node-red": { - "name": "node-red", - "version": "4.1.11", - "local": false, - "user": false, - "nodes": { - "junction": { - "name": "junction", - "types": [ - "junction" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/05-junction.js" - }, - "inject": { - "name": "inject", - "types": [ - "inject" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/20-inject.js" - }, - "debug": { - "name": "debug", - "types": [ - "debug" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/21-debug.js" - }, - "complete": { - "name": "complete", - "types": [ - "complete" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/24-complete.js" - }, - "catch": { - "name": "catch", - "types": [ - "catch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/25-catch.js" - }, - "status": { - "name": "status", - "types": [ - "status" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/25-status.js" - }, - "link": { - "name": "link", - "types": [ - "link in", - "link out", - "link call" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/60-link.js" - }, - "comment": { - "name": "comment", - "types": [ - "comment" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/90-comment.js" - }, - "global-config": { - "name": "global-config", - "types": [ - "global-config" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/91-global-config.js" - }, - "unknown": { - "name": "unknown", - "types": [ - "unknown" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/common/98-unknown.js" - }, - "function": { - "name": "function", - "types": [ - "function" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/10-function.js" - }, - "switch": { - "name": "switch", - "types": [ - "switch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/10-switch.js" - }, - "change": { - "name": "change", - "types": [ - "change" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/15-change.js" - }, - "range": { - "name": "range", - "types": [ - "range" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/16-range.js" - }, - "template": { - "name": "template", - "types": [ - "template" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/80-template.js" - }, - "delay": { - "name": "delay", - "types": [ - "delay" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/89-delay.js" - }, - "trigger": { - "name": "trigger", - "types": [ - "trigger" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/89-trigger.js" - }, - "exec": { - "name": "exec", - "types": [ - "exec" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/90-exec.js" - }, - "rbe": { - "name": "rbe", - "types": [ - "rbe" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/function/rbe.js" - }, - "tls": { - "name": "tls", - "types": [ - "tls-config" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/05-tls.js" - }, - "httpproxy": { - "name": "httpproxy", - "types": [ - "http proxy" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/06-httpproxy.js" - }, - "mqtt": { - "name": "mqtt", - "types": [ - "mqtt in", - "mqtt out", - "mqtt-broker" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/10-mqtt.js" - }, - "httpin": { - "name": "httpin", - "types": [ - "http in", - "http response" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/21-httpin.js" - }, - "httprequest": { - "name": "httprequest", - "types": [ - "http request" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/21-httprequest.js" - }, - "websocket": { - "name": "websocket", - "types": [ - "websocket in", - "websocket out", - "websocket-listener", - "websocket-client" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/22-websocket.js" - }, - "tcpin": { - "name": "tcpin", - "types": [ - "tcp in", - "tcp out", - "tcp request" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/31-tcpin.js" - }, - "udp": { - "name": "udp", - "types": [ - "udp in", - "udp out" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/network/32-udp.js" - }, - "CSV": { - "name": "CSV", - "types": [ - "csv" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-CSV.js" - }, - "HTML": { - "name": "HTML", - "types": [ - "html" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-HTML.js" - }, - "JSON": { - "name": "JSON", - "types": [ - "json" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-JSON.js" - }, - "XML": { - "name": "XML", - "types": [ - "xml" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-XML.js" - }, - "YAML": { - "name": "YAML", - "types": [ - "yaml" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/parsers/70-YAML.js" - }, - "split": { - "name": "split", - "types": [ - "split", - "join" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/sequence/17-split.js" - }, - "sort": { - "name": "sort", - "types": [ - "sort" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/sequence/18-sort.js" - }, - "batch": { - "name": "batch", - "types": [ - "batch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/sequence/19-batch.js" - }, - "file": { - "name": "file", - "types": [ - "file", - "file in" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/storage/10-file.js" - }, - "watch": { - "name": "watch", - "types": [ - "watch" - ], - "enabled": true, - "local": false, - "user": false, - "module": "node-red", - "file": "/usr/src/node-red/node_modules/@node-red/nodes/core/storage/23-watch.js" - } - } - } -} \ No newline at end of file diff --git a/monitoring/node-red/data/.config.runtime.json b/monitoring/node-red/data/.config.runtime.json deleted file mode 100644 index e82525d..0000000 --- a/monitoring/node-red/data/.config.runtime.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "instanceId": "22480a0b20f99f0c", - "_credentialSecret": "c128ee08a3b994abec9602b578cc23c8a395fd1259896c0c21609b46861a093e", - "telemetryEnabled": true -} \ No newline at end of file diff --git a/monitoring/node-red/data/.config.runtime.json.backup b/monitoring/node-red/data/.config.runtime.json.backup deleted file mode 100644 index f4eb194..0000000 --- a/monitoring/node-red/data/.config.runtime.json.backup +++ /dev/null @@ -1,4 +0,0 @@ -{ - "instanceId": "22480a0b20f99f0c", - "_credentialSecret": "c128ee08a3b994abec9602b578cc23c8a395fd1259896c0c21609b46861a093e" -} \ No newline at end of file diff --git a/monitoring/node-red/data/.config.users.json b/monitoring/node-red/data/.config.users.json deleted file mode 100644 index 50b2a14..0000000 --- a/monitoring/node-red/data/.config.users.json +++ /dev/null @@ -1,29 +0,0 @@ -{ - "_": { - "editor": { - "view": { - "view-store-zoom": false, - "view-store-position": false, - "view-show-grid": true, - "view-snap-grid": true, - "view-grid-size": 20, - "view-node-status": true, - "view-node-info-icon": true, - "view-node-show-label": true, - "view-show-tips": true, - "view-show-welcome-tours": true - }, - "tours": { - "welcome": "4.1.8" - }, - "dialog": { - "export": { - "pretty": true, - "json-view": true - } - } - }, - "menu-menu-item-sidebar": true, - "menu-menu-item-palette": true - } -} \ No newline at end of file diff --git a/monitoring/node-red/data/.config.users.json.backup b/monitoring/node-red/data/.config.users.json.backup deleted file mode 100644 index 5237b67..0000000 --- a/monitoring/node-red/data/.config.users.json.backup +++ /dev/null @@ -1,29 +0,0 @@ -{ - "_": { - "editor": { - "view": { - "view-store-zoom": false, - "view-store-position": false, - "view-show-grid": true, - "view-snap-grid": true, - "view-grid-size": 20, - "view-node-status": true, - "view-node-info-icon": true, - "view-node-show-label": true, - "view-show-tips": true, - "view-show-welcome-tours": true - }, - "tours": { - "welcome": "4.1.8" - }, - "dialog": { - "export": { - "pretty": true, - "json-view": true - } - } - }, - "menu-menu-item-sidebar": false, - "menu-menu-item-palette": true - } -} \ No newline at end of file diff --git a/monitoring/node-red/data/.flows.json.backup b/monitoring/node-red/data/.flows.json.backup deleted file mode 100644 index 47815ad..0000000 --- a/monitoring/node-red/data/.flows.json.backup +++ /dev/null @@ -1,1303 +0,0 @@ -[ - { - "id": "00b02bbd01c91485", - "type": "tab", - "label": "Grafana Docker Safe Update", - "disabled": false, - "info": "" - }, - { - "id": "f16653fb4cb05bbe", - "type": "tab", - "label": "Health Check", - "disabled": false, - "info": "", - "env": [] - }, - { - "id": "d0f45d2b6f117365", - "type": "tab", - "label": "uptime-kuma alerts", - "disabled": false, - "info": "", - "env": [] - }, - { - "id": "c5240b64a962ea54", - "type": "tab", - "label": "Gotify Messages", - "disabled": false, - "info": "", - "env": [] - }, - { - "id": "22f648a14d2e8fae", - "type": "inject", - "z": "00b02bbd01c91485", - "name": "Test Alert", - "props": [ - { - "p": "payload" - } - ], - "repeat": "", - "crontab": "", - "once": false, - "onceDelay": "", - "topic": "", - "payload": "{\"receiver\":\"node-red\",\"status\":\"firing\",\"alerts\":[{\"status\":\"firing\",\"labels\":{\"Active\":\"telegraf: 0 updates\",\"Restored\":\"telegraf: 0 updates\",\"alertname\":\"Updates\",\"com_docker_compose_project\":\"core\",\"compose_image\":\"telegraf:latest\",\"container\":\"telegraf\",\"grafana_folder\":\"Infrastructure\",\"job\":\"container-updates\",\"running_image\":\"telegraf:latest\"},\"annotations\":{},\"startsAt\":\"2026-03-31T01:16:10Z\",\"endsAt\":\"0001-01-01T00:00:00Z\",\"generatorURL\":\"https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\",\"fingerprint\":\"49b1e1dbf1255191\",\"silenceURL\":\"https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dtelegraf%3A+0+updates&matcher=Restored%3Dtelegraf%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dtelegraf%3Alatest&matcher=container%3Dtelegraf&matcher=job%3Dcontainer-updates&matcher=running_image%3Dtelegraf%3Alatest&orgId=1\",\"dashboardURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171\",\"panelURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171&viewPanel=6\",\"ruleUID\":\"bfgysfo3iregwf\",\"values\":{\"A\":1,\"D\":1},\"valueString\":\"[ var='A' labels={com_docker_compose_project=core, compose_image=telegraf:latest, container=telegraf, job=container-updates, running_image=telegraf:latest} type='query' value=1 ], [ var='D' labels={com_docker_compose_project=core, compose_image=telegraf:latest, container=telegraf, job=container-updates, running_image=telegraf:latest} type='threshold' value=1 ]\",\"orgId\":1},{\"status\":\"firing\",\"labels\":{\"Active\":\"update-test: 0 updates\",\"Restored\":\"update-test: 0 updates\",\"alertname\":\"Updates\",\"com_docker_compose_project\":\"core\",\"compose_image\":\"nginx:1.27.1\",\"container\":\"update-test\",\"grafana_folder\":\"Infrastructure\",\"job\":\"container-updates\",\"running_image\":\"nginx:1.27.0\"},\"annotations\":{},\"startsAt\":\"2026-03-31T01:15:10Z\",\"endsAt\":\"0001-01-01T00:00:00Z\",\"generatorURL\":\"https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\",\"fingerprint\":\"c56bd9f28943cfac\",\"silenceURL\":\"https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dupdate-test%3A+0+updates&matcher=Restored%3Dupdate-test%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dnginx%3A1.27.1&matcher=container%3Dupdate-test&matcher=job%3Dcontainer-updates&matcher=running_image%3Dnginx%3A1.27.0&orgId=1\",\"dashboardURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171\",\"panelURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171&viewPanel=6\",\"ruleUID\":\"bfgysfo3iregwf\",\"values\":{\"A\":1,\"D\":1},\"valueString\":\"[ var='A' labels={com_docker_compose_project=core, compose_image=nginx:1.27.1, container=update-test, job=container-updates, running_image=nginx:1.27.0} type='query' value=1 ], [ var='D' labels={com_docker_compose_project=core, compose_image=nginx:1.27.1, container=update-test, job=container-updates, running_image=nginx:1.27.0} type='threshold' value=1 ]\",\"orgId\":1}],\"groupLabels\":{\"alertname\":\"Updates\",\"grafana_folder\":\"Infrastructure\"},\"commonLabels\":{\"alertname\":\"Updates\",\"com_docker_compose_project\":\"core\",\"grafana_folder\":\"Infrastructure\",\"job\":\"container-updates\"},\"commonAnnotations\":{},\"externalURL\":\"https://grafana.lan.ddnsgeek.com/\",\"appVersion\":\"12.4.2\",\"version\":\"1\",\"groupKey\":\"{}/{__grafana_autogenerated__=\\\"true\\\"}/{__grafana_receiver__=\\\"node-red\\\"}/{__grafana_route_settings_hash__=\\\"f177b219cbbdd2e2\\\"}:{alertname=\\\"Updates\\\", grafana_folder=\\\"Infrastructure\\\"}\",\"truncatedAlerts\":0,\"orgId\":1,\"title\":\"[FIRING:2] Updates Infrastructure (core container-updates)\",\"state\":\"alerting\",\"message\":\"**Firing**\\n\\nValue: A=1, D=1\\nLabels:\\n - alertname = Updates\\n - Active = telegraf: 0 updates\\n - Restored = telegraf: 0 updates\\n - com_docker_compose_project = core\\n - compose_image = telegraf:latest\\n - container = telegraf\\n - grafana_folder = Infrastructure\\n - job = container-updates\\n - running_image = telegraf:latest\\nAnnotations:\\nSource: https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\\nSilence: https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dtelegraf%3A+0+updates&matcher=Restored%3Dtelegraf%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dtelegraf%3Alatest&matcher=container%3Dtelegraf&matcher=job%3Dcontainer-updates&matcher=running_image%3Dtelegraf%3Alatest&orgId=1\\nDashboard: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171\\nPanel: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171&viewPanel=6\\n\\nValue: A=1, D=1\\nLabels:\\n - alertname = Updates\\n - Active = update-test: 0 updates\\n - Restored = update-test: 0 updates\\n - com_docker_compose_project = core\\n - compose_image = nginx:1.27.1\\n - container = update-test\\n - grafana_folder = Infrastructure\\n - job = container-updates\\n - running_image = nginx:1.27.0\\nAnnotations:\\nSource: https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\\nSilence: https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dupdate-test%3A+0+updates&matcher=Restored%3Dupdate-test%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dnginx%3A1.27.1&matcher=container%3Dupdate-test&matcher=job%3Dcontainer-updates&matcher=running_image%3Dnginx%3A1.27.0&orgId=1\\nDashboard: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171\\nPanel: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171&viewPanel=6\\n\"}", - "payloadType": "json", - "x": 140, - "y": 100, - "wires": [ - [ - "671243b648c669fe" - ] - ] - }, - { - "id": "17eef927bdc12e54", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Create Pull Command", - "func": "const labels = msg.payload.alerts.labels || {};\nconst container = labels.container;\nconst image = labels.compose_image || labels.running_image || labels.image;\nconst project = labels.com_docker_compose_project;\n\nconst host = project === \"core\" ? \"docker\" : \"raspi\";\n\nif (!container) {\n node.warn(\"No container found in alert labels\");\n return null;\n}\n\nmsg.payload = `PROJECT_ROOT=\"/compose/${host}\" /compose/${host}/services-up.sh --profile all pull -q ${container}`;\nmsg.container = container;\nmsg.image = image;\nmsg.host = host;\n\nnode.log(`New docker update available\n Container: ${container}\n Image: ${image}\n Host: ${host}`);\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1300, - "y": 80, - "wires": [ - [ - "e92429c3061966f7" - ] - ] - }, - { - "id": "e92429c3061966f7", - "type": "exec", - "z": "00b02bbd01c91485", - "command": "", - "addpay": "payload", - "append": "", - "useSpawn": "false", - "timer": "", - "winHide": false, - "oldrc": false, - "name": "Pull Image", - "x": 1510, - "y": 80, - "wires": [ - [ - "5c36c5b0e44d7cb0" - ], - [ - "5c36c5b0e44d7cb0" - ], - [ - "3af6aa9cbaad6ff9" - ] - ] - }, - { - "id": "b8a933687445fb13", - "type": "exec", - "z": "00b02bbd01c91485", - "command": "", - "addpay": "payload", - "append": "", - "useSpawn": "false", - "timer": "70", - "winHide": false, - "oldrc": true, - "name": "Test New Image", - "x": 2160, - "y": 80, - "wires": [ - [ - "40e040d2b58bbaa1", - "4c182d7a643805cd" - ], - [ - "4c182d7a643805cd" - ], - [] - ] - }, - { - "id": "40e040d2b58bbaa1", - "type": "switch", - "z": "00b02bbd01c91485", - "name": "Check Test Result", - "property": "payload", - "propertyType": "msg", - "rules": [ - { - "t": "cont", - "v": "0", - "vt": "str" - }, - { - "t": "else" - } - ], - "checkall": "true", - "repair": false, - "outputs": 2, - "x": 2370, - "y": 80, - "wires": [ - [ - "da5d95a30589805c" - ], - [ - "47ac22574893de41" - ] - ] - }, - { - "id": "ab2063f9180cd1aa", - "type": "exec", - "z": "00b02bbd01c91485", - "command": "", - "addpay": "payload", - "append": "", - "useSpawn": "false", - "timer": "", - "winHide": false, - "oldrc": true, - "name": "Deploy Production Container", - "x": 2960, - "y": 80, - "wires": [ - [ - "32e3684b63a6f13e" - ], - [ - "e8e4151333935b78", - "32e3684b63a6f13e" - ], - [] - ] - }, - { - "id": "a4c73e8e3e87fab7", - "type": "http in", - "z": "00b02bbd01c91485", - "name": "Grafana Webhook", - "url": "/grafana-update", - "method": "post", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 110, - "y": 60, - "wires": [ - [ - "671243b648c669fe" - ] - ] - }, - { - "id": "3af6aa9cbaad6ff9", - "type": "switch", - "z": "00b02bbd01c91485", - "name": "image pulled OK?", - "property": "payload.code", - "propertyType": "msg", - "rules": [ - { - "t": "eq", - "v": "0", - "vt": "num" - }, - { - "t": "else" - } - ], - "checkall": "true", - "repair": false, - "outputs": 2, - "x": 1710, - "y": 80, - "wires": [ - [ - "96c81501330c20e3" - ], - [ - "1de1d1befec88aa4" - ] - ] - }, - { - "id": "96c81501330c20e3", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Build Test Command", - "func": "const container = msg.container;\nconst image = msg.image;\nconst host = msg.host;\nmsg.payload = `/data/test-container.sh ${container} ${host}`;\nmsg.image = image;\nmsg.container = container;\nmsg.host = host\nnode.log(`Pull Successful\n Container: ${container}\n Image: ${msg.image}\n Host: ${host}`\n )\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1940, - "y": 80, - "wires": [ - [ - "b8a933687445fb13" - ] - ] - }, - { - "id": "95e72a493b5b736c", - "type": "split", - "z": "00b02bbd01c91485", - "name": "", - "splt": "\\n", - "spltType": "str", - "arraySplt": 1, - "arraySpltType": "len", - "stream": true, - "addname": "", - "property": "payload.alerts", - "x": 610, - "y": 80, - "wires": [ - [ - "298528baa0f776b4" - ] - ] - }, - { - "id": "da5d95a30589805c", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Build Deploy Command", - "func": "const container = msg.container;\nconst image = msg.image;\nconst host = msg.host;\nmsg.payload = `PROJECT_ROOT=\"/compose/${host}\" /compose/${host}/services-up.sh --profile all up -d ${container}`;\nmsg.image = image;\nmsg.container = container;\nmsg.host = host;\nnode.log(`Test Successful\n Container: ${container}\n Image: ${msg.image}\n Host: ${host}`\n )\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 2670, - "y": 80, - "wires": [ - [ - "ab2063f9180cd1aa" - ] - ] - }, - { - "id": "27ac6d1d2b208f99", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image pull fail", - "mode": "link", - "links": [ - "ba2c4e239d3b1e1d" - ], - "x": 2095, - "y": 140, - "wires": [] - }, - { - "id": "49c52031d95c0638", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image test fail", - "mode": "link", - "links": [ - "10718f4768834442" - ], - "x": 2795, - "y": 140, - "wires": [] - }, - { - "id": "b083fcf71669254e", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker update success", - "mode": "link", - "links": [ - "f5771c9cc8e81779" - ], - "x": 3415, - "y": 80, - "wires": [] - }, - { - "id": "671243b648c669fe", - "type": "function", - "z": "00b02bbd01c91485", - "name": "WEBHOOK /grafana-update IN", - "func": "node.log(\n \"Payload:\\n\" +\n JSON.stringify(msg.payload, null, 2)\n);\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 390, - "y": 80, - "wires": [ - [ - "95e72a493b5b736c" - ] - ] - }, - { - "id": "e8e4151333935b78", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Deployment Success", - "func": "const attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nif (msg.updateKey && attempts[msg.updateKey]) {\n delete attempts[msg.updateKey];\n flow.set(\"dockerUpdateAttempts\", attempts);\n}\nnode.log(`Deployment Successful\n Container: ${msg.container}\n Image: ${msg.image}\n Host: ${msg.host}\n`);\n\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 3240, - "y": 80, - "wires": [ - [ - "b083fcf71669254e" - ] - ] - }, - { - "id": "1de1d1befec88aa4", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Pull Image Failed", - "func": "let attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nif (msg.updateKey && attempts[msg.updateKey]) {\n const firstFailure = !attempts[msg.updateKey].notified;\n\n attempts[msg.updateKey].status = \"pull_failed\";\n attempts[msg.updateKey].failedAt = Date.now();\n\n if (firstFailure) {\n attempts[msg.updateKey].notified = true;\n\n msg.notification = {\n title: `Docker update locked out: ${msg.container}`,\n message:\n `Automatic update for ${msg.container} failed.\n\n` +\n `Image: ${msg.image}\n` +\n `Host: ${msg.host}\n` +\n `Result: ${attempts[msg.updateKey].status}\n\n` +\n `Further Grafana alerts for this update will be ignored until manual intervention.`\n };\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n return [msg, msg];\n }\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n}\n\nnode.log(`Pull image failed\n Command: ${msg.payload}\n Container: ${msg.container}\n Image: ${msg.image}\n Host: ${msg.host}`);\nreturn [msg, null];", - "outputs": 2, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1930, - "y": 140, - "wires": [ - [ - "27ac6d1d2b208f99" - ], - [ - "0e6520dfb81a951b" - ] - ] - }, - { - "id": "47ac22574893de41", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Test Image Failed", - "func": "let attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nif (msg.updateKey && attempts[msg.updateKey]) {\n const firstFailure = !attempts[msg.updateKey].notified;\n\n attempts[msg.updateKey].status = \"test_failed\";\n attempts[msg.updateKey].failedAt = Date.now();\n\n if (firstFailure) {\n attempts[msg.updateKey].notified = true;\n\n msg.notification = {\n title: `Docker update locked out: ${msg.container}`,\n message:\n `Automatic update for ${msg.container} failed.\n\n` +\n `Image: ${msg.image}\n` +\n `Host: ${msg.host}\n` +\n `Result: ${attempts[msg.updateKey].status}\n\n` +\n `Further Grafana alerts for this update will be ignored until manual intervention.`\n };\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n return [msg, msg];\n }\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n}\n\nnode.log(`Test image failed\n Command: ${msg.payload}\n Container: ${msg.container}\n Image: ${msg.image}\n Host: ${msg.host}`);\nreturn [msg, null];", - "outputs": 2, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 2650, - "y": 140, - "wires": [ - [ - "49c52031d95c0638" - ], - [ - "77675958f77d2d5f" - ] - ] - }, - { - "id": "298528baa0f776b4", - "type": "switch", - "z": "00b02bbd01c91485", - "name": "docker project name", - "property": "payload.alerts.labels.com_docker_compose_project", - "propertyType": "msg", - "rules": [ - { - "t": "eq", - "v": "core", - "vt": "str" - }, - { - "t": "eq", - "v": "raspi", - "vt": "str" - }, - { - "t": "else" - } - ], - "checkall": "true", - "repair": false, - "outputs": 3, - "x": 800, - "y": 80, - "wires": [ - [ - "bad4d106425b7dd2" - ], - [ - "bad4d106425b7dd2" - ], - [ - "1ab4069c08a68fa3" - ] - ] - }, - { - "id": "1ab4069c08a68fa3", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Unknown Project", - "func": "const payload = (msg.payload && typeof msg.payload === \"object\") ? msg.payload : {};\nconst labels = (payload.labels && typeof payload.labels === \"object\") ? payload.labels : {};\n\nconst container = labels.container || \"unknown container\";\nconst image = labels.compose_image || labels.running_image || labels.image || \"unknown image\";\nconst project = labels.com_docker_compose_project || \"unknown project\";\n\nnode.warn(`Unable to map project name ${project} to host.\n\nUpdates for ${container} (${image}) failed`);\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1290, - "y": 200, - "wires": [ - [ - "852d039f540dd0d3" - ] - ] - }, - { - "id": "852d039f540dd0d3", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker updates fail unknown", - "mode": "link", - "links": [ - "7c62509d505c281b" - ], - "x": 1455, - "y": 200, - "wires": [] - }, - { - "id": "f4b91e278109e661", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Repeat update Suppresed", - "func": "const labels = msg.payload.alerts.labels || {};\n\nnode.warn(\n `${labels.container || \"unknown\"} ` +\n `(${labels.compose_image || labels.running_image || \"unknown image\"})`\n);\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1310, - "y": 140, - "wires": [ - [] - ] - }, - { - "id": "5c36c5b0e44d7cb0", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Logging", - "func": "//const labels = msg.payload.alerts.labels || {};\n//const container = labels.container;\n//const image = labels.compose_image || labels.running_image || labels.image;\n\nif (msg.payload != \"\") {\n node.log(msg.payload)\n}\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1680, - "y": 40, - "wires": [ - [] - ] - }, - { - "id": "4c182d7a643805cd", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Logging", - "func": "//const labels = msg.payload.alerts.labels || {};\n//const container = labels.container;\n//const image = labels.compose_image || labels.running_image || labels.image;\nif (msg.payload != \"\") {\n node.log(msg.payload)\n}\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 2340, - "y": 40, - "wires": [ - [] - ] - }, - { - "id": "32e3684b63a6f13e", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Logging", - "func": "//const labels = msg.payload.alerts.labels || {};\n//const container = labels.container;\n//const image = labels.compose_image || labels.running_image || labels.image;\nif (msg.payload != \"\") {\n node.log(msg.payload)\n}\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 3200, - "y": 40, - "wires": [ - [] - ] - }, - { - "id": "bad4d106425b7dd2", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Check Already Attempted", - "func": "const labels = msg.payload.alerts.labels || {};\n\nconst container = labels.container;\nconst image = labels.compose_image || labels.running_image || labels.image;\nconst project = labels.com_docker_compose_project;\n\nif (!container || !image) {\n node.warn(\"Missing container/image labels; skipping update attempt tracking\");\n return [null, null];\n}\n\n// Load persistent attempt registry\nlet attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nconst host = project === \"core\" ? \"docker\" : \"raspi\";\n\n// Unique key for this exact update attempt\nconst key = `${container}|${image}|${host}`;\n\n// If we've already tried this image for this container, suppress it\nif (attempts[key]) {\n node.warn(\n `Ignoring repeated update alert for ${container} -> ${image}. ` +\n `Already attempted at ${new Date(attempts[key].time).toISOString()}`\n );\n\n msg.suppressed = true;\n msg.updateKey = key;\n msg.attemptInfo = attempts[key];\n\n return [null, msg];\n}\n\n// First time we've seen this update, record it immediately\nattempts[key] = {\n time: Date.now(),\n status: \"started\"\n};\n\nflow.set(\"dockerUpdateAttempts\", attempts);\n\nmsg.updateKey = key;\n\nnode.log(`First attempt for ${container} -> ${image}`);\n\nreturn [msg, null];", - "outputs": 2, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1050, - "y": 80, - "wires": [ - [ - "17eef927bdc12e54" - ], - [ - "f4b91e278109e661" - ] - ] - }, - { - "id": "0e6520dfb81a951b", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image update locked", - "mode": "link", - "links": [ - "b72f58c8b6d6d265" - ], - "x": 2095, - "y": 200, - "wires": [] - }, - { - "id": "77675958f77d2d5f", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image update locked", - "mode": "link", - "links": [ - "b72f58c8b6d6d265" - ], - "x": 2795, - "y": 200, - "wires": [] - }, - { - "id": "8c74f9646c655f07", - "type": "http in", - "z": "00b02bbd01c91485", - "name": "/docker-update-lockouts in", - "url": "/docker-update-lockouts", - "method": "get", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 250, - "y": 340, - "wires": [ - [ - "bf13590833ea0288" - ] - ] - }, - { - "id": "bf13590833ea0288", - "type": "function", - "z": "00b02bbd01c91485", - "name": "get docker update lockouts", - "func": "const attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nconst output = Object.entries(attempts).map(([key, value]) => ({\n key,\n status: value.status,\n firstAttempt: new Date(value.time).toISOString(),\n failedAt: value.failedAt\n ? new Date(value.failedAt).toISOString()\n : null,\n notified: !!value.notified\n}));\n\nmsg.payload = output;\nnode.log(JSON.stringify(msg.payload, null, 2));\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 540, - "y": 340, - "wires": [ - [ - "2fc3cf8f165b7537" - ] - ] - }, - { - "id": "2fc3cf8f165b7537", - "type": "http response", - "z": "00b02bbd01c91485", - "name": "", - "statusCode": "", - "headers": {}, - "x": 770, - "y": 340, - "wires": [] - }, - { - "id": "81f6db49f4ad354a", - "type": "http in", - "z": "00b02bbd01c91485", - "name": "clear lockout", - "url": "/docker-update-lockouts/clear", - "method": "post", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 210, - "y": 480, - "wires": [ - [ - "28d736c3d3a4cf14" - ] - ] - }, - { - "id": "7bae4cc1bd52dfd8", - "type": "http response", - "z": "00b02bbd01c91485", - "name": "", - "statusCode": "", - "headers": {}, - "x": 770, - "y": 480, - "wires": [] - }, - { - "id": "28d736c3d3a4cf14", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Clear lockout", - "func": "let attempts = flow.get(\"dockerUpdateAttempts\") || {};\nconst key = (msg.payload.key || \"\").trim(); // trim whitespace\n\n// optionally log all keys for debugging\nnode.log(\"Available keys: \" + Object.keys(attempts).join(\", \"));\nnode.log(\"Requested key: '\" + key + \"'\");\n\nif (key in attempts) { // use 'in' to avoid false negatives\n delete attempts[key];\n flow.set(\"dockerUpdateAttempts\", attempts);\n\n msg.payload = { success: true, cleared: key };\n node.log(`Cleared update lock for ${key}`);\n} else {\n msg.payload = { success: false, error: `No lock found for '${key}'` };\n}\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 490, - "y": 480, - "wires": [ - [ - "7bae4cc1bd52dfd8" - ] - ] - }, - { - "id": "b113615f19bd2588", - "type": "http in", - "z": "f16653fb4cb05bbe", - "name": "/health in", - "url": "/health", - "method": "get", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 380, - "y": 220, - "wires": [ - [ - "4bf7d7901301ce7e" - ] - ] - }, - { - "id": "4bf7d7901301ce7e", - "type": "function", - "z": "f16653fb4cb05bbe", - "name": "health check", - "func": "msg.payload = { status: \"ok\" };\nmsg.headers = { \"Content-Type\": \"application/json\" };\nnode.log(msg.payload.status);\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 670, - "y": 220, - "wires": [ - [ - "269da1ef164eeb72" - ] - ] - }, - { - "id": "269da1ef164eeb72", - "type": "http response", - "z": "f16653fb4cb05bbe", - "name": "", - "statusCode": "", - "headers": {}, - "x": 950, - "y": 220, - "wires": [] - }, - { - "id": "40ed22bfb88a0d78", - "type": "http in", - "z": "d0f45d2b6f117365", - "name": "/uptime-kuma in", - "url": "/uptime-kuma", - "method": "post", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 320, - "y": 200, - "wires": [ - [ - "46affc0319a44fa9", - "ab7d36db8e9316f8", - "058ef296282aa774" - ] - ] - }, - { - "id": "4e0b1edf6f60d701", - "type": "http response", - "z": "d0f45d2b6f117365", - "name": "response", - "statusCode": "", - "headers": {}, - "x": 860, - "y": 200, - "wires": [] - }, - { - "id": "46affc0319a44fa9", - "type": "link out", - "z": "d0f45d2b6f117365", - "name": "gotify domain name alerts", - "mode": "link", - "links": [ - "bed17b50dd678228" - ], - "x": 615, - "y": 120, - "wires": [] - }, - { - "id": "ab7d36db8e9316f8", - "type": "function", - "z": "d0f45d2b6f117365", - "name": "WEBHOOK /uptime-kuma IN", - "func": "node.log(\n \"Payload:\\n\" +\n JSON.stringify(msg.payload, null, 2)\n);\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 620, - "y": 200, - "wires": [ - [ - "4e0b1edf6f60d701" - ] - ] - }, - { - "id": "058ef296282aa774", - "type": "debug", - "z": "d0f45d2b6f117365", - "name": "debug 1", - "active": true, - "tosidebar": true, - "console": false, - "tostatus": false, - "complete": "payload", - "targetType": "msg", - "statusVal": "", - "statusType": "auto", - "x": 560, - "y": 280, - "wires": [] - }, - { - "id": "0301a3cebd1eb23f", - "type": "http request", - "z": "c5240b64a962ea54", - "name": "Send to gotify", - "method": "POST", - "ret": "obj", - "paytoqs": "ignore", - "url": "http://gotify/message?token=ATSMpSKrdNjKXeT", - "tls": "", - "persist": false, - "proxy": "", - "insecureHTTPParser": false, - "authType": "", - "senderr": false, - "headers": [ - { - "keyType": "other", - "keyValue": "Content-Type", - "valueType": "other", - "valueValue": "application/json" - } - ], - "x": 1300, - "y": 280, - "wires": [ - [] - ] - }, - { - "id": "bed17b50dd678228", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Doman name alerts", - "links": [ - "46affc0319a44fa9" - ], - "x": 275, - "y": 100, - "wires": [ - [ - "6e58de21ded7459e" - ] - ] - }, - { - "id": "6e58de21ded7459e", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Domain name alerts", - "func": "const name = msg.payload.monitor.name;\nconst hb = msg.payload.heartbeat;\n\nconst isUp = hb.status === 1;\n\nconst icon = isUp ? \"✅\" : \"🔴\";\nconst state = isUp ? \"UP\" : \"DOWN\";\n\n// Build a short title for the Gotify notification\nconst title = `${icon} ${name} is ${state}`;\nconst time = hb.localDateTime.split(\" \")[1].split(\":\").slice(0, 2).join(\":\");\n// Build a more detailed message\nlet message = `${icon} Monitor: ${name}\\n`;\nmessage += `Status: ${state}\\n`;\nmessage += `Time: ${time}\\n`;\nmessage += `Details: ${hb.msg}`;\n\nif (hb.ping !== undefined) {\n message += `\\nPing: ${hb.ping} ms`;\n}\n\nif (hb.duration !== undefined) {\n message += `\\nCheck Interval: ${hb.duration} sec`;\n}\n\n// Higher priority for down alerts\nmsg.payload = {\n title: title,\n message: message,\n priority: isUp ? 5 : 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 480, - "y": 100, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "8630c7dfcdbcce50", - "type": "function", - "z": "c5240b64a962ea54", - "name": "GOTIFY alert OUT", - "func": "node.log(JSON.stringify(msg.payload, null, 2));\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1070, - "y": 280, - "wires": [ - [ - "0301a3cebd1eb23f" - ] - ] - }, - { - "id": "0135d283b9edfb01", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker Pull Failed", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\n\nmsg.payload = {\n title: \"Docker Update Failed\",\n message: `Pull failed for ${container}\\n${stderr}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 710, - "y": 200, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "ba2c4e239d3b1e1d", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker pull failed alerts", - "links": [ - "27ac6d1d2b208f99" - ], - "x": 275, - "y": 200, - "wires": [ - [ - "c1aa11bb22cc33dd" - ] - ] - }, - { - "id": "4eafade32c867e40", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker test failed", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\n\nmsg.payload = {\n title: \"Testing Failed\",\n message: `Testing failed for ${container}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 710, - "y": 300, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "10718f4768834442", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker test failed alerts", - "links": [ - "49c52031d95c0638" - ], - "x": 275, - "y": 300, - "wires": [ - [ - "d2aa11bb22cc33dd" - ] - ] - }, - { - "id": "7d8200040f9b1e83", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker update success", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\n\nmsg.payload = {\n title: \"Container Updated\",\n message: `Container: ${container}\n Host: ${msg.host}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 790, - "y": 380, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "f5771c9cc8e81779", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update success alerts", - "links": [ - "b083fcf71669254e" - ], - "x": 275, - "y": 380, - "wires": [ - [ - "e3aa11bb22cc33dd" - ] - ] - }, - { - "id": "c3d07241f4a570af", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker updates Unknown Project", - "func": "const payload = (msg.payload && typeof msg.payload === \"object\") ? msg.payload : {};\nconst labels = (payload.labels && typeof payload.labels === \"object\") ? payload.labels : {};\n\nconst container = msg.container || labels.container || \"unknown container\";\nconst project = labels.com_docker_compose_project || msg.project || \"unknown project\";\n\nmsg.payload = {\n title: \"Container Updates Failed\",\n message: `The ${container} container has failed.\n\nUnknown project ${project}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 800, - "y": 460, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "7c62509d505c281b", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update unknown project", - "links": [ - "852d039f540dd0d3" - ], - "x": 275, - "y": 460, - "wires": [ - [ - "f4aa11bb22cc33dd" - ] - ] - }, - { - "id": "d1346f7151103832", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker updates for Raspi", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\nconst project = msg.payload.labels.com_docker_compose_project\nmsg.payload = {\n title: \"Container Updates Available - Raspi\",\n message: `The ${container} container has updates available.`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 750, - "y": 520, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "e6c64cd6d405b8ed", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update for raspi", - "links": [], - "x": 275, - "y": 520, - "wires": [ - [ - "a5aa11bb22cc33dd" - ] - ] - }, - { - "id": "b72f58c8b6d6d265", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update locked", - "links": [ - "0e6520dfb81a951b", - "77675958f77d2d5f" - ], - "x": 275, - "y": 580, - "wires": [ - [ - "b6aa11bb22cc33dd" - ] - ] - }, - { - "id": "1a9798d5c081240a", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker updates locked", - "func": "const container = msg.container || \"unknown container\";\nconst defaultPayload = {\n title: \"Update Locked out\",\n message: `Container: ${container}\nHost: ${msg.host}\n\nManual intervention required.`,\n priority: 8\n};\n\nif (msg.notification) {\n msg.payload = {\n title: msg.notification.title || defaultPayload.title,\n message: msg.notification.message || defaultPayload.message,\n priority: 8\n };\n return msg;\n}\n\nmsg.payload = defaultPayload;\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 740, - "y": 580, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "a1f8e9b2c3d4e5f6", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Build update log event", - "func": "const nowIso = new Date().toISOString();\nconst startedAt = msg.update_started_at || Date.now();\nconst durationMs = Math.max(0, Date.now() - startedAt);\n\nconst payload = (msg.payload && typeof msg.payload === \"object\") ? msg.payload : {};\nconst labels = payload.labels || {};\n\nconst status = (msg.update_status || payload.status || \"unknown\").toString().toLowerCase();\n\nmsg.payload = JSON.stringify({\n ts: nowIso,\n flow: \"docker-updates\",\n event: msg.update_event || \"attempt\",\n container: msg.container || labels.container || \"unknown\",\n project: labels.com_docker_compose_project || msg.project || \"unknown\",\n host: msg.host || \"unknown\",\n status,\n success: status === \"success\" ? 1 : 0,\n failed: [\"failed\", \"locked\"].includes(status) ? 1 : 0,\n duration_ms: durationMs,\n code: Number.isFinite(Number(payload.code)) ? Number(payload.code) : 0,\n error: (msg.update_error || payload.error || \"\").toString().slice(0, 300)\n});\n\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 690, - "y": 660, - "wires": [ - [ - "b1c2d3e4f5a69788" - ] - ] - }, - { - "id": "b1c2d3e4f5a69788", - "type": "file", - "z": "c5240b64a962ea54", - "name": "Write update event log", - "filename": "/data/update-events.ndjson", - "filenameType": "str", - "appendNewline": true, - "createDir": false, - "overwriteFile": "false", - "encoding": "none", - "x": 930, - "y": 660, - "wires": [ - [] - ] - }, - { - "id": "c1aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Pull Failed", - "func": "msg.update_status = \"failed\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 200, - "wires": [ - [ - "0135d283b9edfb01", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "d2aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Test Failed", - "func": "msg.update_status = \"failed\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 300, - "wires": [ - [ - "4eafade32c867e40", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "e3aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Update Success", - "func": "msg.update_status = \"success\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 380, - "wires": [ - [ - "7d8200040f9b1e83", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "f4aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Unknown Project", - "func": "msg.update_status = \"failed\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 460, - "wires": [ - [ - "c3d07241f4a570af", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "a5aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Update Attempt", - "func": "msg.update_status = \"attempt\";\nmsg.update_event = \"attempt\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 520, - "wires": [ - [ - "d1346f7151103832", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "b6aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Update Locked", - "func": "msg.update_status = \"locked\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 460, - "y": 580, - "wires": [ - [ - "1a9798d5c081240a", - "a1f8e9b2c3d4e5f6" - ] - ] - } -] \ No newline at end of file diff --git a/monitoring/node-red/data/.flows_cred.json.backup b/monitoring/node-red/data/.flows_cred.json.backup deleted file mode 100644 index 1b319ef..0000000 --- a/monitoring/node-red/data/.flows_cred.json.backup +++ /dev/null @@ -1,3 +0,0 @@ -{ - "$": "0875f76c323e5c597b616b8d0802ec74qpYy2kDXF8kqK4a8NneEiGhCLy5Lp+vI1FkwjR0umSjQBv2nQKyxpVC2eFxg" -} \ No newline at end of file diff --git a/monitoring/node-red/data/.npm/_cacache/content-v2/sha512/b0/47/c1458664fa9b6a08e9035110b523127a96bd7285d19472dc702f5dc498b927412b0ecd3273708fbf9d61754520599ac0b0e11f3e4c4d4ac784e78d7d97fe b/monitoring/node-red/data/.npm/_cacache/content-v2/sha512/b0/47/c1458664fa9b6a08e9035110b523127a96bd7285d19472dc702f5dc498b927412b0ecd3273708fbf9d61754520599ac0b0e11f3e4c4d4ac784e78d7d97fe deleted file mode 100644 index 294d108672f07b7a3d9aa0394505567ed57c309e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 22123 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.0.0","plugins":{"flow-debugger":"dist/flow-debugger.js"}},"devDependencies":{"@types/node":"^15.12.2","fs-extra":"^10.0.0","html-minifier":"^4.0.0","nodemon":"^2.0.7","tslint":"^6.1.3","typescript":"^4.3.2"},"gitHead":"3c27f6d64e6dbd2313e2f859f8ffb1bf9772ca72","bugs":{"url":"https://github.com/node-red/node-red-debugger/issues"},"homepage":"https://github.com/node-red/node-red-debugger#readme","_id":"node-red-debugger@1.0.0","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-XaWptBinVBjXZYWmURwbTDTCD1XxmRzOidYyput3Pqnb+H7g+Q2wtdBVX/ROEL1pWAqL1rzIK4/wXPYF6A6WFA==","shasum":"75dfa1ed1c2197e69700769c18e7cd56c6a0c409","tarball":"https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.0.0.tgz","fileCount":17,"unpackedSize":73748,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgw4TGCRA9TVsSAnZWagAAi1gP/jTTNax+Tw2C83Udjf/1\nqxYSS1goc55dtQ3F8wTLPuZwOx3eo2ylp6oc9YicXU4nOfRmz4mVsUlLE0fe\nlJYqbCITTBvfx82ZLnx9Xfy3F6rNbJWRlDKqjuIuyFbFXaZfsZYictHa7eh6\nhFIrLDaG8CedEQbPRgUKCNVpMVaCcMuNOUMccSv6gGkssOlNctRFHrmvPU2M\nwwwwMZ3XIoPdt5hJ2MN1XxsCYl4ehtXavq3TmNGrzm4IdX0iQRhkQ6ji9odi\nuJX5hkblHedIhJseA6pHeBkh6bdTBeJKPiYDxx+io4qw5xU8ehyo4MTeqp89\njzaiTkMQmr7+SUL1wFj+3crY54WBr5hDQDeKd/xYfGneYWgqPho+AW/eQOJl\nKmuhOqJNy/hF63AaoFXuXBwVoyYeYAf9M63EWmxPcaYGxOwJws4Je2LK6e+d\niuggG+rlAoHz5HSVj+JUxw/iE0gKiXQNcsS6a4RpDaV1PiiNqQaEvQfDNtH/\neoK104u4nk2MvDmPhJeCcWFR//Jmwgh/IQIWdJO2UZ0gvBWgXWe/aV91Ru/A\n3C5YKWdpWB7Y64QLsTBqHXkPZTP6mFJfKWZm+lGaWqWcx42wc7xYEHceHJBu\nQNcI3gqztCPVz0h5J4l451Wr4qtwehPDmfYKXT/O7K/RdAEc3qZoShDktufX\nF4C0\r\n=JLZ9\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCFGkrByzKFV6QjHlfZa2JB176kwRJelihrKhT5+RfkTwIgPlLJhsoaRH6y2L140UGqgd+L4IW6epxKq9s0RxNQgrk="}]},"_npmUser":{"name":"knolleary","email":"nick.oleary@gmail.com"},"directories":{},"maintainers":[{"name":"knolleary","email":"nick.oleary@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-debugger_1.0.0_1623426246605_0.7855937877363888"},"_hasShrinkwrap":false},"1.0.1":{"name":"node-red-debugger","version":"1.0.1","description":"A flow debugger for Node-RED 2.x","repository":{"type":"git","url":"git+https://github.com/node-red/node-red-debugger.git"},"scripts":{"build":"(tsc || exit 1) && npm run tslint && npm run copyAssets","tslint":"tslint -c tslint.json -p tsconfig.json","copyAssets":"node scripts/copy-static-assets.js","dev":"nodemon --exec 'npm run build' -i dist -e 'ts html'","test":"npm run build"},"keywords":["node-red","debugger"],"author":{"name":"Nick O'Leary","email":"nick.oleary@gmail.com"},"license":"Apache-2","node-red":{"version":">=2.0.0","plugins":{"flow-debugger":"dist/flow-debugger.js"}},"devDependencies":{"@types/node":"^15.12.2","fs-extra":"^10.0.0","html-minifier":"^4.0.0","nodemon":"^2.0.7","tslint":"^6.1.3","typescript":"^4.3.2"},"gitHead":"de2973e309e8b59b8d11f4e67dc4fe062142b10d","bugs":{"url":"https://github.com/node-red/node-red-debugger/issues"},"homepage":"https://github.com/node-red/node-red-debugger#readme","_id":"node-red-debugger@1.0.1","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-7zOaX/vCUgwpiHrhLbk6P9d3kZY2P9G4t/0x9P69KlKRT1NxekGYtYKRKjFA1GRX0pna//nfJMXwAX4eyzhRZg==","shasum":"42c902dacc3a02993553e62c96a230b7cdf53df3","tarball":"https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.0.1.tgz","fileCount":17,"unpackedSize":73748,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJgw5S2CRA9TVsSAnZWagAAlDsP/1WhoDXGylQd7dBfg6oA\n+JRNKrQcqkkguKCIMKr+hHQU/6JiyswmwRTVZvT35pPSsk9Cw66H7SPWNqIN\ncZBDt/k6Jb03rJl5GFv32+vmxSrOIfvaVjiosIqVWmynPNqSsClZknufZpqb\niSD3RhQ6fWmv2FoENTw+MapZ1QV6mZyFnZG62Qe9nnUETBcuLW5/QHjENd16\nI5iHf4GK02qMDGHc34RSjZx5DGLvEqqgKBlAXKlc1yjTorxMl6D+CWiCg0fn\nRZj8wCPwSZRs5oyKjTLJ3Z3DFihRH8ecV+n57U4ncAQ3g1xpBFxBO/wbb9ct\nNyQ0vvmLb/CiwQv5UgPvxng7phzpaVqMNFo1xeGLckei2c7tOIcBktD8WPHS\nGNIcPZb1Fgiis9zqtT5u7pusBs8ftFd81xTitFioHSqTCO0UALhtb7a5eXuK\ngDhlVbqAhKaRHjzQ23rKi/xc+zrmgyUvIJgxMOtMv4nSwKJ1/4I9dkmcGbcQ\n4g+zvtRSwpN+kq60f4rweTX6Vle3kz0zlCsm+UyR6dDgQwblmouyV9TLO6J+\nWqBcmZviaYcbtyuMSlJsa2iQm2x/MUJjLapvjwFV6I9n0REcB524qa6qW+ru\n5egTDkOXWiLARaJuzwfRFyJDLeAoTi74LkVuHhAcsWF9lDb6mcRyBC2YIgZS\nab0i\r\n=7gDE\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDIIg+Dq9L/PH+PutU4M+OXpZ68N5Rjsjw/eMIC9ogkgQIgJXyK0jxIM+tAssiiXICcxdAqI747mUiHlNyh4UXRbGM="}]},"_npmUser":{"name":"knolleary","email":"nick.oleary@gmail.com"},"directories":{},"maintainers":[{"name":"knolleary","email":"nick.oleary@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-debugger_1.0.1_1623430326297_0.4331967962654064"},"_hasShrinkwrap":false},"1.1.0":{"name":"node-red-debugger","version":"1.1.0","description":"A flow debugger for Node-RED 2.x","repository":{"type":"git","url":"git+https://github.com/node-red/node-red-debugger.git"},"scripts":{"build":"(tsc || exit 1) && npm run tslint && npm run copyAssets","tslint":"tslint -c tslint.json -p tsconfig.json","copyAssets":"node scripts/copy-static-assets.js","dev":"nodemon --exec 'npm run build' -i dist -i resources -e 'ts html css'","test":"npm run build"},"keywords":["node-red","debugger"],"author":{"name":"Nick O'Leary","email":"nick.oleary@gmail.com"},"license":"Apache-2","node-red":{"version":">=2.0.0","plugins":{"flow-debugger":"dist/flow-debugger.js"}},"devDependencies":{"@types/node":"^15.12.2","fs-extra":"^10.0.0","html-minifier":"^4.0.0","nodemon":"^2.0.7","tslint":"^6.1.3","typescript":"^4.3.2"},"gitHead":"72b8e8747032ea7eb87e120cdd6c03e5c5f8ff4b","bugs":{"url":"https://github.com/node-red/node-red-debugger/issues"},"homepage":"https://github.com/node-red/node-red-debugger#readme","_id":"node-red-debugger@1.1.0","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-V7252AQEGdtrmXzgVBqK0f+O2R1yZ1D5ZiJKmz2r/xm2S6MmAp/mkP6N2UC11c9+qLatZuLtSEYs2/okVt7knA==","shasum":"e0cae2bc35da21ac3037359aa8e8e9098a968c78","tarball":"https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.0.tgz","fileCount":20,"unpackedSize":87423,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg3t1gCRA9TVsSAnZWagAAb9YQAJsm4nc4ttpPstCVI1uB\nW5haaMb8R4SlWKiMFr9GyS6ut+ivfDKYJ6Fh6sFLZVJfzLRXT/UPLAhEoTYJ\nR4sgh8sBBAYv43kzXIjptVaB0Xq58/j2bxDLxPnlwax0aOVEgMENlESrK7to\nkUJcrvsreW8NE1gPCpwwzLpqmMFLdvG+kX+f+4hIS+rMnwRT5be5xdufNf5y\nP6wjJ9FgSZEvyBWCvIEIgaVa/tup+vqtRrFxJ2rf5qi6YOj9MUvzPCgFon+c\n17B3rUz51UVIHDu99pZ2jLPEadRoCNL2ArWI5X/tZZtufOPcPyZanCRuA+Ze\nBVdde0FWmrqqn3o/Vc1VA4l8TBYm6Gvd/FjJfTcyrNJYCG8nKHzv3SKKHB+e\nnmptZ83IwtXAc0YbHnPGLA7R6414KoPxPplKrOUZZqzz6Fl4xJ4vdVvXt9c1\nm4J+60ZOjkS1z52E//Ucimp/BG1qBErinMQ9+ZNAcQ5iYOO4tgwgdvwv+Xk6\n3kJgxvdQlbQk/mQ9C5VCkXhmZw35tJxLwLKGIMs95CkvKDyU14QdjNiFbNiV\nKs/7sz/Fx9L7wstzXT1e7FXKbf9Z73hx9mn5GprqdBEEjdc+AmzeJXh3d6UG\njBzipDX8pMTT2cbA/ZzXHYEoDZ2fOMt6m/mXFixrGDZuB1qfDgfuI79FjHz2\nLVs6\r\n=yESb\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIC42gKjcci+dRJhwvpAf6CJ4PbapOEO30VApqFZrEKyNAiEA/5UaucZw72vQlOvCOoScl8fgQYQR5EQeqdD7F8K9oUQ="}]},"_npmUser":{"name":"knolleary","email":"nick.oleary@gmail.com"},"directories":{},"maintainers":[{"name":"knolleary","email":"nick.oleary@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-debugger_1.1.0_1625218399672_0.4417756923323586"},"_hasShrinkwrap":false},"1.1.1":{"name":"node-red-debugger","version":"1.1.1","description":"A flow debugger for Node-RED 2.x","repository":{"type":"git","url":"git+https://github.com/node-red/node-red-debugger.git"},"scripts":{"build":"(tsc || exit 1) && npm run tslint && npm run copyAssets","tslint":"tslint -c tslint.json -p tsconfig.json","copyAssets":"node scripts/copy-static-assets.js","dev":"nodemon --exec 'npm run build' -i dist -i resources -e 'ts html css'","test":"npm run build"},"keywords":["node-red","debugger"],"author":{"name":"Nick O'Leary","email":"nick.oleary@gmail.com"},"license":"Apache-2","node-red":{"version":">=2.0.0","plugins":{"flow-debugger":"dist/flow-debugger.js"}},"devDependencies":{"@types/node":"^15.12.2","fs-extra":"^10.0.0","html-minifier":"^4.0.0","nodemon":"^2.0.7","tslint":"^6.1.3","typescript":"^4.3.2"},"gitHead":"03ec572f899038a9386d774c7a86bbd8c7390441","bugs":{"url":"https://github.com/node-red/node-red-debugger/issues"},"homepage":"https://github.com/node-red/node-red-debugger#readme","_id":"node-red-debugger@1.1.1","_nodeVersion":"14.17.0","_npmVersion":"6.14.13","dist":{"integrity":"sha512-sEfBRYZk+ptqCOkDURC1IxJ6lr1yhdGUctxwL13EmLknQSsOzTJzcI+/nWF1RSBZmsCw4R8+TE1Kx4TnjX2X/g==","shasum":"0450ac3bfa437556ab33e9ece8a967ee38da907f","tarball":"https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.1.tgz","fileCount":20,"unpackedSize":87568,"npm-signature":"-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJg+AG8CRA9TVsSAnZWagAAKIsP/36YhU4VVhovGTcnZ4K/\nWfQSPfx1F4snuw5g/mTf4JBhPB5Ej4ufsCqeG43wfzn5pz0NZJgR0irjm2Xn\nh3oUGrwN/KRir98Ms9aXMolQ5usCoP5IEd05NVOjW7EhfO42+Jx74i8VYqYn\ntfHtrrd7eMbjRJFzgUSdf1gFosxCvpQwF2WKXgzqHqrpxgg/8cCfkMK9OA4X\ndPnhcOEB5yOjoQIB964h62oLYrbpcJvvU2qfr3LVGC/n/+kDU9eVKEfaY5wA\niPZeHUyqnAsMkoNxhZqwEZnP/p7IUrIxYmRV3WcouFWxE/vh2qek13RkxE9c\nr8tY4hqMDZAFhI0sb9FOHEtFJPS6LH71IZiQdMZmRfWpfu6TMspg0vRnKXmm\nKS50Q7N17ZiNIEp5WKLskvldeorMp9+Y8xPoO9vhhAr1cSZJ/88JDC0epv7h\nuUJOeD1uR/KzHjyivQ2DYshwM30XzLAiYJHXExno5m0oXbQ5NsnF7+5G7FiJ\nA8+kpDr/QIuJRlMn2Pc/JWj3G/MKM7k5yX04W1nwvpue68uunDiiquDNUWi7\nSVB09EnGaODP9TC3V0f1wAPcp++DaVIUYFdv2CH9lW/6qIHQOeQ4MiMg/Jc+\nIse3Q/1srIQSlpMBpo+ZV27xy+bldkFRzne8smOXGsiI7byP8QG9pRXh+56d\nlU1i\r\n=9qR8\r\n-----END PGP SIGNATURE-----\r\n","signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQDdX2dtKGX3opUZ18KiS0y4HV4tFRRbJE7X5iThmeKekwIgBDy60zfXxRBy/bNRcgXXbzQa0INkIRMB9jMVmndiQuk="}]},"_npmUser":{"name":"knolleary","email":"nick.oleary@gmail.com"},"directories":{},"maintainers":[{"name":"knolleary","email":"nick.oleary@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/node-red-debugger_1.1.1_1626866108052_0.6596553668642058"},"_hasShrinkwrap":false}},"time":{"created":"2021-06-11T15:44:06.605Z","1.0.0":"2021-06-11T15:44:06.740Z","modified":"2022-05-11T04:22:13.151Z","1.0.1":"2021-06-11T16:52:06.434Z","1.1.0":"2021-07-02T09:33:19.823Z","1.1.1":"2021-07-21T11:15:08.226Z"},"maintainers":[{"name":"knolleary","email":"nick.oleary@gmail.com"}],"description":"A flow debugger for Node-RED 2.x","homepage":"https://github.com/node-red/node-red-debugger#readme","keywords":["node-red","debugger"],"repository":{"type":"git","url":"git+https://github.com/node-red/node-red-debugger.git"},"author":{"name":"Nick O'Leary","email":"nick.oleary@gmail.com"},"bugs":{"url":"https://github.com/node-red/node-red-debugger/issues"},"license":"Apache-2","readme":"# Node-RED Flow Debugger\n\nThis module is a Plugin for Node-RED 2.x. It provides a flow debugger with the following\nfeatures:\n\n - set breakpoints on node inputs or outputs\n - pause the runtime manually or when a message arrives at a breakpoint\n - once paused you can:\n - inspect the queued up messages\n - step forward individual messages\n - drop messages\n\n## Installation\n\nInstall this module in your Node-RED user directory or via the Palette Manager\nthen restart Node-RED\n\n npm install node-red-debugger\n\n\n## Usage\n\nThe Flow Debugger adds a new sidebar tab in the editor. Select it from the dropdown\nmenu.\n\nBy default, the debugger is disabled. Click the 'disabled' toggle button to enable it.\n\nThe sidebar has two sections - a list of the breakpoints you have set and a list\nof any messages queued up in the runtime.\n\n### Working with breakpoints\n\nWith the debugger enabled, when you hover over a node's port a breakpoint indicator\nwill appear. Move your mouse over the indicator and click once - it will turn solid blue\nand an entry will appear in the sidebar.\n\nIf you click on it again, the breakpoint will be deactivated but remain in place (light blue).\n\nClicking on it again will remove the breakpoint entirely (dotted outline).\n\nYou can also deactive a breakpoint using its checkbox in the sidebar, and remove it by\nclicking the `x` button.\n\n### Pausing the runtime\n\nThe runtime will by paused whenever a message arrives at an active breakpoint. You\ncan also manually pause the runtime using the pause button in the sidebar.\n\nOnce paused, the flow will show how many messages are queued up at each node input\nand output. Those messages will also be listed in the sidebar - in the order the\nruntime will process them.\n\nIf you click the step button at the top of the sidebar, the runtime will process\nthe next message in the list. You can step individual messages by clicking the\nstep button that appears when you hover over the message.\n\nYou can also delete any message from the queue by clicking its delete button. This\nwill prevent the message from passing any further in the flow.\n\nYou can click the play button to resume the flows.\n\n\n## Limitations\n\n - Due to the way Subflows work, breakpoints on Subflow outputs will be ignored\n\n## Roadmap\n\n - Set conditions on individual breakpoints\n - Allow queued messages to be edited\n - Pause only selected nodes/flows/groups\n\n\n## Development\n\nThis plugin has been developed using TypeScript. This means that when running\nfrom the source code rather than npm, it must first be built.\n\n git clone https://github.com/node-red/node-red-debugger.git\n cd node-red-debugger\n npm install\n npm run build\n\nThis will generate all of the plugin files in the `dist` folder - which is where\nNode-RED will expect to load the files from.\n\n\nThen, in your Node-RED user directory (`~/.node-red`) run:\n\n npm install ``\n\n### Themeing\n\nThe Debugger sidebar will use the active Node-RED theme. For the breakpoints\ndrawn within the flow workspace, the following CSS variables will be used if they\nare set by the active theme.\n\n - `--red-ui-flow-debugger-breakpoint-fill`\n - `--red-ui-flow-debugger-breakpoint-stroke`\n - `--red-ui-flow-debugger-breakpoint-active-fill`\n - `--red-ui-flow-debugger-breakpoint-active-stroke`\n - `--red-ui-flow-debugger-breakpoint-inactive-fill`\n - `--red-ui-flow-debugger-breakpoint-inactive-stroke`\n - `--red-ui-flow-debugger-breakpoint-label`\n - `--red-ui-flow-debugger-breakpoint-label-active`\n","readmeFilename":"README.md"} \ No newline at end of file diff --git a/monitoring/node-red/data/.npm/_cacache/index-v5/15/a4/2638498d877ec2c8c3d88cb9c08d7867c52d3fceb6fc64cc5abde73b01a9 b/monitoring/node-red/data/.npm/_cacache/index-v5/15/a4/2638498d877ec2c8c3d88cb9c08d7867c52d3fceb6fc64cc5abde73b01a9 deleted file mode 100644 index 608faea..0000000 --- a/monitoring/node-red/data/.npm/_cacache/index-v5/15/a4/2638498d877ec2c8c3d88cb9c08d7867c52d3fceb6fc64cc5abde73b01a9 +++ /dev/null @@ -1,2 +0,0 @@ - -910aac156dabb4fcf662d29b6bd825588e1e1844 {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.1.tgz","integrity":"sha512-sEfBRYZk+ptqCOkDURC1IxJ6lr1yhdGUctxwL13EmLknQSsOzTJzcI+/nWF1RSBZmsCw4R8+TE1Kx4TnjX2X/g==","time":1775352975936,"size":22123,"metadata":{"time":1775352975918,"url":"https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.1.tgz","reqHeaders":{},"resHeaders":{"cache-control":"public, immutable, max-age=31557600","content-type":"application/octet-stream","date":"Sun, 05 Apr 2026 01:36:15 GMT","etag":"\"8d40a313fd218e46c3e4fe78121b9267\"","last-modified":"Wed, 21 Jul 2021 11:15:11 GMT","vary":"Accept-Encoding"},"options":{"compress":true}}} \ No newline at end of file diff --git a/monitoring/node-red/data/.npm/_cacache/index-v5/48/03/b8903b717bbc1ad41b3f37148db48f54e0828c1aef870973f6672895d689 b/monitoring/node-red/data/.npm/_cacache/index-v5/48/03/b8903b717bbc1ad41b3f37148db48f54e0828c1aef870973f6672895d689 deleted file mode 100644 index 8b8b812..0000000 --- a/monitoring/node-red/data/.npm/_cacache/index-v5/48/03/b8903b717bbc1ad41b3f37148db48f54e0828c1aef870973f6672895d689 +++ /dev/null @@ -1,2 +0,0 @@ - -aaa2f94f98f0490d343865ece4ec971006a4f1c3 {"key":"make-fetch-happen:request-cache:https://registry.npmjs.org/node-red-debugger","integrity":"sha512-wsK2SHDqXFpCtXchBvURI89oTTyDgd4QzMB9ARaNER0KGree4m/aMgswJ8ds/IVhGfe0QIRag8nyLX1zFkPmLw==","time":1775352975866,"size":15640,"metadata":{"time":1775352975857,"url":"https://registry.npmjs.org/node-red-debugger","reqHeaders":{"accept":"application/json"},"resHeaders":{"cache-control":"public, max-age=300","content-encoding":"gzip","content-type":"application/json","date":"Sun, 05 Apr 2026 01:36:15 GMT","etag":"W/\"907dbbf9d3078f923fc58d814f174384\"","last-modified":"Wed, 11 May 2022 04:22:14 GMT","vary":"accept-encoding, accept"},"options":{"compress":true}}} \ No newline at end of file diff --git a/monitoring/node-red/data/.npm/_logs/2026-04-05T01_36_15_515Z-debug-0.log b/monitoring/node-red/data/.npm/_logs/2026-04-05T01_36_15_515Z-debug-0.log deleted file mode 100644 index 9ef2dc8..0000000 --- a/monitoring/node-red/data/.npm/_logs/2026-04-05T01_36_15_515Z-debug-0.log +++ /dev/null @@ -1,29 +0,0 @@ -0 verbose cli /usr/local/bin/node /usr/local/bin/npm -1 info using npm@10.8.2 -2 info using node@v20.20.1 -3 silly config load:file:/usr/local/lib/node_modules/npm/npmrc -4 silly config load:file:/data/.npmrc -5 silly config load:file:/usr/src/node-red/.npmrc -6 silly config load:file:/usr/local/etc/npmrc -7 verbose title npm install node-red-debugger@1.1.1 -8 verbose argv "install" "--no-audit" "--no-update-notifier" "--no-fund" "--save" "--save-prefix" "~" "--omit" "dev" "--engine-strict" "node-red-debugger@1.1.1" -9 verbose logfile logs-max:10 dir:/data/.npm/_logs/2026-04-05T01_36_15_515Z- -10 verbose logfile /data/.npm/_logs/2026-04-05T01_36_15_515Z-debug-0.log -11 silly packumentCache heap:2111832064 maxSize:527958016 maxEntrySize:263979008 -12 silly logfile done cleaning log files -13 silly idealTree buildDeps -14 silly fetch manifest node-red-debugger@1.1.1 -15 silly packumentCache full:https://registry.npmjs.org/node-red-debugger cache-miss -16 http fetch GET 200 https://registry.npmjs.org/node-red-debugger 101ms (cache miss) -17 silly packumentCache full:https://registry.npmjs.org/node-red-debugger set size:undefined disposed:false -18 silly placeDep ROOT node-red-debugger@1.1.1 OK for: node-red-project@0.0.1 want: 1.1.1 -19 silly reify moves {} -20 silly tarball no local data for node-red-debugger@https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.1.tgz. Extracting by manifest. -21 http fetch GET 200 https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.1.tgz 55ms (cache miss) -22 silly ADD node_modules/node-red-debugger -23 verbose cwd /data -24 verbose os Linux 6.12.78 -25 verbose node v20.20.1 -26 verbose npm v10.8.2 -27 verbose exit 0 -28 info ok diff --git a/monitoring/node-red/data/context/00b02bbd01c91485/flow.json b/monitoring/node-red/data/context/00b02bbd01c91485/flow.json deleted file mode 100644 index 2e883c9..0000000 --- a/monitoring/node-red/data/context/00b02bbd01c91485/flow.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dockerUpdateAttempts": {} -} \ No newline at end of file diff --git a/monitoring/node-red/data/context/global/global.json b/monitoring/node-red/data/context/global/global.json deleted file mode 100644 index 2e883c9..0000000 --- a/monitoring/node-red/data/context/global/global.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "dockerUpdateAttempts": {} -} \ No newline at end of file diff --git a/monitoring/node-red/data/flows.json b/monitoring/node-red/data/flows.json deleted file mode 100644 index 93fa7a0..0000000 --- a/monitoring/node-red/data/flows.json +++ /dev/null @@ -1,1285 +0,0 @@ -[ - { - "id": "00b02bbd01c91485", - "type": "tab", - "label": "Grafana Docker Safe Update", - "disabled": false, - "info": "" - }, - { - "id": "f16653fb4cb05bbe", - "type": "tab", - "label": "Health Check", - "disabled": false, - "info": "", - "env": [] - }, - { - "id": "d0f45d2b6f117365", - "type": "tab", - "label": "uptime-kuma alerts", - "disabled": false, - "info": "", - "env": [] - }, - { - "id": "c5240b64a962ea54", - "type": "tab", - "label": "Gotify Messages", - "disabled": false, - "info": "", - "env": [] - }, - { - "id": "22f648a14d2e8fae", - "type": "inject", - "z": "00b02bbd01c91485", - "name": "Test Alert", - "props": [ - { - "p": "payload" - } - ], - "repeat": "", - "crontab": "", - "once": false, - "onceDelay": "", - "topic": "", - "payload": "{\"receiver\":\"node-red\",\"status\":\"firing\",\"alerts\":[{\"status\":\"firing\",\"labels\":{\"Active\":\"telegraf: 0 updates\",\"Restored\":\"telegraf: 0 updates\",\"alertname\":\"Updates\",\"com_docker_compose_project\":\"core\",\"compose_image\":\"telegraf:latest\",\"container\":\"telegraf\",\"grafana_folder\":\"Infrastructure\",\"job\":\"container-updates\",\"running_image\":\"telegraf:latest\"},\"annotations\":{},\"startsAt\":\"2026-03-31T01:16:10Z\",\"endsAt\":\"0001-01-01T00:00:00Z\",\"generatorURL\":\"https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\",\"fingerprint\":\"49b1e1dbf1255191\",\"silenceURL\":\"https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dtelegraf%3A+0+updates&matcher=Restored%3Dtelegraf%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dtelegraf%3Alatest&matcher=container%3Dtelegraf&matcher=job%3Dcontainer-updates&matcher=running_image%3Dtelegraf%3Alatest&orgId=1\",\"dashboardURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171\",\"panelURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171&viewPanel=6\",\"ruleUID\":\"bfgysfo3iregwf\",\"values\":{\"A\":1,\"D\":1},\"valueString\":\"[ var='A' labels={com_docker_compose_project=core, compose_image=telegraf:latest, container=telegraf, job=container-updates, running_image=telegraf:latest} type='query' value=1 ], [ var='D' labels={com_docker_compose_project=core, compose_image=telegraf:latest, container=telegraf, job=container-updates, running_image=telegraf:latest} type='threshold' value=1 ]\",\"orgId\":1},{\"status\":\"firing\",\"labels\":{\"Active\":\"update-test: 0 updates\",\"Restored\":\"update-test: 0 updates\",\"alertname\":\"Updates\",\"com_docker_compose_project\":\"core\",\"compose_image\":\"nginx:1.27.1\",\"container\":\"update-test\",\"grafana_folder\":\"Infrastructure\",\"job\":\"container-updates\",\"running_image\":\"nginx:1.27.0\"},\"annotations\":{},\"startsAt\":\"2026-03-31T01:15:10Z\",\"endsAt\":\"0001-01-01T00:00:00Z\",\"generatorURL\":\"https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\",\"fingerprint\":\"c56bd9f28943cfac\",\"silenceURL\":\"https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dupdate-test%3A+0+updates&matcher=Restored%3Dupdate-test%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dnginx%3A1.27.1&matcher=container%3Dupdate-test&matcher=job%3Dcontainer-updates&matcher=running_image%3Dnginx%3A1.27.0&orgId=1\",\"dashboardURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171\",\"panelURL\":\"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171&viewPanel=6\",\"ruleUID\":\"bfgysfo3iregwf\",\"values\":{\"A\":1,\"D\":1},\"valueString\":\"[ var='A' labels={com_docker_compose_project=core, compose_image=nginx:1.27.1, container=update-test, job=container-updates, running_image=nginx:1.27.0} type='query' value=1 ], [ var='D' labels={com_docker_compose_project=core, compose_image=nginx:1.27.1, container=update-test, job=container-updates, running_image=nginx:1.27.0} type='threshold' value=1 ]\",\"orgId\":1}],\"groupLabels\":{\"alertname\":\"Updates\",\"grafana_folder\":\"Infrastructure\"},\"commonLabels\":{\"alertname\":\"Updates\",\"com_docker_compose_project\":\"core\",\"grafana_folder\":\"Infrastructure\",\"job\":\"container-updates\"},\"commonAnnotations\":{},\"externalURL\":\"https://grafana.lan.ddnsgeek.com/\",\"appVersion\":\"12.4.2\",\"version\":\"1\",\"groupKey\":\"{}/{__grafana_autogenerated__=\\\"true\\\"}/{__grafana_receiver__=\\\"node-red\\\"}/{__grafana_route_settings_hash__=\\\"f177b219cbbdd2e2\\\"}:{alertname=\\\"Updates\\\", grafana_folder=\\\"Infrastructure\\\"}\",\"truncatedAlerts\":0,\"orgId\":1,\"title\":\"[FIRING:2] Updates Infrastructure (core container-updates)\",\"state\":\"alerting\",\"message\":\"**Firing**\\n\\nValue: A=1, D=1\\nLabels:\\n - alertname = Updates\\n - Active = telegraf: 0 updates\\n - Restored = telegraf: 0 updates\\n - com_docker_compose_project = core\\n - compose_image = telegraf:latest\\n - container = telegraf\\n - grafana_folder = Infrastructure\\n - job = container-updates\\n - running_image = telegraf:latest\\nAnnotations:\\nSource: https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\\nSilence: https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dtelegraf%3A+0+updates&matcher=Restored%3Dtelegraf%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dtelegraf%3Alatest&matcher=container%3Dtelegraf&matcher=job%3Dcontainer-updates&matcher=running_image%3Dtelegraf%3Alatest&orgId=1\\nDashboard: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171\\nPanel: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171&viewPanel=6\\n\\nValue: A=1, D=1\\nLabels:\\n - alertname = Updates\\n - Active = update-test: 0 updates\\n - Restored = update-test: 0 updates\\n - com_docker_compose_project = core\\n - compose_image = nginx:1.27.1\\n - container = update-test\\n - grafana_folder = Infrastructure\\n - job = container-updates\\n - running_image = nginx:1.27.0\\nAnnotations:\\nSource: https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\\nSilence: https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dupdate-test%3A+0+updates&matcher=Restored%3Dupdate-test%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dnginx%3A1.27.1&matcher=container%3Dupdate-test&matcher=job%3Dcontainer-updates&matcher=running_image%3Dnginx%3A1.27.0&orgId=1\\nDashboard: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171\\nPanel: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171&viewPanel=6\\n\"}", - "payloadType": "json", - "x": 140, - "y": 100, - "wires": [ - [ - "671243b648c669fe" - ] - ] - }, - { - "id": "17eef927bdc12e54", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Create Pull Command", - "func": "const labels = msg.payload.alerts.labels || {};\nconst container = labels.container;\nconst image = labels.compose_image || labels.running_image || labels.image;\nconst project = labels.com_docker_compose_project;\n\nconst host = project === \"core\" ? \"docker\" : \"raspi\";\n\nif (!container) {\n node.warn(\"No container found in alert labels\");\n return null;\n}\n\nmsg.payload = `PROJECT_ROOT=\"/compose/${host}\" /compose/${host}/services-up.sh --profile all pull -q ${container}`;\nmsg.container = container;\nmsg.image = image;\nmsg.host = host;\n\nnode.log(`New docker update available\n Container: ${container}\n Image: ${image}\n Host: ${host}`);\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1300, - "y": 80, - "wires": [ - [ - "e92429c3061966f7" - ] - ] - }, - { - "id": "e92429c3061966f7", - "type": "exec", - "z": "00b02bbd01c91485", - "command": "", - "addpay": "payload", - "append": "", - "useSpawn": "false", - "timer": "", - "winHide": false, - "oldrc": false, - "name": "Pull Image", - "x": 1510, - "y": 80, - "wires": [ - [ - "5c36c5b0e44d7cb0" - ], - [ - "5c36c5b0e44d7cb0" - ], - [ - "3af6aa9cbaad6ff9" - ] - ] - }, - { - "id": "b8a933687445fb13", - "type": "exec", - "z": "00b02bbd01c91485", - "command": "", - "addpay": "payload", - "append": "", - "useSpawn": "false", - "timer": "70", - "winHide": false, - "oldrc": true, - "name": "Test New Image", - "x": 2160, - "y": 80, - "wires": [ - [ - "40e040d2b58bbaa1", - "4c182d7a643805cd" - ], - [ - "4c182d7a643805cd" - ], - [] - ] - }, - { - "id": "40e040d2b58bbaa1", - "type": "switch", - "z": "00b02bbd01c91485", - "name": "Check Test Result", - "property": "payload", - "propertyType": "msg", - "rules": [ - { - "t": "cont", - "v": "0", - "vt": "str" - }, - { - "t": "else" - } - ], - "checkall": "true", - "repair": false, - "outputs": 2, - "x": 2370, - "y": 80, - "wires": [ - [ - "da5d95a30589805c" - ], - [ - "47ac22574893de41" - ] - ] - }, - { - "id": "ab2063f9180cd1aa", - "type": "exec", - "z": "00b02bbd01c91485", - "command": "", - "addpay": "payload", - "append": "", - "useSpawn": "false", - "timer": "", - "winHide": false, - "oldrc": true, - "name": "Deploy Production Container", - "x": 2960, - "y": 80, - "wires": [ - [ - "32e3684b63a6f13e" - ], - [ - "e8e4151333935b78", - "32e3684b63a6f13e" - ], - [] - ] - }, - { - "id": "a4c73e8e3e87fab7", - "type": "http in", - "z": "00b02bbd01c91485", - "name": "Grafana Webhook", - "url": "/grafana-update", - "method": "post", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 110, - "y": 60, - "wires": [ - [ - "671243b648c669fe" - ] - ] - }, - { - "id": "3af6aa9cbaad6ff9", - "type": "switch", - "z": "00b02bbd01c91485", - "name": "image pulled OK?", - "property": "payload.code", - "propertyType": "msg", - "rules": [ - { - "t": "eq", - "v": "0", - "vt": "num" - }, - { - "t": "else" - } - ], - "checkall": "true", - "repair": false, - "outputs": 2, - "x": 1710, - "y": 80, - "wires": [ - [ - "96c81501330c20e3" - ], - [ - "1de1d1befec88aa4" - ] - ] - }, - { - "id": "96c81501330c20e3", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Build Test Command", - "func": "const container = msg.container;\nconst image = msg.image;\nconst host = msg.host;\nmsg.payload = `/data/test-container.sh ${container} ${host}`;\nmsg.image = image;\nmsg.container = container;\nmsg.host = host\nnode.log(`Pull Successful\n Container: ${container}\n Image: ${msg.image}\n Host: ${host}`\n )\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1940, - "y": 80, - "wires": [ - [ - "b8a933687445fb13" - ] - ] - }, - { - "id": "95e72a493b5b736c", - "type": "split", - "z": "00b02bbd01c91485", - "name": "", - "splt": "\\n", - "spltType": "str", - "arraySplt": 1, - "arraySpltType": "len", - "stream": true, - "addname": "", - "property": "payload.alerts", - "x": 610, - "y": 80, - "wires": [ - [ - "298528baa0f776b4" - ] - ] - }, - { - "id": "da5d95a30589805c", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Build Deploy Command", - "func": "const container = msg.container;\nconst image = msg.image;\nconst host = msg.host;\nmsg.payload = `PROJECT_ROOT=\"/compose/${host}\" /compose/${host}/services-up.sh --profile all up -d ${container}`;\nmsg.image = image;\nmsg.container = container;\nmsg.host = host;\nnode.log(`Test Successful\n Container: ${container}\n Image: ${msg.image}\n Host: ${host}`\n )\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 2670, - "y": 80, - "wires": [ - [ - "ab2063f9180cd1aa" - ] - ] - }, - { - "id": "27ac6d1d2b208f99", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image pull fail", - "mode": "link", - "links": [ - "ba2c4e239d3b1e1d" - ], - "x": 2095, - "y": 140, - "wires": [] - }, - { - "id": "49c52031d95c0638", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image test fail", - "mode": "link", - "links": [ - "10718f4768834442" - ], - "x": 2795, - "y": 140, - "wires": [] - }, - { - "id": "b083fcf71669254e", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker update success", - "mode": "link", - "links": [ - "f5771c9cc8e81779" - ], - "x": 3415, - "y": 80, - "wires": [] - }, - { - "id": "671243b648c669fe", - "type": "function", - "z": "00b02bbd01c91485", - "name": "WEBHOOK /grafana-update IN", - "func": "node.log(\n \"Payload:\\n\" +\n JSON.stringify(msg.payload, null, 2)\n);\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 390, - "y": 80, - "wires": [ - [ - "95e72a493b5b736c" - ] - ] - }, - { - "id": "e8e4151333935b78", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Deployment Success", - "func": "let attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nif (msg.updateKey) {\n const existing = attempts[msg.updateKey] || {};\n attempts[msg.updateKey] = {\n ...existing,\n time: existing.time || Date.now(),\n status: \"success\",\n completedAt: Date.now(),\n notified: true\n };\n flow.set(\"dockerUpdateAttempts\", attempts);\n}\n\nnode.log(`Deployment Successful\n Container: ${msg.container}\n Image: ${msg.image}\n Host: ${msg.host}\n`);\n\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 3240, - "y": 80, - "wires": [ - [ - "b083fcf71669254e" - ] - ] - }, - { - "id": "1de1d1befec88aa4", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Pull Image Failed", - "func": "let attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nif (msg.updateKey && attempts[msg.updateKey]) {\n const firstFailure = !attempts[msg.updateKey].notified;\n\n attempts[msg.updateKey].status = \"pull_failed\";\n attempts[msg.updateKey].failedAt = Date.now();\n\n if (firstFailure) {\n attempts[msg.updateKey].notified = true;\n\n msg.notification = {\n title: `Docker update locked out: ${msg.container}`,\n message:\n `Automatic update for ${msg.container} failed.\n\n` +\n `Image: ${msg.image}\n` +\n `Host: ${msg.host}\n` +\n `Result: ${attempts[msg.updateKey].status}\n\n` +\n `Further Grafana alerts for this update will be ignored until manual intervention.`\n };\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n return [msg, msg];\n }\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n}\n\nnode.log(`Pull image failed\n Command: ${msg.payload}\n Container: ${msg.container}\n Image: ${msg.image}\n Host: ${msg.host}`);\nreturn [msg, null];", - "outputs": 2, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1930, - "y": 140, - "wires": [ - [ - "27ac6d1d2b208f99" - ], - [ - "0e6520dfb81a951b" - ] - ] - }, - { - "id": "47ac22574893de41", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Test Image Failed", - "func": "let attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nif (msg.updateKey && attempts[msg.updateKey]) {\n const firstFailure = !attempts[msg.updateKey].notified;\n\n attempts[msg.updateKey].status = \"test_failed\";\n attempts[msg.updateKey].failedAt = Date.now();\n\n if (firstFailure) {\n attempts[msg.updateKey].notified = true;\n\n msg.notification = {\n title: `Docker update locked out: ${msg.container}`,\n message:\n `Automatic update for ${msg.container} failed.\n\n` +\n `Image: ${msg.image}\n` +\n `Host: ${msg.host}\n` +\n `Result: ${attempts[msg.updateKey].status}\n\n` +\n `Further Grafana alerts for this update will be ignored until manual intervention.`\n };\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n return [msg, msg];\n }\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n}\n\nnode.log(`Test image failed\n Command: ${msg.payload}\n Container: ${msg.container}\n Image: ${msg.image}\n Host: ${msg.host}`);\nreturn [msg, null];", - "outputs": 2, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 2650, - "y": 140, - "wires": [ - [ - "49c52031d95c0638" - ], - [ - "77675958f77d2d5f" - ] - ] - }, - { - "id": "298528baa0f776b4", - "type": "switch", - "z": "00b02bbd01c91485", - "name": "docker project name", - "property": "payload.alerts.labels.com_docker_compose_project", - "propertyType": "msg", - "rules": [ - { - "t": "eq", - "v": "core", - "vt": "str" - }, - { - "t": "eq", - "v": "raspi", - "vt": "str" - }, - { - "t": "else" - } - ], - "checkall": "true", - "repair": false, - "outputs": 3, - "x": 800, - "y": 80, - "wires": [ - [ - "bad4d106425b7dd2" - ], - [ - "bad4d106425b7dd2" - ], - [ - "1ab4069c08a68fa3" - ] - ] - }, - { - "id": "1ab4069c08a68fa3", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Unknown Project", - "func": "const payload = (msg.payload && typeof msg.payload === \"object\") ? msg.payload : {};\nconst labels = (payload.labels && typeof payload.labels === \"object\") ? payload.labels : {};\n\nconst container = labels.container || \"unknown container\";\nconst image = labels.compose_image || labels.running_image || labels.image || \"unknown image\";\nconst project = labels.com_docker_compose_project || \"unknown project\";\n\nnode.warn(`Unable to map project name ${project} to host.\n\nUpdates for ${container} (${image}) failed`);\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1290, - "y": 200, - "wires": [ - [ - "852d039f540dd0d3" - ] - ] - }, - { - "id": "852d039f540dd0d3", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker updates fail unknown", - "mode": "link", - "links": [ - "7c62509d505c281b" - ], - "x": 1455, - "y": 200, - "wires": [] - }, - { - "id": "f4b91e278109e661", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Repeat update Suppressed", - "func": "const labels = msg.payload.alerts.labels || {};\nconst container = labels.container || \"unknown\";\nconst image = labels.compose_image || labels.running_image || labels.image || \"unknown image\";\nconst status = (msg.attemptInfo && msg.attemptInfo.status) || \"unknown\";\n\nnode.warn(\n `Repeated update suppressed for ${container} (${image}). Prior status: ${status}`\n);\n\nreturn null;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1310, - "y": 140, - "wires": [ - [] - ] - }, - { - "id": "5c36c5b0e44d7cb0", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Logging", - "func": "//const labels = msg.payload.alerts.labels || {};\n//const container = labels.container;\n//const image = labels.compose_image || labels.running_image || labels.image;\n\nif (msg.payload != \"\") {\n node.log(msg.payload)\n}\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1680, - "y": 40, - "wires": [ - [] - ] - }, - { - "id": "4c182d7a643805cd", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Logging", - "func": "//const labels = msg.payload.alerts.labels || {};\n//const container = labels.container;\n//const image = labels.compose_image || labels.running_image || labels.image;\nif (msg.payload != \"\") {\n node.log(msg.payload)\n}\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 2340, - "y": 40, - "wires": [ - [] - ] - }, - { - "id": "32e3684b63a6f13e", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Logging", - "func": "//const labels = msg.payload.alerts.labels || {};\n//const container = labels.container;\n//const image = labels.compose_image || labels.running_image || labels.image;\nif (msg.payload != \"\") {\n node.log(msg.payload)\n}\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 3200, - "y": 40, - "wires": [ - [] - ] - }, - { - "id": "bad4d106425b7dd2", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Check Already Attempted", - "func": "const SUCCESS_TTL_MS = 36 * 60 * 60 * 1000;\nconst now = Date.now();\n\nconst labels = msg.payload.alerts.labels || {};\n\nconst container = labels.container;\nconst image = labels.compose_image || labels.running_image || labels.image;\nconst project = labels.com_docker_compose_project;\n\nif (!container || !image) {\n node.warn(\"Missing container/image labels; skipping update attempt tracking\");\n return [null, null];\n}\n\n// Load persistent attempt registry\nlet attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\n// Prune old successful records so they don't accumulate forever\nfor (const [k, v] of Object.entries(attempts)) {\n if (v && v.status === \"success\" && v.completedAt && (now - v.completedAt) > SUCCESS_TTL_MS) {\n delete attempts[k];\n }\n}\n\nconst host = project === \"core\" ? \"docker\" : \"raspi\";\n\n// Unique key for this exact update attempt\nconst key = `${container}|${image}|${host}`;\n\n// If we've already tried this image for this container, suppress it\nif (attempts[key]) {\n node.warn(\n `Ignoring repeated update alert for ${container} -> ${image}. ` +\n `Already handled with status '${attempts[key].status}' at ${new Date(attempts[key].time).toISOString()}`\n );\n\n msg.suppressed = true;\n msg.updateKey = key;\n msg.attemptInfo = attempts[key];\n\n flow.set(\"dockerUpdateAttempts\", attempts);\n\n return [null, msg];\n}\n\n// First time we've seen this update, record it immediately\nattempts[key] = {\n time: Date.now(),\n status: \"started\"\n};\n\nflow.set(\"dockerUpdateAttempts\", attempts);\n\nmsg.updateKey = key;\n\nnode.log(`First attempt for ${container} -> ${image}`);\n\nreturn [msg, null];", - "outputs": 2, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1050, - "y": 80, - "wires": [ - [ - "17eef927bdc12e54" - ], - [ - "f4b91e278109e661" - ] - ] - }, - { - "id": "0e6520dfb81a951b", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image update locked", - "mode": "link", - "links": [ - "b72f58c8b6d6d265" - ], - "x": 2095, - "y": 200, - "wires": [] - }, - { - "id": "77675958f77d2d5f", - "type": "link out", - "z": "00b02bbd01c91485", - "name": "Docker image update locked", - "mode": "link", - "links": [ - "b72f58c8b6d6d265" - ], - "x": 2795, - "y": 200, - "wires": [] - }, - { - "id": "8c74f9646c655f07", - "type": "http in", - "z": "00b02bbd01c91485", - "name": "/docker-update-lockouts in", - "url": "/docker-update-lockouts", - "method": "get", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 250, - "y": 340, - "wires": [ - [ - "bf13590833ea0288" - ] - ] - }, - { - "id": "bf13590833ea0288", - "type": "function", - "z": "00b02bbd01c91485", - "name": "get docker update lockouts", - "func": "const attempts = flow.get(\"dockerUpdateAttempts\") || {};\n\nconst output = Object.entries(attempts).map(([key, value]) => ({\n key,\n status: value.status || null,\n firstAttempt: value.time ? new Date(value.time).toISOString() : null,\n completedAt: value.completedAt ? new Date(value.completedAt).toISOString() : null,\n failedAt: value.failedAt ? new Date(value.failedAt).toISOString() : null,\n notified: !!value.notified\n}));\n\nmsg.payload = output;\nnode.log(JSON.stringify(msg.payload, null, 2));\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 540, - "y": 340, - "wires": [ - [ - "2fc3cf8f165b7537" - ] - ] - }, - { - "id": "2fc3cf8f165b7537", - "type": "http response", - "z": "00b02bbd01c91485", - "name": "", - "statusCode": "", - "headers": {}, - "x": 770, - "y": 340, - "wires": [] - }, - { - "id": "81f6db49f4ad354a", - "type": "http in", - "z": "00b02bbd01c91485", - "name": "clear lockout", - "url": "/docker-update-lockouts/clear", - "method": "post", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 210, - "y": 480, - "wires": [ - [ - "28d736c3d3a4cf14" - ] - ] - }, - { - "id": "7bae4cc1bd52dfd8", - "type": "http response", - "z": "00b02bbd01c91485", - "name": "", - "statusCode": "", - "headers": {}, - "x": 770, - "y": 480, - "wires": [] - }, - { - "id": "28d736c3d3a4cf14", - "type": "function", - "z": "00b02bbd01c91485", - "name": "Clear lockout", - "func": "let attempts = flow.get(\"dockerUpdateAttempts\") || {};\nconst key = (msg.payload.key || \"\").trim(); // trim whitespace\n\n// optionally log all keys for debugging\nnode.log(\"Available keys: \" + Object.keys(attempts).join(\", \"));\nnode.log(\"Requested key: '\" + key + \"'\");\n\nif (key in attempts) { // use 'in' to avoid false negatives\n delete attempts[key];\n flow.set(\"dockerUpdateAttempts\", attempts);\n\n msg.payload = { success: true, cleared: key };\n node.log(`Cleared update lock for ${key}`);\n} else {\n msg.payload = { success: false, error: `No lock found for '${key}'` };\n}\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 490, - "y": 480, - "wires": [ - [ - "7bae4cc1bd52dfd8" - ] - ] - }, - { - "id": "b113615f19bd2588", - "type": "http in", - "z": "f16653fb4cb05bbe", - "name": "/health in", - "url": "/health", - "method": "get", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 380, - "y": 220, - "wires": [ - [ - "4bf7d7901301ce7e" - ] - ] - }, - { - "id": "4bf7d7901301ce7e", - "type": "function", - "z": "f16653fb4cb05bbe", - "name": "health check", - "func": "msg.payload = { status: \"ok\" };\nmsg.headers = { \"Content-Type\": \"application/json\" };\nnode.log(msg.payload.status);\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 670, - "y": 220, - "wires": [ - [ - "269da1ef164eeb72" - ] - ] - }, - { - "id": "269da1ef164eeb72", - "type": "http response", - "z": "f16653fb4cb05bbe", - "name": "", - "statusCode": "", - "headers": {}, - "x": 950, - "y": 220, - "wires": [] - }, - { - "id": "40ed22bfb88a0d78", - "type": "http in", - "z": "d0f45d2b6f117365", - "name": "/uptime-kuma in", - "url": "/uptime-kuma", - "method": "post", - "upload": false, - "skipBodyParsing": false, - "swaggerDoc": "", - "x": 320, - "y": 200, - "wires": [ - [ - "46affc0319a44fa9", - "ab7d36db8e9316f8" - ] - ] - }, - { - "id": "4e0b1edf6f60d701", - "type": "http response", - "z": "d0f45d2b6f117365", - "name": "response", - "statusCode": "", - "headers": {}, - "x": 860, - "y": 200, - "wires": [] - }, - { - "id": "46affc0319a44fa9", - "type": "link out", - "z": "d0f45d2b6f117365", - "name": "gotify domain name alerts", - "mode": "link", - "links": [ - "bed17b50dd678228" - ], - "x": 615, - "y": 120, - "wires": [] - }, - { - "id": "ab7d36db8e9316f8", - "type": "function", - "z": "d0f45d2b6f117365", - "name": "WEBHOOK /uptime-kuma IN", - "func": "node.log(\n \"Payload:\\n\" +\n JSON.stringify(msg.payload, null, 2)\n);\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 620, - "y": 200, - "wires": [ - [ - "4e0b1edf6f60d701" - ] - ] - }, - { - "id": "0301a3cebd1eb23f", - "type": "http request", - "z": "c5240b64a962ea54", - "name": "Send to gotify", - "method": "POST", - "ret": "obj", - "paytoqs": "ignore", - "url": "http://gotify/message?token=ATSMpSKrdNjKXeT", - "tls": "", - "persist": false, - "proxy": "", - "insecureHTTPParser": false, - "authType": "", - "senderr": false, - "headers": [ - { - "keyType": "other", - "keyValue": "Content-Type", - "valueType": "other", - "valueValue": "application/json" - } - ], - "x": 1300, - "y": 280, - "wires": [ - [] - ] - }, - { - "id": "bed17b50dd678228", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Doman name alerts", - "links": [ - "46affc0319a44fa9" - ], - "x": 275, - "y": 100, - "wires": [ - [ - "6e58de21ded7459e" - ] - ] - }, - { - "id": "6e58de21ded7459e", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Domain name alerts", - "func": "const name = msg.payload.monitor.name;\nconst hb = msg.payload.heartbeat;\n\nconst isUp = hb.status === 1;\n\nconst icon = isUp ? \"\u2705\" : \"\ud83d\udd34\";\nconst state = isUp ? \"UP\" : \"DOWN\";\n\n// Build a short title for the Gotify notification\nconst title = `${icon} ${name} is ${state}`;\nconst time = hb.localDateTime.split(\" \")[1].split(\":\").slice(0, 2).join(\":\");\n// Build a more detailed message\nlet message = `${icon} Monitor: ${name}\\n`;\nmessage += `Status: ${state}\\n`;\nmessage += `Time: ${time}\\n`;\nmessage += `Details: ${hb.msg}`;\n\nif (hb.ping !== undefined) {\n message += `\\nPing: ${hb.ping} ms`;\n}\n\nif (hb.duration !== undefined) {\n message += `\\nCheck Interval: ${hb.duration} sec`;\n}\n\n// Higher priority for down alerts\nmsg.payload = {\n title: title,\n message: message,\n priority: isUp ? 5 : 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 480, - "y": 100, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "8630c7dfcdbcce50", - "type": "function", - "z": "c5240b64a962ea54", - "name": "GOTIFY alert OUT", - "func": "node.log(JSON.stringify(msg.payload, null, 2));\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 1070, - "y": 280, - "wires": [ - [ - "0301a3cebd1eb23f" - ] - ] - }, - { - "id": "0135d283b9edfb01", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker Pull Failed", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\n\nmsg.payload = {\n title: \"Docker Update Failed\",\n message: `Pull failed for ${container}\\n${stderr}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 710, - "y": 200, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "ba2c4e239d3b1e1d", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker pull failed alerts", - "links": [ - "27ac6d1d2b208f99" - ], - "x": 275, - "y": 200, - "wires": [ - [ - "c1aa11bb22cc33dd" - ] - ] - }, - { - "id": "4eafade32c867e40", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker test failed", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\n\nmsg.payload = {\n title: \"Testing Failed\",\n message: `Testing failed for ${container}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 710, - "y": 300, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "10718f4768834442", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker test failed alerts", - "links": [ - "49c52031d95c0638" - ], - "x": 275, - "y": 300, - "wires": [ - [ - "d2aa11bb22cc33dd" - ] - ] - }, - { - "id": "7d8200040f9b1e83", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker update success", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\n\nmsg.payload = {\n title: \"Container Updated\",\n message: `Container: ${container}\n Host: ${msg.host}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 790, - "y": 380, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "f5771c9cc8e81779", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update success alerts", - "links": [ - "b083fcf71669254e" - ], - "x": 275, - "y": 380, - "wires": [ - [ - "e3aa11bb22cc33dd" - ] - ] - }, - { - "id": "c3d07241f4a570af", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker updates Unknown Project", - "func": "const payload = (msg.payload && typeof msg.payload === \"object\") ? msg.payload : {};\nconst labels = (payload.labels && typeof payload.labels === \"object\") ? payload.labels : {};\n\nconst container = msg.container || labels.container || \"unknown container\";\nconst project = labels.com_docker_compose_project || msg.project || \"unknown project\";\n\nmsg.payload = {\n title: \"Container Updates Failed\",\n message: `The ${container} container has failed.\n\nUnknown project ${project}`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 800, - "y": 460, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "7c62509d505c281b", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update unknown project", - "links": [ - "852d039f540dd0d3" - ], - "x": 275, - "y": 460, - "wires": [ - [ - "f4aa11bb22cc33dd" - ] - ] - }, - { - "id": "d1346f7151103832", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker updates for Raspi", - "func": "const container = msg.container || \"unknown container\";\nconst code = msg.payload.code;\nconst stderr = flow.get(\"pull_stderr\") || \"Unknown error\";\nconst project = msg.payload.labels.com_docker_compose_project\nmsg.payload = {\n title: \"Container Updates Available - Raspi\",\n message: `The ${container} container has updates available.`,\n priority: 8\n};\n\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 750, - "y": 520, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "e6c64cd6d405b8ed", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update for raspi", - "links": [], - "x": 275, - "y": 520, - "wires": [ - [ - "a5aa11bb22cc33dd" - ] - ] - }, - { - "id": "b72f58c8b6d6d265", - "type": "link in", - "z": "c5240b64a962ea54", - "name": "Docker update locked", - "links": [ - "0e6520dfb81a951b", - "77675958f77d2d5f" - ], - "x": 275, - "y": 580, - "wires": [ - [ - "b6aa11bb22cc33dd" - ] - ] - }, - { - "id": "1a9798d5c081240a", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Docker updates locked", - "func": "const container = msg.container || \"unknown container\";\nconst defaultPayload = {\n title: \"Update Locked out\",\n message: `Container: ${container}\nHost: ${msg.host}\n\nManual intervention required.`,\n priority: 8\n};\n\nif (msg.notification) {\n msg.payload = {\n title: msg.notification.title || defaultPayload.title,\n message: msg.notification.message || defaultPayload.message,\n priority: 8\n };\n return msg;\n}\n\nmsg.payload = defaultPayload;\nreturn msg;", - "outputs": 1, - "timeout": 0, - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 740, - "y": 580, - "wires": [ - [ - "8630c7dfcdbcce50" - ] - ] - }, - { - "id": "a1f8e9b2c3d4e5f6", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Build update log event", - "func": "const nowIso = new Date().toISOString();\nconst startedAt = msg.update_started_at || Date.now();\nconst durationMs = Math.max(0, Date.now() - startedAt);\n\nconst payload = (msg.payload && typeof msg.payload === \"object\") ? msg.payload : {};\nconst labels = payload.labels || {};\n\nconst status = (msg.update_status || payload.status || \"unknown\").toString().toLowerCase();\n\nmsg.payload = JSON.stringify({\n ts: nowIso,\n flow: \"docker-updates\",\n event: msg.update_event || \"attempt\",\n container: msg.container || labels.container || \"unknown\",\n project: labels.com_docker_compose_project || msg.project || \"unknown\",\n host: msg.host || \"unknown\",\n status,\n success: status === \"success\" ? 1 : 0,\n failed: [\"failed\", \"locked\"].includes(status) ? 1 : 0,\n duration_ms: durationMs,\n code: Number.isFinite(Number(payload.code)) ? Number(payload.code) : 0,\n error: (msg.update_error || payload.error || \"\").toString().slice(0, 300)\n});\n\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 690, - "y": 660, - "wires": [ - [ - "b1c2d3e4f5a69788" - ] - ] - }, - { - "id": "b1c2d3e4f5a69788", - "type": "file", - "z": "c5240b64a962ea54", - "name": "Write update event log", - "filename": "/data/update-events.ndjson", - "filenameType": "str", - "appendNewline": true, - "createDir": false, - "overwriteFile": "false", - "encoding": "none", - "x": 930, - "y": 660, - "wires": [ - [] - ] - }, - { - "id": "c1aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Pull Failed", - "func": "msg.update_status = \"failed\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 200, - "wires": [ - [ - "0135d283b9edfb01", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "d2aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Test Failed", - "func": "msg.update_status = \"failed\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 300, - "wires": [ - [ - "4eafade32c867e40", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "e3aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Update Success", - "func": "msg.update_status = \"success\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 380, - "wires": [ - [ - "7d8200040f9b1e83", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "f4aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Unknown Project", - "func": "msg.update_status = \"failed\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 460, - "wires": [ - [ - "c3d07241f4a570af", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "a5aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Update Attempt", - "func": "msg.update_status = \"attempt\";\nmsg.update_event = \"attempt\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 470, - "y": 520, - "wires": [ - [ - "d1346f7151103832", - "a1f8e9b2c3d4e5f6" - ] - ] - }, - { - "id": "b6aa11bb22cc33dd", - "type": "function", - "z": "c5240b64a962ea54", - "name": "Mark Docker Update Locked", - "func": "msg.update_status = \"locked\";\nmsg.update_event = \"completed\";\nreturn msg;", - "outputs": 1, - "timeout": "", - "noerr": 0, - "initialize": "", - "finalize": "", - "libs": [], - "x": 460, - "y": 580, - "wires": [ - [ - "1a9798d5c081240a", - "a1f8e9b2c3d4e5f6" - ] - ] - } -] \ No newline at end of file diff --git a/monitoring/node-red/data/flows_cred.json b/monitoring/node-red/data/flows_cred.json deleted file mode 100644 index 4b0f3a5..0000000 --- a/monitoring/node-red/data/flows_cred.json +++ /dev/null @@ -1,3 +0,0 @@ -{ - "$": "b5f1756334f073b04b89cd6319c4ce1aBB8dAVwKD38fNXCo2L9NODemuEpJ4T4=" -} \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/.package-lock.json b/monitoring/node-red/data/node_modules/.package-lock.json deleted file mode 100644 index b252c9b..0000000 --- a/monitoring/node-red/data/node_modules/.package-lock.json +++ /dev/null @@ -1,14 +0,0 @@ -{ - "name": "node-red-project", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "node_modules/node-red-debugger": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.1.tgz", - "integrity": "sha512-sEfBRYZk+ptqCOkDURC1IxJ6lr1yhdGUctxwL13EmLknQSsOzTJzcI+/nWF1RSBZmsCw4R8+TE1Kx4TnjX2X/g==", - "license": "Apache-2" - } - } -} diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/CHANGELOG.md b/monitoring/node-red/data/node_modules/node-red-debugger/CHANGELOG.md deleted file mode 100644 index 8fb9244..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/CHANGELOG.md +++ /dev/null @@ -1,19 +0,0 @@ -### 1.1.1 - - - Do not send full message object in messageQueued event Fixes #8 - -### 1.1.0 - - - Require Node-RED 2.0.0-beta.2 - - Allow debugger to pause just breakpoint nodes - - Better display >99 message queue count on node annotation - - Publish debugger state as retained to make resync easier - - Add Japanese translations (#7) @kazuhitoyokoi - -### 1.0.1 - - - Fix case sensitivity of filenames due to TypeScript being TypeScript - -### 1.0.0 - - - First public release of the Flow Debugger diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/LICENSE b/monitoring/node-red/data/node_modules/node-red-debugger/LICENSE deleted file mode 100644 index feaf1c9..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/LICENSE +++ /dev/null @@ -1,178 +0,0 @@ -Copyright OpenJS Foundation and other contributors, https://openjsf.org/ - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/README.md b/monitoring/node-red/data/node_modules/node-red-debugger/README.md deleted file mode 100644 index bff8ee2..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/README.md +++ /dev/null @@ -1,105 +0,0 @@ -# Node-RED Flow Debugger - -This module is a Plugin for Node-RED 2.x. It provides a flow debugger with the following -features: - - - set breakpoints on node inputs or outputs - - pause the runtime manually or when a message arrives at a breakpoint - - once paused you can: - - inspect the queued up messages - - step forward individual messages - - drop messages - -## Installation - -Install this module in your Node-RED user directory or via the Palette Manager -then restart Node-RED - - npm install node-red-debugger - - -## Usage - -The Flow Debugger adds a new sidebar tab in the editor. Select it from the dropdown -menu. - -By default, the debugger is disabled. Click the 'disabled' toggle button to enable it. - -The sidebar has two sections - a list of the breakpoints you have set and a list -of any messages queued up in the runtime. - -### Working with breakpoints - -With the debugger enabled, when you hover over a node's port a breakpoint indicator -will appear. Move your mouse over the indicator and click once - it will turn solid blue -and an entry will appear in the sidebar. - -If you click on it again, the breakpoint will be deactivated but remain in place (light blue). - -Clicking on it again will remove the breakpoint entirely (dotted outline). - -You can also deactive a breakpoint using its checkbox in the sidebar, and remove it by -clicking the `x` button. - -### Pausing the runtime - -The runtime will by paused whenever a message arrives at an active breakpoint. You -can also manually pause the runtime using the pause button in the sidebar. - -Once paused, the flow will show how many messages are queued up at each node input -and output. Those messages will also be listed in the sidebar - in the order the -runtime will process them. - -If you click the step button at the top of the sidebar, the runtime will process -the next message in the list. You can step individual messages by clicking the -step button that appears when you hover over the message. - -You can also delete any message from the queue by clicking its delete button. This -will prevent the message from passing any further in the flow. - -You can click the play button to resume the flows. - - -## Limitations - - - Due to the way Subflows work, breakpoints on Subflow outputs will be ignored - -## Roadmap - - - Set conditions on individual breakpoints - - Allow queued messages to be edited - - Pause only selected nodes/flows/groups - - -## Development - -This plugin has been developed using TypeScript. This means that when running -from the source code rather than npm, it must first be built. - - git clone https://github.com/node-red/node-red-debugger.git - cd node-red-debugger - npm install - npm run build - -This will generate all of the plugin files in the `dist` folder - which is where -Node-RED will expect to load the files from. - - -Then, in your Node-RED user directory (`~/.node-red`) run: - - npm install `` - -### Themeing - -The Debugger sidebar will use the active Node-RED theme. For the breakpoints -drawn within the flow workspace, the following CSS variables will be used if they -are set by the active theme. - - - `--red-ui-flow-debugger-breakpoint-fill` - - `--red-ui-flow-debugger-breakpoint-stroke` - - `--red-ui-flow-debugger-breakpoint-active-fill` - - `--red-ui-flow-debugger-breakpoint-active-stroke` - - `--red-ui-flow-debugger-breakpoint-inactive-fill` - - `--red-ui-flow-debugger-breakpoint-inactive-stroke` - - `--red-ui-flow-debugger-breakpoint-label` - - `--red-ui-flow-debugger-breakpoint-label-active` diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.html b/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.html deleted file mode 100644 index 42c29cf..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.html +++ /dev/null @@ -1,2 +0,0 @@ - - diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js b/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js deleted file mode 100644 index 2280be7..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js +++ /dev/null @@ -1,140 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -const debugger_1 = require("./lib/debugger"); -const location_1 = require("./lib/location"); -module.exports = (RED) => { - const apiRoot = "/flow-debugger"; - RED.plugins.registerPlugin("node-red-debugger", { - onadd: () => { - const flowDebugger = new debugger_1.Debugger(RED); - const routeAuthHandler = RED.auth.needsPermission("flow-debugger.write"); - RED.comms.publish("flow-debugger/connected", true, true); - function publishState() { - RED.comms.publish("flow-debugger/state", flowDebugger.getState()); - } - flowDebugger.on("paused", (event) => { - RED.comms.publish("flow-debugger/paused", event); - }); - flowDebugger.on("resumed", (event) => { - RED.comms.publish("flow-debugger/resumed", event); - }); - flowDebugger.on("messageQueued", (event) => { - // Don't include the full message on the event - // event.msg = RED.util.encodeObject({msg:event.msg}, {maxLength: 100}); - delete event.msg; - RED.comms.publish("flow-debugger/messageQueued", event); - }); - flowDebugger.on("messageDispatched", (event) => { - RED.comms.publish("flow-debugger/messageDispatched", event); - }); - // flowDebugger.on("step", (event) => { - // - // }); - RED.httpAdmin.get(`${apiRoot}`, (_, res) => { - res.json(flowDebugger.getState()); - }); - RED.httpAdmin.put(`${apiRoot}`, routeAuthHandler, (req, res) => { - let stateChanged = false; - if (req.body.hasOwnProperty("enabled")) { - const enabled = !!req.body.enabled; - if (enabled && !flowDebugger.enabled) { - flowDebugger.enable(); - stateChanged = true; - } - else if (!enabled && flowDebugger.enabled) { - flowDebugger.disable(); - stateChanged = true; - } - } - if (req.body.hasOwnProperty("config")) { - stateChanged = flowDebugger.setConfig(req.body.config); - } - if (stateChanged) { - publishState(); - } - res.json(flowDebugger.getState()); - }); - RED.httpAdmin.get(`${apiRoot}/breakpoints`, routeAuthHandler, (_, res) => { - res.json(flowDebugger.getBreakpoints()); - }); - RED.httpAdmin.put(`${apiRoot}/breakpoints/:id`, routeAuthHandler, (req, res) => { - flowDebugger.setBreakpointActive(req.params.id, req.body.active); - res.json(flowDebugger.getBreakpoint(req.params.id)); - }); - RED.httpAdmin.delete(`${apiRoot}/breakpoints/:id`, routeAuthHandler, (req, res) => { - flowDebugger.clearBreakpoint(req.params.id); - res.sendStatus(200); - }); - RED.httpAdmin.post(`${apiRoot}/breakpoints`, routeAuthHandler, (req, res) => { - // req.body.location - const breakpointId = flowDebugger.setBreakpoint(new location_1.Location(req.body.id, req.body.path, req.body.portType, req.body.portIndex)); - res.json(flowDebugger.getBreakpoint(breakpointId)); - }); - RED.httpAdmin.get(`${apiRoot}/messages`, routeAuthHandler, (_, res) => { - res.json(Array.from(flowDebugger.getMessageQueue()).map(m => { - const result = { - id: m.id, - location: m.location.toString(), - destination: undefined, - msg: RED.util.encodeObject({ msg: m.event.msg }, { maxLength: 100 }) - }; - if (m.event.hasOwnProperty('source')) { - // SendEvent - so include the destination location id - result.destination = m.event.destination.id + "[i][0]"; - } - return result; - })); - }); - RED.httpAdmin.get(`${apiRoot}/messages/:id`, routeAuthHandler, (req, res) => { - const id = req.params.id; - const messageEvent = flowDebugger.getMessageQueue().get(parseInt(id, 10)); - if (messageEvent) { - const result = { - id: messageEvent.id, - location: messageEvent.location, - destination: undefined, - msg: RED.util.encodeObject({ msg: messageEvent.event.msg }, { maxLength: 100 }) - }; - if (messageEvent.event.hasOwnProperty('source')) { - // SendEvent - so include the destination location id - result.destination = messageEvent.event.destination.id + "[i][0]"; - } - res.json(result); - } - else { - res.sendStatus(404); - } - }); - RED.httpAdmin.delete(`${apiRoot}/messages/:id`, routeAuthHandler, (req, res) => { - flowDebugger.deleteMessage(parseInt(req.params.id, 10)); - res.sendStatus(200); - }); - RED.httpAdmin.post(`${apiRoot}/pause`, routeAuthHandler, (_, res) => { - flowDebugger.pause(); - res.sendStatus(200); - }); - RED.httpAdmin.post(`${apiRoot}/step`, routeAuthHandler, (req, res) => { - let stepMessage = null; - if (req.body && req.body.message) { - stepMessage = req.body.message; - } - flowDebugger.step(stepMessage); - res.sendStatus(200); - }); - RED.httpAdmin.post(`${apiRoot}/resume`, routeAuthHandler, (_, res) => { - flowDebugger.resume(); - res.sendStatus(200); - }); - } - }); -}; -/* - -/flow-debugger/enable -/flow-debugger/disable -/flow-debugger/breakpoint - - - -*/ -//# sourceMappingURL=flow-debugger.js.map \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js.map b/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js.map deleted file mode 100644 index 66c418b..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/flow-debugger.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"flow-debugger.js","sourceRoot":"","sources":["../src/flow-debugger.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js deleted file mode 100644 index 6a614d5..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js +++ /dev/null @@ -1,83 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.MessageQueue = void 0; -class MessageQueue { - constructor(queueName) { - this.queueName = queueName; - this.previousName = `previousBy${queueName}`; - this.nextName = `nextBy${queueName}`; - this.length = 0; - } - enqueue(event) { - if (!this.head) { - this.head = event; - } - event[this.previousName] = this.tail; - if (this.tail) { - this.tail[this.nextName] = event; - } - this.tail = event; - this.length++; - } - next() { - const result = this.head; - if (result) { - this.remove(result); - this.length--; - } - return result; - } - peek() { - return this.head; - } - get(id) { - let p = this.head; - while (p) { - if (p.id === id) { - return p; - } - p = p[this.nextName]; - } - } - remove(event) { - const previousEvent = event[this.previousName]; - const nextEvent = event[this.nextName]; - if (previousEvent) { - previousEvent[this.nextName] = nextEvent; - } - else { - this.head = nextEvent; - } - if (nextEvent) { - nextEvent[this.previousName] = previousEvent; - } - else { - this.tail = previousEvent; - } - this.length--; - } - *[Symbol.iterator]() { - let p = this.head; - while (p) { - yield p; - p = p[this.nextName]; - } - } - dump() { - let result = `MessageQueue ${this.queueName} [${this.length}] - head: ${this.head.id} - tail: ${this.tail.id} - list: `; - let p = this.head; - while (p) { - result = result + p.id; - p = p[this.nextName]; - if (p) { - result += " > "; - } - } - return result; - } -} -exports.MessageQueue = MessageQueue; -//# sourceMappingURL=MessageQueue.js.map \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js.map b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js.map deleted file mode 100644 index d1d70e0..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/MessageQueue.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"MessageQueue.js","sourceRoot":"","sources":["../../src/lib/MessageQueue.ts"],"names":[],"mappings":";;;AAEA,MAAa,YAAY;IAQrB,YAAY,SAAgB;QACxB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;QAC3B,IAAI,CAAC,YAAY,GAAG,aAAa,SAAS,EAAE,CAAA;QAC5C,IAAI,CAAC,QAAQ,GAAG,SAAS,SAAS,EAAE,CAAA;QACpC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;IACpB,CAAC;IACD,OAAO,CAAC,KAAkB;QACtB,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE;YACZ,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;SACrB;QACD,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QACrC,IAAI,IAAI,CAAC,IAAI,EAAE;YACX,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,KAAK,CAAC;SACpC;QACD,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IACD,IAAI;QACA,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC;QACzB,IAAI,MAAM,EAAE;YACR,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;YACpB,IAAI,CAAC,MAAM,EAAE,CAAC;SACjB;QACD,OAAO,MAAM,CAAC;IAClB,CAAC;IACD,IAAI;QACA,OAAO,IAAI,CAAC,IAAI,CAAC;IACrB,CAAC;IACD,GAAG,CAAC,EAAS;QACT,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAClB,OAAM,CAAC,EAAE;YACL,IAAI,CAAC,CAAC,EAAE,KAAK,EAAE,EAAE;gBACb,OAAO,CAAC,CAAC;aACZ;YACD,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAA;SACvB;IACL,CAAC;IACD,MAAM,CAAC,KAAkB;QACrB,MAAM,aAAa,GAAG,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QAC/C,MAAM,SAAS,GAAG,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACvC,IAAI,aAAa,EAAE;YACf,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;SAC5C;aAAM;YACH,IAAI,CAAC,IAAI,GAAG,SAAS,CAAC;SACzB;QACD,IAAI,SAAS,EAAE;YACX,SAAS,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,aAAa,CAAC;SAChD;aAAM;YACH,IAAI,CAAC,IAAI,GAAG,aAAa,CAAC;SAC7B;QACD,IAAI,CAAC,MAAM,EAAE,CAAC;IAClB,CAAC;IACD,CAAC,CAAC,MAAM,CAAC,QAAQ,CAAC;QACd,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAClB,OAAM,CAAC,EAAE;YACL,MAAM,CAAC,CAAC;YACR,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACxB;IACL,CAAC;IACD,IAAI;QACA,IAAI,MAAM,GAAG,gBAAgB,IAAI,CAAC,SAAS,KAAK,IAAI,CAAC,MAAM;UACzD,IAAI,CAAC,IAAI,CAAC,EAAE;UACZ,IAAI,CAAC,IAAI,CAAC,EAAE;SACb,CAAC;QACF,IAAI,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAClB,OAAM,CAAC,EAAE;YACL,MAAM,GAAG,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC;YACvB,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YACrB,IAAI,CAAC,EAAE;gBACH,MAAM,IAAI,KAAK,CAAC;aACnB;SACJ;QACD,OAAO,MAAM,CAAA;IAEjB,CAAC;CACJ;AAnFD,oCAmFC"} \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js deleted file mode 100644 index edf9d54..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js +++ /dev/null @@ -1,370 +0,0 @@ -"use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - Object.defineProperty(o, k2, { enumerable: true, get: function() { return m[k]; } }); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.Debugger = void 0; -const Location = __importStar(require("./location")); -const MessageQueue_1 = require("./MessageQueue"); -const events_1 = require("events"); -const DEBUGGER_PAUSED = Symbol("node-red-debugger: paused"); -let BREAKPOINT_ID = 1; -class Debugger extends events_1.EventEmitter { - // Events: - // paused / resumed - constructor(RED) { - super(); - this.config = { - breakpointAction: "pause-all" - }; - this.RED = RED; - this.enabled = false; - this.breakpoints = new Map(); - this.pausedLocations = new Set(); - this.breakpointsByLocation = new Map(); - this.queuesByLocation = {}; - this.messageQueue = new MessageQueue_1.MessageQueue("Time"); - this.eventNumber = 0; - } - log(message) { - this.RED.log.info(`[flow-debugger] ${message}`); - } - checkLocation(location, event, done) { - const breakpointId = location.getBreakpointLocation(); - if (this.isNodePaused(location.id)) { - this.queueEvent(location, event, done); - } - else { - if (event.msg && event.msg[DEBUGGER_PAUSED]) { - this.pause({ - reason: "step", - node: location.id - }); - this.queueEvent(location, event, done); - } - else { - const bp = this.breakpointsByLocation.get(breakpointId); - if (bp && bp.active) { - this.pause({ - reason: "breakpoint", - node: location.id, - breakpoint: bp.id - }); - this.queueEvent(location, event, done); - } - else { - done(); - } - } - } - } - enable() { - this.log("Enabled"); - this.enabled = true; - this.RED.hooks.add("preRoute.flow-debugger", (sendEvent, done) => { - if (isNodeInSubflowModule(sendEvent.source.node)) { - // Inside a subflow module - don't pause the event - done(); - return; - } - if (sendEvent.source.node._flow.TYPE !== "flow" && sendEvent.source.node.id === sendEvent.source.node._flow.id) { - // This is the subflow output which, in the current implementation - // means the message is actually about to be routed to the first node - // inside the subflow, not the output of actual subflow. - done(); - return; - } - if (sendEvent.cloneMessage) { - sendEvent.msg = this.RED.util.cloneMessage(sendEvent.msg); - sendEvent.cloneMessage = false; - } - const eventLocation = Location.createLocation(sendEvent); - // console.log("preRoute",eventLocation.toString()); - this.checkLocation(eventLocation, sendEvent, done); - }); - this.RED.hooks.add("onReceive.flow-debugger", (receiveEvent, done) => { - if (receiveEvent.destination.node.type === "inject") { - // Never pause an Inject node's internal receive event - done(); - return; - } - if (isNodeInSubflowModule(receiveEvent.destination.node)) { - // Inside a subflow module - don't pause the event - done(); - return; - } - const eventLocation = Location.createLocation(receiveEvent); - // console.log("onReceive",eventLocation.toString()); - this.checkLocation(eventLocation, receiveEvent, done); - }); - } - disable() { - this.log("Disabled"); - this.enabled = false; - this.RED.hooks.remove("*.flow-debugger"); - this.pausedLocations.clear(); - this.drainQueues(true); - } - pause(event) { - if (this.enabled) { - let logReason; - if (event) { - if (this.config.breakpointAction === "pause-all") { - this.pausedLocations.clear(); - this.pausedLocations.add("*"); - } - else { - this.pausedLocations.add(event.node); - } - if (event.reason === "breakpoint") { - logReason = "@" + this.breakpoints.get(event.breakpoint).location.toString(); - } - else if (event.reason === "step") { - logReason = "@" + event.node; - } - event.pausedLocations = [...this.pausedLocations]; - } - else { - // Manual pause - this.pausedLocations.clear(); - this.pausedLocations.add("*"); - logReason = "manual"; - } - this.log(`Flows paused: ${logReason}`); - this.emit("paused", event || { reason: "manual" }); - } - } - resume(nodeId) { - if (this.pausedLocations.size === 0) { - return; - } - if (!nodeId || nodeId === "*") { - console.log("resume - clear all locations"); - this.pausedLocations.clear(); - } - else if (nodeId && this.pausedLocations.has(nodeId)) { - this.pausedLocations.delete(nodeId); - } - else { - // Nothing has been unpaused - return; - } - this.log("Flows resumed"); - this.emit("resumed", { node: nodeId }); - this.drainQueues(); - } - deleteMessage(messageId) { - const nextEvent = this.messageQueue.get(messageId); - if (nextEvent) { - this.messageQueue.remove(nextEvent); - const nextEventLocation = nextEvent.location.toString(); - this.queuesByLocation[nextEventLocation].remove(nextEvent); - const queueDepth = this.queuesByLocation[nextEventLocation].length; - if (queueDepth === 0) { - delete this.queuesByLocation[nextEventLocation]; - } - this.emit("messageDispatched", { id: nextEvent.id, location: nextEventLocation, depth: queueDepth }); - // Call done with false to prevent any further processing - nextEvent.done(false); - } - } - isNodePaused(nodeId) { - return this.pausedLocations.has("*") || this.pausedLocations.has(nodeId); - } - drainQueues(quiet) { - for (const nextEvent of this.messageQueue) { - const eventNodeId = nextEvent.location.id; - if (!this.isNodePaused(eventNodeId)) { - const nextEventLocation = nextEvent.location.toString(); - this.queuesByLocation[nextEventLocation].remove(nextEvent); - const queueDepth = this.queuesByLocation[nextEventLocation].length; - if (queueDepth === 0) { - delete this.queuesByLocation[nextEventLocation]; - } - if (!quiet) { - this.emit("messageDispatched", { id: nextEvent.id, location: nextEventLocation, depth: queueDepth }); - } - if (nextEvent.event.msg[DEBUGGER_PAUSED]) { - delete nextEvent.event.msg[DEBUGGER_PAUSED]; - } - nextEvent.done(); - this.messageQueue.remove(nextEvent); - } - } - } - setBreakpoint(location) { - const bp = { - id: (BREAKPOINT_ID++) + "", - location, - active: true, - mode: "all" - }; - this.breakpoints.set(bp.id, bp); - this.breakpointsByLocation.set(location.toString(), bp); - return bp.id; - } - getBreakpoint(breakpointId) { - return this.breakpoints.get(breakpointId); - } - setBreakpointActive(breakpointId, state) { - const bp = this.breakpoints.get(breakpointId); - if (bp) { - bp.active = state; - } - } - clearBreakpoint(breakpointId) { - const bp = this.breakpoints.get(breakpointId); - if (bp) { - this.breakpoints.delete(breakpointId); - this.breakpointsByLocation.delete(bp.location.toString()); - } - } - getBreakpoints() { - return Array.from(this.breakpoints.values()); - } - step(messageId) { - if (this.enabled) { - let nextEvent; - if (messageId) { - nextEvent = this.messageQueue.get(messageId); - if (nextEvent) { - this.messageQueue.remove(nextEvent); - } - } - else { - nextEvent = this.messageQueue.next(); - } - if (nextEvent) { - const nextEventLocation = nextEvent.location.toString(); - this.log("Step: " + nextEventLocation); - this.queuesByLocation[nextEventLocation].remove(nextEvent); - const queueDepth = this.queuesByLocation[nextEventLocation].length; - if (queueDepth === 0) { - delete this.queuesByLocation[nextEventLocation]; - } - nextEvent.event.msg[DEBUGGER_PAUSED] = true; - this.emit("messageDispatched", { id: nextEvent.id, location: nextEventLocation, depth: queueDepth }); - nextEvent.done(); - } - } - } - setConfig(newConfig) { - let changed = false; - for (const key in this.config) { - if (newConfig.hasOwnProperty(key) && this.config[key] !== newConfig[key]) { - changed = true; - this.config[key] = newConfig[key]; - } - } - return changed; - } - getState() { - if (!this.enabled) { - return { enabled: false }; - } - return { - enabled: true, - pausedLocations: [...this.pausedLocations], - config: this.config, - breakpoints: this.getBreakpoints(), - queues: this.getMessageQueueDepths() - }; - } - getMessageSummary() { - return Array.from(this.messageQueue).map(m => { - return { - id: m.id, - location: m.location - }; - }); - } - getMessageQueue() { - return this.messageQueue; - } - getMessageQueueDepths() { - if (!this.enabled) { - return {}; - } - const result = {}; - for (const [locationId, queue] of Object.entries(this.queuesByLocation)) { - result[locationId] = { depth: queue.length }; - } - return result; - } - dump() { - let result = `Debugger State ---- -${this.messageQueue.dump()} -`; - const locationIds = Object.keys(this.queuesByLocation); - locationIds.forEach(id => { - result += `--- -Location: ${id} -${this.queuesByLocation[id].dump()} -`; - }); - return result; - } - queueEvent(location, event, done) { - const locationId = location.toString(); - if (!this.queuesByLocation[locationId]) { - this.queuesByLocation[locationId] = new MessageQueue_1.MessageQueue("Location"); - } - const messageEvent = { - id: this.eventNumber++, - event, - location, - done, - nextByLocation: null, - previousByLocation: null, - nextByTime: null, - previousByTime: null - }; - this.queuesByLocation[locationId].enqueue(messageEvent); - this.messageQueue.enqueue(messageEvent); - const queuedEvent = { - id: messageEvent.id, - location: locationId, - msg: event.msg, - depth: this.queuesByLocation[locationId].length, - destination: null, - }; - if (event.hasOwnProperty('source')) { - // SendEvent - so include the destination location id - queuedEvent.destination = "/" + event.destination.id + "[i][0]"; - } - this.emit("messageQueued", queuedEvent); - } -} -exports.Debugger = Debugger; -const MODULE_TYPE_RE = /^module:/; -function isNodeInSubflowModule(node) { - let f = node._flow; - do { - if (f.TYPE === "flow") { - return false; - } - if (MODULE_TYPE_RE.test(f.TYPE)) { - return true; - } - f = f.parent; - } while (f && f.TYPE); - return false; -} -//# sourceMappingURL=debugger.js.map \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js.map b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js.map deleted file mode 100644 index 7b32d01..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/debugger.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"debugger.js","sourceRoot":"","sources":["../../src/lib/debugger.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js deleted file mode 100644 index 97b8712..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js +++ /dev/null @@ -1,46 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -exports.createLocation = exports.Location = void 0; -class Location { - constructor(nodeId, nodePath, portType = "o", portIndex = 0) { - this.inSubflow = false; - this.id = nodeId; - this.path = nodePath; - this.portType = portType; - this.portIndex = portIndex; - } - getBreakpointLocation() { - if (this.inSubflow) { - return `*/${this.id}[${this.portType}][${this.portIndex}]`; - } - else { - return this.toString(); - } - } - toString() { - return `${this.path}/${this.id}[${this.portType}][${this.portIndex}]`; - } -} -exports.Location = Location; -function createLocation(event) { - let node; - let portType; - let portIndex; - if (event.hasOwnProperty("source")) { - node = event.source.node; - portType = "o"; - portIndex = event.source.port; - } - else { - node = event.destination.node; - portType = "i"; - portIndex = 0; - } - const l = new Location(node._alias || node.id, node._flow.path, portType, portIndex); - if (node._alias) { - l.inSubflow = true; - } - return l; -} -exports.createLocation = createLocation; -//# sourceMappingURL=location.js.map \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js.map b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js.map deleted file mode 100644 index dd20e2c..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/location.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"location.js","sourceRoot":"","sources":["../../src/lib/location.ts"],"names":[],"mappings":";;;AAIA,MAAa,QAAQ;IAYjB,YAAY,MAAa,EAAE,QAAe,EAAE,WAAkB,GAAG,EAAE,SAAS,GAAC,CAAC;QAF9E,cAAS,GAAW,KAAK,CAAC;QAGtB,IAAI,CAAC,EAAE,GAAG,MAAM,CAAC;QACjB,IAAI,CAAC,IAAI,GAAG,QAAQ,CAAC;QACrB,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;QACzB,IAAI,CAAC,SAAS,GAAG,SAAS,CAAC;IAC/B,CAAC;IACD,qBAAqB;QACjB,IAAI,IAAI,CAAC,SAAS,EAAE;YAChB,OAAO,KAAK,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,GAAG,CAAA;SAC7D;aAAM;YACH,OAAO,IAAI,CAAC,QAAQ,EAAE,CAAC;SAC1B;IACL,CAAC;IACD,QAAQ;QACJ,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,EAAE,IAAI,IAAI,CAAC,QAAQ,KAAK,IAAI,CAAC,SAAS,GAAG,CAAA;IACzE,CAAC;CACJ;AA5BD,4BA4BC;AAED,SAAgB,cAAc,CAAC,KAA4B;IACvD,IAAI,IAAQ,CAAC;IACb,IAAI,QAAiB,CAAC;IACtB,IAAI,SAAgB,CAAC;IACrB,IAAI,KAAK,CAAC,cAAc,CAAC,QAAQ,CAAC,EAAE;QAChC,IAAI,GAAI,KAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;QACxC,QAAQ,GAAG,GAAG,CAAC;QACf,SAAS,GAAI,KAAmB,CAAC,MAAM,CAAC,IAAI,CAAC;KAChD;SAAM;QACH,IAAI,GAAI,KAAsB,CAAC,WAAW,CAAC,IAAI,CAAC;QAChD,QAAQ,GAAG,GAAG,CAAC;QACf,SAAS,GAAG,CAAC,CAAC;KACjB;IACD,MAAM,CAAC,GAAG,IAAI,QAAQ,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,QAAQ,EAAE,SAAS,CAAC,CAAC;IACrF,IAAI,IAAI,CAAC,MAAM,EAAE;QACb,CAAC,CAAC,SAAS,GAAG,IAAI,CAAC;KACtB;IACD,OAAO,CAAC,CAAC;AACb,CAAC;AAlBD,wCAkBC"} \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js deleted file mode 100644 index 11e638d..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=types.js.map \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js.map b/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js.map deleted file mode 100644 index 9561242..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/lib/types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/lib/types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/en-US/flow-debugger.json b/monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/en-US/flow-debugger.json deleted file mode 100644 index fb0a88a..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/en-US/flow-debugger.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "label": { - "debugger": "Flow Debugger", - "debuggerShort": "debugger", - "breakpoints": "Breakpoints", - "messages":"Messages", - "output": "output", - "input": "input", - "paused": "Flows paused", - "resume": "Resume flows", - "step": "Step flows", - "pause": "Pause flows", - "deleteMessage": "Delete message", - "stepMessage": "Step message", - "filter": { - "label": "Filter messages", - "all": "all nodes", - "flow": "current flow" - }, - "settings": "Debugger options", - "breakpointAction": { - "label": "Breakpoint action", - "pause-all": "pause all nodes", - "pause-bp": "pause at breakpoint" - } - } -} diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/ja/flow-debugger.json b/monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/ja/flow-debugger.json deleted file mode 100644 index 5aed0a7..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/locales/ja/flow-debugger.json +++ /dev/null @@ -1,27 +0,0 @@ -{ - "label": { - "debugger": "フローデバッガ", - "debuggerShort": "デバッガ", - "breakpoints": "ブレイクポイント", - "messages": "メッセージ", - "output": "出力", - "input": "入力", - "paused": "フローを停止しました", - "resume": "フローを再開", - "step": "フローをステップ実行", - "pause": "フローを停止", - "deleteMessage": "メッセージを削除", - "stepMessage": "メッセージをステップ実行", - "filter": { - "label": "メッセージの絞り込み", - "all": "全てのノード", - "flow": "現在のフロー" - }, - "settings": "デバッガオプション", - "breakpointAction": { - "label": "ブレイクポイントの動作", - "pause-all": "全てのノードを停止", - "pause-bp": "ブレイクポイントで停止" - } - } -} diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js b/monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js deleted file mode 100644 index 4bf6893..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js +++ /dev/null @@ -1,3 +0,0 @@ -"use strict"; -Object.defineProperty(exports, "__esModule", { value: true }); -//# sourceMappingURL=nr-types.js.map \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js.map b/monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js.map deleted file mode 100644 index 7488926..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/dist/nr-types.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"file":"nr-types.js","sourceRoot":"","sources":["../src/nr-types.ts"],"names":[],"mappings":""} \ No newline at end of file diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/package.json b/monitoring/node-red/data/node_modules/node-red-debugger/package.json deleted file mode 100644 index b375986..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/package.json +++ /dev/null @@ -1,37 +0,0 @@ -{ - "name": "node-red-debugger", - "version": "1.1.1", - "description": "A flow debugger for Node-RED 2.x", - "repository": { - "type": "git", - "url": "https://github.com/node-red/node-red-debugger.git" - }, - "scripts": { - "build": "(tsc || exit 1) && npm run tslint && npm run copyAssets", - "tslint": "tslint -c tslint.json -p tsconfig.json", - "copyAssets": "node scripts/copy-static-assets.js", - "dev": "nodemon --exec 'npm run build' -i dist -i resources -e 'ts html css'", - "test": "npm run build" - }, - "keywords": ["node-red","debugger"], - "author": "Nick O'Leary ", - "files": [ - "dist", - "resources" - ], - "license": "Apache-2", - "node-red": { - "version": ">=2.0.0", - "plugins": { - "flow-debugger": "dist/flow-debugger.js" - } - }, - "devDependencies": { - "@types/node": "^15.12.2", - "fs-extra": "^10.0.0", - "html-minifier": "^4.0.0", - "nodemon": "^2.0.7", - "tslint": "^6.1.3", - "typescript": "^4.3.2" - } -} diff --git a/monitoring/node-red/data/node_modules/node-red-debugger/resources/style.css b/monitoring/node-red/data/node_modules/node-red-debugger/resources/style.css deleted file mode 100644 index b0a2bad..0000000 --- a/monitoring/node-red/data/node_modules/node-red-debugger/resources/style.css +++ /dev/null @@ -1 +0,0 @@ -.red-ui-flow-debugger{height:100%;display:flex;flex-direction:column}.red-ui-flow-debugger-stack{overflow-y:scroll;background:var(--red-ui-primary-background)}.red-ui-flow-debugger-stack .red-ui-palette-category:last-child{border-bottom:1px solid var(--red-ui-secondary-border-color)}.red-ui-flow-debugger.disabled .red-ui-sidebar-header>:not(:first-child){display:none}.red-ui-flow-debugger.disabled .red-ui-flow-debugger-stack{display:none}.red-ui-flow-debugger .red-ui-sidebar-header{flex:0 0 auto;display:flex}.red-ui-flow-debugger .red-ui-sidebar-header>*{flex-shrink:0}.red-ui-flow-debugger .red-ui-editableList-border{border:none;border-radius:0}.red-ui-flow-debugger .red-ui-editableList-container{padding:0}.red-ui-flow-debugger .red-ui-editableList-container li{padding:0}.red-ui-flow-debugger .red-ui-editableList-container li .red-ui-editableList-item-remove{right:3px}.red-ui-flow-debugger-breakpoint-list,.red-ui-flow-debugger-message-list{min-height:30px}.red-ui-flow-debugger-breakpoint-list .red-ui-editableList-item-content{padding:6px 8px}.red-ui-flow-debugger-message-list .red-ui-editableList-item-content{padding:6px 0}.red-ui-flow-debugger-message .red-ui-debug-msg-meta{display:flex;padding-left:10px}.red-ui-flow-debugger-breakpoint{user-select:none;display:flex;align-items:center}.red-ui-flow-debugger-breakpoint .red-ui-node-icon{margin-left:6px;margin-right:6px}.red-ui-flow-debugger-breakpoint.red-ui-flow-debugger-breakpoint-input .red-ui-node-icon:before,.red-ui-flow-debugger-breakpoint.red-ui-flow-debugger-breakpoint-output .red-ui-node-icon:after{position:absolute;top:calc(50% - 4px);left:-5px;width:7px;height:7px;display:block;content:"";background:var(--red-ui-node-port-background);border:1px solid var(--red-ui-node-border);border-radius:2px}.red-ui-flow-debugger-breakpoint.red-ui-flow-debugger-breakpoint-output .red-ui-node-icon:after{left:20px}.red-ui-flow-debugger .red-ui-editableList-container li.highlight{background:#e6e6e6}.red-ui-flow-debugger .red-ui-editableList-container li.pending{opacity:.4}.red-ui-flow-debugger-breakpoint input[type=checkbox]{margin-top:0;margin-right:4px}.red-ui-flow-debugger-breakpoint>:nth-child(2){flex-grow:1;flex-shrink:1;overflow:hidden}.red-ui-flow-debugger-breakpoint:not(.active) :not(:first-child){opacity:.7}.red-ui-flow-debugger-breakpoint-port{flex-shrink:0;height:22px}.red-ui-flow-debugger-breakpoint-port svg{stroke:red;stroke-width:1;fill:none}.red-ui-flow-debugger-port-overlay{cursor:pointer;display:none}.red-ui-flow-debugger-port-overlay-background{fill:var(--red-ui-flow-debugger-breakpoint-fill,#fff);stroke-width:1;stroke:var(--red-ui-flow-debugger-breakpoint-stroke,#58d)}.red-ui-flow-debugger-port-overlay-background.red-ui-flow-debugger-port-overlay-pulse{fill:none!important;stroke-width:1;stroke:var(--red-ui-flow-debugger-breakpoint-stroke,#58d);animation:red-ui-flow-debugger-port-overlay-pulse-kf .6s linear}@keyframes red-ui-flow-debugger-port-overlay-pulse-kf{0%{transform:scale(.8);opacity:1}50%{opacity:.5}70%{opacity:.2}100%{transform:scale(2,1.5);opacity:0}}.red-ui-flow-debugger-port-overlay.active .red-ui-flow-debugger-port-overlay-background{fill:var(--red-ui-flow-debugger-breakpoint-active-fill,#59e);stroke:var(--red-ui-flow-debugger-breakpoint-active-stroke,#36b)}.red-ui-flow-debugger-port-overlay.inactive .red-ui-flow-debugger-port-overlay-background{fill:var(--red-ui-flow-debugger-breakpoint-inactive-fill,#def);stroke:var(--red-ui-flow-debugger-breakpoint-inactive-stroke,#59e)}.red-ui-flow-debugger-port-overlay.pending .red-ui-flow-debugger-port-overlay-background{fill:var(--red-ui-flow-debugger-breakpoint-inactive-fill,#def);stroke:var(--red-ui-flow-debugger-breakpoint-inactive-stroke,#59e);stroke-dasharray:4 2;opacity:.8}.red-ui-flow-debugger-port-overlay-highlight{stroke-width:1.5;fill:none;stroke-dasharray:4 2;stroke:var(--red-ui-node-selected-color,#ff7f0e);transform:scale(1.2,1.5)}.red-ui-flow-debugger-port-overlay.active,.red-ui-flow-debugger-port-overlay.hasMessages,.red-ui-flow-debugger-port-overlay.inactive,.red-ui-flow-debugger-port-overlay.pending{display:inherit}.red-ui-flow-debugger-port-overlay-label{stroke-width:0;fill:var(--red-ui-flow-debugger-breakpoint-label,var(--red-ui-node-label-color,#000));font-size:9pt;text-anchor:end}.red-ui-flow-debugger-port-overlay-label.small{font-size:7pt;transform:translate(2px,-1px)}.red-ui-flow-debugger-port-overlay.active .red-ui-flow-debugger-port-overlay-label{fill:var(--red-ui-flow-debugger-breakpoint-label-active,#fff)}.red-ui-flow-debugger-notification{display:flex}.red-ui-flow-debugger-notification>.red-ui-flow-debugger-toolbar{flex-grow:1;text-align:right}.red-ui-flow-debugger-message:hover .red-ui-flow-debugger-msg-tools{display:inline}.red-ui-flow-debugger-msg-tools{position:absolute;right:5px;display:none}.red-ui-flow-debugger-settings{background:var(--red-ui-tertiary-background);color:var(--red-ui-primary-text-color)}.red-ui-flow-debugger-settings div{margin:0 0 6px 0}.red-ui-flow-debugger-settings label{display:flex;align-items:center;margin-left:10px}.red-ui-flow-debugger-settings input[type=radio]{margin:0 5px 0 0}.red-ui-flow-debugger-message-load{display:block;padding:0;font-size:.8em;color:var(--red-ui-tertiary-text-color)}.red-ui-flow-debugger-message-load a{display:block;padding:6px 0 8px 25px}.red-ui-flow-debugger-annotation-paused{stroke:var(--red-ui-flow-debugger-breakpoint-active-stroke,#36b)} \ No newline at end of file diff --git a/monitoring/node-red/data/package-lock.json b/monitoring/node-red/data/package-lock.json deleted file mode 100644 index df7edaf..0000000 --- a/monitoring/node-red/data/package-lock.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "node-red-project", - "version": "0.0.1", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "node-red-project", - "version": "0.0.1", - "dependencies": { - "node-red-debugger": "~1.1.1" - } - }, - "node_modules/node-red-debugger": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/node-red-debugger/-/node-red-debugger-1.1.1.tgz", - "integrity": "sha512-sEfBRYZk+ptqCOkDURC1IxJ6lr1yhdGUctxwL13EmLknQSsOzTJzcI+/nWF1RSBZmsCw4R8+TE1Kx4TnjX2X/g==", - "license": "Apache-2" - } - } -} diff --git a/monitoring/node-red/data/package.json b/monitoring/node-red/data/package.json deleted file mode 100644 index e78b2cb..0000000 --- a/monitoring/node-red/data/package.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "name": "node-red-project", - "description": "A Node-RED Project", - "version": "0.0.1", - "private": true, - "dependencies": { - "node-red-debugger": "~1.1.1" - } -} diff --git a/monitoring/node-red/data/settings.js b/monitoring/node-red/data/settings.js deleted file mode 100644 index ef5af14..0000000 --- a/monitoring/node-red/data/settings.js +++ /dev/null @@ -1,623 +0,0 @@ -/** - * This is the default settings file provided by Node-RED. - * - * It can contain any valid JavaScript code that will get run when Node-RED - * is started. - * - * Lines that start with // are commented out. - * Each entry should be separated from the entries above and below by a comma ',' - * - * For more information about individual settings, refer to the documentation: - * https://nodered.org/docs/user-guide/runtime/configuration - * - * The settings are split into the following sections: - * - Flow File and User Directory Settings - * - Security - * - Server Settings - * - Runtime Settings - * - Editor Settings - * - Node Settings - * - **/ - -module.exports = { - -/******************************************************************************* - * Flow File and User Directory Settings - * - flowFile - * - credentialSecret - * - flowFilePretty - * - userDir - * - nodesDir - ******************************************************************************/ - - /** The file containing the flows. If not set, defaults to flows_.json **/ - flowFile: 'flows.json', - - /** By default, credentials are encrypted in storage using a generated key. To - * specify your own secret, set the following property. - * If you want to disable encryption of credentials, set this property to false. - * Note: once you set this property, do not change it - doing so will prevent - * node-red from being able to decrypt your existing credentials and they will be - * lost. - */ - //credentialSecret: "a-secret-key", - - /** By default, the flow JSON will be formatted over multiple lines making - * it easier to compare changes when using version control. - * To disable pretty-printing of the JSON set the following property to false. - */ - flowFilePretty: true, - - /** By default, all user data is stored in a directory called `.node-red` under - * the user's home directory. To use a different location, the following - * property can be used - */ - //userDir: '/home/nol/.node-red/', - - /** Node-RED scans the `nodes` directory in the userDir to find local node files. - * The following property can be used to specify an additional directory to scan. - */ - //nodesDir: '/home/nol/.node-red/nodes', - -/******************************************************************************* - * Security - * - adminAuth - * - https - * - httpsRefreshInterval - * - requireHttps - * - httpNodeAuth - * - httpStaticAuth - ******************************************************************************/ - - /** To password protect the Node-RED editor and admin API, the following - * property can be used. See https://nodered.org/docs/security.html for details. - */ - //adminAuth: { - // type: "credentials", - // users: [{ - // username: "admin", - // password: "$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN.", - // permissions: "*" - // }] - //}, - - /** The following property can be used to enable HTTPS - * This property can be either an object, containing both a (private) key - * and a (public) certificate, or a function that returns such an object. - * See http://nodejs.org/api/https.html#https_https_createserver_options_requestlistener - * for details of its contents. - */ - - /** Option 1: static object */ - //https: { - // key: require("fs").readFileSync('privkey.pem'), - // cert: require("fs").readFileSync('cert.pem') - //}, - - /** Option 2: function that returns the HTTP configuration object */ - // https: function() { - // // This function should return the options object, or a Promise - // // that resolves to the options object - // return { - // key: require("fs").readFileSync('privkey.pem'), - // cert: require("fs").readFileSync('cert.pem') - // } - // }, - - /** If the `https` setting is a function, the following setting can be used - * to set how often, in hours, the function will be called. That can be used - * to refresh any certificates. - */ - //httpsRefreshInterval : 12, - - /** The following property can be used to cause insecure HTTP connections to - * be redirected to HTTPS. - */ - //requireHttps: true, - - /** To password protect the node-defined HTTP endpoints (httpNodeRoot), - * including node-red-dashboard, or the static content (httpStatic), the - * following properties can be used. - * The `pass` field is a bcrypt hash of the password. - * See https://nodered.org/docs/security.html#generating-the-password-hash - */ - //httpNodeAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."}, - //httpStaticAuth: {user:"user",pass:"$2a$08$zZWtXTja0fB1pzD4sHCMyOCMYz2Z6dNbM6tl8sJogENOMcxWV9DN."}, - -/******************************************************************************* - * Server Settings - * - uiPort - * - uiHost - * - apiMaxLength - * - httpServerOptions - * - httpAdminRoot - * - httpAdminMiddleware - * - httpAdminCookieOptions - * - httpNodeRoot - * - httpNodeCors - * - httpNodeMiddleware - * - httpStatic - * - httpStaticRoot - * - httpStaticCors - ******************************************************************************/ - - /** the tcp port that the Node-RED web server is listening on */ - uiPort: process.env.PORT || 1880, - - /** By default, the Node-RED UI accepts connections on all IPv4 interfaces. - * To listen on all IPv6 addresses, set uiHost to "::", - * The following property can be used to listen on a specific interface. For - * example, the following would only allow connections from the local machine. - */ - //uiHost: "127.0.0.1", - - /** The maximum size of HTTP request that will be accepted by the runtime api. - * Default: 5mb - */ - //apiMaxLength: '5mb', - - /** The following property can be used to pass custom options to the Express.js - * server used by Node-RED. For a full list of available options, refer - * to http://expressjs.com/en/api.html#app.settings.table - */ - //httpServerOptions: { }, - - /** By default, the Node-RED UI is available at http://localhost:1880/ - * The following property can be used to specify a different root path. - * If set to false, this is disabled. - */ - //httpAdminRoot: '/admin', - - /** The following property can be used to add a custom middleware function - * in front of all admin http routes. For example, to set custom http - * headers. It can be a single function or an array of middleware functions. - */ - // httpAdminMiddleware: function(req,res,next) { - // // Set the X-Frame-Options header to limit where the editor - // // can be embedded - // //res.set('X-Frame-Options', 'sameorigin'); - // next(); - // }, - - /** The following property can be used to set addition options on the session - * cookie used as part of adminAuth authentication system - * Available options are documented here: https://www.npmjs.com/package/express-session#cookie - */ - // httpAdminCookieOptions: { }, - - /** Some nodes, such as HTTP In, can be used to listen for incoming http requests. - * By default, these are served relative to '/'. The following property - * can be used to specify a different root path. If set to false, this is - * disabled. - */ - //httpNodeRoot: '/red-nodes', - - /** The following property can be used to configure cross-origin resource sharing - * in the HTTP nodes. - * See https://github.com/troygoode/node-cors#configuration-options for - * details on its contents. The following is a basic permissive set of options: - */ - //httpNodeCors: { - // origin: "*", - // methods: "GET,PUT,POST,DELETE" - //}, - - /** If you need to set an http proxy please set an environment variable - * called http_proxy (or HTTP_PROXY) outside of Node-RED in the operating system. - * For example - http_proxy=http://myproxy.com:8080 - * (Setting it here will have no effect) - * You may also specify no_proxy (or NO_PROXY) to supply a comma separated - * list of domains to not proxy, eg - no_proxy=.acme.co,.acme.co.uk - */ - - /** The following property can be used to add a custom middleware function - * in front of all http in nodes. This allows custom authentication to be - * applied to all http in nodes, or any other sort of common request processing. - * It can be a single function or an array of middleware functions. - */ - //httpNodeMiddleware: function(req,res,next) { - // // Handle/reject the request, or pass it on to the http in node by calling next(); - // // Optionally skip our rawBodyParser by setting this to true; - // //req.skipRawBodyParser = true; - // next(); - //}, - - /** When httpAdminRoot is used to move the UI to a different root path, the - * following property can be used to identify a directory of static content - * that should be served at http://localhost:1880/. - * When httpStaticRoot is set differently to httpAdminRoot, there is no need - * to move httpAdminRoot - */ - //httpStatic: '/home/nol/node-red-static/', //single static source - /** - * OR multiple static sources can be created using an array of objects... - * Each object can also contain an options object for further configuration. - * See https://expressjs.com/en/api.html#express.static for available options. - * They can also contain an option `cors` object to set specific Cross-Origin - * Resource Sharing rules for the source. `httpStaticCors` can be used to - * set a default cors policy across all static routes. - */ - //httpStatic: [ - // {path: '/home/nol/pics/', root: "/img/"}, - // {path: '/home/nol/reports/', root: "/doc/"}, - // {path: '/home/nol/videos/', root: "/vid/", options: {maxAge: '1d'}} - //], - - /** - * All static routes will be appended to httpStaticRoot - * e.g. if httpStatic = "/home/nol/docs" and httpStaticRoot = "/static/" - * then "/home/nol/docs" will be served at "/static/" - * e.g. if httpStatic = [{path: '/home/nol/pics/', root: "/img/"}] - * and httpStaticRoot = "/static/" - * then "/home/nol/pics/" will be served at "/static/img/" - */ - //httpStaticRoot: '/static/', - - /** The following property can be used to configure cross-origin resource sharing - * in the http static routes. - * See https://github.com/troygoode/node-cors#configuration-options for - * details on its contents. The following is a basic permissive set of options: - */ - //httpStaticCors: { - // origin: "*", - // methods: "GET,PUT,POST,DELETE" - //}, - - /** The following property can be used to modify proxy options */ - // proxyOptions: { - // mode: "legacy", // legacy mode is for non-strict previous proxy determination logic (node-red < v4 compatible) - // }, - -/******************************************************************************* - * Runtime Settings - * - lang - * - runtimeState - * - telemetry - * - diagnostics - * - logging - * - contextStorage - * - exportGlobalContextKeys - * - externalModules - ******************************************************************************/ - - /** Uncomment the following to run node-red in your preferred language. - * Available languages include: en-US (default), ja, de, zh-CN, zh-TW, ru, ko - * Some languages are more complete than others. - */ - // lang: "de", - - /** Configure diagnostics options - * - enabled: When `enabled` is `true` (or unset), diagnostics data will - * be available at http://localhost:1880/diagnostics - * - ui: When `ui` is `true` (or unset), the action `show-system-info` will - * be available to logged in users of node-red editor - */ - diagnostics: { - /** enable or disable diagnostics endpoint. Must be set to `false` to disable */ - enabled: true, - /** enable or disable diagnostics display in the node-red editor. Must be set to `false` to disable */ - ui: true, - }, - /** Configure runtimeState options - * - enabled: When `enabled` is `true` flows runtime can be Started/Stopped - * by POSTing to available at http://localhost:1880/flows/state - * - ui: When `ui` is `true`, the action `core:start-flows` and - * `core:stop-flows` will be available to logged in users of node-red editor - * Also, the deploy menu (when set to default) will show a stop or start button - */ - runtimeState: { - /** enable or disable flows/state endpoint. Must be set to `false` to disable */ - enabled: false, - /** show or hide runtime stop/start options in the node-red editor. Must be set to `false` to hide */ - ui: false, - }, - telemetry: { - /** - * By default, telemetry is disabled until the user provides consent the first - * time they open the editor. - * - * The following property can be uncommented and set to true/false to enable/disable - * telemetry without seeking further consent in the editor. - * The user can override this setting via the user settings dialog within the editor - */ - // enabled: true, - /** - * If telemetry is enabled, the editor will notify the user if a new version of Node-RED - * is available. Set the following property to false to disable this notification. - */ - // updateNotification: true - }, - /** Configure the logging output */ - logging: { - /** Only console logging is currently supported */ - console: { - /** Level of logging to be recorded. Options are: - * fatal - only those errors which make the application unusable should be recorded - * error - record errors which are deemed fatal for a particular request + fatal errors - * warn - record problems which are non fatal + errors + fatal errors - * info - record information about the general running of the application + warn + error + fatal errors - * debug - record information which is more verbose than info + info + warn + error + fatal errors - * trace - record very detailed logging + debug + info + warn + error + fatal errors - * off - turn off all logging (doesn't affect metrics or audit) - */ - level: "info", - /** Whether or not to include metric events in the log output */ - metrics: false, - /** Whether or not to include audit events in the log output */ - audit: false - } - }, - - /** Context Storage - * The following property can be used to enable context storage. The configuration - * provided here will enable file-based context that flushes to disk every 30 seconds. - * Refer to the documentation for further options: https://nodered.org/docs/api/context/ - */ - contextStorage: { - default: { - module:"localfilesystem" - }, - }, - - /** `global.keys()` returns a list of all properties set in global context. - * This allows them to be displayed in the Context Sidebar within the editor. - * In some circumstances it is not desirable to expose them to the editor. The - * following property can be used to hide any property set in `functionGlobalContext` - * from being list by `global.keys()`. - * By default, the property is set to false to avoid accidental exposure of - * their values. Setting this to true will cause the keys to be listed. - */ - exportGlobalContextKeys: false, - - /** Configure how the runtime will handle external npm modules. - * This covers: - * - whether the editor will allow new node modules to be installed - * - whether nodes, such as the Function node are allowed to have their - * own dynamically configured dependencies. - * The allow/denyList options can be used to limit what modules the runtime - * will install/load. It can use '*' as a wildcard that matches anything. - */ - externalModules: { - // autoInstall: false, /** Whether the runtime will attempt to automatically install missing modules */ - // autoInstallRetry: 30, /** Interval, in seconds, between reinstall attempts */ - // palette: { /** Configuration for the Palette Manager */ - // allowInstall: true, /** Enable the Palette Manager in the editor */ - // allowUpdate: true, /** Allow modules to be updated in the Palette Manager */ - // allowUpload: true, /** Allow module tgz files to be uploaded and installed */ - // allowList: ['*'], - // denyList: [], - // allowUpdateList: ['*'], - // denyUpdateList: [] - // }, - // modules: { /** Configuration for node-specified modules */ - // allowInstall: true, - // allowList: [], - // denyList: [] - // } - }, - - -/******************************************************************************* - * Editor Settings - * - disableEditor - * - editorTheme - ******************************************************************************/ - - /** The following property can be used to disable the editor. The admin API - * is not affected by this option. To disable both the editor and the admin - * API, use either the httpRoot or httpAdminRoot properties - */ - //disableEditor: false, - - /** Customising the editor - * See https://nodered.org/docs/user-guide/runtime/configuration#editor-themes - * for all available options. - */ - editorTheme: { - /** The following property can be used to set a custom theme for the editor. - * See https://github.com/node-red-contrib-themes/theme-collection for - * a collection of themes to chose from. - */ - //theme: "", - - /** To disable the 'Welcome to Node-RED' tour that is displayed the first - * time you access the editor for each release of Node-RED, set this to false - */ - //tours: false, - - palette: { - /** The following property can be used to order the categories in the editor - * palette. If a node's category is not in the list, the category will get - * added to the end of the palette. - * If not set, the following default order is used: - */ - //categories: ['subflows', 'common', 'function', 'network', 'sequence', 'parser', 'storage'], - }, - - projects: { - /** To enable the Projects feature, set this value to true */ - enabled: false, - workflow: { - /** Set the default projects workflow mode. - * - manual - you must manually commit changes - * - auto - changes are automatically committed - * This can be overridden per-user from the 'Git config' - * section of 'User Settings' within the editor - */ - mode: "manual" - } - }, - - codeEditor: { - /** Select the text editor component used by the editor. - * As of Node-RED V3, this defaults to "monaco", but can be set to "ace" if desired - */ - lib: "monaco", - options: { - /** The follow options only apply if the editor is set to "monaco" - * - * theme - must match the file name of a theme in - * packages/node_modules/@node-red/editor-client/src/vendor/monaco/dist/theme - * e.g. "tomorrow-night", "upstream-sunburst", "github", "my-theme" - */ - // theme: "vs", - /** other overrides can be set e.g. fontSize, fontFamily, fontLigatures etc. - * for the full list, see https://microsoft.github.io/monaco-editor/docs.html#interfaces/editor.IStandaloneEditorConstructionOptions.html - */ - //fontSize: 14, - //fontFamily: "Cascadia Code, Fira Code, Consolas, 'Courier New', monospace", - //fontLigatures: true, - } - }, - - markdownEditor: { - mermaid: { - /** enable or disable mermaid diagram in markdown document - */ - enabled: true - } - }, - - multiplayer: { - /** To enable the Multiplayer feature, set this value to true */ - enabled: false - }, - }, - -/******************************************************************************* - * Node Settings - * - fileWorkingDirectory - * - functionGlobalContext - * - functionExternalModules - * - globalFunctionTimeout - * - functionTimeout - * - nodeMessageBufferMaxLength - * - ui (for use with Node-RED Dashboard) - * - debugUseColors - * - debugMaxLength - * - debugStatusLength - * - execMaxBufferSize - * - httpRequestTimeout - * - mqttReconnectTime - * - serialReconnectTime - * - socketReconnectTime - * - socketTimeout - * - tcpMsgQueueSize - * - inboundWebSocketTimeout - * - tlsConfigDisableLocalFiles - * - webSocketNodeVerifyClient - ******************************************************************************/ - - /** The working directory to handle relative file paths from within the File nodes - * defaults to the working directory of the Node-RED process. - */ - //fileWorkingDirectory: "", - - /** Allow the Function node to load additional npm modules directly */ - functionExternalModules: true, - - - /** - * The default timeout (in seconds) for all Function nodes. - * Individual nodes can set their own timeout value within their configuration. - */ - globalFunctionTimeout: 0, - - /** - * Default timeout, in seconds, for the Function node. 0 means no timeout is applied - * This value is applied when the node is first added to the workspace - any changes - * must then be made with the individual node configurations. - * To set a global timeout value, use `globalFunctionTimeout` - */ - functionTimeout: 0, - - /** The following property can be used to set predefined values in Global Context. - * This allows extra node modules to be made available with in Function node. - * For example, the following: - * functionGlobalContext: { os:require('os') } - * will allow the `os` module to be accessed in a Function node using: - * global.get("os") - */ - functionGlobalContext: { - // os:require('os'), - }, - - /** The maximum number of messages nodes will buffer internally as part of their - * operation. This applies across a range of nodes that operate on message sequences. - * defaults to no limit. A value of 0 also means no limit is applied. - */ - //nodeMessageBufferMaxLength: 0, - - /** If you installed the optional node-red-dashboard you can set it's path - * relative to httpNodeRoot - * Other optional properties include - * readOnly:{boolean}, - * middleware:{function or array}, (req,res,next) - http middleware - * ioMiddleware:{function or array}, (socket,next) - socket.io middleware - */ - //ui: { path: "ui" }, - - /** Colourise the console output of the debug node */ - //debugUseColors: true, - - /** The maximum length, in characters, of any message sent to the debug sidebar tab */ - debugMaxLength: 1000, - - /** The maximum length, in characters, of status messages under the debug node */ - //debugStatusLength: 32, - - /** Maximum buffer size for the exec node. Defaults to 10Mb */ - //execMaxBufferSize: 10000000, - - /** Timeout in milliseconds for HTTP request connections. Defaults to 120s */ - //httpRequestTimeout: 120000, - - /** Retry time in milliseconds for MQTT connections */ - mqttReconnectTime: 15000, - - /** Retry time in milliseconds for Serial port connections */ - serialReconnectTime: 15000, - - /** Retry time in milliseconds for TCP socket connections */ - //socketReconnectTime: 10000, - - /** Timeout in milliseconds for TCP server socket connections. Defaults to no timeout */ - //socketTimeout: 120000, - - /** Maximum number of messages to wait in queue while attempting to connect to TCP socket - * defaults to 1000 - */ - //tcpMsgQueueSize: 2000, - - /** Timeout in milliseconds for inbound WebSocket connections that do not - * match any configured node. Defaults to 5000 - */ - //inboundWebSocketTimeout: 5000, - - /** To disable the option for using local files for storing keys and - * certificates in the TLS configuration node, set this to true. - */ - //tlsConfigDisableLocalFiles: true, - - /** The following property can be used to verify WebSocket connection attempts. - * This allows, for example, the HTTP request headers to be checked to ensure - * they include valid authentication information. - */ - //webSocketNodeVerifyClient: function(info) { - // /** 'info' has three properties: - // * - origin : the value in the Origin header - // * - req : the HTTP request - // * - secure : true if req.connection.authorized or req.connection.encrypted is set - // * - // * The function should return true if the connection should be accepted, false otherwise. - // * - // * Alternatively, if this function is defined to accept a second argument, callback, - // * it can be used to verify the client asynchronously. - // * The callback takes three arguments: - // * - result : boolean, whether to accept the connection or not - // * - code : if result is false, the HTTP error status to return - // * - reason: if result is false, the HTTP reason string to return - // */ - //}, -} diff --git a/monitoring/node-red/data/test-container.sh b/monitoring/node-red/data/test-container.sh deleted file mode 100755 index 0f70a65..0000000 --- a/monitoring/node-red/data/test-container.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/usr/bin/env bash -# test-container.sh -# Usage: ./test-container.sh container_name host - -container="$1" -host="$2" -test_name="testing-${container}" - -compose_script="/compose/${host}/services-up.sh" - -# Run container in detached mode -$compose_script --profile all run -d --name "$test_name" --build "$container" - -# Poll health status -timeout=60 # seconds -interval=2 # seconds -elapsed=0 -result=1 # default to failure - -while [ $elapsed -lt $timeout ]; do - status=$(docker inspect --format='{{.State.Health.Status}}' "$test_name" 2>/dev/null) - if [ "$status" == "healthy" ]; then -# echo "healthy" - result=0 # success - break - elif [ "$status" == "unhealthy" ]; then -# echo "unhealthy" - result=1 # failure - break - fi - sleep $interval - elapsed=$((elapsed + interval)) -done - -# Timeout case -if [ $elapsed -ge $timeout ]; then -# echo "timeout" - result=1 -fi - -# Cleanup -docker rm "$test_name" --force >/dev/null 2>&1 - -#echo "Exiting with $result" >&2 - -echo $result -exit $result diff --git a/monitoring/node-red/data/test-container.sh.old b/monitoring/node-red/data/test-container.sh.old deleted file mode 100755 index 96b7d89..0000000 --- a/monitoring/node-red/data/test-container.sh.old +++ /dev/null @@ -1,31 +0,0 @@ -#!/usr/bin/env bash -# test-container.sh -# Usage: ./test-container.sh container_name - -container="$1" -test_name="testing-${container}" -compose_script="/home/nixos/docker/services-up.sh" - -# Run container in detached mode -$compose_script --profile all run -d --name "$test_name" --rm --build "$container" - -# Poll health status -timeout=60 # seconds -interval=2 # seconds -elapsed=0 - -while [ $elapsed -lt $timeout ]; do - status=$(docker inspect --format='{{.State.Health.Status}}' "$test_name" 2>/dev/null) - if [ "$status" == "healthy" ]; then - echo "healthy" - break - elif [ "$status" == "unhealthy" ]; then - echo "unhealthy" - break - fi - sleep $interval - elapsed=$((elapsed + interval)) -done - -# Cleanup -docker rm -f "$test_name" >/dev/null 2>&1 diff --git a/monitoring/node-red/data/update-events.ndjson b/monitoring/node-red/data/update-events.ndjson deleted file mode 100644 index 7ffe090..0000000 --- a/monitoring/node-red/data/update-events.ndjson +++ /dev/null @@ -1,553 +0,0 @@ -{"ts":"2026-04-12T20:15:12.288Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.289Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.290Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.291Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.293Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.294Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.295Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.295Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.296Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:15:12.296Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.274Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.275Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.276Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.277Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.279Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.280Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.281Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.282Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.284Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:20:12.286Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.278Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.281Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.303Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.307Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.312Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.316Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.318Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.320Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.329Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:25:12.334Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:26.099Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:26.100Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.555Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.558Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.558Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.558Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.558Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.558Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.558Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.558Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.559Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:31:28.559Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:33:22.745Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:33:22.745Z","flow":"docker-updates","event":"completed","container":"unknown","project":"unknown","host":"unknown","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:40:04.105Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:04.105Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.438Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.438Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.455Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.455Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.485Z","flow":"docker-updates","event":"completed","container":"passbolt-webapp","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.485Z","flow":"docker-updates","event":"completed","container":"passbolt-webapp","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.487Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.488Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.491Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.491Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.497Z","flow":"docker-updates","event":"completed","container":"node-exporter","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.497Z","flow":"docker-updates","event":"completed","container":"node-exporter","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.507Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.507Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.511Z","flow":"docker-updates","event":"completed","container":"authelia","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.512Z","flow":"docker-updates","event":"completed","container":"authelia","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.598Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.599Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.624Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:40:12.624Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:44:14.788Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:44:22.082Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:50:12.876Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:50:12.876Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:50:12.982Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:50:12.982Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:50:13.154Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:50:13.154Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T20:50:23.451Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:50:25.696Z","flow":"docker-updates","event":"completed","container":"passbolt-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:50:28.102Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:50:47.517Z","flow":"docker-updates","event":"completed","container":"node-exporter","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:51:25.470Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:51:25.470Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:51:25.471Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:51:25.471Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:51:25.486Z","flow":"docker-updates","event":"completed","container":"authelia","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T20:51:25.486Z","flow":"docker-updates","event":"completed","container":"authelia","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T21:57:10.715Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T21:57:10.715Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T21:57:10.738Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T21:57:10.738Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-12T23:13:57.888Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:13:57.889Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:13:57.890Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:13:57.890Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:17:05.554Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:17:05.554Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:17:05.555Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:17:05.555Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":2,"error":""} -{"ts":"2026-04-12T23:21:36.664Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:21:36.664Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:21:36.677Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:21:36.678Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:23:55.514Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:23:55.514Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:23:55.515Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:23:55.515Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:37:38.907Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-12T23:38:32.835Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T02:43:53.730Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T02:44:47.524Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T02:44:47.524Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T02:46:35.255Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T02:58:03.503Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T05:16:15.689Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T05:16:51.797Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T05:16:51.797Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T05:27:32.283Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T05:28:25.458Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T05:28:25.458Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T07:06:45.327Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T07:06:45.328Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T07:26:45.292Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T07:26:45.293Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T07:31:45.282Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T07:31:45.283Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T08:14:39.514Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T08:15:33.209Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T10:38:33.065Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T10:39:26.857Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T10:39:26.857Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T23:42:19.598Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T23:43:13.246Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-13T23:43:13.246Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T00:19:10.544Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T00:20:04.306Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T00:20:04.308Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T01:24:35.295Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T01:25:29.131Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T02:30:22.079Z","flow":"docker-updates","event":"completed","container":"update-test","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T02:31:15.896Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T02:31:15.896Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:06:16.689Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:06:48.773Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:06:48.781Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:07:07.846Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:11:02.306Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:12:00.541Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:16:00.956Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:17:00.656Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:20:55.223Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:21:52.064Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:25:53.292Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:26:50.450Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:30:59.645Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:31:51.975Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:35:51.577Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:36:47.627Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:40:51.544Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T07:41:47.538Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:35:51.628Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:36:47.488Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:40:51.502Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:41:47.413Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:45:51.560Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:46:47.499Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:50:51.537Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:51:47.494Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:55:51.594Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T10:56:47.565Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:01:01.763Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:01:54.859Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:05:51.596Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:06:47.566Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:10:51.565Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:11:47.456Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:15:51.472Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:16:47.879Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:20:51.537Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:21:47.564Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:25:51.637Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:26:47.433Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:30:51.528Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:31:47.465Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:35:51.549Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:36:47.462Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:40:51.546Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:41:47.437Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:45:51.531Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:46:47.390Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:50:51.546Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:51:47.483Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:55:51.592Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T11:56:47.458Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:00:51.525Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:01:47.531Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:05:51.579Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:06:47.427Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:10:51.579Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:11:47.446Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:15:51.528Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:16:47.460Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:20:51.588Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:21:47.536Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:25:51.597Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:26:47.447Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:30:51.560Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:31:47.478Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:35:51.536Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:36:47.454Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:40:51.560Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:41:47.468Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:45:51.807Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:46:47.803Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:50:51.581Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:51:47.529Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:55:51.533Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T12:56:47.461Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:00:51.675Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:01:47.911Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:05:51.526Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:06:47.941Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:10:51.535Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:11:47.450Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:15:51.578Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:16:47.468Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:20:51.736Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:21:47.477Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:25:51.549Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:26:47.487Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:30:51.521Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:31:47.415Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:35:51.564Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:36:47.548Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:40:51.563Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:41:47.448Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:45:51.540Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:46:47.422Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:50:51.591Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:51:47.462Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:55:51.763Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T13:56:47.489Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:00:52.083Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:01:48.283Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:05:52.030Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:06:48.221Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:10:52.039Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:11:48.289Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:15:51.578Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:16:47.446Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:20:51.576Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:21:47.443Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:25:51.507Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:26:47.404Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:30:51.544Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:31:47.472Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:35:51.555Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:36:47.472Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:40:51.548Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:41:47.515Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:45:51.543Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:46:47.468Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:50:51.565Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:51:47.461Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:55:51.618Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T14:56:47.507Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:00:51.615Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:01:47.437Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:05:51.546Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:06:47.501Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:10:51.528Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:11:47.451Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:15:51.983Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:16:47.892Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:20:51.480Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:21:47.345Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:25:51.552Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:26:47.435Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:30:51.674Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:31:47.526Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:35:51.542Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:36:47.422Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:40:51.594Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:41:47.507Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:45:51.542Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:46:47.501Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:50:51.565Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:51:47.441Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:55:51.588Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T15:56:47.427Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:00:51.565Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:01:47.444Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:05:51.675Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:06:47.559Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:10:51.651Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:11:47.492Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:15:51.587Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:16:47.445Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:20:51.604Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:21:47.569Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:25:51.578Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:26:47.487Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:30:51.609Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:31:47.515Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:35:51.507Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:36:47.448Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:40:51.556Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:41:47.487Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:45:51.596Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:46:47.437Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:50:51.592Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:51:47.492Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:55:51.655Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T16:56:47.484Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:00:51.746Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:01:47.778Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:05:51.560Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:06:47.485Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:10:51.600Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:11:47.434Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:15:51.578Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:16:47.416Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:20:51.597Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:21:47.516Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:25:51.910Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:26:47.734Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:30:51.572Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:31:47.432Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:35:51.767Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:36:47.810Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:40:51.588Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:41:47.521Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:45:51.709Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:46:47.854Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:50:51.720Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:51:47.652Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:55:51.596Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T17:56:47.477Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:00:51.613Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:01:47.464Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:05:51.606Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:06:47.526Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:10:51.664Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:11:47.553Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:15:51.534Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:16:47.442Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:20:51.595Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:21:47.447Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:25:51.600Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:26:47.467Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:30:51.608Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:31:47.465Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:35:51.638Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:36:48.003Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:40:51.584Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:41:47.521Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:45:51.585Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:46:47.496Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:50:51.682Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:51:47.651Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:55:51.542Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T18:56:47.476Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:00:51.635Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:01:47.730Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:05:51.556Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:06:47.497Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:10:51.560Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:11:47.470Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:15:51.550Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:16:47.426Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:20:51.554Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:21:47.473Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:25:51.616Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:26:47.998Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:30:51.584Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:31:47.499Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:35:51.591Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:36:47.465Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:40:51.580Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:41:47.419Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:45:51.738Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:46:48.231Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:50:51.585Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:51:47.554Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:55:52.004Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T19:56:47.614Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:00:51.557Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:01:48.036Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:05:51.612Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:06:47.534Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:10:51.558Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:11:47.411Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:15:51.596Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:16:47.542Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:20:51.614Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:21:47.439Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:25:51.557Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:26:47.435Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:30:51.600Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:31:47.526Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:35:51.603Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:36:47.473Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:40:51.554Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:41:47.443Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:45:51.617Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:46:47.507Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:50:51.573Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:51:47.514Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:55:51.611Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T20:56:47.491Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:00:51.692Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:01:47.580Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:05:51.750Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:06:47.974Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:10:51.675Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:11:47.590Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:15:51.666Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:16:47.557Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:20:51.633Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:21:47.522Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:25:51.668Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:26:47.828Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:28:29.097Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:29:24.810Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:29:28.971Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:33:29.156Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:34:25.049Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:38:29.178Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:39:24.976Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:40:29.198Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:41:24.871Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:45:29.318Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:46:25.370Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:50:29.226Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:51:25.260Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:55:29.161Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-14T21:56:25.104Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-15T12:35:22.769Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-15T12:36:18.957Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-16T07:06:27.862Z","flow":"docker-updates","event":"completed","container":"passbolt-db","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-16T07:06:27.862Z","flow":"docker-updates","event":"completed","container":"passbolt-db","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-16T07:06:28.709Z","flow":"docker-updates","event":"completed","container":"nextcloud-db","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-16T07:06:28.709Z","flow":"docker-updates","event":"completed","container":"nextcloud-db","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-16T07:06:40.038Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-17T07:05:12.795Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-17T07:05:12.795Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-17T19:11:29.490Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-21T07:05:42.645Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-21T07:05:42.646Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-21T07:05:59.089Z","flow":"docker-updates","event":"completed","container":"gitea","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-21T07:06:45.971Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-21T07:06:45.971Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-21T07:06:56.112Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-21T07:06:56.112Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-22T07:05:43.226Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-22T07:05:43.226Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-22T07:05:43.237Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-22T07:05:43.237Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-22T07:06:55.068Z","flow":"docker-updates","event":"completed","container":"influxdb","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-22T07:06:55.069Z","flow":"docker-updates","event":"completed","container":"influxdb","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-22T11:50:51.776Z","flow":"docker-updates","event":"completed","container":"gitea","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-24T07:06:46.595Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-24T07:06:46.596Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-25T07:06:01.141Z","flow":"docker-updates","event":"completed","container":"gitea","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":1,"code":0,"error":""} -{"ts":"2026-04-25T07:06:05.952Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-25T08:21:45.451Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-25T08:21:45.451Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-26T07:05:42.647Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-26T07:05:42.647Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-26T07:06:59.195Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-26T19:10:52.147Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-26T19:10:52.183Z","flow":"docker-updates","event":"completed","container":"gitea","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-27T07:05:42.810Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-27T07:05:42.811Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-27T07:05:42.820Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-27T07:05:42.820Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-27T19:11:52.376Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-29T07:06:01.058Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-30T07:05:42.792Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-30T07:05:42.793Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-04-30T07:07:03.429Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-04-30T07:55:52.210Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-02T07:06:02.030Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-03T19:11:00.985Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-04T07:05:43.437Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-04T07:05:43.437Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-04T07:05:43.478Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-04T07:05:43.478Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-04T07:06:49.671Z","flow":"docker-updates","event":"completed","container":"pihole-exporter","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-05T07:06:53.883Z","flow":"docker-updates","event":"completed","container":"influxdb","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-05T07:06:53.883Z","flow":"docker-updates","event":"completed","container":"influxdb","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-05T07:15:53.751Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-05T19:11:46.870Z","flow":"docker-updates","event":"completed","container":"pihole-exporter","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-06T07:05:43.370Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-06T07:05:43.371Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-06T07:06:52.049Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-06T07:06:52.050Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-06T07:07:04.711Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-06T19:21:00.548Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-07T07:05:43.486Z","flow":"docker-updates","event":"completed","container":"portainer-agent","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-07T07:05:43.486Z","flow":"docker-updates","event":"completed","container":"portainer-agent","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-07T07:06:00.453Z","flow":"docker-updates","event":"completed","container":"gramps-redis","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-07T07:06:54.399Z","flow":"docker-updates","event":"completed","container":"portainer","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-07T07:16:46.710Z","flow":"docker-updates","event":"completed","container":"pihole-exporter","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-07T19:11:59.538Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-08T07:25:53.059Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-08T19:10:53.346Z","flow":"docker-updates","event":"completed","container":"gramps-redis","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-08T19:11:48.007Z","flow":"docker-updates","event":"completed","container":"portainer","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":1,"code":0,"error":""} -{"ts":"2026-05-08T19:21:46.912Z","flow":"docker-updates","event":"completed","container":"pihole-exporter","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-09T07:05:43.856Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-09T07:05:43.856Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-09T07:06:56.795Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-09T07:06:56.795Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-09T07:16:59.180Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-09T19:30:53.415Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-11T07:06:02.234Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-11T07:06:46.802Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-11T07:06:46.802Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-12T07:05:12.881Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-12T07:05:12.881Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-12T07:05:12.904Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-12T07:05:12.904Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-12T19:10:22.519Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-14T07:15:33.937Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-15T19:20:35.237Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-17T07:25:31.989Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-20T07:06:38.260Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-20T07:06:38.267Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T07:07:31.156Z","flow":"docker-updates","event":"completed","container":"gitea","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":1,"code":0,"error":""} -{"ts":"2026-05-21T07:08:03.029Z","flow":"docker-updates","event":"completed","container":"passbolt-db","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T07:08:03.041Z","flow":"docker-updates","event":"completed","container":"passbolt-db","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T07:08:05.341Z","flow":"docker-updates","event":"completed","container":"nextcloud-db","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":1,"code":0,"error":""} -{"ts":"2026-05-21T07:08:05.349Z","flow":"docker-updates","event":"completed","container":"nextcloud-db","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T07:08:05.951Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T09:50:18.722Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-21T09:50:18.729Z","flow":"docker-updates","event":"completed","container":"traefik","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-21T09:50:18.782Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-21T09:50:18.787Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"raspi","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-21T09:51:38.670Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T09:51:38.675Z","flow":"docker-updates","event":"completed","container":"telegraf","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T09:51:39.328Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-21T09:51:39.330Z","flow":"docker-updates","event":"completed","container":"nextcloud-redis","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-23T07:07:54.823Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-23T07:09:42.801Z","flow":"docker-updates","event":"completed","container":"passbolt-webapp","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-23T07:09:42.807Z","flow":"docker-updates","event":"completed","container":"passbolt-webapp","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-24T19:11:52.462Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-25T07:05:54.288Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-25T07:05:54.298Z","flow":"docker-updates","event":"completed","container":"gramps-web","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-25T07:05:54.324Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"failed","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-25T07:05:54.325Z","flow":"docker-updates","event":"completed","container":"gramps-web-celery","project":"unknown","host":"docker","status":"locked","success":0,"failed":1,"duration_ms":0,"code":1,"error":""} -{"ts":"2026-05-27T07:06:52.888Z","flow":"docker-updates","event":"completed","container":"authelia","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":1,"code":0,"error":""} -{"ts":"2026-05-27T07:08:21.357Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":1,"code":0,"error":""} -{"ts":"2026-05-29T07:08:28.615Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-29T07:09:43.873Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-30T19:12:17.132Z","flow":"docker-updates","event":"completed","container":"prometheus","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} -{"ts":"2026-05-30T19:12:44.362Z","flow":"docker-updates","event":"completed","container":"searxng-webapp","project":"unknown","host":"docker","status":"success","success":1,"failed":0,"duration_ms":0,"code":0,"error":""} diff --git a/monitoring/node-red/data/webhook.json b/monitoring/node-red/data/webhook.json deleted file mode 100644 index 39570d1..0000000 --- a/monitoring/node-red/data/webhook.json +++ /dev/null @@ -1 +0,0 @@ -{"receiver":"node-red","status":"firing","alerts":[{"status":"firing","labels":{"Active":"telegraf: 0 updates","Restored":"telegraf: 0 updates","alertname":"Updates","com_docker_compose_project":"core","compose_image":"telegraf:latest","container":"telegraf","grafana_folder":"Infrastructure","job":"container-updates","running_image":"telegraf:latest"},"annotations":{},"startsAt":"2026-03-31T01:16:10Z","endsAt":"0001-01-01T00:00:00Z","generatorURL":"https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1","fingerprint":"49b1e1dbf1255191","silenceURL":"https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dtelegraf%3A+0+updates&matcher=Restored%3Dtelegraf%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dtelegraf%3Alatest&matcher=container%3Dtelegraf&matcher=job%3Dcontainer-updates&matcher=running_image%3Dtelegraf%3Alatest&orgId=1","dashboardURL":"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171","panelURL":"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171&viewPanel=6","ruleUID":"bfgysfo3iregwf","values":{"A":1,"D":1},"valueString":"[ var='A' labels={com_docker_compose_project=core, compose_image=telegraf:latest, container=telegraf, job=container-updates, running_image=telegraf:latest} type='query' value=1 ], [ var='D' labels={com_docker_compose_project=core, compose_image=telegraf:latest, container=telegraf, job=container-updates, running_image=telegraf:latest} type='threshold' value=1 ]","orgId":1},{"status":"firing","labels":{"Active":"update-test: 0 updates","Restored":"update-test: 0 updates","alertname":"Updates","com_docker_compose_project":"core","compose_image":"nginx:1.27.1","container":"update-test","grafana_folder":"Infrastructure","job":"container-updates","running_image":"nginx:1.27.0"},"annotations":{},"startsAt":"2026-03-31T01:15:10Z","endsAt":"0001-01-01T00:00:00Z","generatorURL":"https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1","fingerprint":"c56bd9f28943cfac","silenceURL":"https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dupdate-test%3A+0+updates&matcher=Restored%3Dupdate-test%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dnginx%3A1.27.1&matcher=container%3Dupdate-test&matcher=job%3Dcontainer-updates&matcher=running_image%3Dnginx%3A1.27.0&orgId=1","dashboardURL":"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171","panelURL":"https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171&viewPanel=6","ruleUID":"bfgysfo3iregwf","values":{"A":1,"D":1},"valueString":"[ var='A' labels={com_docker_compose_project=core, compose_image=nginx:1.27.1, container=update-test, job=container-updates, running_image=nginx:1.27.0} type='query' value=1 ], [ var='D' labels={com_docker_compose_project=core, compose_image=nginx:1.27.1, container=update-test, job=container-updates, running_image=nginx:1.27.0} type='threshold' value=1 ]","orgId":1}],"groupLabels":{"alertname":"Updates","grafana_folder":"Infrastructure"},"commonLabels":{"alertname":"Updates","com_docker_compose_project":"core","grafana_folder":"Infrastructure","job":"container-updates"},"commonAnnotations":{},"externalURL":"https://grafana.lan.ddnsgeek.com/","appVersion":"12.4.2","version":"1","groupKey":"{}/{__grafana_autogenerated__=\"true\"}/{__grafana_receiver__=\"node-red\"}/{__grafana_route_settings_hash__=\"f177b219cbbdd2e2\"}:{alertname=\"Updates\", grafana_folder=\"Infrastructure\"}","truncatedAlerts":0,"orgId":1,"title":"[FIRING:2] Updates Infrastructure (core container-updates)","state":"alerting","message":"**Firing**\n\nValue: A=1, D=1\nLabels:\n - alertname = Updates\n - Active = telegraf: 0 updates\n - Restored = telegraf: 0 updates\n - com_docker_compose_project = core\n - compose_image = telegraf:latest\n - container = telegraf\n - grafana_folder = Infrastructure\n - job = container-updates\n - running_image = telegraf:latest\nAnnotations:\nSource: https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\nSilence: https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dtelegraf%3A+0+updates&matcher=Restored%3Dtelegraf%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dtelegraf%3Alatest&matcher=container%3Dtelegraf&matcher=job%3Dcontainer-updates&matcher=running_image%3Dtelegraf%3Alatest&orgId=1\nDashboard: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171\nPanel: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916170000&orgId=1&to=1774926701171&viewPanel=6\n\nValue: A=1, D=1\nLabels:\n - alertname = Updates\n - Active = update-test: 0 updates\n - Restored = update-test: 0 updates\n - com_docker_compose_project = core\n - compose_image = nginx:1.27.1\n - container = update-test\n - grafana_folder = Infrastructure\n - job = container-updates\n - running_image = nginx:1.27.0\nAnnotations:\nSource: https://grafana.lan.ddnsgeek.com/alerting/grafana/bfgysfo3iregwf/view?orgId=1\nSilence: https://grafana.lan.ddnsgeek.com/alerting/silence/new?alertmanager=grafana&matcher=__alert_rule_uid__%3Dbfgysfo3iregwf&matcher=Active%3Dupdate-test%3A+0+updates&matcher=Restored%3Dupdate-test%3A+0+updates&matcher=com_docker_compose_project%3Dcore&matcher=compose_image%3Dnginx%3A1.27.1&matcher=container%3Dupdate-test&matcher=job%3Dcontainer-updates&matcher=running_image%3Dnginx%3A1.27.0&orgId=1\nDashboard: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171\nPanel: https://grafana.lan.ddnsgeek.com/d/ad895wr?from=1774916110000&orgId=1&to=1774926701171&viewPanel=6\n"} diff --git a/monitoring/node-red/docker-compose.yml b/monitoring/node-red/docker-compose.yml index bd1551b..fbdbf8f 100644 --- a/monitoring/node-red/docker-compose.yml +++ b/monitoring/node-red/docker-compose.yml @@ -19,7 +19,8 @@ services: # ports: # - "1880:1880" volumes: - - ${PROJECT_ROOT}/monitoring/node-red/data:/data +# - ${PROJECT_ROOT}/monitoring/node-red/data:/data + - ${DOCKER_VOLUMES}/node-red-data:/data - ${PROJECT_ROOT}:/compose/docker:ro - /home/nixos/raspi:/compose/raspi:ro # - ${PROJECT_ROOT}:/usr/src/node-red:ro @@ -61,3 +62,6 @@ services: - "io.portainer.accesscontrol.public" - "traefik.docker.network=core_traefik" - "traefik.http.services.node-red.loadbalancer.server.port=1880" +#volumes: +# node-red-data: +# external: true diff --git a/monitoring/prometheus/docker-compose.yml b/monitoring/prometheus/docker-compose.yml index 59383e1..5dc7fed 100644 --- a/monitoring/prometheus/docker-compose.yml +++ b/monitoring/prometheus/docker-compose.yml @@ -20,8 +20,10 @@ services: # context: ${PROJECT_ROOT}/monitoring/prometheus volumes: - ${PROJECT_ROOT}/monitoring/prometheus/prometheus.yml:/etc/prometheus/prometheus.yml:ro - - ${PROJECT_ROOT}/monitoring/prometheus/data:/prometheus - - ${PROJECT_ROOT}/monitoring/prometheus/rules:/etc/prometheus/rules:ro +# - ${PROJECT_ROOT}/monitoring/prometheus/data:/prometheus +# - ${PROJECT_ROOT}/monitoring/prometheus/rules:/etc/prometheus/rules:ro + - ${DOCKER_VOLUMES}/prometheus/data:/prometheus + - ${DOCKER_VOLUMES}/prometheus/rules:/etc/prometheus/rules:ro - ${PROJECT_ROOT}/secrets/prometheus_kuma_basic_auth_password.txt:/run/secrets/prometheus_kuma_basic_auth_password:ro restart: unless-stopped @@ -46,3 +48,9 @@ services: timeout: 10s retries: 3 start_period: 30s + +#volumes: +# prometheus-data: +# external: true +# prometheus-rules: +# external: true diff --git a/monitoring/prometheus/prometheus.yml b/monitoring/prometheus/prometheus.yml index d66446c..6085a7b 100644 --- a/monitoring/prometheus/prometheus.yml +++ b/monitoring/prometheus/prometheus.yml @@ -46,10 +46,10 @@ scrape_configs: labels: role: pihole -# - targets: -# - server:9100 -# labels: -# role: server + - targets: + - server:9100 + labels: + role: server - targets: - nix-cache:9100 diff --git a/monitoring/prometheus/rules/alerts.yml b/monitoring/prometheus/rules/alerts.yml deleted file mode 100644 index 9cc51eb..0000000 --- a/monitoring/prometheus/rules/alerts.yml +++ /dev/null @@ -1,28 +0,0 @@ -groups: - - name: system - rules: - - alert: HostHighCPU -# expr: rate(node_cpu_seconds_total{mode!="idle"}[2m]) > 0.9 - expr: 100 * (1 - avg by(instance) (rate(node_cpu_seconds_total{mode="idle"}[2m]))) > 90 - for: 2m - labels: - severity: warning - annotations: - summary: "High CPU usage on host" - - - alert: ContainerRestarting -# expr: increase(container_start_time_seconds[10m]) > 3 - expr: increase(container_restart_count[10m]) > 3 - for: 1m - labels: - severity: warning - annotations: - summary: "Container restarting frequently" - - - alert: AlwaysFiring - expr: vector(1) - for: 10s - labels: - severity: critical - annotations: - summary: "This alert should always fire" diff --git a/monitoring/telegraf/docker-compose.yml b/monitoring/telegraf/docker-compose.yml index 15e0d3a..3c5f7d1 100644 --- a/monitoring/telegraf/docker-compose.yml +++ b/monitoring/telegraf/docker-compose.yml @@ -12,7 +12,9 @@ services: - no-new-privileges:true volumes: - ${PROJECT_ROOT}/monitoring/telegraf/telegraf.conf:/etc/telegraf/telegraf.conf:ro - - ${PROJECT_ROOT}/monitoring/node-red/data:/var/log/node-red:ro +# - ${PROJECT_ROOT}/monitoring/node-red/data:/var/log/node-red:ro + + - ${DOCKER_VOLUMES}/node-red-data:/var/log/node-red:ro networks: # - edge - monitor diff --git a/monitoring/uptime-kuma/docker-compose.yml b/monitoring/uptime-kuma/docker-compose.yml index 62d1a94..0ebe4ac 100644 --- a/monitoring/uptime-kuma/docker-compose.yml +++ b/monitoring/uptime-kuma/docker-compose.yml @@ -9,7 +9,8 @@ services: environment: DOCKER_HOST: ${DOCKER_SOCKET_PROXY_HOST} volumes: - - ${PROJECT_ROOT}/monitoring/uptime-kuma/data:/app/data +# - ${PROJECT_ROOT}/monitoring/uptime-kuma/data:/app/data + - ${DOCKER_VOLUMES}/monitor-kuma-data:/app/data # ports: # - 8888:3001 labels: @@ -33,3 +34,7 @@ services: #networks: # traefik_reverse_proxy: # external: true + +#volumes: +# monitor-kuma-data: +# external: true