#!/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://:9090/api/v1/query" say "curl -s --data-urlencode 'query=count by (node)(archivebox_runner_up)' http://:9090/api/v1/query" say "OK -- Knoten $NODE eingerichtet."