2025-12-10 18:55:38 +01:00
|
|
|
|
# Mindnet v2.4 – Entwickler-Workflow
|
|
|
|
|
|
**Datei:** `docs/DEV_WORKFLOW.md`
|
2025-12-12 22:54:59 +01:00
|
|
|
|
**Stand:** 2025-12-12 (Aktualisiert: v2.6 mit Traffic Control)
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
Dieses Handbuch beschreibt den Entwicklungszyklus zwischen **Windows PC** (IDE), **Raspberry Pi** (Gitea) und **Beelink** (Runtime/Server).
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 1. Die Architektur
|
|
|
|
|
|
|
|
|
|
|
|
* **Windows 11 (VS Code):** Hier schreibst du Code. **Nie** direkt auf `main` arbeiten!
|
|
|
|
|
|
* **Raspberry Pi (Gitea):** Der Tresor. Speichert den Code und verwaltet Versionen.
|
2025-12-08 10:10:48 +01:00
|
|
|
|
* **Beelink (Runtime):** Hier läuft die Software. Wir nutzen **Systemd-Services**:
|
2025-12-10 10:26:44 +01:00
|
|
|
|
* **PROD:**
|
|
|
|
|
|
* API: `mindnet-prod` (Port 8001). Ordner: `~/mindnet`.
|
|
|
|
|
|
* UI: `mindnet-ui-prod` (Port 8501).
|
|
|
|
|
|
* **DEV:**
|
|
|
|
|
|
* API: `mindnet-dev` (Port 8002). Ordner: `~/mindnet_dev`.
|
|
|
|
|
|
* UI: `mindnet-ui-dev` (Port 8502).
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 2. Der Zyklus: Von der Idee zum Release
|
|
|
|
|
|
|
|
|
|
|
|
### Phase 1: Entwicklung (Windows / VS Code)
|
|
|
|
|
|
|
|
|
|
|
|
Hier erstellst du die neue Funktion in einer sicheren Umgebung.
|
|
|
|
|
|
|
2025-12-07 19:09:03 +01:00
|
|
|
|
1. **Basis aktualisieren (WICHTIG!):**
|
|
|
|
|
|
Bevor du startest, muss dein lokales `main` auf dem Stand des Servers sein.
|
|
|
|
|
|
* Klicke unten links auf den aktuellen Branch und wähle **`main`**.
|
|
|
|
|
|
* Klicke links im Menü "Source Control" auf die **drei Punkte (...)** -> **Pull** (oder das Synchronisieren-Symbol).
|
|
|
|
|
|
* *Erst jetzt hast du alle Dateien!*
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
2025-12-07 19:09:03 +01:00
|
|
|
|
2. **Branch erstellen:**
|
|
|
|
|
|
* Klicke wieder unten links auf `main`.
|
2025-12-07 18:53:13 +01:00
|
|
|
|
* Wähle `+ Create new branch...`.
|
2025-12-12 22:54:59 +01:00
|
|
|
|
* Gib den Namen ein: `feature/was-ich-tue` (z.B. `feature/wp15-traffic-control`).
|
2025-12-07 15:49:44 +01:00
|
|
|
|
* Drücke **Enter**.
|
|
|
|
|
|
|
|
|
|
|
|
3. **Sicherheits-Check:**
|
2025-12-07 18:53:13 +01:00
|
|
|
|
* Steht unten links jetzt dein Feature-Branch? **Nur dann darfst du Code ändern!**
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
4. **Coden:**
|
2025-12-12 22:54:59 +01:00
|
|
|
|
* Nimm deine Änderungen vor (z.B. neue Schemas in `types.yaml` oder Async-Logik in `ingestion.py`).
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
5. **Sichern & Hochladen:**
|
2025-12-07 18:53:13 +01:00
|
|
|
|
* **Source Control** Icon (Gabel-Symbol) -> Nachricht eingeben -> **Commit**.
|
|
|
|
|
|
* **Publish Branch** (oder "Sync Changes"), um den Branch zum Raspberry Pi (Gitea) zu senden.
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### Phase 2: Testen (Beelink / `mindnet_dev`)
|
|
|
|
|
|
|
2025-12-07 18:53:13 +01:00
|
|
|
|
Hier prüfst du, ob dein neuer Code auf dem echten Server läuft.
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
1. **Einloggen:**
|
|
|
|
|
|
`ssh user@<BEELINK-IP>`
|
|
|
|
|
|
|
|
|
|
|
|
2. **In die Werkstatt gehen:**
|
|
|
|
|
|
`cd /home/llmadmin/mindnet_dev`
|
|
|
|
|
|
|
|
|
|
|
|
3. **Code holen:**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
git fetch
|
2025-12-07 18:53:13 +01:00
|
|
|
|
# Tipp: 'git branch -r' zeigt alle verfügbaren Branches an
|
2025-12-12 22:54:59 +01:00
|
|
|
|
git checkout feature/wp15-traffic-control
|
2025-12-07 15:49:44 +01:00
|
|
|
|
git pull
|
|
|
|
|
|
```
|
|
|
|
|
|
|
2025-12-12 22:54:59 +01:00
|
|
|
|
4. **Umgebung vorbereiten (WICHTIG für v2.6):**
|
|
|
|
|
|
Prüfe deine `.env` Datei. Sie benötigt jetzt Einträge für die Traffic Control.
|
|
|
|
|
|
```bash
|
|
|
|
|
|
nano .env
|
|
|
|
|
|
```
|
|
|
|
|
|
**Ergänze/Prüfe:**
|
|
|
|
|
|
```ini
|
|
|
|
|
|
# Traffic Control (Neu in v2.6)
|
|
|
|
|
|
MINDNET_LLM_BACKGROUND_LIMIT=2 # Max. parallele Import-Tasks
|
|
|
|
|
|
MINDNET_API_TIMEOUT=300.0 # Frontend wartet länger
|
|
|
|
|
|
MINDNET_EMBEDDING_MODEL="nomic-embed-text"
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Dependencies aktualisieren:**
|
2025-12-07 15:49:44 +01:00
|
|
|
|
```bash
|
|
|
|
|
|
source .venv/bin/activate
|
2025-12-12 22:54:59 +01:00
|
|
|
|
pip install -r requirements.txt
|
2025-12-11 16:58:23 +01:00
|
|
|
|
ollama pull nomic-embed-text
|
2025-12-07 15:49:44 +01:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-12-08 10:10:48 +01:00
|
|
|
|
5. **Test-Server aktualisieren (WICHTIG):**
|
2025-12-10 10:26:44 +01:00
|
|
|
|
Der Code ist da, aber die Prozesse im RAM sind noch alt. Wir müssen die Services neustarten.
|
2025-12-07 18:53:13 +01:00
|
|
|
|
|
2025-12-08 10:10:48 +01:00
|
|
|
|
**Option A: Standard (Als Service laufen lassen)**
|
|
|
|
|
|
Ideal, wenn du nur testen willst, ob es läuft.
|
2025-12-07 15:49:44 +01:00
|
|
|
|
```bash
|
2025-12-10 18:55:38 +01:00
|
|
|
|
# 1. API neustarten (Backend)
|
2025-12-08 10:10:48 +01:00
|
|
|
|
sudo systemctl restart mindnet-dev
|
2025-12-10 18:55:38 +01:00
|
|
|
|
# 2. UI neustarten (Frontend)
|
2025-12-10 10:26:44 +01:00
|
|
|
|
sudo systemctl restart mindnet-ui-dev
|
2025-12-08 10:10:48 +01:00
|
|
|
|
|
|
|
|
|
|
# Logs prüfen (um Fehler zu sehen):
|
|
|
|
|
|
journalctl -u mindnet-dev -f
|
|
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
**Option B: Manuell Debuggen (Direct Output)**
|
|
|
|
|
|
Ideal, wenn du Print-Ausgaben direkt sehen willst oder der Service dauernd crasht.
|
|
|
|
|
|
```bash
|
2025-12-10 10:26:44 +01:00
|
|
|
|
# 1. Services stoppen (wichtig, sonst sind Ports 8002/8502 belegt!)
|
2025-12-08 10:10:48 +01:00
|
|
|
|
sudo systemctl stop mindnet-dev
|
2025-12-10 10:26:44 +01:00
|
|
|
|
sudo systemctl stop mindnet-ui-dev
|
2025-12-08 10:10:48 +01:00
|
|
|
|
|
2025-12-10 10:26:44 +01:00
|
|
|
|
# 2. Manuell starten (z.B. API)
|
2025-12-07 18:53:13 +01:00
|
|
|
|
uvicorn app.main:app --host 0.0.0.0 --port 8002 --env-file .env
|
2025-12-07 15:49:44 +01:00
|
|
|
|
```
|
|
|
|
|
|
|
2025-12-12 22:54:59 +01:00
|
|
|
|
6. **Validieren (Smoke Tests v2.6):**
|
2025-12-10 18:55:38 +01:00
|
|
|
|
|
2025-12-12 22:54:59 +01:00
|
|
|
|
* **Test A: Last-Test (Traffic Control):**
|
|
|
|
|
|
1. Starte einen Import im Terminal: `python3 -m scripts.import_markdown ...`
|
|
|
|
|
|
2. Öffne **gleichzeitig** `http://<IP>:8502` im Browser.
|
|
|
|
|
|
3. Stelle eine Chat-Frage ("Was ist Mindnet?").
|
|
|
|
|
|
4. **Erwartung:** Der Chat antwortet sofort (Realtime Lane), während der Import im Hintergrund weiterläuft (Background Lane).
|
2025-12-10 18:55:38 +01:00
|
|
|
|
|
2025-12-12 22:54:59 +01:00
|
|
|
|
* **Test B: API Check**
|
2025-12-10 10:26:44 +01:00
|
|
|
|
```bash
|
2025-12-11 16:58:23 +01:00
|
|
|
|
curl -X POST "http://localhost:8002/ingest/analyze" -d '{"text": "mindnet", "type": "journal"}'
|
2025-12-10 10:26:44 +01:00
|
|
|
|
```
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### Phase 3: Release (Gitea / Raspberry Pi)
|
|
|
|
|
|
|
2025-12-10 10:26:44 +01:00
|
|
|
|
Wenn der Test auf Port 8002 / 8502 erfolgreich war:
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
1. Öffne Gitea im Browser.
|
2025-12-07 18:53:13 +01:00
|
|
|
|
2. Erstelle einen **Pull Request** (Dein Branch -> `main`).
|
|
|
|
|
|
3. **Merge** den Pull Request.
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
### Phase 4: Deployment (Beelink / `mindnet`)
|
|
|
|
|
|
|
2025-12-10 10:26:44 +01:00
|
|
|
|
Jetzt bringen wir die Änderung in das Live-System (Port 8001 / 8501).
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
1. **Deploy-Agent (Automatisch):**
|
|
|
|
|
|
Wenn dein `deploy.yml` aktiv ist, passiert das jetzt von selbst!
|
|
|
|
|
|
|
|
|
|
|
|
2. **Manuell (Falls nötig):**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd /home/llmadmin/mindnet
|
|
|
|
|
|
git pull origin main
|
2025-12-08 10:10:48 +01:00
|
|
|
|
|
2025-12-11 16:58:23 +01:00
|
|
|
|
# Dependencies updaten & Modelle checken
|
2025-12-10 10:26:44 +01:00
|
|
|
|
source .venv/bin/activate
|
|
|
|
|
|
pip install -r requirements.txt
|
2025-12-11 16:58:23 +01:00
|
|
|
|
ollama pull nomic-embed-text
|
|
|
|
|
|
|
2025-12-12 22:54:59 +01:00
|
|
|
|
# .env prüfen (Traffic Control)
|
|
|
|
|
|
# Ggf. MINDNET_LLM_BACKGROUND_LIMIT=2 hinzufügen
|
|
|
|
|
|
|
2025-12-11 16:58:23 +01:00
|
|
|
|
# Falls sich die Vektor-Dimension geändert hat (v2.4 Upgrade):
|
|
|
|
|
|
# python3 -m scripts.reset_qdrant --mode wipe --prefix "mindnet" --yes
|
|
|
|
|
|
# python3 -m scripts.import_markdown --vault ./vault --prefix "mindnet" --apply --force
|
2025-12-10 10:26:44 +01:00
|
|
|
|
|
|
|
|
|
|
# Produktions-Services neustarten
|
2025-12-08 10:10:48 +01:00
|
|
|
|
sudo systemctl restart mindnet-prod
|
2025-12-10 10:26:44 +01:00
|
|
|
|
sudo systemctl restart mindnet-ui-prod
|
2025-12-07 15:49:44 +01:00
|
|
|
|
```
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2025-12-07 18:53:13 +01:00
|
|
|
|
### Phase 5: Aufräumen (Optional aber empfohlen)
|
|
|
|
|
|
|
|
|
|
|
|
Damit das Chaos nicht wächst, löschen wir den fertigen Branch.
|
|
|
|
|
|
|
|
|
|
|
|
1. **Gitea:** Im Pull Request auf "Delete Branch" klicken.
|
|
|
|
|
|
2. **Beelink (Dev):**
|
|
|
|
|
|
```bash
|
|
|
|
|
|
cd ~/mindnet_dev
|
|
|
|
|
|
git checkout main
|
|
|
|
|
|
git pull
|
2025-12-12 22:54:59 +01:00
|
|
|
|
git branch -d feature/wp15-traffic-control
|
2025-12-07 18:53:13 +01:00
|
|
|
|
```
|
|
|
|
|
|
3. **VS Code:**
|
|
|
|
|
|
* Auf `main` wechseln.
|
2025-12-08 10:10:48 +01:00
|
|
|
|
* Sync drücken.
|
2025-12-07 18:53:13 +01:00
|
|
|
|
* `F1` -> `Git: Delete Branch` -> Branch auswählen.
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2025-12-07 15:49:44 +01:00
|
|
|
|
## 3. Cheat Sheet: Die wichtigsten Befehle
|
|
|
|
|
|
|
|
|
|
|
|
| Wo? | Befehl | Was tut es? |
|
|
|
|
|
|
| :--- | :--- | :--- |
|
2025-12-10 10:26:44 +01:00
|
|
|
|
| **Beelink** | `sudo systemctl restart mindnet-dev` | **Neustart Dev-Backend (Port 8002).** |
|
2025-12-13 10:09:05 +01:00
|
|
|
|
| **Beelink** | `sudo systemctl restart mindnet-ui-dev` | **Neustart Dev-Frontend (Port 8002).** |
|
2025-12-10 10:26:44 +01:00
|
|
|
|
| **Beelink** | `journalctl -u mindnet-dev -f` | **Live-Logs Backend.** |
|
2025-12-11 16:58:23 +01:00
|
|
|
|
| **Beelink** | `python debug_analysis.py` | **Prüft Aliases & Scores.** |
|
2025-12-13 10:10:18 +01:00
|
|
|
|
| **Beelink** | `python3 -m scripts.reset_qdrant --mode wipe --prefix "mindnet_dev" --yes` | **Löscht & Repariert DB.** |
|
|
|
|
|
|
| **Beelink** | `python3 -m scripts.import_markdown --vault ./vault_master --prefix "mindnet_dev" --apply --force` | **Löscht & Repariert DB.** |
|
2025-12-13 10:09:05 +01:00
|
|
|
|
| **Beelink** | `source .venv/bin/activate` | **Aktivieren des virtual environments** |
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
2025-12-07 19:09:03 +01:00
|
|
|
|
## 4. Troubleshooting
|
2025-12-07 15:49:44 +01:00
|
|
|
|
|
2025-12-12 22:54:59 +01:00
|
|
|
|
**"Read timed out" im Frontend**
|
|
|
|
|
|
* **Ursache:** Backend braucht für Smart Edges länger als 60s.
|
|
|
|
|
|
* **Lösung:** `MINDNET_API_TIMEOUT=300.0` in `.env` setzen und Services neustarten.
|
2025-12-11 16:58:23 +01:00
|
|
|
|
|
2025-12-12 22:54:59 +01:00
|
|
|
|
**Import ist extrem langsam**
|
|
|
|
|
|
* **Ursache:** Smart Edges analysieren jeden Chunk mit LLM.
|
2025-12-09 17:11:03 +01:00
|
|
|
|
* **Lösung:**
|
2025-12-12 22:54:59 +01:00
|
|
|
|
* Akzeptieren (Qualität vor Speed).
|
|
|
|
|
|
* Oder temporär in `config/types.yaml`: `enable_smart_edge_allocation: false`.
|
2025-12-09 17:11:03 +01:00
|
|
|
|
|
|
|
|
|
|
**"UnicodeDecodeError in .env"**
|
|
|
|
|
|
* **Ursache:** Umlaute oder Sonderzeichen in der `.env` Datei.
|
|
|
|
|
|
* **Lösung:** `.env` bereinigen (nur ASCII nutzen) und sicherstellen, dass sie UTF-8 ohne BOM ist.
|