Files
netbird-telegraf-installer/scripts/install-archivebox-telemetrie.sh
T
kalina 6b169c77e6 ArchiveBox-Telemetrie: Exporteur + Telegraf-Container fuer Knoten ohne sudo
archibald hat kein sudo und kein linger, aber Docker-Gruppe. Muster wie
bei der llama-swap-Telemetrie auf dem ROG: ein Nutzer-Cron fuehrt den
Exporteur aus, Telegraf laeuft als Container daneben und pusht per
Remote Write zum Collector im Mesh.

- scripts/archivebox-telemetrie.py: liest die ArchiveBox-Logs und die
  SQLite-DB IM Container (Host-User mm darf index.sqlite3 nicht oeffnen,
  Container-User 911 schon) und schreibt eine Prometheus-Exposition.
  Kein node-Label -- das setzt Telegraf per global_tags.
- scripts/install-archivebox-telemetrie.sh: installiert Exporteur,
  Cron-Eintrag (jede Minute) und den Container, mit --dry-run.
- stacks/telegraf-container/: telegraf 1.39, network_mode host,
  inputs.file (data_format prometheus), outputs.prometheus_remote_write.
2026-10-10 23:26:19 +02:00

91 lines
3.4 KiB
Bash
Executable File

#!/bin/sh
# =============================================================================
# ArchiveBox-Runner-Telemetrie auf einem Knoten OHNE sudo einrichten.
#
# Drei Teile, alle ohne Root:
# 1. Exporteur-Skript nach ~/bin (liest Logs + DB im Container, schreibt .prom)
# 2. Cron-Eintrag (jede Minute) -- der Cron-Daemon des Hosts, kein Nutzer-Timer
# (linger=no wuerde Nutzer-Units beim Abmelden abraeumen)
# 3. Telegraf-Container (Docker-Gruppe) mit Remote Write an den Collector
#
# Aufruf: sh install-archivebox-telemetrie.sh [--dry-run]
# Vorbedingungen: python3, docker (Docker-Gruppe), cron laufen.
# =============================================================================
set -eu
DRY="${1:-}"
NODE="${NODE_NAME:-archibald}"
HOME_DIR="${HOME:-/home/mm}"
BIN="$HOME_DIR/bin/archivebox-telemetrie.py"
STACK_DIR="$HOME_DIR/stacks/telegraf-archibald"
PROM_URL="${PROM_URL:-http://100.83.134.46:9090/api/v1/write}"
say() { printf '%s\n' "$*"; }
run() {
if [ "$DRY" = "--dry-run" ]; then say "DRY: $*"; else eval "$@"; fi
}
say "== Vorbedingungen =="
for c in python3 docker crontab; do
command -v "$c" >/dev/null 2>&1 || { say "FEHLER: $c fehlt"; exit 1; }
say "ok: $c -> $(command -v "$c")"
done
docker ps >/dev/null 2>&1 || { say "FEHLER: Docker nicht nutzbar (Gruppe?)"; exit 1; }
say "ok: Docker nutzbar"
say "== 1. Exporteur =="
run "mkdir -p '$HOME_DIR/bin' '$HOME_DIR/abx-telemetrie'"
run "chmod 755 '$HOME_DIR/abx-telemetrie'"
if [ "$DRY" != "--dry-run" ]; then
here=$(cd "$(dirname "$0")" && pwd)
run "cp '$here/archivebox-telemetrie.py' '$BIN'"
run "chmod 755 '$BIN'"
fi
say "== 2. Cron (jede Minute, idempotent) =="
LINE="* * * * * LC_ALL=C /usr/bin/python3 $BIN >/dev/null 2>&1"
if [ "$DRY" = "--dry-run" ]; then
say "DRY: crontab-Zeile -> $LINE"
else
tmp=$(mktemp)
crontab -l 2>/dev/null | grep -v 'archivebox-telemetrie.py' > "$tmp" || true
printf '%s\n' "$LINE" >> "$tmp"
crontab "$tmp"
rm -f "$tmp"
say "crontab jetzt:"
crontab -l | sed 's/^/ /'
fi
say "== 3. Telegraf-Container =="
run "mkdir -p '$STACK_DIR'"
here=$(cd "$(dirname "$0")" && pwd)
if [ "$DRY" != "--dry-run" ]; then
run "cp '$here/../stacks/telegraf-container/docker-compose.yml' '$STACK_DIR/'"
run "cp '$here/../stacks/telegraf-container/telegraf.conf' '$STACK_DIR/'"
# NODE_NAME/PROM_URL aus der Datei gegen die hier gesetzten Werte stellen.
run "sed -i \"s|NODE_NAME: .*|NODE_NAME: $NODE|\" '$STACK_DIR/docker-compose.yml'"
run "sed -i \"s|PROM_URL: .*|PROM_URL: $PROM_URL|\" '$STACK_DIR/docker-compose.yml'"
fi
say "== Probelauf des Exporteurs =="
if [ "$DRY" != "--dry-run" ]; then
run "/usr/bin/python3 '$BIN'"
say "--- $HOME_DIR/abx-telemetrie/abx.prom (Kopf) ---"
head -20 "$HOME_DIR/abx-telemetrie/abx.prom"
fi
say "== Container starten =="
if [ "$DRY" != "--dry-run" ]; then
( cd "$STACK_DIR" && docker compose up -d )
sleep 20
docker logs --since 60s telegraf-archibald 2>&1 | grep -c 'E!' | sed 's/^/ E!-Zeilen: /'
docker exec telegraf-archibald sh -c 'cat /var/lib/abx-prom/abx.prom | head -3' \
| sed 's/^/ Container sieht: /'
fi
say ""
say "== Abnahme (auf dem Collector ausfuehren) =="
say "curl -s --data-urlencode 'query=archivebox_telemetrie_timestamp_seconds' http://<collector>:9090/api/v1/query"
say "curl -s --data-urlencode 'query=count by (node)(archivebox_runner_up)' http://<collector>:9090/api/v1/query"
say "OK -- Knoten $NODE eingerichtet."