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
This commit is contained in:
commit
8a385dfe21
10 changed files with 745 additions and 0 deletions
24
.cursorrules
Normal file
24
.cursorrules
Normal file
|
|
@ -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
|
||||
45
MASTER_INDEX.md
Normal file
45
MASTER_INDEX.md
Normal file
|
|
@ -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.
|
||||
34
README.md
Normal file
34
README.md
Normal file
|
|
@ -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.
|
||||
83
arakava-news/STATE.md
Normal file
83
arakava-news/STATE.md
Normal file
|
|
@ -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://<tailscale-ip>: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 <befehl>
|
||||
```
|
||||
|
||||
## 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)
|
||||
<!-- Hier können manuelle Ergänzungen eingetragen werden -->
|
||||
68
edelmetall/STATE.md
Normal file
68
edelmetall/STATE.md
Normal file
|
|
@ -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)
|
||||
<!-- Hier können manuelle Ergänzungen eingetragen werden -->
|
||||
68
esp32/PLAN.md
Normal file
68
esp32/PLAN.md
Normal file
|
|
@ -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
|
||||
71
infrastructure/STATE.md
Normal file
71
infrastructure/STATE.md
Normal file
|
|
@ -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-ip> # Tailscale
|
||||
|
||||
# Container-Befehle
|
||||
pct exec <ID> -- <befehl>
|
||||
pct push <ID> /lokal /remote
|
||||
pct pull <ID> /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)
|
||||
<!-- Hier können manuelle Ergänzungen eingetragen werden -->
|
||||
40
scripts/setup.sh
Normal file
40
scripts/setup.sh
Normal file
|
|
@ -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"
|
||||
236
scripts/sync-state.sh
Normal file
236
scripts/sync-state.sh
Normal file
|
|
@ -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://<TOKEN>@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://<CT109-IP>: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"
|
||||
76
smart-home/STATE.md
Normal file
76
smart-home/STATE.md
Normal file
|
|
@ -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 -- <befehl> # 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)
|
||||
<!-- Hier können manuelle Ergänzungen eingetragen werden -->
|
||||
Loading…
Add table
Reference in a new issue