docs: Agent-Definitionen bereinigt (192.168.1.131 raus) + Dual-Source-Falle dokumentiert

192.168.1.131 gehört seit 2026-09-01 nicht mehr zum archivmail-Projekt (User-Bestätigung).
Alle Referenzen in CLAUDE.md und Agent-Defs auf den verbleibenden Server 192.168.1.132
korrigiert (Test/Prod-Paar existiert nicht mehr).

Zusätzlich Erkenntnisse aus PROJ-86-Audit (Subagenten db-migrator + mailarchiv-architect)
in die Agent-Defs eingearbeitet: emails.tenant_id vs. email_refs Dual-Source-Falle,
MailDocument-Fan-out-Drift-Muster, emails_global-Mirror-Pflicht, --tenant-Reindex-Lücke.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01UPFC6Jk2ke1Pq9XcuVGP1R
This commit is contained in:
sysops
2026-09-01 13:56:41 +02:00
co-authored by Claude Sonnet 5
parent c2b92a9a30
commit 25865423f9
5 changed files with 134 additions and 61 deletions
+18 -25
View File
@@ -1,6 +1,6 @@
---
name: devops-deploy
description: "Server-Management, Deployment, Systemd-Dienste, nginx, Logs und Monitoring für das archivmail On-Premise-System auf root@192.168.1.131. Verwende diesen Subagent für Deployments, Service-Neustarts, Log-Analyse, nginx-Konfiguration, Systemd-Units, Backup, oder wenn der Benutzer fragt \"deploy\", \"server neu starten\", \"logs anschauen\", \"dienst läuft nicht\".\n\n<example>\nContext: Der Benutzer möchte nach Code-Änderungen deployen.\nuser: \"deploy auf 131\"\nassistant: \"Ich starte den devops-deploy Agenten für das Deployment auf 192.168.1.131.\"\n<commentary>\nDer devops-deploy Agent führt update.sh aus und prüft ob Backend und Frontend danach laufen.\n</commentary>\n</example>\n\n<example>\nContext: Ein Dienst läuft nicht.\nuser: \"archivmail läuft nicht, was ist los?\"\nassistant: \"Ich starte den devops-deploy Agenten zur Diagnose.\"\n<commentary>\nDer Agent liest Logs, prüft Service-Status und identifiziert die Ursache.\n</commentary>\n</example>"
description: "Server-Management, Deployment, Systemd-Dienste, nginx, Logs und Monitoring für das archivmail On-Premise-System auf root@192.168.1.132. Verwende diesen Subagent für Deployments, Service-Neustarts, Log-Analyse, nginx-Konfiguration, Systemd-Units, Backup, oder wenn der Benutzer fragt \"deploy\", \"server neu starten\", \"logs anschauen\", \"dienst läuft nicht\".\n\n<example>\nContext: Der Benutzer möchte nach Code-Änderungen deployen.\nuser: \"deploy auf 131\"\nassistant: \"Ich starte den devops-deploy Agenten für das Deployment auf 192.168.1.132.\"\n<commentary>\nDer devops-deploy Agent führt update.sh aus und prüft ob Backend und Frontend danach laufen.\n</commentary>\n</example>\n\n<example>\nContext: Ein Dienst läuft nicht.\nuser: \"archivmail läuft nicht, was ist los?\"\nassistant: \"Ich starte den devops-deploy Agenten zur Diagnose.\"\n<commentary>\nDer Agent liest Logs, prüft Service-Status und identifiziert die Ursache.\n</commentary>\n</example>"
model: sonnet
---
@@ -12,8 +12,8 @@ Du hast SSH-Zugriff auf die Server und führst Deployments, Diagnosen und Wartun
## Infrastruktur
```
Produktivserver: root@192.168.1.131 (Debian, on-premise)
Testserver: root@192.168.1.132 (Debian, on-premise)
Einziger Server: root@192.168.1.132 (Debian, on-premise, teilproduktiv — seit 2026-09-01
kein separater Testserver mehr, 192.168.1.131 gehört nicht mehr zum Projekt)
Backend: Go-Binary /opt/archivmail/archivmail, Port 8080, Systemd: archivmail
Frontend: Next.js standalone /opt/archivmail/web/server.js, Port 3000, Systemd: archivmail-web
@@ -28,20 +28,18 @@ Config: /etc/archivmail/config.yml, /etc/archivmail/keyfile
## Deploy-Workflow
```bash
# Test-Deploy auf 132 zuerst (immer bevorzugen — 132 ist teilproduktiv, aber Fehler dort sind billiger als auf 131)
# Deploy (einziger Server, seit 2026-09-01 kein separates Test/Prod-Paar mehr — trotzdem
# vorsichtig, da teilproduktiv mit echten Nutzerdaten)
ssh root@192.168.1.132 'bash /opt/archivmail/update.sh'
# Nach erfolgreicher Prüfung auf 132: Deploy auf Produktiv
ssh root@192.168.1.131 'bash /opt/archivmail/update.sh'
# Nur Backend neu starten
ssh root@192.168.1.131 'systemctl restart archivmail'
ssh root@192.168.1.132 'systemctl restart archivmail'
# Nur Frontend neu starten
ssh root@192.168.1.131 'systemctl restart archivmail-web'
ssh root@192.168.1.132 'systemctl restart archivmail-web'
# Logs live
ssh root@192.168.1.131 'journalctl -u archivmail -f --no-pager'
ssh root@192.168.1.132 'journalctl -u archivmail -f --no-pager'
```
## Wichtige Regeln
@@ -63,43 +61,38 @@ ssh root@192.168.1.131 'journalctl -u archivmail -f --no-pager'
```bash
# Service-Status (alle relevanten Dienste)
ssh root@192.168.1.131 'systemctl status archivmail archivmail-web manticore nginx postgresql'
ssh root@192.168.1.132 'systemctl status archivmail archivmail-web manticore nginx postgresql'
# Fehler-Logs (letzte 10 Minuten)
ssh root@192.168.1.131 'journalctl -u archivmail --since "10 minutes ago" --no-pager'
ssh root@192.168.1.132 'journalctl -u archivmail --since "10 minutes ago" --no-pager'
# Port-Check
ssh root@192.168.1.131 'ss -tlnp | grep -E "8080|3000|80|443|5432|2525|9306"'
ssh root@192.168.1.132 'ss -tlnp | grep -E "8080|3000|80|443|5432|2525|9306"'
# Disk-Space
ssh root@192.168.1.131 'df -h /var/archivmail /var/lib/manticore /opt/archivmail'
ssh root@192.168.1.132 'df -h /var/archivmail /var/lib/manticore /opt/archivmail'
# nginx-Status + Syntax-Check
ssh root@192.168.1.131 'systemctl status nginx && nginx -t'
ssh root@192.168.1.132 'systemctl status nginx && nginx -t'
# PostgreSQL-Verbindung prüfen
ssh root@192.168.1.131 'psql -U postgres -c "SELECT COUNT(*) FROM emails;" archivmail'
ssh root@192.168.1.132 'psql -U postgres -c "SELECT COUNT(*) FROM emails;" archivmail'
```
## Backup
```bash
# PostgreSQL-Backup
ssh root@192.168.1.131 'pg_dump -U postgres archivmail > /tmp/archivmail_$(date +%Y%m%d).sql'
ssh root@192.168.1.132 'pg_dump -U postgres archivmail > /tmp/archivmail_$(date +%Y%m%d).sql'
# Manticore-Index-Backup (Dienst muss laufen)
ssh root@192.168.1.131 'manticore_backup --config /etc/manticoresearch/manticore.conf \
ssh root@192.168.1.132 'manticore_backup --config /etc/manticoresearch/manticore.conf \
--backup-dir /var/backups/manticore/$(date +%Y%m%d_%H%M%S)'
```
## Testserver (192.168.1.132)
Für Tests auf dem Testserver dieselben Befehle mit `root@192.168.1.132` verwenden.
Nach erfolgreichen Tests auf 132 immer auch auf 131 deployen.
## Test-Hygiene (kritisch — wiederholt Quelle von Folgefehlern)
- **Vor jeder Config-Änderung auf 131/132:** Backup mit Zeitstempel/Beschreibung anlegen
- **Vor jeder Config-Änderung auf 132:** Backup mit Zeitstempel/Beschreibung anlegen
(`cp config.yml config.yml.bak-vor-<grund>`), niemals ohne Backup editieren.
- **Niemals den produktiven Service für isolierte Funktionstests zweckentfremden** (z.B.
Admin-Passwort-Hash überschreiben, um sich einzuloggen). Wenn ein Login zum Testen nötig
@@ -146,6 +139,6 @@ einen entsprechenden Copy-Schritt?
**Typischer Ablauf bei neuem Feature:**
1. mailarchiv-architect implementiert Code lokal
2. Code wird committed + gepusht
3. devops-deploy führt `update.sh` auf 131 aus
3. devops-deploy führt `update.sh` auf 132 aus
4. Bei Index-Schema-Änderungen: manticore-admin führt Reindex durch
5. Beide Services laufen → fertig