diff --git a/README.md b/README.md index c57531e..77e7702 100644 --- a/README.md +++ b/README.md @@ -1,28 +1,45 @@ # netbird-telegraf-installer -Ein Befehl, und eine Node liefert Metriken + Logs an den zentralen Collector im NetBird-Netz -(Prometheus Remote Write `:9090`, Loki `:3100`, Grafana `:3000` — alle auf `100.83.134.46`). +Ein Befehl, und eine Node liefert Metriken + Logs an die zentrale Observability auf dem imac. +Der Ausgang läuft über den **NetBird-Reverse-Proxy** (`imac-prometheus.x05.idx.wf`, `imac-loki.x05.idx.wf`) +mit **Bearer-Token** — dadurch funktioniert der Installer auch auf Maschinen, die **kein NetBird-Peer** sind +(Büro-LAN, Kundenlaptop, CGNAT, VM ohne Client). -Voraussetzung: Die Node ist NetBird-Peer und erreicht `100.83.134.46`. Kein Tunnel, keine Freigabe nach außen. +## Der Token — zuerst lesen + +Jeder Aufruf braucht `--token `. Ohne Token bricht das Script mit +`FEHLER: Kein Token: --token angeben` ab. + +Den Token legt man im NetBird-Dashboard an: **`https://x05.idx.wf` → Reverse Proxy → +Service `imac-prometheus` → Authentication → Header → Preset „Bearer Token"**. +Für `imac-loki` denselben Wert eintragen (oder einen zweiten, dann aber getrennt halten). + +Token nie in dieses Repo schreiben — er landet ausschließlich in `/etc/default/telegraf` (Modus 0600) auf der Zielmaschine. ## Linux — Debian, Ubuntu, Proxmox VE, RHEL/Rocky/Alma/Fedora, Alpine, sonstige ```sh -curl -fsSL https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/install.sh | sudo sh -s -- --name +curl -fsSL https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/install.sh \ + | sudo sh -s -- --name --token ``` | Option | Bedeutung | |---|---| | `--name ` | Node-Name im Dashboard (Default: `hostname -s`) | -| `--collector ` | Collector-IP (Default `100.83.134.46`) | +| `--token ` | **Pflicht.** Bearer-Token des Reverse-Proxys | +| `--collector ` | Direktweg innerhalb des NetBird statt Reverse Proxy (z. B. `100.83.134.46`); braucht dann keinen Token-Zwang, aber die Node muss Peer sein | | `--role proxmox\|apache\|docker\|none` | Zusatz-Profil; Default `auto` erkennt Proxmox, Docker und Apache selbst | | `--pve-token 'telegraf@pve!monitoring=…'` | Proxmox-API-Token für VM/CT-Metriken | | `--apache-log ` | Access-Log (Default `/var/log/apache2/access.log`) | | `--uninstall` | alles entfernen | -**GPU:** Wird automatisch erkannt — NVIDIA via `nvidia-smi` (`inputs.nvidia_smi`), AMD via `rocm-smi` (exec-Input), Intel via `/dev/dri`. Ohne GPU läuft alles andere unverändert. Im Docker-Betrieb muss der Treiber im Container verfügbar sein (`nvidia-container-toolkit` bzw. `--device /dev/dri`). +Ablauf: Paketquelle von InfluxData (apt/dnf/apk) oder statisches Binary (amd64/arm64/armv7) → `/etc/telegraf/telegraf.conf` + `telegraf.d/` aus diesem Repo → `/etc/default/telegraf` mit NODE_NAME, PROM_URL, LOKI_URL, TELEGRAF_TOKEN → systemd-Dienst `telegraf`, enabled, Konfig-Test vor dem Start. -Ablauf: Paketquelle von InfluxData (apt/dnf/apk) oder statisches Binary (amd64/arm64/armv7) → `/etc/telegraf/telegraf.conf` + `telegraf.d/` aus diesem Repo → `/etc/default/telegraf` mit NODE_NAME/COLLECTOR → systemd-Dienst `telegraf`, enabled, Konfig-Test vor dem Start. +### Direktweg (Node ist NetBird-Peer) + +```sh +curl -fsSL …/install.sh | sudo sh -s -- --name --token --collector 100.83.134.46 +``` ### Proxmox VE @@ -30,7 +47,8 @@ Ablauf: Paketquelle von InfluxData (apt/dnf/apk) oder statisches Binary (amd64/a pveum user add telegraf@pve pveum user token add telegraf@pve monitoring -privsep 1 # Secret notieren pveum acl modify / -token 'telegraf@pve!monitoring' -role PVEAuditor -curl -fsSL https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/install.sh | sh -s -- --name pve1 --pve-token 'telegraf@pve!monitoring=' +curl -fsSL …/install.sh | sudo sh -s -- --name pve1 --token \ + --role proxmox --pve-token 'telegraf@pve!monitoring=' ``` ### Apache @@ -41,10 +59,9 @@ Wird automatisch erkannt (`apache2ctl`/`httpd`). Access-Log geht roh nach Loki. ```powershell Set-ExecutionPolicy Bypass -Scope Process -Force -iwr -useb https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/install.ps1 | iex +& ([scriptblock]::Create((iwr -useb https://gitea.m-m.bio/mm/netbird-telegraf-installer/raw/branch/main/install.ps1))) -Name ROG -Token ``` -Mit Parametern: `& ([scriptblock]::Create((iwr -useb …/install.ps1))) -Name mypc` -Installiert nach `C:\Program Files\Telegraf`, Dienst `telegraf`; liefert CPU/RAM/Disk/Net/Dienste + Eventlog (Warnung/Fehler) an den Collector. `-Uninstall` entfernt alles. +Installiert nach `C:\Program Files\Telegraf`, Dienst `telegraf`; liefert CPU/RAM/Disk/Net/Dienste + Eventlog (Warnung/Fehler). `-Uninstall` entfernt alles. ## GPU-Metriken @@ -55,22 +72,27 @@ Installiert nach `C:\Program Files\Telegraf`, Dienst `telegraf`; liefert CPU/RAM | Intel | `/dev/dri/renderD128` | Hinweis im Log — `intel_gpu_top` wird nicht automatisch erfasst | Im Dashboard: Row **GPU** (Auslastung, Speicher, Temperatur, Leistung). Leere Panels heißen: keine GPU-Node im Mesh. +Im Docker-Betrieb muss der Treiber im Container verfügbar sein (`nvidia-container-toolkit` bzw. `--device /dev/dri`); als systemd-Dienst ist das automatisch der Fall. + +## Prüfen + +```sh +TOKEN= +curl -s -H "Authorization: Bearer $TOKEN" \ + "https://imac-prometheus.x05.idx.wf/api/v1/query?query=system_uptime{node=\"\"}" +journalctl -u telegraf -f +``` +Im Grafana-Dashboard „NetBird Observability — Overview“ erscheint die Node automatisch im Node-Filter. +Grafana selbst: `http://100.83.134.46:3000` (nur im NetBird, Login `admin`). ## Docker-Host ohne root Wer kein sudo hat, aber in der Gruppe `docker` ist: Container-Variante aus [netbird-observability/stacks/telegraf-node](https://gitea.m-m.bio/mm/netbird-observability) (privates Repo). - -## Prüfen - -```sh -curl -s 'http://100.83.134.46:9090/api/v1/query?query=system_uptime{node=""}' -journalctl -u telegraf -f -``` -Im Grafana-Dashboard „NetBird Observability — Overview“ erscheint die Node automatisch im Node-Filter. +Dort ist `network_mode: host` gesetzt — ohne das sieht Telegraf nur `lo`+`eth0` statt der echten Interfaces. ## Sicherheit -- Der Collector akzeptiert unauthentifiziert — er ist nur über das NetBird-Interface erreichbar. +- Der Proxy verlangt Bearer-Token; das Header wird vor dem Weiterleiten entfernt und liegt damit nicht bei Prometheus/Loki. - Telegraf läuft als Benutzer `telegraf` (Docker-Socket read-only via Gruppe `docker`, Apache-Logs via Gruppe `adm`). -- Dieses Repo ist öffentlich und enthält keine Secrets. Tokens landen nur in `/etc/default/telegraf` (0600). +- Dieses Repo ist öffentlich und enthält keine Secrets. diff --git a/install.ps1 b/install.ps1 index 0bc4b1f..fa7a221 100644 --- a/install.ps1 +++ b/install.ps1 @@ -9,11 +9,19 @@ #> param( [string]$Name = $env:COMPUTERNAME.ToLower(), - [string]$Collector = "100.83.134.46", + # nvidia_smi-Input wird nur aktiv genutzt, wenn nvidia-smi installiert ist + [string]$Collector = "", + [string]$Token = "", [string]$Version = "1.40.0", [switch]$Uninstall ) $ErrorActionPreference = "Stop" +if (-not $Token -and -not $Collector) { throw "Kein Token: -Token angeben (siehe README)." } +if ($Collector) { + $PromUrl = "http://${Collector}:9090/api/v1/write"; $LokiUrl = "http://${Collector}:3100"; $Base = "http://${Collector}" +} else { + $PromUrl = "https://imac-prometheus.x05.idx.wf/api/v1/write"; $LokiUrl = "https://imac-loki.x05.idx.wf"; $Base = "https://imac-prometheus.x05.idx.wf" +} $Dir = "C:\Program Files\Telegraf" $Exe = "$Dir\telegraf.exe" $Conf = "$Dir\telegraf.conf" @@ -33,10 +41,13 @@ elseif (-not [Environment]::Is64BitOperatingSystem) { $arch = "i386" } Write-Host "[netbird-telegraf] Node=$Name Arch=$arch Collector=$Collector" try { - Invoke-WebRequest -UseBasicParsing -TimeoutSec 8 "http://${Collector}:9090/-/ready" | Out-Null - Write-Host "[netbird-telegraf] Collector erreichbar." + $h = @{} + if ($Token) { $h["Authorization"] = "Bearer $Token" } + $readyUrl = if ($Collector) { "$Base/-/ready" } else { "$Base/-/ready" } + Invoke-WebRequest -UseBasicParsing -TimeoutSec 10 -Headers $h $readyUrl | Out-Null + Write-Host "[netbird-telegraf] Collector erreichbar (auth ok)." } catch { - Write-Warning "Collector http://${Collector}:9090 nicht erreichbar — NetBird verbunden? Installation läuft weiter, Telegraf puffert." + Write-Warning "Collector $PromUrl nicht erreichbar oder Token falsch — Installation läuft weiter, Telegraf puffert." } if (-not (Test-Path $Exe)) { @@ -64,7 +75,7 @@ $cfg = @" hostname = "$Name" [[outputs.http]] - url = "http://${Collector}:9090/api/v1/write" + url = "$PromUrl" data_format = "prometheusremotewrite" timeout = "10s" namedrop = ["win_eventlog"] @@ -72,13 +83,18 @@ $cfg = @" Content-Type = "application/x-protobuf" Content-Encoding = "snappy" X-Prometheus-Remote-Write-Version = "0.1.0" + Authorization = "Bearer $Token" [[outputs.loki]] - domain = "http://${Collector}:3100" + domain = "$LokiUrl" endpoint = "/loki/api/v1/push" namepass = ["win_eventlog"] sanitize_label_names = true metric_name_label = "" + http_headers = { "Authorization" = "Bearer $Token" } + +[[inputs.nvidia_smi]] + timeout = "10s" [[inputs.cpu]] percpu = false @@ -109,5 +125,5 @@ Stop-Service telegraf -ErrorAction SilentlyContinue Start-Service telegraf Start-Sleep -Seconds 3 if ((Get-Service telegraf).Status -ne "Running") { throw "Dienst telegraf läuft nicht." } -Write-Host "[netbird-telegraf] OK — Node '$Name' liefert an http://${Collector}:9090 (Metriken) und :3100 (Eventlog Warn/Error)." -Write-Host "[netbird-telegraf] Grafana: http://${Collector}:3000 (nur im NetBird)" +Write-Host "[netbird-telegraf] OK — Node '$Name' liefert an $PromUrl (Metriken) und $LokiUrl (Eventlog Warn/Error)." +Write-Host "[netbird-telegraf] Grafana: http://100.83.134.46:3000 (nur im NetBird)"