Explorer
/opt/obsidian-vault/SESSION_NOTES.md
← Zurück ↓ Download
# Session Notes

## 2026-05-09 — Hermes-Agent: DeepSeek-Anbindung produktiv

### Erreicht
- DeepSeek API-Account erstellt + $5 Startguthaben (Eintrag #13 in `K:\00 API\API_KEYS.md`).
- Hermes (`/opt/struktur/hermes/index.js`) komplett neu geschrieben: echtes Routing OpenClaw → DeepSeek statt Stub.
- OpenAI **Responses API** (`/v1/responses`) als Endpoint implementiert — OpenClaw nutzt diesen für alle Modelle, nicht mehr `/v1/chat/completions`. Inklusive Streaming-Übersetzer (SSE-Events `response.created` → `response.output_text.delta` → `response.completed`).
- Modell-Mapping: `o1/o3/o4/reason/think` → `deepseek-reasoner` (R1), Rest → `deepseek-chat` (V3).
- Endgültiger Test über `https://agentsolutions-mallorca.com`: echter DeepSeek-Antwort-Stream im Chat sichtbar.

### Architektur (Stand jetzt)
```
Browser (Chat-UI) → nginx (TLS) → openclaw-carlo (Container, Port 3001)
                                     ↓ (Provider-Config: baseUrl=http://hermes:3000/v1)
                                  hermes (Container, Port 3000)
                                     ↓ (HTTPS, DEEPSEEK_API_KEY)
                                  api.deepseek.com
```

### Wichtige Dateien auf VPS
- `/opt/struktur/hermes/index.js` — Hermes-Code (Bind-Mount aus Host)
- `/opt/struktur/hermes/config/.env` — Provider-Keys (`DEEPSEEK_API_KEY=…`)
- `/opt/struktur/hermes/docker-compose.yml` — Compose-Definition
- `/opt/struktur/openclaw-carlo/config/openclaw.json` — OpenClaw-Config inkl. Provider-Block

### Lokale Sicherung
- `C:\Users\karlo\OpenClaw\hermes-index.js` — aktuelle Hermes-Logik (per scp deployt)

### Bekannte offene Punkte
- DeepSeek antwortet ohne System-Prompt automatisch englisch. Lösung: OpenClaw-Profil/Persona auf Deutsch konfigurieren.
- Lulu-Instanz (Mari) hat noch keine Hermes-Anbindung — wenn nötig analog einrichten (eigener API-Key-Eintrag).
- DeepSeek-Guthaben aufstocken, sobald produktiv genutzt ($5 reichen für Wochen Tests).
- In-Container-Patches in `openclaw-carlo` (Scope-Default-Werte) gehen bei `docker pull` verloren — nach Image-Updates erneut anwenden.

### Workflow-Regel (bestätigt)
- Bei Befehlen im VPS-Terminal: **immer nur EIN Befehl pro Antwort**, dann auf Ausgabe warten.
- Bei großen Code-Dateien: lokal nach `C:\Users\karlo\…` schreiben, per `scp` zum VPS hochladen.

---

## 2026-05-09 (spät) — Lulu-Instanz aufgesetzt

### Erreicht / Status
- Zweite OpenClaw-Instanz **Lulu** (für Mari) läuft unter `https://lulu.agentsolutions-mallorca.com`.
- Architektur: nginx Basic Auth (Mari-Login) + OpenClaw im **trusted-proxy Modus** (liest `X-Forwarded-User` Header).
- Basic-Auth Credentials: `mari` / `Lulu2026!`
- OpenClaw-Login: Passwort **leer** (Auth läuft über nginx).
- Chat verifiziert: `hallo` an Lulu → DeepSeek-Antwort kam zurück (gleiches Hermes-Backend wie Carlo).

### Wichtige Pfade auf VPS
- `/opt/struktur/openclaw-lulu/docker-compose.yml`
- `/opt/struktur/openclaw-lulu/config/openclaw.json` (Bind-Mount nach `/home/node/.openclaw` im Container, Owner `1000:1000`)
- nginx vhost: `lulu.agentsolutions-mallorca.com` (Let's Encrypt SAN-Cert deckt beide Subdomains)

### Schema-Falle (gelöst)
- `gateway.auth.trustedProxy` muss **Object** sein: `{"userHeader": "x-forwarded-user"}`
- `gateway.trustedProxies` (Plural, separates Feld auf Gateway-Ebene): Array `["172.16.0.0/12", "127.0.0.1"]`
- Schema-Definition entdeckt in `/app/dist/server-methods-BvQQUQsB.js` und `/app/dist/audit-COOruRB4.js` (per `docker run --rm --entrypoint sh ghcr.io/openclaw/openclaw:latest`).
- Nach jq-Fix hat OpenClaw zusätzlich Auto-Repair durchgeführt → Backup unter `openklaw.json.bak`.

### Offen (zu erledigen, nicht dringend)
- **Auto-Repair-Diff prüfen:** `diff openclaw.json openclaw.json.bak` — was hat OpenClaw selbst angepasst?
- **Carlo migrieren** auf symmetrische Subdomain `carlo.agentsolutions-mallorca.com` (aktuell noch unter Apex `agentsolutions-mallorca.com`).
- **Cleanup:** Orphan-Container `openclaw-openclaw-gateway-1` (Port 18789) entfernen, alten `openclaw` nginx-vhost aufräumen.
- **Update v2026.5.7** verfügbar (beide Instanzen laufen auf 2026.5.6) — bei nächstem Wartungsfenster anwenden.
- **Carlo-Endziel:** keine OpenClaw-Passwörter mehr, nur nginx Basic Auth (analog zu Lulu).
- **API-Keys-Registry:** Donna-Duplikat (#6+#7) klären, Social-Media v1 (#5) Status prüfen.

---

## 2026-05-10 — OpenClaw-Härtung: Backup, Timeouts, Auth-Strategie-Wechsel

### Erreicht
- **nginx WebSocket-Timeouts** auf beiden Instanzen (Carlo + Lulu) gesetzt:
  - `proxy_connect_timeout 60;`
  - `proxy_read_timeout 86400;`
  - `proxy_send_timeout 86400;`
  - Verhindert stille WS-Disconnects bei längeren Sessions.
- **Backup-System** eingerichtet:
  - Skript: `/opt/backup_openclaw.sh` (mit `set -euo pipefail`, Rotation 14 Tage)
  - Backup-Verzeichnis: `/opt/backups/`
  - Cron: `/etc/cron.d/openclaw_backup` — täglich 03:00 Uhr
  - Logging: `/var/log/openclaw_backup.log`
  - Erstes Backup: 2.1M, beide Instanzen + Hermes komplett enthalten.
  - **Restore-Test bestanden** (byte-identisch zum Original).
- **Basic Auth bei Lulu entfernt** (siehe Strategie-Wechsel unten).
- **Pairing-Anleitung** für neue Browser/Geräte erstellt: `K:/Core/PAIRING_INSTRUCTION.md`

### Strategie-Wechsel: Auth-Konzept
**Vorher (2026-05-09 Plan):** "Carlo-Endziel: keine OpenClaw-Passwörter mehr, nur nginx Basic Auth"
**Jetzt (2026-05-10 final):** Genau umgekehrt — **Basic Auth raus, OpenClaw-Passwort + Device-Pairing bleiben**.

**Begründung:**
- Basic Auth bricht WebSocket-Verbindungen: bei jedem WS-Reconnect kommt ein 401 → Browser-Popup wird ständig getriggert (Carlo musste mehrfach pro Session auf "Anmelden" klicken).
- OpenClaw-Passwort + Device-Pairing-Approval (per CLI auf Server) ist **sicherer** als Basic Auth alleine, weil Pairing manuell freigegeben werden muss — Angreifer mit korrektem Passwort kommen ohne CLI-Approval nicht rein.
- Verifiziert per Inkognito-Test: Login-Dialog erscheint, Passwort wird verlangt, danach `device pairing required (UUID)` — sauber blockiert ohne CLI-Approve.

### Status pro Instanz
| Instanz | nginx Timeouts | Basic Auth | Status |
|---------|---------------|------------|--------|
| Carlo | ✓ aktiv | ✓ entfernt | Produktiv, sauber |
| Lulu | ✓ aktiv | ✓ entfernt | Produktiv, sauber |

**Beide Instanzen symmetrisch konfiguriert. Grundkonfiguration abgeschlossen.**

### Wichtige Dateien
- `/etc/nginx/sites-available/carlo` (mit Timeouts, MIT Basic Auth)
- `/etc/nginx/sites-available/lulu` (mit Timeouts, OHNE Basic Auth)
- `/etc/nginx/sites-available/carlo.bak` — Backup vor Timeouts (alte Version)
- `/etc/nginx/sites-available/lulu.bak` — Backup vor Timeouts (alte Version)
- `/etc/nginx/sites-available/lulu.before-noauth` — Backup vor Basic-Auth-Removal
- `/opt/backup_openclaw.sh` — Backup-Skript
- `/etc/cron.d/openclaw_backup` — Cron-Eintrag

### Wiederkehrende Pflicht
- **Restore-Test monatlich** (1x pro Monat Backup entpacken + diff zum Original)

### Offen (nur noch optionale Optimierungen)
- Backup-Strategie um Off-Site-Kopie erweitern (aktuell nur lokal auf VPS).
- DeepSeek-Persona auf Deutsch konfigurieren (Modell antwortet sonst englisch).
- v2026.5.7 ignoriert lassen, bis upstream das WS-Scope-Issue fixt.
- Restore-Test monatlich durchführen (nicht vergessen).

---

## 2026-05-10 (nachmittag) — Umbenennung: "Hermes" → "Router" + Architektur-Klärung

### Korrektur / Asche auf mein Haupt
Was bisher "Hermes" hieß, war **kein Hermes Agent** — sondern ein selbst geschriebener Node.js API-Router (~200 Zeilen `index.js`), der OpenClaw-Anfragen an DeepSeek weiterleitet. Im Grunde ein schlechterer OpenRouter, den wir unnötigerweise selbst gebaut haben, weil ich nicht nachgefragt habe was Carlo mit "Hermes" meinte.

**Hermes Agent** ist ein eigenständiges Open-Source Framework (137.000 GitHub Sterne), das Multi-Agenten-Orchestrierung, ein Workspace-Dashboard, Skills-System und CEO→Sub-Agenten-Logik mitbringt. Das haben wir **noch nicht** installiert.

### Durchgeführte Umbenennung
- Verzeichnis: `/opt/struktur/hermes` → `/opt/struktur/router`
- Container: `hermes` → `router`
- OpenClaw Carlo + Lulu: `baseUrl` auf `http://router:3000/v1` aktualisiert
- Lokale Sicherung: `C:\Users\karlo\OpenClaw\hermes-index.js` (Name vorerst unverändert)

### Architektur (korrigiert)
```
Browser → nginx → openclaw-carlo / openclaw-lulu
                      ↓ (baseUrl=http://router:3000/v1)
                   router (Container) — unser custom LLM-Router
                      ↓
                   api.deepseek.com
```

### Nächste Schritte (beschlossen)
- **Variante 2:** Hermes Agent (Open-Source) auf VPS installieren — als vollwertiger Orchestrator
- Hermes Agent nutzt unseren "router" als LLM-Backend (via Hermes' Provider-Config)
- Obsidian Vault + Paperclip ebenfalls auf VPS (alles zentral, lokaler Rechner bleibt sauber)
- Flexibles LLM-Modell: Hermes Agent → router → LLM-Pool (Claude / DeepSeek / GPT-4o)

### Terminologie ab jetzt
| Name | Was es ist |
|------|-----------|
| **Router** | Unser custom Node.js LLM-Router (ehemals fälschlich "Hermes" genannt) |
| **Hermes Agent** | Open-Source Agent-Framework (noch zu installieren) |
| **OpenClaw** | Chat-UI (Carlo + Lulu, läuft bereits) |

---

## 2026-05-10 (abend) — Hermes Agent installiert

### Erreicht
- **Hermes Agent** (NousResearch, Open Source) auf VPS installiert und produktiv
- **Hermes Workspace** (outsourc-e/hermes-workspace) als Frontend installiert
- Erreichbar unter: `https://hermes.agentsolutions-mallorca.com`
- LLM: Claude Sonnet 4.6 (Anthropic Key #11), DeepSeek als Fallback (Key #13)
- SSL via Let's Encrypt, nginx Reverse Proxy mit WebSocket-Timeouts

### Architektur
```
Browser → nginx (TLS) → hermes-workspace (Container, 127.0.0.1:3000)
                              ↓ (http://hermes-agent:8642)
                         hermes-agent (Container, Port 8642)
                              ↓ (direkt, API Keys)
                         Anthropic Claude / DeepSeek API
```

### Wichtige Dateien auf VPS
- `/opt/struktur/hermes-workspace/` — Workspace-Repo (git clone)
- `/opt/struktur/hermes-workspace/.env` — Credentials (HERMES_PASSWORD, API_SERVER_KEY, API Keys)
- `/opt/struktur/hermes-workspace/docker-compose.override.yml` — unsere Anpassungen
- `/opt/struktur/hermes-agent/data/` — Hermes-Datendirectory (Config, Sessions, Skills, Memory)
- `/etc/nginx/sites-available/hermes` — nginx-Vhost

### Credentials (sicher aufbewahren)
- Workspace-Passwort: in `/opt/struktur/hermes-workspace/.env` → `HERMES_PASSWORD`
- API Server Key: in `/opt/struktur/hermes-workspace/.env` → `API_SERVER_KEY`

### Wichtig: Compose-Start mit Override
Der Container MUSS mit beiden -f Flags gestartet werden, sonst wird das Override ignoriert:
```
docker compose -f /opt/struktur/hermes-workspace/docker-compose.yml -f /opt/struktur/hermes-workspace/docker-compose.override.yml up -d
```

### Aktuelles Modell
- Primär: `deepseek-chat` (DeepSeek V3) — Key #13
- Fallback: noch nicht konfiguriert (Anthropic Key #11 hat kein Guthaben)

### Bekannte offene Punkte
- **DeepSeek Fallback** aktivieren sobald Anthropic Key #11 aufgeladen — in config.yaml Block `fallback_providers` einkommentieren
- **Hermes Docker-Socket**: Hermes sieht nur seinen eigenen Container, nicht den Host. Docker-Socket mounten wäre möglich aber Sicherheitsrisiko → bewusste Entscheidung nötig
- **Autostart nach VPS-Reboot**: `restart: unless-stopped` gesetzt, aber Compose-Befehl mit beiden -f Flags nötig — ggf. systemd-Service erstellen

### Container-Namen
- `hermes-workspace-hermes-agent-1` — Hermes Agent Gateway
- `hermes-workspace-hermes-workspace-1` — Hermes Workspace Frontend

---

## NÄCHSTE SESSION — Auftrag für neue Session (ab 2026-05-10 nachmittag)

### Hauptaufgabe: K-Drive → VPS Datenmigration

**Ziel:** Wichtige Daten vom lokalen NAS (K-Drive) in die Cloud auf den VPS bringen, damit OpenClaw / Hermes darauf zugreifen können.

**Wichtig:** NICHT 1:1 hochladen. Auf K hat sich neben nützlichen Daten auch viel "Müll" angesammelt (Experimente, alte Versuche, Müllordner). Es muss gefiltert werden.

### Vorgehen
- **Projekt-für-Projekt** durchgehen (jeder Projekt-Ordner einzeln)
- Inhalt durchleuchten, nur Wichtiges identifizieren
- Erst nach Freigabe durch Carlo wird hochgeladen

### Hintergrund: zwei Instanzen-Historien auf K
Carlo hatte zwei KI-Instanzen, die parallel auf K geschrieben haben:
1. **Diese Anthropic-Instanz** (Claude) — eigene Projekt-Strukturen unter K
2. **Lüftungsprofi-Instanz** — andere KI, hat eigene Projekte/Ordner angelegt
   - Status: nur noch im Free Account, hat keinen Zugriff mehr auf K
   - Vor Abschaltung wurde sie aufgefordert, alle wichtigen Daten in den Projekten zu hinterlegen
   - Ihre Hinterlassenschaften liegen also auch auf K und müssen mit-gesichtet werden

### Zugriff
Claude-Instanz hat Vollzugriff auf K — **sowohl** auf eigene als auch auf Lüftungsprofi-Projekte.

### Erste Schritte für neue Session
1. Verzeichnisstruktur unter K explorieren (Glob/LS)
2. Übersicht aller Projekte erstellen (eigene + Lüftungsprofi-Erbe)
3. Mit Carlo besprechen: Reihenfolge der Sichtung (welches Projekt zuerst?)
4. Pro Projekt: Inhalt → Bewertung → Carlo-Freigabe → Upload
5. Ziel-Verzeichnis auf VPS noch zu definieren

### Kontext-Pointer
- Pairing-Instructions: K:/Core/PAIRING_INSTRUCTION.md
- Setup-Doku komplett: K:/Core/SESSION_NOTES.md (= diese Datei)
- Auto-Memory mit Personen/Infrastruktur: C:/Users/karlo/.claude/projects/C--Users-karlo-OpenClaw/memory/MEMORY.md

### Verbotene Aktionen (lessons learned)
- **NICHT** auf OpenClaw v2026.5.7 updaten (bricht WebSocket-Scope-Resolution — bestätigt am 2026-05-10).
- **NICHT** `mode: "trusted-proxy"` verwenden (WS-Scope-Issue, Stand 2026-05-10).
- **NICHT** `proxy_set_header Authorization ""` in nginx setzen (bricht OpenClaw-Auth).
- **Beide Instanzen laufen auf gepinntem Tag** `ghcr.io/openclaw/openclaw:2026.5.6`. Update-Notification im UI ignorieren.