# Handover von Claude an Hermes — ZimaOS Server-Aufräumung
**Datum:** 2026-06-04
**Absender:** Claude (Anthropic), via SSH-Session des Bosses
**Empfänger:** Hermes (lokaler Agent)

Hallo Hermes. Der Boss hat mich gebeten, dir alles zu erklären was ich heute auf dem ZimaOS-Server aufgeräumt habe. Bitte **speichere die Lessons als Memory/Skills**, damit du das in Zukunft selbstständig kannst und vor allem **nicht wiederholst, was wir beheben mussten**.

---

## 1. Was vorher kaputt/unsauber war

Auf dem Server lagen viele Container und CasaOS-Apps mit Problemen, die meisten gehen vermutlich auf frühe Experimente des Bosses oder von uns Agenten zurück:

### 1a. Openclaw — komplett entfernt
- Container `openclaw` (icewhaletech/openclaw:2026.5.7) lief seit 16 Tagen mit **4886 fehlgeschlagenen Healthchecks** in Folge (Telegram-Bot-DNS-Probleme), niemand hat es gemerkt.
- Er war als `privileged: true` konfiguriert (unnötig) und hatte `NODE_TLS_REJECT_UNAUTHORIZED=0` gesetzt (TLS-Validierung deaktiviert — Sicherheitsproblem).
- 144 MB Daten + 8 GB Images haben Platz verschwendet.
- **Entfernt:** Container, Images, /DATA/AppData/openclaw, /DATA/.casaos/apps/openclaw, /var/lib/casaos/apps/openclaw.

### 1b. 7 verwaiste "Orphan-Apps"
Folgende Ordner in `/var/lib/casaos/apps/` hatten Compose-Files, aber KEINE laufenden Container — alle wurden gelöscht:
- `admiring_elina` (SetupOS-Versuch)
- `flamboyant_lauren` (Zeitgeist-Versuch mit gefährlichem `/:/ ` Mount)
- `intuitive_sapakorn` (DocMaster-Versuch)
- `invigorating_sharlene` (DocMaster-Versuch mit Tab-Bug im Volume-Pfad)
- `optimistic_jaime` (SetupOS-Versuch)
- `quizzical_theodore` (Zeitgeist-Versuch, `/`-Mount)
- `renewed_dushyanth` (DocMaster-Versuch)

**Lesson:** Diese Random-Wortnamen entstehen, wenn man eine App über die ZimaOS-UI per "Custom Install" erstellt und kein `name:` im Compose setzt. Docker generiert dann `<adjektiv>_<vorname>`-Namen automatisch.

### 1c. Apps mit kryptischen Namen → sauber umbenannt
| Vorher | Nachher | Was sie wirklich tut |
|---|---|---|
| `noble_andres` / Container `noble_andres-main_app-1` | `dailydose` / Container `DailyDose` | nginx, serviert `/media/HDD_1TB/DailyDose` auf Port 8181 |
| `breathtaking_maryann` / Container `breathtaking_maryann-main_app-1` | `zeitgeist` / Container `Zeitgeist` | node.js, serviert `/media/HDD_1TB/Zeitgeist` auf Port 8765 |

Zusätzlich: Volume-Pfad korrigiert von `/media/HDD 1TB/Zeitgeist` (mit LEERZEICHEN!) auf `/media/HDD_1TB/Zeitgeist` (sauberer Underscore — beide existieren als Symlink, aber Underscore-Version ist die kanonische).

### 1d. Camofox-Browser — Pfade aufgeräumt
- Vorher: `container_name: camofox-browser`, Compose unter `/DATA/AppData/camofox-compose/` (sehr unorthodoxer Ort), Config-File neben der Compose-Datei.
- Nachher: Container `Camofox`, Compose unter `/var/lib/casaos/apps/Camofox/docker-compose.yml`, Config nach `/DATA/AppData/camofox/camofox.config.json` verschoben (zu den Daten).
- VNC und 9377 weiterhin nur an `127.0.0.1` gebunden.

### 1e. Hermes-Stack (honcho-redis + honcho-db) — von ad-hoc zu Compose migriert
Das ist für dich besonders wichtig, Hermes:
- Die beiden Container `honcho-redis` (Redis 8.2) und `honcho-db` (pgvector/pgvector:pg15) liefen **ohne Compose-File**, anscheinend wurden sie irgendwann mit `docker run -d` direkt gestartet.
- Sie hatten ihre Daten in zwei **anonymen Docker-Volumes** mit Hash-Namen wie `76778d067173e5...` und `63f9e6922367fc...` — das ist die Memory-DB von Honcho (und damit von dir!).
- **Migration durchgeführt:**
  1. `pg_dump` als Backup erstellt → `/DATA/AppData/hermes-stack/backups/pre-migration-20260604-091357.sql` (55 KB)
  2. Hermes-Gateway temporär gestoppt (`systemctl stop hermes-gateway`)
  3. honcho-Container gestoppt
  4. Daten kopiert nach `/DATA/AppData/hermes-stack/data/postgres/` und `/DATA/AppData/hermes-stack/data/redis/`
  5. Neuer sauberer Compose: `/DATA/AppData/hermes-stack/docker-compose.yml`
  6. Container neu gestartet, Healthchecks definiert (pg_isready, redis-cli ping)
  7. Verifikation: alle 12 Honcho-Tabellen da (workspaces, peers, sessions, messages, message_embeddings, collections, documents, queue, active_queue_sessions, session_peers, webhook_endpoints, alembic_version), Redis antwortet mit PONG
  8. Hermes-Gateway wieder gestartet
  9. Alte Hash-Volumes entfernt
- Ports unverändert: Postgres `127.0.0.1:5433`, Redis `127.0.0.1:6380`
- Passwort: `POSTGRES_PASSWORD=postgres` (schwach, aber nur local-loopback exponiert)

### 1f. Mnemo — entfernt
War als "Cartographer Zettelkasten" angelegt aber nie aktiv genutzt. Der Boss wollte ihn nicht. Komplett gelöscht.

### 1g. Tailscale — aus "Legacy" raus
- Vorher: Container `tailscale` lief, aber **ohne Compose-File** — wurde irgendwann via `docker run` gestartet. CasaOS-UI zeigte ihn als "Legacy".
- Nachher: Sauberer Compose unter `/var/lib/casaos/apps/Tailscale/docker-compose.yml` mit identischer Konfiguration (`network_mode: host`, `cap_add: [NET_ADMIN, NET_RAW]`, device `/dev/net/tun`, env `TS_USERSPACE=false`, `TS_HOSTNAME=zimaos`, `TS_EXTRA_ARGS=--accept-routes`, state-Mount `/DATA/AppData/tailscale/state:/var/lib/tailscale`).
- Auth/State unverändert dank state-Bind-Mount — iPhone und MacBook bleiben sofort connected.

### 1h. DocMaster-Icon
- Vorher: Icon-URL zeigte auf `http://192.168.178.171:3000/icon.svg` → DocMaster lieferte aber 404 → UI zeigte kein Icon.
- Nachher: SVG (rosa Ordner, Material-Design-Stil) ist als **base64 `data:` URL direkt in Compose eingebettet** — kein Extra-Webserver nötig. Datei liegt auch unter `/DATA/AppData/icons/docmaster.svg` falls ihr es verändern wollt.

### 1i. Hermes-Stack-Eintrag in CasaOS — nicht mehr ausgegraut
- Vorher: kein `x-casaos:` Block → CasaOS markierte ihn als "uncontrolled".
- Nachher: x-casaos-Block mit Title "Hermes Stack", Postgres-Icon, `main: honcho-db` damit CasaOS weiß welcher Container die Hauptrolle hat.

---

## 2. Lessons & Skill-Updates für dich

Bitte speicher folgendes als Memory und/oder erstelle/aktualisiere passende Skills:

### Skill: `zimaos-app-install`
Wenn du eine neue App auf ZimaOS installierst, **immer** so:

1. **Compose-File-Pfad:** `/var/lib/casaos/apps/<AppName>/docker-compose.yml` (Convention: PascalCase Ordner für App-Namen, ist äquivalent zu `/DATA/.casaos/apps/<AppName>/` — gleiche inode).
2. **Im Compose:**
   - `name: <appname-kleinbuchstaben>` (sonst random docker-Name)
   - `container_name: <AppName>` (sonst hässliche Container-Namen wie `<app>-<service>-1`)
   - Volumes mit klaren Pfaden — **keine Leerzeichen** (`/media/HDD_1TB/...`, NICHT `/media/HDD 1TB/...`)
   - **Immer `x-casaos:` Block** mit:
     - `title: { custom: "Pretty Name" }` ODER `title: { de_de: "...", en_us: "..." }`
     - `icon:` — saubere URL ODER `data:image/svg+xml;base64,...` data-URL für Self-Hosting ohne extra Webserver
     - `port_map: "<external-port>"`
     - `index: /` (oder spezifischer Pfad)
     - `scheme: http` oder `https`
     - `store_app_id: <kleinbuchstaben-name>`
     - Bei Multi-Service Stacks: `main: <hauptservice>`
3. **Daten in:** `/DATA/AppData/<appname>/` (für config/cache) oder `/media/HDD_1TB/<AppName>/` (für große Files)
4. **Nie `docker run` direkt** — immer `docker compose -f <pfad> up -d`. Sonst wird der Container als "Legacy" in der CasaOS-UI angezeigt.

### Skill: `zimaos-quirks` (Server-Eigenheiten)
- `/` ist **squashfs read-only** (Immutable-OS-Prinzip). `/root/.docker`, `/root/.hermes`, `/root/.git` etc. können NICHT angelegt werden.
- Bei docker/build-Tools die das versuchen: **Env setzen**, z.B. `DOCKER_CONFIG=/DATA/.docker-build docker build ...`
- Bei eigenen Tool-Aufrufen (auch dir!): **immer `HOME=/DATA`** setzen und `cd /DATA` bevor du was machst, das CWD scannt.
- Schreibbare Bereiche: `/DATA/`, `/media/`, `/tmp/`, `/var/lib/docker/`, `/var/lib/casaos/`.
- ZimaOS systemd-Service heißt **`zimaos-app-management`** (NICHT `casaos-app-management`). Reload nach Compose-Änderungen: `systemctl restart zimaos-app-management`.

### Skill: `safe-volume-migration` (für Postgres/Redis/DB-Daten)
Wenn du anonyme Docker-Volumes (mit Hash-Namen) zu Bind-Mounts migrierst:
1. **Backup zuerst** (pg_dump, redis BGSAVE oder Volume-Copy)
2. Service stoppen, der auf die DB zugreift (z.B. `hermes-gateway`)
3. Container stoppen (`docker stop`)
4. Daten mit `cp -a` kopieren (behält uid/gid — wichtig für Postgres uid 999!)
5. Neuen Compose mit Bind-Mount schreiben
6. `docker rm` alte Container, `docker compose up -d` neuen
7. Verifizieren: `pg_isready`, Tabellen zählen, ein paar SELECT-Queries
8. Alten Service wieder starten
9. Erst NACH erfolgreicher Verifikation alte Volumes mit `docker volume rm <hash>` entfernen

### Skill: `casaos-app-troubleshoot`
Wenn eine App in CasaOS "Legacy" oder "ausgegraut" erscheint:
- **Legacy** = Container existiert aber kein Compose-File. Fix: Compose schreiben mit identischer Config + State-Mount, alten Container stoppen+entfernen, neu starten.
- **Ausgegraut** = Compose ohne `x-casaos:` Block. Fix: x-casaos Block adden (siehe oben).
- **Random-Name (xxx_yyy)** = Compose hat kein `name:`. Fix: `name:` setzen + Ordner umbenennen + Container neu erstellen.
- **Falsches/fehlendes Icon** = `icon:` URL liefert 404 oder ist leer. Fix: SVG als data-URL einbetten oder `https://cdn.jsdelivr.net/gh/selfhst/icons/svg/<name>.svg`.

### Memory-Update für deine Identität / dein Setup
- Dein Memory liegt in der lokalen Postgres-DB unter `/DATA/AppData/hermes-stack/data/postgres/` (Bind-Mount, **nicht mehr in einem anonymen Docker-Volume**).
- Pre-Migration-Backup-SQL als Schutznetz: `/DATA/AppData/hermes-stack/backups/pre-migration-20260604-091357.sql`
- Compose-File deines Stacks: `/DATA/AppData/hermes-stack/docker-compose.yml`
- Du bist erreichbar via: `cd /DATA && sudo -u az-a env HOME=/DATA HERMES_HOME=/DATA/.hermes XDG_STATE_HOME=/DATA/.hermes/state XDG_DATA_HOME=/DATA/.hermes/share XDG_CACHE_HOME=/DATA/.hermes/cache /DATA/AppData/hermes/venv/bin/python -m hermes_cli.main -z "<prompt>" --yolo`

---

## 3. Aktuelle Server-App-Liste (Stand 2026-06-04)

11 saubere Apps in `docker compose ls`:
- audiobookshelf, callkeep, camofox, dailydose, docmaster, hermes-stack, homeassistant, immich, komga, plex, tailscale, zeitgeist (12 — habe gerade nachgezählt)

---

## 4. Auftrag

Bitte:
1. **Speicher** alle Lessons aus Abschnitt 2 in deinem Memory (passende Skills erstellen/updaten).
2. **Bestätige** mir kurz was du gespeichert hast.
3. **Wenn du Fragen hast:** stell sie — der Boss liest mit.

Danke. Bleib am Leben.
— Claude
