7.7 KiB
Anforderungsdokument (Version 3): Docker-Migration nach Ubuntu VM (docker1)
Zweck: Verbindliche Netzwerk-Anforderungen und schrittweiser Migrationsplan für den Umzug des GTM-Engine Stacks (ca. 20 Container). Basierend auf den Stabilisierungs-Erkenntnissen vom 07.03.2026.
Teil 1: Externe Port-Freigaben (Firewall)
Diese Ports müssen auf der Firewall für den eingehenden Verkehr zur VM 10.10.81.2 geöffnet werden.
| Host-Port | Ziel-Dienst | Zugriff | Zweck |
|---|---|---|---|
| 8090 | gateway_proxy |
Intranet | Zentraler Zugang. Alle Web-Apps (Dashboard, CE, Lead). |
| 3000 | gitea |
Intranet | Gitea Web UI. |
| 2222 | gitea |
Intranet | Gitea Git via SSH. |
| 8003 | connector-so |
Public | SuperOffice Webhook-Empfänger (SSL erforderlich!). |
| 5678 | n8n |
Public | Automation Workhooks. |
| 8094 | gtm-architect |
Intranet | GTM Architect Direct. |
| 8092 | b2b-marketing |
Intranet | B2B Marketing Assistant Direct. |
| 8001 | transcription |
Intranet | Transcription Tool Direct (via 8090). |
Port-Mapping (docker-compose.yml)
Die folgende Tabelle listet alle Host-Ports auf, die durch die docker-compose.yml gebunden werden. Diese sind die Ports, die auf docker1 lauschen werden.
| Host-Port | Ziel-Dienst | Zweck / Notiz |
|---|---|---|
| 8090 | nginx (Gateway) |
Zentraler Zugang (Intranet) |
| 8000 | company-explorer |
API (intern) |
| 8003 | connector-superoffice |
Webhook (Public) |
| 8501 | lead-engine |
UI (intern) |
| 8004 | lead-engine |
API (intern) |
| 8092 | b2b-marketing-assistant |
UI/API (Intranet) |
| 8093 | content-engine |
UI/API (Intranet) |
| 8094 | gtm-architect |
UI/API (Intranet) |
| 8096 | heatmap-frontend |
UI (Intranet) |
| 8002 | heatmap-backend |
API (intern) |
| 8097 | competitor-analysis |
UI/API (Intranet) |
| 8098 | market-intelligence |
UI/API (Intranet) |
| 8001 | transcription-tool |
UI/API (Intranet) |
Teil 2: Netzwerk-Architektur (Intern)
- 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.envnötig, solangeSO_CLIENT_IDpasst. - 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)/content/->content-engine:3000(API/Frontend)/market/->market-intelligence:3001(API/Frontend)/competitor/->competitor-analysis:3000(API/Frontend)/heatmap/->heatmap-frontend:80(Static/Proxy)/tr/->transcription-tool:8001(API/Frontend) -> Achtung: Benötigt explizitenrewritein Nginx!
⚠️ Kritische Lehren (Update 08.03.2026)
Der Umzug muss zwingend diese Punkte beachten, um den "Totalausfall" zu vermeiden:
1. Datenbank-Schema & Volumes
Regel: Datenbanken werden NIEMALS mehr direkt auf einen Host-Pfad gemountet.
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, content_engine_data, market_intel_data, competitor_analysis_data, transcription_uploads).
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.deerstellt und der Mitarbeiter (e.melcer@) als Teilnehmer hinzugefügt.
3. GTM Architect & B2B Assistant: Standalone-Betrieb
- Architektur: Beide Apps nutzen das "Self-Contained Image" Muster. Code, Frontend-Builds (
dist/) undnode_modulessind 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.jsonimfrontend/Ordner für den TypeScript-Build. - Nginx: Der Pfad
/tr/muss explizit umgeschrieben werden:rewrite ^/tr/(.*) /$1 break;.
📂 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):
# 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 content_engine_data:/data -v $(pwd):/backup alpine tar czf /backup/content_data.tar.gz -C /data .
docker run --rm -v market_intel_data:/data -v $(pwd):/backup alpine tar czf /backup/market_data.tar.gz -C /data .
docker run --rm -v competitor_analysis_data:/data -v $(pwd):/backup alpine tar czf /backup/competitor_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):
- Volumes anlegen:
docker volume create explorer_db_data(etc.) - Daten wiederherstellen:
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
git pushauf Synology (aktuellster Stand inkl. GTM-Integration)..envDatei sichern (Vollständigkeit prüfen!).- Volumes sichern (siehe oben:
tar.gzErstellung).
Phase 2: Deployment auf docker1
- Repo klonen:
git clone ... /opt/gtm-engine .envkopieren.- Volumes restoren (BEVOR
docker compose upausgeführt wird). - Starten:
docker compose up -d --build - Schema-Check:
docker exec -it company-explorer python /app/fix_missing_columns.py
Phase 3: Verifizierung
- Check Kalender-Lesen:
docker exec lead-engine python /app/trading_twins/test_calendar_logic.py - Check GTM Architect:
https://10.10.81.2:8090/gtm/
Anhang A: Post-Deployment Port Check
Führen Sie dieses Skript auf einem Client-Rechner aus (nicht auf docker1 selbst), um die Erreichbarkeit der freigegebenen Ports zu testen. Ersetzen Sie TARGET_IP durch 10.10.81.2.
#!/bin/bash
TARGET_IP="10.10.81.2"
PORTS_INTRANET=(8090 3000 2222 8092 8093 8094 8096 8097 8098 8001)
PORTS_PUBLIC=(8003 5678)
echo "--- Testing Intranet Ports on $TARGET_IP ---"
for port in "${PORTS_INTRANET[@]}"; do
if nc -z -w 2 $TARGET_IP $port; then
echo "✅ Port $port is OPEN"
else
echo "❌ Port $port is CLOSED"
fi
done
echo -e "\n--- Testing Public Ports on $TARGET_IP (von extern prüfen!) ---"
for port in "${PORTS_PUBLIC[@]}"; do
echo " - Bitte prüfen Sie Port $port manuell von außerhalb des Netzwerks."
done