Stabilize Lead Engine calendar logic (v1.4) and integrate GTM Architect, B2B Assistant, and Transcription Tool into Docker stack [30388f42]

This commit is contained in:
2026-03-08 08:46:25 +00:00
parent 57081bf102
commit 44502e5b2b
16 changed files with 451 additions and 136 deletions

View File

@@ -13,7 +13,9 @@ Diese Ports müssen auf der Firewall für den eingehenden Verkehr zur VM `10.10.
| **2222** | `gitea` | Intranet | Gitea Git via SSH. |
| **8003** | `connector-so` | **Public** | SuperOffice Webhook-Empfänger (SSL erforderlich!). |
| **5678** | `n8n` | **Public** | Automation Workhooks. |
| **8004** | `lead-engine` | **Public** | Lead Engine API (für Buchungs-Links). |
| **8094** | `gtm-architect`| Intranet | GTM Architect Direct. |
| **8092** | `b2b-marketing`| Intranet | B2B Marketing Assistant Direct. |
| **8001** | `transcription`| Intranet | Transcription Tool Direct (via 8090). |
---
@@ -22,61 +24,82 @@ Diese Ports müssen auf der Firewall für den eingehenden Verkehr zur VM `10.10.
* **DNS Resolver:** In Nginx konfiguriert (`resolver 127.0.0.11`).
* **WebSockets:** Das Gateway unterstützt `Upgrade`-Header (kritisch für Streamlit/Lead-Engine).
* **Echo-Prävention:** Der Connector (`worker.py`) identifiziert sich dynamisch. Keine manuellen ID-Einträge in `.env` nötig, solange `SO_CLIENT_ID` passt.
* **Routing:**
* `/ce/` -> `company-explorer:8000`
* `/lead/` -> `lead-engine:8501` (UI)
* `/feedback/` -> `lead-engine:8004` (API)
* `/gtm/` -> `gtm-architect:3005` (API/Frontend)
* `/b2b/` -> `b2b-marketing-assistant:3002` (API/Frontend)
* `/tr/` -> `transcription-tool:8001` (API/Frontend) -> **Achtung:** Benötigt expliziten `rewrite` in Nginx!
---
# ⚠️ Kritische Lehren (Post-Mortem 07.03.2026)
# ⚠️ Kritische Lehren (Update 08.03.2026)
Der Umzug am Montag muss zwingend diese Punkte beachten, um den "Totalausfall" von heute zu vermeiden:
Der Umzug muss zwingend diese Punkte beachten, um den "Totalausfall" zu vermeiden:
### 1. Datenbank-Schema-Falle
**Problem:** Alte `.db`-Dateien (Backups) haben oft nicht alle Spalten, die der aktuelle Code erwartet.
**Lösung:** Nach dem Starten der Container auf der neuen VM **muss** das Migrations-Skript ausgeführt werden:
```bash
docker exec -it company-explorer python /app/fix_missing_columns.py
```
*Dies repariert Tabellen für Companies, Industries und Contacts (inkl. Unsubscribe-Tokens).*
### 2. Docker Volumes vs. Bind Mounts
### 1. Datenbank-Schema & Volumes
**Regel:** Datenbanken werden **NIEMALS** mehr direkt auf einen Host-Pfad gemountet.
**Grund:** Permission-Errors und SQLite-Locks ("Database is locked") auf Netzwerk-Dateisystemen (Synology/NFS).
**Vorgehen:** Nutzung von benannten Volumes (`explorer_db_data`, `connector_db_data`, `lead_engine_data`).
**Grund:** Permission-Errors und SQLite-Locks auf Netzwerk-Dateisystemen.
**Vorgehen:** Nutzung von benannten Volumes (`explorer_db_data`, `connector_db_data`, `lead_engine_data`, `gtm_architect_data`, `b2b_marketing_data`, `transcription_uploads`).
### 3. Daten-Injektion (Der "Rescue"-Befehl)
Um bestehende Daten in die neuen Volumes zu bekommen, nutzt man diesen Befehl:
```bash
# Beispiel für den Company Explorer
docker cp ./my_local_backup.db company-explorer:/data/companies_v3_fixed_2.db
```
### 2. Lead Engine: Kalender-Logik (v1.4)
* **Raster:** Das System bietet Termine nur im **15-Minuten-Takt** (:00, :15, :30, :45) an.
* **Abstand:** Zwischen zwei Terminvorschlägen liegen mind. **3 Stunden** Pause.
* **AppOnly Workaround:** Termin wird im Kalender von `info@robo-planet.de` erstellt und der Mitarbeiter (`e.melcer@`) als Teilnehmer hinzugefügt.
### 4. Streamlit Proxy-Konfiguration
**Problem:** Streamlit (Lead Engine) verliert die Verbindung unter Sub-Pfaden (`/lead/`).
**Lösung:**
* Dockerfile: `--server.baseUrlPath=/lead` ist Pflicht.
* Nginx: `proxy_http_version 1.1` und `Upgrade`-Header müssen gesetzt sein.
### 3. GTM Architect & B2B Assistant: Standalone-Betrieb
* **Architektur:** Beide Apps nutzen das "Self-Contained Image" Muster. Code, Frontend-Builds (`dist/`) und `node_modules` sind fest im Image verbaut.
* **GTM Port:** 3005 intern.
* **B2B Port:** 3002 intern.
* **DB-Abhängigkeit:** Der B2B Assistant benötigt zwingend die Datei `market_db_manager.py` (wird beim Build aus dem Root kopiert).
### 4. Transcription Tool: FFmpeg & Routing
* **FFmpeg:** Muss im Image vorhanden sein (Build dauert ca. 15 Min auf Synology).
* **Pfade:** Das Tool benötigt eine `tsconfig.json` im `frontend/` Ordner für den TypeScript-Build.
* **Nginx:** Der Pfad `/tr/` muss explizit umgeschrieben werden: `rewrite ^/tr/(.*) /$1 break;`.
---
### **Verbindlicher Migrationsplan (Montag)**
### 📂 Docker Volume Migration (Der "Plug & Play" Weg)
Um die Daten (Companies, Leads, Projekte, Audio-Files) ohne Verluste umzuziehen, müssen die benannten Volumes gesichert werden.
**Auf der Synology (Quelle):**
```bash
# Backup aller kritischen Volumes in ein Archiv
docker run --rm -v explorer_db_data:/data -v $(pwd):/backup alpine tar czf /backup/explorer_data.tar.gz -C /data .
docker run --rm -v lead_engine_data:/data -v $(pwd):/backup alpine tar czf /backup/lead_data.tar.gz -C /data .
docker run --rm -v gtm_architect_data:/data -v $(pwd):/backup alpine tar czf /backup/gtm_data.tar.gz -C /data .
docker run --rm -v b2b_marketing_data:/data -v $(pwd):/backup alpine tar czf /backup/b2b_data.tar.gz -C /data .
docker run --rm -v transcription_uploads:/data -v $(pwd):/backup alpine tar czf /backup/tr_uploads.tar.gz -C /data .
```
**Auf der Ubuntu VM (Ziel):**
1. Volumes anlegen: `docker volume create explorer_db_data` (etc.)
2. Daten wiederherstellen:
```bash
docker run --rm -v explorer_db_data:/data -v $(pwd):/backup alpine sh -c "cd /data && tar xzf /backup/explorer_data.tar.gz"
```
---
### **Verbindlicher Migrationsplan**
**Phase 1: Vorbereitung**
1. [ ] **`git push`** auf Synology (aktuellster Stand d1b77fd2).
2. [ ] **`.env` Datei sichern** (enthält alle heute stabilisierten Keys!).
1. [ ] **`git push`** auf Synology (aktuellster Stand inkl. GTM-Integration).
2. [ ] **`.env` Datei sichern** (Vollständigkeit prüfen!).
3. [ ] **Volumes sichern** (siehe oben: `tar.gz` Erstellung).
**Phase 2: Deployment auf `docker1`**
1. [ ] Repo klonen: `git clone ... /opt/gtm-engine`
2. [ ] `.env` anlegen und befüllen.
3. [ ] Starten: `docker compose up -d --build`
4. [ ] **Schema-Check:** `docker exec -it company-explorer python /app/fix_missing_columns.py` ausführen.
2. [ ] `.env` kopieren.
3. [ ] **Volumes restoren** (BEVOR `docker compose up` ausgeführt wird).
4. [ ] Starten: `docker compose up -d --build`
5. [ ] **Schema-Check:** `docker exec -it company-explorer python /app/fix_missing_columns.py`
**Phase 3: Datenrettung (Falls nötig)**
1. [ ] Datenbank-Dumps vom Wochenende via `docker cp` in die Volumes schieben.
2. [ ] Webhook-Status prüfen: `docker exec -it connector-superoffice python /app/register_webhook.py`.
---
### **Aktuelle Offene Todos (Priorisiert)**
1. **Lead Engine:** Microsoft Graph Credentials in `.env` ergänzen (401 Fehler beheben).
2. **n8n:** Workflow-Export von Synology und Import auf neuer Instanz.
3. **Styling:** Frontend-CSS im Company Explorer verifizieren (Build läuft wieder, aber UI-Check nötig).
**Phase 3: Verifizierung**
1. [ ] Check Kalender-Lesen: `docker exec lead-engine python /app/trading_twins/test_calendar_logic.py`
2. [ ] Check GTM Architect: `https://10.10.81.2:8090/gtm/`