From 567cf7e63df70f9fcb3b29680ef00615d25b7ffd Mon Sep 17 00:00:00 2001 From: Hermes Agent Date: Mon, 22 Jun 2026 00:00:17 +0200 Subject: [PATCH] =?UTF-8?q?docs:=20BSN=20Live-System-Plan=20=E2=80=94=205-?= =?UTF-8?q?Phasen-Setup=20von=20Tag=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/BSN-LIVESYSTEM-PLAN.md | 193 ++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100644 docs/BSN-LIVESYSTEM-PLAN.md diff --git a/docs/BSN-LIVESYSTEM-PLAN.md b/docs/BSN-LIVESYSTEM-PLAN.md new file mode 100644 index 0000000..1a9f74d --- /dev/null +++ b/docs/BSN-LIVESYSTEM-PLAN.md @@ -0,0 +1,193 @@ +# BSN Live-System — Initialer Projektplan + +> **Ziel:** Neuer Server, neues Projekt, alles von Tag 1 an richtig. +> **Erstellt:** 21. Juni 2026 — basierend auf 3 Review-Runden + sys-1/2-Tests + +--- + +## Phase 0 — Server einrichten (1h) + +```bash +# User anlegen +sudo useradd -m -s /bin/bash cody +sudo useradd -m -s /bin/bash basti +sudo useradd -m -s /bin/bash alicia + +# Sudo für alle +echo "cody ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/cody +echo "basti ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/basti +echo "alicia ALL=(ALL:ALL) NOPASSWD: ALL" | sudo tee /etc/sudoers.d/alicia + +# SSH-Keys verteilen +# (Public Keys von Cody, Basti, Alicia in authorized_keys) + +# Basis-Tools +sudo apt-get update && sudo apt-get install -y redis-server git python3-pip curl +sudo systemctl enable --now redis-server + +# Python-Toolchain +pip install ruff mypy pre-commit pytest pytest-cov redis +``` + +--- + +## Phase 1 — Projekt-Repo aufsetzen (30min) + +In Gitea (`git.datenhimmel.work`): +- Neues Repo `BSN-Community` anlegen +- Gitea Actions Runner registrieren + +Im Projekt-Root: + +```bash +git clone git@git.datenhimmel.work:danielkrause/BSN-Community.git +cd BSN-Community +``` + +**Dateien aus dem Prototypen kopieren:** + +| Von (BSN-Chatsystem) | Nach (BSN-Community) | Grund | +|---|---|---| +| `.gitea/workflows/quality.yml` | `.gitea/workflows/quality.yml` | CI-Gate | +| `CODING_STANDARDS.md` | `CODING_STANDARDS.md` | Regelwerk | +| `queue_handler.py` | `src/queue_handler.py` | Queue-System | +| `webhook_queue.py` | `src/webhook_queue.py` | Signatur-Prüfung | +| `queue_worker.py` | `src/queue_worker.py` | Async Worker | +| `pyproject.toml` (aus HTML §13) | `pyproject.toml` | Ruff + mypy + pytest Config | +| `.pre-commit-config.yaml` (aus HTML §13) | `.pre-commit-config.yaml` | Pre-Commit Hooks | +| `docs/bsn-coding-standards.html` | `docs/bsn-coding-standards.html` | IT-Bibel | + +**Git initial:** +```bash +git add -A +git commit -m "chore: Projekt-Setup mit CI-Gate, Queue, Coding-Standards" +git push origin main +# Gitea Actions prüft automatisch! +``` + +--- + +## Phase 2 — Hermes-Agenten einrichten (30min) + +```bash +# Cody-Profil (Entwickler) +hermes profile create cody --clone-from default +hermes config set agent.environment_hint "Du bist Cody, BSN-Entwickler. Befolge skill_view('bsn-coding-standards'). CI: .gitea/workflows/quality.yml" --profile cody + +# Alicia-Profil (Content) +hermes profile create alicia --clone-from default +hermes config set agent.environment_hint "Du bist Alicia, BSN-Content-Managerin. System-Übersicht: read_file('ALICIA.md'). Befolge skill_view('bsn-coding-standards')." --profile alicia + +# Basti-Profil (Redakteur) +hermes profile create basti --clone-from default +hermes config set agent.environment_hint "Du bist Basti, BSN-Redakteur. Befolge skill_view('bsn-coding-standards') bei Code-Arbeit." --profile basti +``` + +**Skills installieren (pro Profil):** +``` +skill_view('bsn-coding-standards') # Coding-Regeln +skill_view('web-research') # Recherche +skill_view('article-management') # Article Server (Alicia/Basti) +``` + +--- + +## Phase 3 — Flask-App-Struktur (1h) + +Statt `app.py` (5599 Zeilen Monolith) → saubere Struktur: + +``` +src/ +├── app.py # Flask-App-Factory + Config (< 100 Zeilen) +├── routes/ +│ ├── __init__.py +│ ├── whatsapp.py # WhatsApp Webhook (→ Queue) +│ ├── telegram.py # Telegram Webhook (→ Queue) +│ ├── admin.py # Admin-Dashboard +│ └── api.py # Öffentliche API +├── services/ +│ ├── __init__.py +│ ├── intake.py # Message-Verarbeitung +│ └── game_service.py # Spiele-Logik +├── models/ +│ ├── __init__.py +│ └── submission.py # DB-Modell +├── queue/ +│ ├── __init__.py +│ ├── handler.py # QueueHandler (von queue_handler.py) +│ ├── webhook.py # Signatur + Intake (von webhook_queue.py) +│ └── worker.py # Queue-Worker (von queue_worker.py) +├── utils/ +│ ├── __init__.py +│ └── validators.py +tests/ +├── test_routes/ +├── test_services/ +├── test_queue/ +└── conftest.py +``` + +--- + +## Phase 4 — Services starten (15min) + +```bash +# Flask-App (systemd) +sudo tee /etc/systemd/system/bsn-chatbot.service << EOF +[Unit] +Description=BSN Chatbot +After=network.target redis-server.service + +[Service] +User=cody +WorkingDirectory=/home/cody/workspace/BSN-Community +ExecStart=/home/cody/venv/bin/python src/app.py +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + +# Queue-Worker (systemd) +sudo tee /etc/systemd/system/bsn-worker.service << EOF +[Unit] +Description=BSN Queue Worker +After=redis-server.service + +[Service] +User=cody +WorkingDirectory=/home/cody/workspace/BSN-Community +ExecStart=/home/cody/venv/bin/python src/queue/worker.py --poll 2 --batch 5 +Restart=always + +[Install] +WantedBy=multi-user.target +EOF + +sudo systemctl daemon-reload +sudo systemctl enable --now bsn-chatbot bsn-worker +``` + +--- + +## Phase 5 — Monitoring (später) + +- `structlog` für strukturiertes Logging +- `GlitchTip` für Error-Tracking +- `/admin/queue` Endpoint für Queue-Status + +--- + +## ✅ Checkliste: Ist alles drin? + +- [ ] CI-Gate (Gitea Actions) prüft jeden Push +- [ ] Pre-commit blockiert lokal +- [ ] Coding-Standards-Skill in allen Profilen +- [ ] Queue puffert Submissions (Tunnel down = nix verloren) +- [ ] Signatur-Prüfung vor Enqueue +- [ ] Dedup über message_id +- [ ] Worker verarbeitet asynchron +- [ ] Flask-Struktur sauber getrennt (Routes ≠ Services ≠ Models) +- [ ] Alle Agenten (Cody, Basti, Alicia) haben environment_hint +- [ ] Redis läuft als systemd-Service +- [ ] Worker läuft als systemd-Service