commit 8a385dfe21482901d2c8b2575eb97c68f7eb3300 Author: Orbitalo Date: Sun Feb 22 11:41:57 2026 +0700 Initial: Modulares KI-Gedächtnissystem (MoE-Prinzip) - .cursorrules: 20-Zeilen Router, lädt nur relevanten Kontext - MASTER_INDEX.md: Einseiten-Übersicht aller Projekte - infrastructure/STATE.md: alle Server, Container, IPs - arakava-news/STATE.md: WordPress + RSS Manager - edelmetall/STATE.md: Gold/Silber Dashboard - smart-home/STATE.md: ioBroker, Grafana, Backup-System - esp32/PLAN.md: Hardware-Projekte - scripts/sync-state.sh: Auto-Sync täglich 03:00 - scripts/setup.sh: Einmalig einrichten diff --git a/.cursorrules b/.cursorrules new file mode 100644 index 0000000..9a9aa1f --- /dev/null +++ b/.cursorrules @@ -0,0 +1,24 @@ +# Orbitalo Homelab — KI Router +# REGEL: Nur diese Datei beim Start lesen. Dann NUR den einen relevanten Doc laden. +# Nie mehr als 1 STATE.md gleichzeitig in den Kontext laden. + +## Routing-Tabelle +| Aufgabe betrifft... | Lade diese Datei | +|-----------------------------------|------------------------------| +| WordPress / RSS / Arakava News | arakava-news/STATE.md | +| Gold / Silber / Edelmetall-Bot | edelmetall/STATE.md | +| Smart Home / ioBroker / Grafana | smart-home/STATE.md | +| ESP32 / Display / Heizung | esp32/PLAN.md | +| Server / Container / Proxmox | infrastructure/STATE.md | +| Telegram Bots allgemein | infrastructure/STATE.md | +| Alle Projekte / Übersicht | MASTER_INDEX.md | + +## Server-Zugang (immer verfügbar) +- pve-hetzner: `ssh root@100.88.230.59` | PW: Astral-Proxmox!2026 +- pve1 Kambodscha: `ssh root@192.168.0.197` | PW: astral66 +- Cluster-Doku: `pct exec 999 -- cat /root/.cursorrules` + +## Goldene Regeln +1. Kontextfenster schonen — nie mehr laden als nötig +2. STATE.md Dateien sind auto-generiert — immer aktuell +3. Bei Unklarheit: MASTER_INDEX.md lesen, nicht raten diff --git a/MASTER_INDEX.md b/MASTER_INDEX.md new file mode 100644 index 0000000..f5ced7a --- /dev/null +++ b/MASTER_INDEX.md @@ -0,0 +1,45 @@ +# Homelab Master Index +> Einmalig lesen für Übersicht. Danach gezielt die STATE.md des betroffenen Projekts laden. + +## Projekte + +| Projekt | Repo / Pfad | STATE.md | Code | +|---|---|---|---| +| **Arakava News** (WordPress + RSS + KI) | Orbitalo/Wordpress-V3-MCP-Projekt | arakava-news/STATE.md | arakava-news/src/ | +| **Edelmetall Dashboard** (Gold/Silber) | — (in diesem Repo) | edelmetall/STATE.md | edelmetall/src/ | +| **Smart Home Muldenstein** (ioBroker, Grafana) | — (in diesem Repo) | smart-home/STATE.md | smart-home/scripts/ | +| **ESP32 Projekte** (Heizung, Sensor) | — (in diesem Repo) | esp32/PLAN.md | — | +| **Infrastruktur** (alle Server + CTs) | — (in diesem Repo) | infrastructure/STATE.md | — | + +## Server + +| Server | Standort | Tailscale IP | Funktion | +|---|---|---|---| +| pve-hetzner | Deutschland | 100.88.230.59 | Hauptserver (CT 100-110, 144, 999) | +| pve1 | Kambodscha | 192.168.0.197 (lokal) | Heimserver (CT 135, 888, 999-Mirror) | +| pve3 | Muldenstein, DE | 100.109.101.12 | Smart Home (CT 143, 134) | + +## Wichtigste Zugangsdaten + +| System | Login | +|---|---| +| pve-hetzner SSH | root / Astral-Proxmox!2026 | +| pve1 SSH | root / astral66 | +| Alle lokalen CTs | root / astral66 | +| WordPress Admin | admin / eJIyhW0p5PFacjvvKGufKeXS | +| Seafile | admin@orbitalo.net / astral66 | +| n8n | wuttig@gmx.de / Astral66 | +| Dify | admin@orbitalo.net / astral66 | +| Grafana | admin / astral66 | + +## Telegram Bots + +| Bot | Token | Chat-ID | Projekt | +|---|---|---|---| +| @MutterbotAI_bot | (in infrastructure/STATE.md) | 674951792 | Moltbot allgemein | +| @DifyRagBot | 8390483455:AAEUyRWkvESSGQBtvjzAIQ5UKqmpoMTQZ00 | 674951792 | Dify RAG / Grafana Alerts | +| Arakava Comments | 8551565940:AAHIUpZND-tCNGv9yEoNPRyPt4GxEPYBJdE | 674951792 | WordPress Kommentare | + +## Auto-Sync +Die STATE.md Dateien werden täglich um 03:00 Uhr automatisch aktualisiert. +Script: `scripts/sync-state.sh` läuft als Cron-Job auf pve-hetzner. diff --git a/README.md b/README.md new file mode 100644 index 0000000..43bed60 --- /dev/null +++ b/README.md @@ -0,0 +1,34 @@ +# homelab-brain + +Externes Gedächtnis für das Orbitalo Homelab. +Optimiert für KI-Assistenten — minimaler Kontext beim Start, Details nur bei Bedarf. + +## Für KI-Assistenten + +**Immer zuerst `.cursorrules` lesen** — dann nur den einen relevanten `STATE.md` Doc. +Nie mehr als 1-2 Dateien gleichzeitig laden. + +## Struktur + +``` +.cursorrules ← Router (20 Zeilen) — immer zuerst lesen +MASTER_INDEX.md ← Übersicht wenn Projekt unklar + +infrastructure/STATE.md ← Server, Container, alle IPs +arakava-news/STATE.md ← WordPress + RSS Manager +edelmetall/STATE.md ← Gold/Silber Dashboard +smart-home/STATE.md ← ioBroker, Grafana, Backup +esp32/PLAN.md ← Hardware-Projekte (statisch) + +scripts/sync-state.sh ← Auto-Sync (läuft täglich 03:00) +scripts/setup.sh ← Einmalig einrichten +``` + +## Auto-Sync einrichten + +```bash +ssh root@100.88.230.59 +bash <(curl -s https://raw.githubusercontent.com/Orbitalo/homelab-brain/main/scripts/setup.sh) +``` + +Die `STATE.md` Dateien werden danach täglich automatisch aktualisiert. diff --git a/arakava-news/STATE.md b/arakava-news/STATE.md new file mode 100644 index 0000000..84af24b --- /dev/null +++ b/arakava-news/STATE.md @@ -0,0 +1,83 @@ +# Arakava News — Live State +> Auto-generiert täglich 03:00. Manueller Abschnitt am Ende. + +## Services + +| Service | Container | Status | Letzter Check | +|---|---|---|---| +| rss-manager | CT 109 | auto-aktualisiert | siehe unten | +| WordPress | CT 101 (Docker) | auto-aktualisiert | siehe unten | +| n8n Workflows | CT 104 | ⛔ deaktiviert | — | + +## RSS Manager + +``` +URL: http://:8080 +DB: /opt/rss-manager/rss_manager.db +Logs: /opt/rss-manager/logs/ +Neustart: systemctl restart rss-manager +``` + +## WordPress + +``` +URL: https://arakava-news-2.orbitalo.net +Admin: admin / eJIyhW0p5PFacjvvKGufKeXS +CT 101 → docker exec wordpress-app wp --allow-root +``` + +## Aktive Feeds (17 Stück) + +| ID | Name | Kategorie | Schedule | +|---|---|---|---| +| 1 | Dr. Bines Substack | 13 | 08/14/20 Uhr | +| 3 | NachDenkSeiten | 5 | 07/13/19 Uhr | +| 4 | Tichys Einblick | 6 | 07:30/13:30/19:30 | +| 5 | Junge Freiheit | 7 | 08/14/20 Uhr | +| 6 | PAZ | 8 | 08:30/14:30/20:30 | +| 7 | Apollo News | 9 | 09/15/21 Uhr | +| 8 | Apolut | 10 | 09:30/15:30/21:30 | +| 9 | Achgut.com | 15 | 10/16/22 Uhr | +| 10 | Heise Security | 11 | alle 4h | +| 11 | Golem.de | 12 | alle 2h | +| 12 | Heise Online | 3 | alle 3h | +| 13 | Rubikon.news | 17 | alle 3h | +| 14 | Corona-Transition | 18 | alle 4h | +| 15 | Photon.info (KI) | 3 | alle 6h | +| 16 | Antispiegel | 20 | 08:30/14:30/20:30 | +| 17 | Riehle News | 21 | 09:00 Uhr | + +## KI-Integration + +| Dienst | Modell | Zweck | Kosten/Monat | +|---|---|---|---| +| Photon.info | gpt-4o-mini | Vorcheck Relevanz | ~$0.01 | +| GitHub Researcher | claude-3-5-haiku | Analyse + Beschreibung | ~$0.70 | +| OpenRouter Key | sk-or-v1-f5b2... | Alle AI-Calls | ~$0.70-1.00 | + +## Bekannte Eigenheiten + +- **Antispiegel:** Cloudflare-geschützt → cloudscraper aktiv +- **GitHub Researcher:** läuft täglich 07:00, Symbolbild Media-ID 466 +- **Feed-Logos:** alle 17 Feeds haben logo_media_id in SQLite (IDs 449-464) +- **WP-CLI:** immer `--allow-root` in Docker + +## Code-Struktur (CT 109: /opt/rss-manager/) + +``` +poster.py — Scraping, Images, KI-Analyse +scheduler.py — APScheduler, alle Jobs +app.py — Flask Web-UI +db.py — SQLite, Token-Logging +github_researcher.py — GitHub Trending +templates/ — 9 HTML-Templates +``` + +## Offene Aufgaben v3 +- [ ] CT 112 anlegen, Docker Compose v3 +- [ ] Retry-Logik in poster.py +- [ ] Telegram Alerting bei Feed-Fehlern +- [ ] Heimserver RTX 3090 mit Ollama (Phase 6) + +## Notizen (manuell) + diff --git a/edelmetall/STATE.md b/edelmetall/STATE.md new file mode 100644 index 0000000..594f334 --- /dev/null +++ b/edelmetall/STATE.md @@ -0,0 +1,68 @@ +# Edelmetall Dashboard — Live State +> Auto-generiert täglich 03:00. Manueller Abschnitt am Ende. + +## Services + +| Service | Container | URL | Status | +|---|---|---|---| +| Dashboard Kambodscha | CT 135, pve1 | http://192.168.0.219:8501 | auto-aktualisiert | +| Dashboard Deutschland | CT 134, pve3 | https://blei.orbitalo.info | auto-aktualisiert | + +## Zugang + +```bash +# Dashboard Kambodscha starten/stoppen +pct exec 135 -- pkill -f streamlit +pct exec 135 -- bash -c "cd /root/edelmetall && source venv/bin/activate && nohup streamlit run dashboard/app.py --server.port 8501 --server.address 0.0.0.0 &" + +# Dashboard Deutschland (pve3) +ssh root@100.122.163.2 "pct exec 134 -- ..." +``` + +## Code-Struktur (CT 135: /root/edelmetall/) + +``` +dashboard/app.py — Haupt-Dashboard (Streamlit) +dashboard/validation.py — Preis-Validierung +bot.py — Telegram Bot +spot_api.py — Spot-Preis API +venv/ — Python venv +``` + +## Dashboard-Tabs + +| Tab | Funktion | +|---|---| +| 📈 Preise | Gold/Silber Live-Preise | +| ⚖️ Ratio | Gold/Silber Ratio + Regime-Analyse | +| 📊 Strategie | **Allocation Signal Indikator** | +| 📊 Spreads | Händler-Spreads | +| 💎 Portfolio | Persönliches Portfolio | +| 🌍 Makro Liquidität | Makro-Analyse | +| 🔧 Scraper | Scraper Status | + +## Allocation Signal Logik + +| Signal | Bedingung | Bedeutung | +|---|---|---| +| 🔴 GOLD | ratio > MA(120) AND slope > 0 | Gold bevorzugen | +| 🟢 REBALANCING | percentile >= 90 OR ratio > 85 | Silber relativ günstig | +| 🟡 NEUTRAL | sonst | Halten | + +Hysterese: Signal wechselt erst nach 7 Tagen stabiler Bedingung. + +## Portfolio (Kambodscha Investment) + +| Wohnung | Stock | Kaufpreis | Mieter | Miete | +|---|---|---|---|---| +| D1603 | 16 | 29.745 EUR | Antonio Ramirez | 250 USD/M | +| G2010B | 20 | 34.000 USD | Cheng Qiu | 250 USD/M | + +Netto-Einnahmen: 467 USD/Monat (nach Management Fee) + +## Offene Aufgaben +- [ ] Beide Dashboards in CT 112 v3 migrieren +- [ ] Bot-Alerts für Allocation Signal + +## Notizen (manuell) + diff --git a/esp32/PLAN.md b/esp32/PLAN.md new file mode 100644 index 0000000..d0ee1f5 --- /dev/null +++ b/esp32/PLAN.md @@ -0,0 +1,68 @@ +# ESP32 Projekte — Plan +> Statisches Dokument (kein Auto-Sync nötig — Hardware noch nicht bestellt/fertig). + +## Hardware-Bestellung (AliExpress, ~52 EUR) + +| Teil | Menge | Preis | Status | +|---|---|---|---| +| ESP32-8048S050 (5" Display) | 1 | ~30 EUR | 🛒 bestellen | +| ESP32-2432S028 (2.8" Display) | 1 | ~12 EUR | 🛒 bestellen | +| DS18B20 Temperatursensor (wasserdicht) | 8 | ~10 EUR | 🛒 bestellen | + +## Projekt 1: Heizungs-Display (5 Zoll) + +**Hardware:** ESP32-8048S050 +**Zweck:** Pufferspeicher, Solar, Holzheizung, Wärmepumpe, Ölheizung, Prognose +**Plan:** `/root/ESP32-Heizung-Projekt.md` auf pve1 CT 999 + +```bash +# Plan lesen +pct exec 999 -- cat /root/ESP32-Heizung-Projekt.md +``` + +## Projekt 2: Sensor-Monitor (2.8 Zoll) + +**Hardware:** ESP32-2432S028 (ILI9341, 240×320) +**Zweck:** WLAN-Scanner, Sensordaten anzeigen, Debug-Node + +### Pin-Belegung (Standard ESP32 DevKit) + +| Signal | GPIO | +|---|---| +| TFT_MOSI | 23 | +| TFT_SCLK | 18 | +| TFT_CS | 5 | +| TFT_DC | 2 | +| TFT_RST | 4 | + +### Framework: PlatformIO + Arduino + TFT_eSPI + +```bash +# Einmalig installieren +curl -fsSL https://raw.githubusercontent.com/platformio/platformio-core-installer/master/get-platformio.py -o get-platformio.py +python3 get-platformio.py + +# Flashen +cd esp32-wifi-scanner +~/.platformio/penv/bin/pio run -t upload +``` + +### Display-Layout (240×320) +``` +┌────────────────────────────┐ +│ WiFi Scanner │ +├────────────────────────────┤ +│ -67 dBm │ +│ ████████████░░░░ (65%) │ +│ MyNetwork_5G │ +│ 192.168.1.42 │ +├────────────────────────────┤ +│ Status: CONNECTED │ +└────────────────────────────┘ +``` + +## Nächste Schritte +- [ ] Hardware bestellen (AliExpress) +- [ ] WiFi-Scanner Code generieren (Plan ist fertig) +- [ ] Heizungs-Display Code generieren (Plan in CT 999) +- [ ] DS18B20 Sensoren verlegen/testen diff --git a/infrastructure/STATE.md b/infrastructure/STATE.md new file mode 100644 index 0000000..db84302 --- /dev/null +++ b/infrastructure/STATE.md @@ -0,0 +1,71 @@ +# Infrastruktur — Live State +> Auto-generiert. Manuelle Ergänzungen unten im Abschnitt "Notizen". + +## Container auf pve-hetzner (100.88.230.59) + +| CT | Name | Tailscale IP | Dienste | Status | +|---|---|---|---|---| +| 100 | traefik | 100.78.77.115 | Traefik, Pangolin, Uptime-Kuma, Cloudflared | ✅ | +| 101 | moltbot | 100.91.212.19 | Moltbot Telegram Bot (@MutterbotAI_bot) | ✅ | +| 102 | dify | 100.113.136.30 | Dify RAG System + Telegram Bot | ✅ | +| 103 | seafile | 100.75.247.60 | Seafile Cloud Storage | ✅ | +| 104 | n8n | 100.125.102.93 | n8n Automation (Workflows deaktiviert) | ✅ | +| 107 | ragflow | 100.116.125.12 | RAGFlow (in Einrichtung) | ⚠️ | +| 109 | rss-manager | — | Python RSS Manager + KI | ✅ | +| 110 | portainer | 100.109.206.43 | Portainer Docker UI | ✅ | +| 144 | muldenstein-backup | — | Backup-Archiv (Read-Only) | ✅ | +| 999 | cluster-docu | 100.79.8.49 | Dokumentation | ✅ | + +## Container auf pve1 Kambodscha (192.168.0.197) + +| CT | Name | IP | Dienste | Status | +|---|---|---|---|---| +| 135 | edelmetall | 192.168.0.219 | Streamlit Dashboard Gold/Silber | ✅ | +| 888 | MCP-Proxmox | 192.168.0.116 | Proxmox MCP Server (gilby125) | ✅ | +| 999 | cluster-docu | 192.168.0.209 | Doku-Mirror (alle 5 Min sync) | ✅ | + +## Container auf pve3 Muldenstein (100.109.101.12) + +| CT | Name | IP | Dienste | Status | +|---|---|---|---|---| +| 134 | gold-silber-de | 100.69.161.128 | Edelmetall Dashboard Mirror DE | ✅ | +| 143 | raspi-broker | 192.168.178.36 | InfluxDB, Grafana, ioBroker, Telegraf | ✅ | + +## PBS Backup-Server + +| Name | Tailscale IP | Standort | +|---|---|---| +| pbs (Kambodscha) | 100.82.175.23 | Kambodscha | +| pbs-1 (Muldenstein) | 100.99.139.22 | Deutschland | +| pbs-hetzner | 100.126.237.22 | Hetzner | + +## Netzwerk & Zugang + +```bash +# pve-hetzner +ssh root@100.88.230.59 # Tailscale +https://138.201.84.95:8006 # Proxmox GUI (nur Tailscale erreichbar) + +# pve1 Kambodscha +ssh root@192.168.0.197 # Lokal +ssh root@ # Tailscale + +# Container-Befehle +pct exec -- +pct push /lokal /remote +pct pull /remote /lokal +``` + +## Sicherheit +- Firewall: Default DROP, nur Tailscale + Container-Netz offen +- Fail2ban: aktiv (Stand 07.02: 484 gebannte IPs) +- Backups: täglich 03:00 → PBS Muldenstein (7 tägl, 4 wöchl, 3 monatl) + +## Moltbot (CT 101) +- Bot: @MutterbotAI_bot +- Code: /opt/moltbot/ +- Config: /root/.clawdbot/ +- Service: moltbot.service + +## Notizen (manuell) + diff --git a/scripts/setup.sh b/scripts/setup.sh new file mode 100644 index 0000000..44d0849 --- /dev/null +++ b/scripts/setup.sh @@ -0,0 +1,40 @@ +#!/bin/bash +# ============================================================ +# Einmalig ausführen auf pve-hetzner um Auto-Sync einzurichten +# ssh root@100.88.230.59 +# bash <(curl -s https://raw.githubusercontent.com/Orbitalo/homelab-brain/main/scripts/setup.sh) +# ============================================================ + +GH_TOKEN="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" +REPO_URL="https://${GH_TOKEN}@github.com/Orbitalo/homelab-brain.git" +REPO_DIR="/opt/homelab-brain" + +echo "=== homelab-brain Setup ===" + +# 1. Repo klonen +if [ -d "$REPO_DIR" ]; then + echo "Repo vorhanden, update..." + cd "$REPO_DIR" && git pull +else + echo "Klone Repo..." + git clone "$REPO_URL" "$REPO_DIR" +fi + +# 2. Script ausführbar machen +chmod +x "$REPO_DIR/scripts/sync-state.sh" + +# 3. Cron-Job einrichten (täglich 03:00) +CRON_ENTRY="0 3 * * * root /opt/homelab-brain/scripts/sync-state.sh >> /var/log/homelab-sync.log 2>&1" +if ! grep -q "homelab-brain" /etc/crontab; then + echo "$CRON_ENTRY" >> /etc/crontab + echo "Cron-Job eingerichtet (täglich 03:00)" +else + echo "Cron-Job bereits vorhanden" +fi + +# 4. Einmalig jetzt synchronisieren +echo "Führe ersten Sync aus..." +"$REPO_DIR/scripts/sync-state.sh" + +echo "=== Setup abgeschlossen ===" +echo "Logs: tail -f /var/log/homelab-sync.log" diff --git a/scripts/sync-state.sh b/scripts/sync-state.sh new file mode 100644 index 0000000..b4fbe24 --- /dev/null +++ b/scripts/sync-state.sh @@ -0,0 +1,236 @@ +#!/bin/bash +# ============================================================ +# homelab-brain Auto-Sync Script +# Läuft täglich 03:00 Uhr auf pve-hetzner +# Aktualisiert STATE.md Dateien und pushed nach GitHub +# +# Setup (einmalig auf pve-hetzner): +# git clone https://@github.com/Orbitalo/homelab-brain.git /opt/homelab-brain +# chmod +x /opt/homelab-brain/scripts/sync-state.sh +# echo "0 3 * * * root /opt/homelab-brain/scripts/sync-state.sh >> /var/log/homelab-sync.log 2>&1" >> /etc/crontab +# ============================================================ + +set -euo pipefail +REPO="/opt/homelab-brain" +GH_TOKEN="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" +DATE=$(date '+%Y-%m-%d %H:%M') +CHANGED=0 + +log() { echo "[$(date '+%H:%M:%S')] $1"; } + +cd "$REPO" +git pull --quiet + +# ───────────────────────────────────────────────────── +# 1. ARAKAVA NEWS STATE +# ───────────────────────────────────────────────────── +log "Sammle Arakava News Status..." + +RSS_STATUS=$(pct exec 109 -- systemctl is-active rss-manager 2>/dev/null || echo "unknown") +WP_STATUS=$(pct exec 101 -- docker inspect --format='{{.State.Status}}' wordpress-app 2>/dev/null || echo "unknown") + +# Letzte Feed-Aktivität aus SQLite +FEED_ACTIVITY=$(pct exec 109 -- python3 -c " +import sqlite3, json +db = sqlite3.connect('/opt/rss-manager/rss_manager.db') +rows = db.execute(\"SELECT name, last_run FROM feeds WHERE enabled=1 ORDER BY last_run DESC LIMIT 5\").fetchall() +for r in rows: print(f' {r[0]}: {r[1] or \"nie\"}') +" 2>/dev/null || echo " (nicht abrufbar)") + +# Letzte Fehler (letzte 24h) +ERRORS=$(pct exec 109 -- bash -c "grep -c 'ERROR' /opt/rss-manager/logs/service.log 2>/dev/null || echo 0") +LAST_ERROR=$(pct exec 109 -- bash -c "grep 'ERROR' /opt/rss-manager/logs/service.log 2>/dev/null | tail -1 || echo 'keine'") + +# OpenRouter Balance +OR_BALANCE=$(pct exec 109 -- python3 -c " +import requests, sys +try: + r = requests.get('https://openrouter.ai/api/v1/auth/key', + headers={'Authorization': 'Bearer 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'}, + timeout=5) + d = r.json().get('data', {}) + remaining = float(d.get('limit', 20)) - float(d.get('usage', 0)) + print(f'\${remaining:.2f} verbleibend') +except Exception as e: + print(f'(nicht abrufbar: {e})') +" 2>/dev/null || echo "(nicht abrufbar)") + +cat > "$REPO/arakava-news/STATE.md" << EOF +# Arakava News — Live State +> Auto-generiert: $DATE | Manueller Abschnitt am Ende. + +## Service Status +| Service | Status | +|---|---| +| rss-manager (CT 109) | $RSS_STATUS | +| WordPress Docker (CT 101) | $WP_STATUS | +| n8n Workflows | ⛔ deaktiviert | + +## Letzte Feed-Aktivität (Top 5) +$FEED_ACTIVITY + +## Fehler (letzte 24h) +- Fehler gesamt: $ERRORS +- Letzter Fehler: $LAST_ERROR + +## OpenRouter Guthaben +$OR_BALANCE + +## Credentials +- WordPress: https://arakava-news-2.orbitalo.net | admin / eJIyhW0p5PFacjvvKGufKeXS +- RSS Manager: http://:8080 +- OpenRouter: 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 + +## Feeds (17 aktiv) +| ID | Name | Kategorie | Schedule | +|---|---|---|---| +| 1 | Dr. Bines Substack | 13 | 08/14/20 Uhr | +| 3 | NachDenkSeiten | 5 | 07/13/19 Uhr | +| 4 | Tichys Einblick | 6 | 07:30/13:30/19:30 | +| 5 | Junge Freiheit | 7 | 08/14/20 Uhr | +| 6 | PAZ | 8 | 08:30/14:30/20:30 | +| 7 | Apollo News | 9 | 09/15/21 Uhr | +| 8 | Apolut | 10 | 09:30/15:30/21:30 | +| 9 | Achgut.com | 15 | 10/16/22 Uhr | +| 10 | Heise Security | 11 | alle 4h | +| 11 | Golem.de | 12 | alle 2h | +| 12 | Heise Online | 3 | alle 3h | +| 13 | Rubikon.news | 17 | alle 3h | +| 14 | Corona-Transition | 18 | alle 4h | +| 15 | Photon.info (KI) | 3 | alle 6h | +| 16 | Antispiegel | 20 | 08:30/14:30/20:30 | +| 17 | Riehle News | 21 | 09:00 Uhr | + +## Code (CT 109: /opt/rss-manager/) +- poster.py, scheduler.py, app.py, db.py, github_researcher.py +- Vollcode: github.com/Orbitalo/Wordpress-V3-MCP-Projekt + +## Offene Aufgaben v3 +- [ ] CT 112 anlegen, Docker Compose v3 +- [ ] Retry-Logik in poster.py +- [ ] Telegram Alerting bei Feed-Fehlern + +## Notizen (manuell) +EOF +CHANGED=1 +log "Arakava News STATE.md aktualisiert" + +# ───────────────────────────────────────────────────── +# 2. INFRASTRUKTUR STATE +# ───────────────────────────────────────────────────── +log "Sammle Infrastruktur Status..." + +# Container-Status auf pve-hetzner +CT_STATUS=$(pvesh get /nodes/pve-hetzner/lxc --output-format=text 2>/dev/null | \ + awk '{print $1, $2}' | grep -v "^vmid" || echo "(nicht abrufbar)") + +# Disk-Auslastung +DISK_ROOT=$(df -h / | awk 'NR==2{print $5 " von " $2}') +DISK_DATA=$(df -h /var/lib/vz | awk 'NR==2{print $5 " von " $2}' 2>/dev/null || echo "n/a") + +cat > "$REPO/infrastructure/STATE.md" << EOF +# Infrastruktur — Live State +> Auto-generiert: $DATE + +## pve-hetzner Disk +| Mount | Belegt | +|---|---| +| / (root) | $DISK_ROOT | +| /var/lib/vz (VMs) | $DISK_DATA | + +## Container auf pve-hetzner +| CT | Name | Tailscale IP | Dienste | +|---|---|---|---| +| 100 | traefik | 100.78.77.115 | Traefik, Pangolin, Uptime-Kuma | +| 101 | moltbot | 100.91.212.19 | @MutterbotAI_bot | +| 102 | dify | 100.113.136.30 | Dify RAG + @DifyRagBot | +| 103 | seafile | 100.75.247.60 | Seafile (seafile.orbitalo.net) | +| 104 | n8n | 100.125.102.93 | n8n (Workflows deaktiviert) | +| 107 | ragflow | 100.116.125.12 | RAGFlow (in Einrichtung) | +| 109 | rss-manager | — | RSS Manager + KI | +| 110 | portainer | 100.109.206.43 | Portainer UI | +| 144 | muldenstein-backup | — | Backup-Archiv | +| 999 | cluster-docu | 100.79.8.49 | Dokumentation | + +## Container auf pve1 Kambodscha +| CT | Name | IP | Dienste | +|---|---|---|---| +| 135 | edelmetall | 192.168.0.219 | Streamlit Gold/Silber | +| 888 | MCP-Proxmox | 192.168.0.116 | Proxmox MCP | +| 999 | cluster-docu | 192.168.0.209 | Doku-Mirror | + +## Container auf pve3 Muldenstein +| CT | Name | IP | Dienste | +|---|---|---|---| +| 134 | gold-silber-de | 100.69.161.128 | Dashboard DE (blei.orbitalo.info) | +| 143 | raspi-broker | 192.168.178.36 | InfluxDB, Grafana, ioBroker | + +## Zugangsdaten +- pve-hetzner: root / Astral-Proxmox!2026 +- pve1: root / astral66 +- Alle lokalen CTs: root / astral66 +- Seafile: admin@orbitalo.net / astral66 +- n8n: wuttig@gmx.de / Astral66 +- Dify: admin@orbitalo.net / astral66 + +## Notizen (manuell) +EOF +CHANGED=1 +log "Infrastruktur STATE.md aktualisiert" + +# ───────────────────────────────────────────────────── +# 3. SMART HOME STATE +# ───────────────────────────────────────────────────── +log "Sammle Smart Home Status..." + +# Backup-Status +LAST_BACKUP=$(ls -t /home/backup-muldenstein/backups/*.tar.gz 2>/dev/null | head -1 | xargs ls -lh 2>/dev/null | awk '{print $5, $6, $7, $8}' || echo "nicht abrufbar") +BACKUP_COUNT=$(ls /home/backup-muldenstein/backups/*.tar.gz 2>/dev/null | wc -l || echo "0") + +cat > "$REPO/smart-home/STATE.md" << EOF +# Smart Home Muldenstein — Live State +> Auto-generiert: $DATE + +## Backup-Status +- Letztes Backup: $LAST_BACKUP +- Backups gesamt: $BACKUP_COUNT +- Ziel: /home/backup-muldenstein/backups/ (CT 144) + +## Services (CT 143: 192.168.178.36) +| Dienst | URL | +|---|---| +| Grafana | https://grafana.orbitalo.net | +| ioBroker | http://192.168.178.36:8081 | +| InfluxDB | http://192.168.178.36:8086 | + +## Grafana Alerts → Telegram 674951792 +- Promtail DOWN (> 5 Min keine Daten) +- CPU > 70% +- Memory > 80% +- Disk > 90% + +## Backup-Zeitplan +- täglich 04:00 → Script: /root/backup-to-hetzner.sh (auf pve3) +- Retention: 30d tägl, 90d wöchl, unbegrenzt monatl + +## Notizen (manuell) +EOF +CHANGED=1 +log "Smart Home STATE.md aktualisiert" + +# ───────────────────────────────────────────────────── +# 4. GIT COMMIT & PUSH +# ───────────────────────────────────────────────────── +if [ "$CHANGED" -eq 1 ]; then + log "Committe Änderungen..." + git -C "$REPO" add -A + git -C "$REPO" -c user.email="sync@homelab" -c user.name="Auto-Sync" \ + commit -m "Auto-Sync: $DATE" --quiet || true + git -C "$REPO" push \ + "https://${GH_TOKEN}@github.com/Orbitalo/homelab-brain.git" main --quiet + log "Push erfolgreich" +else + log "Keine Änderungen" +fi + +log "Sync abgeschlossen" diff --git a/smart-home/STATE.md b/smart-home/STATE.md new file mode 100644 index 0000000..be135f8 --- /dev/null +++ b/smart-home/STATE.md @@ -0,0 +1,76 @@ +# Smart Home Muldenstein — Live State +> Auto-generiert täglich 03:00. Manueller Abschnitt am Ende. + +## Services (CT 143, pve3: 192.168.178.36) + +| Dienst | Port | Status | Funktion | +|---|---|---|---| +| ioBroker | — | auto-aktualisiert | Smart Home Steuerung | +| InfluxDB | 8086 | auto-aktualisiert | Zeitreihen-Datenbank | +| Grafana | 3000 | auto-aktualisiert | Dashboards + Alerting | +| Telegraf | — | auto-aktualisiert | Metriken sammeln | + +## Zugang + +```bash +# CT 143 direkt +ssh root@100.109.101.12 # pve3 Host +pct exec 143 -- # Container + +# Grafana +https://grafana.orbitalo.net # Extern (via Traefik) +http://192.168.178.36:3000 # Lokal +# Login: admin / astral66 +``` + +## Grafana Alerts (→ Telegram @DifyRagBot, Chat-ID 674951792) + +| Alert | Schwelle | Severity | +|---|---|---| +| Promtail DOWN | keine Daten > 5 Min | Warning | +| CPU > 70% | 5-Min Durchschnitt | Warning | +| Memory > 80% | 5-Min Durchschnitt | Warning | +| Disk > 90% | 5-Min Durchschnitt | Critical | + +## Backup-System (CT 144 auf pve-hetzner) + +``` +Quelle: CT 143 (pve3 Muldenstein) +Ziel: /home/backup-muldenstein/backups/ (pve-hetzner Host) +Zeitplan: täglich 04:00 Uhr +Retention: 30 Tage täglich, 90 Tage wöchentlich, unbegrenzt monatlich +Größe: ~707 MB pro Backup +``` + +Gesichert: InfluxDB, Grafana, ioBroker, Telegraf-Config, alle Scripts, SSH Keys + +## Monitoring-Architektur + +``` +CT 100 (traefik) → Promtail → Telegraf (CT 143) → InfluxDB → Grafana → Telegram +``` + +## Loki Log-Aggregation + +| Dienst | Host | Port | +|---|---|---| +| Loki Server | CT 110 (100.109.206.43) | 3100 | +| Promtail | CT 100 (100.78.77.115) | 9080 | + +## Scripts (CT 143: /root/) + +``` +backup-to-hetzner.sh — täglich 04:00, pusht nach CT 144 +brennerstarts.py — Brenner-Auswertung +tageswerte_berechnen.py — Tageswerte InfluxDB +brenner_history_calc.py — Historische Berechnung +openwb-logger.sh — OpenWB Wallbox Logger +``` + +## Offene Aufgaben +- [ ] Monitoring auf weitere CTs ausweiten (102, 103, 104) +- [ ] Telegram Alert bei Backup-Fehler (>30h ohne Backup) +- [ ] Restore-Test durchführen + +## Notizen (manuell) +