[32788f42] Keine Zusammenfassung angegeben.
Keine Zusammenfassung angegeben.
This commit is contained in:
@@ -1 +1 @@
|
|||||||
{"task_id": "32788f42-8544-80e1-a13a-c26114cf9b34", "token": "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", "readme_path": "readme.md", "session_start_time": "2026-04-08T08:21:53.169017"}
|
{"task_id": "32788f42-8544-80e1-a13a-c26114cf9b34", "token": "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", "readme_path": "readme.md", "session_start_time": "2026-04-08T16:39:28.516327"}
|
||||||
@@ -133,18 +133,18 @@
|
|||||||
</header>
|
</header>
|
||||||
|
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<!-- B2B Marketing Assistant -->
|
<!-- B2B Marketing Assistant (Inactive)
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">🚀</span>
|
<span class="card-icon">🚀</span>
|
||||||
<h2>B2B Marketing Assistant</h2>
|
<h2>B2B Marketing Assistant</h2>
|
||||||
<p>
|
<p>
|
||||||
KI-gestützte Analyse von Unternehmens-Websites zur Erstellung von Personas, Pain-Points und Marketing-Botschaften.
|
KI-gestützte Analyse von Unternehmens-Websites zur Erstellung von Personas, Pain-Points und Marketing-Botschaften.
|
||||||
</p>
|
</p>
|
||||||
<!-- WICHTIG: Relativer Link für Reverse Proxy -->
|
|
||||||
<a href="/b2b/" class="btn">Starten →</a>
|
<a href="/b2b/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- General Market Intelligence -->
|
<!-- General Market Intelligence (Inactive)
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">📊</span>
|
<span class="card-icon">📊</span>
|
||||||
<h2>Market Intelligence</h2>
|
<h2>Market Intelligence</h2>
|
||||||
@@ -152,22 +152,22 @@
|
|||||||
Allgemeine Marktanalyse und Recherche-Tool.
|
Allgemeine Marktanalyse und Recherche-Tool.
|
||||||
Nutzt Web-Scraping und KI für tiefe Einblicke.
|
Nutzt Web-Scraping und KI für tiefe Einblicke.
|
||||||
</p>
|
</p>
|
||||||
<!-- WICHTIG: Relativer Link für Reverse Proxy -->
|
|
||||||
<a href="/market/" class="btn">Starten →</a>
|
<a href="/market/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- GTM Architect -->
|
<!-- GTM Architect (Inactive)
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">🏛️</span>
|
<span class="card-icon">🏛️</span>
|
||||||
<h2>GTM Architect</h2>
|
<h2>GTM Architect</h2>
|
||||||
<p>
|
<p>
|
||||||
Entwickelt eine komplette Go-to-Market-Strategie für neue technische Produkte, von der Analyse bis zum Sales-Kit.
|
Entwickelt eine komplette Go-to-Market-Strategie für neue technische Produkte, von der Analyse bis zum Sales-Kit.
|
||||||
</p>
|
</p>
|
||||||
<!-- WICHTIG: Relativer Link für Reverse Proxy -->
|
|
||||||
<a href="/gtm/" class="btn">Starten →</a>
|
<a href="/gtm/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Content Engine -->
|
<!-- Content Engine (Inactive)
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">✍️</span>
|
<span class="card-icon">✍️</span>
|
||||||
<h2>Content Engine</h2>
|
<h2>Content Engine</h2>
|
||||||
@@ -176,19 +176,19 @@
|
|||||||
</p>
|
</p>
|
||||||
<a href="/content/" class="btn">Starten →</a>
|
<a href="/content/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Company Explorer (Robotics) -->
|
<!-- Company Explorer -->
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">🤖</span>
|
<span class="card-icon">🤖</span>
|
||||||
<h2>Company Explorer</h2>
|
<h2>Company Explorer</h2>
|
||||||
<p>
|
<p>
|
||||||
Das zentrale CRM-Data-Mining Tool. Importieren, Deduplizieren und Anreichern von Firmenlisten mit Fokus auf Robotik-Potential.
|
Das zentrale CRM-Data-Mining Tool. Importieren, Deduplizieren und Anreichern von Firmenlisten mit Fokus auf Robotik-Potential.
|
||||||
</p>
|
</p>
|
||||||
<!-- Jetzt direkt zum Frontend -->
|
|
||||||
<a href="/ce/" class="btn">Starten →</a>
|
<a href="/ce/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Competitor Analysis Agent -->
|
<!-- Competitor Analysis Agent (Inactive)
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">⚔️</span>
|
<span class="card-icon">⚔️</span>
|
||||||
<h2>Competitor Analysis</h2>
|
<h2>Competitor Analysis</h2>
|
||||||
@@ -197,8 +197,9 @@
|
|||||||
</p>
|
</p>
|
||||||
<a href="/competitor/" class="btn">Starten →</a>
|
<a href="/competitor/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Lead Engine: TradingTwins -->
|
<!-- Lead Engine: TradingTwins (Inactive)
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">📈</span>
|
<span class="card-icon">📈</span>
|
||||||
<h2>Lead Engine: TradingTwins</h2>
|
<h2>Lead Engine: TradingTwins</h2>
|
||||||
@@ -207,6 +208,7 @@
|
|||||||
</p>
|
</p>
|
||||||
<a href="/lead/" class="btn" target="_blank">Starten →</a>
|
<a href="/lead/" class="btn" target="_blank">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
<!-- Meeting Assistant (Transcription) -->
|
<!-- Meeting Assistant (Transcription) -->
|
||||||
<div class="card">
|
<div class="card">
|
||||||
@@ -218,7 +220,7 @@
|
|||||||
<a href="/tr/" class="btn">Starten →</a>
|
<a href="/tr/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- Heatmap Tool -->
|
<!-- Heatmap Tool (Inactive)
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<span class="card-icon">🗺️</span>
|
<span class="card-icon">🗺️</span>
|
||||||
<h2>Heatmap Tool</h2>
|
<h2>Heatmap Tool</h2>
|
||||||
@@ -227,10 +229,21 @@
|
|||||||
</p>
|
</p>
|
||||||
<a href="/heatmap/" class="btn">Starten →</a>
|
<a href="/heatmap/" class="btn">Starten →</a>
|
||||||
</div>
|
</div>
|
||||||
|
-->
|
||||||
|
|
||||||
|
<!-- Fotograf.de Scraper -->
|
||||||
|
<div class="card">
|
||||||
|
<span class="card-icon">📸</span>
|
||||||
|
<h2>Fotograf.de ERP</h2>
|
||||||
|
<p>
|
||||||
|
Automatisierter Workflow zum Download und Formatieren der Anmeldelisten von fotograf.de als sortiertes PDF.
|
||||||
|
</p>
|
||||||
|
<a href="/fotograf-de/" class="btn">Starten →</a>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<footer>
|
<footer>
|
||||||
© 2025 Local AI Suite | Secured Access
|
© 2026 Local AI Suite | Secured Access
|
||||||
</footer>
|
</footer>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
|||||||
@@ -19,23 +19,25 @@ services:
|
|||||||
condition: service_started
|
condition: service_started
|
||||||
company-explorer:
|
company-explorer:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
connector-superoffice:
|
# connector-superoffice:
|
||||||
condition: service_healthy
|
# condition: service_healthy
|
||||||
lead-engine:
|
# lead-engine:
|
||||||
condition: service_started
|
# condition: service_started
|
||||||
gtm-architect:
|
# gtm-architect:
|
||||||
condition: service_started
|
# condition: service_started
|
||||||
b2b-marketing-assistant:
|
# b2b-marketing-assistant:
|
||||||
condition: service_started
|
# condition: service_started
|
||||||
transcription-tool:
|
transcription-tool:
|
||||||
condition: service_started
|
condition: service_started
|
||||||
heatmap-frontend:
|
# heatmap-frontend:
|
||||||
condition: service_started
|
# condition: service_started
|
||||||
competitor-analysis:
|
# competitor-analysis:
|
||||||
condition: service_started
|
# condition: service_started
|
||||||
content-engine:
|
# content-engine:
|
||||||
condition: service_started
|
# condition: service_started
|
||||||
market-intelligence:
|
# market-intelligence:
|
||||||
|
# condition: service_started
|
||||||
|
fotograf-de-scraper-frontend:
|
||||||
condition: service_started
|
condition: service_started
|
||||||
|
|
||||||
# --- DASHBOARD ---
|
# --- DASHBOARD ---
|
||||||
@@ -47,60 +49,60 @@ services:
|
|||||||
- ./dashboard:/usr/share/nginx/html:ro
|
- ./dashboard:/usr/share/nginx/html:ro
|
||||||
|
|
||||||
# --- APPS ---
|
# --- APPS ---
|
||||||
market-intelligence:
|
# market-intelligence:
|
||||||
build:
|
# build:
|
||||||
context: .
|
# context: .
|
||||||
dockerfile: general-market-intelligence/Dockerfile.fullstack
|
# dockerfile: general-market-intelligence/Dockerfile.fullstack
|
||||||
container_name: market-intelligence
|
# container_name: market-intelligence
|
||||||
restart: unless-stopped
|
# restart: unless-stopped
|
||||||
ports:
|
# ports:
|
||||||
- "8098:3001"
|
# - "8098:3001"
|
||||||
environment:
|
# environment:
|
||||||
GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
# GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
||||||
SERP_API_KEY: "${SERP_API}"
|
# SERP_API_KEY: "${SERP_API}"
|
||||||
PYTHONUNBUFFERED: "1"
|
# PYTHONUNBUFFERED: "1"
|
||||||
volumes:
|
# volumes:
|
||||||
- market_intel_data:/data
|
# - market_intel_data:/data
|
||||||
- ./Log_from_docker:/app/Log
|
# - ./Log_from_docker:/app/Log
|
||||||
|
|
||||||
content-engine:
|
# content-engine:
|
||||||
build:
|
# build:
|
||||||
context: .
|
# context: .
|
||||||
dockerfile: content-engine/Dockerfile
|
# dockerfile: content-engine/Dockerfile
|
||||||
container_name: content-engine
|
# container_name: content-engine
|
||||||
restart: unless-stopped
|
# restart: unless-stopped
|
||||||
ports:
|
# ports:
|
||||||
- "8093:3000"
|
# - "8093:3000"
|
||||||
environment:
|
# environment:
|
||||||
GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
# GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
||||||
PYTHONUNBUFFERED: "1"
|
# PYTHONUNBUFFERED: "1"
|
||||||
GTM_DB_PATH: "/gtm_data/gtm_projects.db"
|
# GTM_DB_PATH: "/gtm_data/gtm_projects.db"
|
||||||
CONTENT_DB_PATH: "/data/content_engine.db"
|
# CONTENT_DB_PATH: "/data/content_engine.db"
|
||||||
volumes:
|
# volumes:
|
||||||
- content_engine_data:/data
|
# - content_engine_data:/data
|
||||||
- gtm_architect_data:/gtm_data:ro
|
# - gtm_architect_data:/gtm_data:ro
|
||||||
- ./Log_from_docker:/app/logs_debug
|
# - ./Log_from_docker:/app/logs_debug
|
||||||
healthcheck:
|
# healthcheck:
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:3006"]
|
# test: ["CMD", "curl", "-f", "http://localhost:3006"]
|
||||||
interval: 10s
|
# interval: 10s
|
||||||
timeout: 5s
|
# timeout: 5s
|
||||||
retries: 5
|
# retries: 5
|
||||||
start_period: 30s
|
# start_period: 30s
|
||||||
|
|
||||||
competitor-analysis:
|
# competitor-analysis:
|
||||||
build:
|
# build:
|
||||||
context: ./competitor-analysis-app
|
# context: ./competitor-analysis-app
|
||||||
dockerfile: Dockerfile
|
# dockerfile: Dockerfile
|
||||||
container_name: competitor-analysis
|
# container_name: competitor-analysis
|
||||||
restart: unless-stopped
|
# restart: unless-stopped
|
||||||
ports:
|
# ports:
|
||||||
- "8097:3000"
|
# - "8097:3000"
|
||||||
environment:
|
# environment:
|
||||||
GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
# GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
||||||
PYTHONUNBUFFERED: "1"
|
# PYTHONUNBUFFERED: "1"
|
||||||
volumes:
|
# volumes:
|
||||||
- competitor_analysis_data:/data
|
# - competitor_analysis_data:/data
|
||||||
- ./Log_from_docker:/app/logs_debug
|
# - ./Log_from_docker:/app/logs_debug
|
||||||
|
|
||||||
transcription-tool:
|
transcription-tool:
|
||||||
build:
|
build:
|
||||||
@@ -117,58 +119,58 @@ services:
|
|||||||
- transcription_uploads:/app/uploads
|
- transcription_uploads:/app/uploads
|
||||||
- ./Log_from_docker:/app/logs_debug
|
- ./Log_from_docker:/app/logs_debug
|
||||||
|
|
||||||
heatmap-backend:
|
# heatmap-backend:
|
||||||
build:
|
# build:
|
||||||
context: ./heatmap-tool/backend
|
# context: ./heatmap-tool/backend
|
||||||
container_name: heatmap-backend
|
# container_name: heatmap-backend
|
||||||
restart: unless-stopped
|
# restart: unless-stopped
|
||||||
ports:
|
# ports:
|
||||||
- "8002:8000"
|
# - "8002:8000"
|
||||||
environment:
|
# environment:
|
||||||
ORS_API_KEY: "${ORS_API_KEY}"
|
# ORS_API_KEY: "${ORS_API_KEY}"
|
||||||
PYTHONUNBUFFERED: "1"
|
# PYTHONUNBUFFERED: "1"
|
||||||
|
|
||||||
heatmap-frontend:
|
# heatmap-frontend:
|
||||||
build:
|
# build:
|
||||||
context: ./heatmap-tool/frontend
|
# context: ./heatmap-tool/frontend
|
||||||
dockerfile: Dockerfile
|
# dockerfile: Dockerfile
|
||||||
container_name: heatmap-frontend
|
# container_name: heatmap-frontend
|
||||||
restart: unless-stopped
|
# restart: unless-stopped
|
||||||
ports:
|
# ports:
|
||||||
- "8096:80"
|
# - "8096:80"
|
||||||
depends_on:
|
# depends_on:
|
||||||
- heatmap-backend
|
# - heatmap-backend
|
||||||
|
|
||||||
b2b-marketing-assistant:
|
# b2b-marketing-assistant:
|
||||||
build:
|
# build:
|
||||||
context: .
|
# context: .
|
||||||
dockerfile: b2b-marketing-assistant/Dockerfile
|
# dockerfile: b2b-marketing-assistant/Dockerfile
|
||||||
container_name: b2b-marketing-assistant
|
# container_name: b2b-marketing-assistant
|
||||||
restart: unless-stopped
|
# restart: unless-stopped
|
||||||
ports:
|
# ports:
|
||||||
- "8092:3002"
|
# - "8092:3002"
|
||||||
environment:
|
# environment:
|
||||||
GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
# GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
||||||
PYTHONUNBUFFERED: "1"
|
# PYTHONUNBUFFERED: "1"
|
||||||
volumes:
|
# volumes:
|
||||||
- b2b_marketing_data:/data
|
# - b2b_marketing_data:/data
|
||||||
- ./Log_from_docker:/app/logs_debug
|
# - ./Log_from_docker:/app/logs_debug
|
||||||
|
|
||||||
gtm-architect:
|
# gtm-architect:
|
||||||
build:
|
# build:
|
||||||
context: .
|
# context: .
|
||||||
dockerfile: gtm-architect/Dockerfile
|
# dockerfile: gtm-architect/Dockerfile
|
||||||
container_name: gtm-architect
|
# container_name: gtm-architect
|
||||||
restart: unless-stopped
|
# restart: unless-stopped
|
||||||
ports:
|
# ports:
|
||||||
- "8094:80"
|
# - "8094:80"
|
||||||
environment:
|
# environment:
|
||||||
GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
# GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
||||||
VITE_API_BASE_URL: "/gtm/api"
|
# VITE_API_BASE_URL: "/gtm/api"
|
||||||
GTM_DB_PATH: "/data/gtm_projects.db"
|
# GTM_DB_PATH: "/data/gtm_projects.db"
|
||||||
volumes:
|
# volumes:
|
||||||
- ./Log_from_docker:/app/logs_debug
|
# - ./Log_from_docker:/app/logs_debug
|
||||||
- gtm_architect_data:/data
|
# - gtm_architect_data:/data
|
||||||
|
|
||||||
company-explorer:
|
company-explorer:
|
||||||
build:
|
build:
|
||||||
@@ -197,64 +199,90 @@ services:
|
|||||||
retries: 5
|
retries: 5
|
||||||
start_period: 30s
|
start_period: 30s
|
||||||
|
|
||||||
connector-superoffice:
|
# connector-superoffice:
|
||||||
|
# build:
|
||||||
|
# context: ./connector-superoffice
|
||||||
|
# dockerfile: Dockerfile
|
||||||
|
# container_name: connector-superoffice
|
||||||
|
# restart: unless-stopped
|
||||||
|
# ports:
|
||||||
|
# - "8003:8000"
|
||||||
|
# volumes:
|
||||||
|
# - ./connector-superoffice:/app
|
||||||
|
# - ./connector-superoffice/data:/data # Persistent local DB storage
|
||||||
|
# environment:
|
||||||
|
# PYTHONUNBUFFERED: "1"
|
||||||
|
# GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
||||||
|
# SO_CLIENT_ID: "${SO_CLIENT_ID}"
|
||||||
|
# SO_CLIENT_SECRET: "${SO_CLIENT_SECRET}"
|
||||||
|
# SO_REFRESH_TOKEN: "${SO_REFRESH_TOKEN}"
|
||||||
|
# SO_ENVIRONMENT: "${SO_ENVIRONMENT}"
|
||||||
|
# SO_CONTEXT_IDENTIFIER: "${SO_CONTEXT_IDENTIFIER}"
|
||||||
|
# WEBHOOK_TOKEN: "${WEBHOOK_TOKEN}"
|
||||||
|
# WEBHOOK_SECRET: "${WEBHOOK_SECRET}"
|
||||||
|
# healthcheck:
|
||||||
|
# test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
|
||||||
|
# interval: 10s
|
||||||
|
# timeout: 5s
|
||||||
|
# retries: 5
|
||||||
|
# start_period: 30s
|
||||||
|
|
||||||
|
# lead-engine:
|
||||||
|
# build:
|
||||||
|
# context: ./lead-engine
|
||||||
|
# dockerfile: Dockerfile
|
||||||
|
# container_name: lead-engine
|
||||||
|
# restart: unless-stopped
|
||||||
|
# ports:
|
||||||
|
# - "8501:8501" # UI (Streamlit)
|
||||||
|
# - "8004:8004" # API / Monitor
|
||||||
|
# - "8099:8004" # Direct Test Port
|
||||||
|
# environment:
|
||||||
|
# PYTHONUNBUFFERED: "1"
|
||||||
|
# GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
||||||
|
# SERP_API: "${SERP_API}"
|
||||||
|
# INFO_Application_ID: "${INFO_Application_ID}"
|
||||||
|
# INFO_Tenant_ID: "${INFO_Tenant_ID}"
|
||||||
|
# INFO_Secret: "${INFO_Secret}"
|
||||||
|
# CAL_APPID: "${CAL_APPID}"
|
||||||
|
# CAL_SECRET: "${CAL_SECRET}"
|
||||||
|
# CAL_TENNANT_ID: "${CAL_TENNANT_ID}"
|
||||||
|
# TEAMS_WEBHOOK_URL: "${TEAMS_WEBHOOK_URL}"
|
||||||
|
# FEEDBACK_SERVER_BASE_URL: "${FEEDBACK_SERVER_BASE_URL}"
|
||||||
|
# WORDPRESS_BOOKING_URL: "${WORDPRESS_BOOKING_URL}"
|
||||||
|
# MS_BOOKINGS_URL: "${MS_BOOKINGS_URL}"
|
||||||
|
# volumes:
|
||||||
|
# - ./lead-engine:/app
|
||||||
|
# - ./lead-engine/data:/app/data # Local persistent database
|
||||||
|
|
||||||
|
fotograf-de-scraper-backend:
|
||||||
build:
|
build:
|
||||||
context: ./connector-superoffice
|
context: ./fotograf-de-scraper/backend
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
container_name: connector-superoffice
|
container_name: fotograf-de-scraper-backend
|
||||||
restart: unless-stopped
|
env_file:
|
||||||
ports:
|
- ./fotograf-de-scraper/.env
|
||||||
- "8003:8000"
|
|
||||||
volumes:
|
|
||||||
- ./connector-superoffice:/app
|
|
||||||
- ./connector-superoffice/data:/data # Persistent local DB storage
|
|
||||||
environment:
|
environment:
|
||||||
PYTHONUNBUFFERED: "1"
|
- TZ=Europe/Berlin
|
||||||
GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
ports:
|
||||||
SO_CLIENT_ID: "${SO_CLIENT_ID}"
|
- "8002:8000"
|
||||||
SO_CLIENT_SECRET: "${SO_CLIENT_SECRET}"
|
volumes:
|
||||||
SO_REFRESH_TOKEN: "${SO_REFRESH_TOKEN}"
|
- ./fotograf-de-scraper/backend:/app
|
||||||
SO_ENVIRONMENT: "${SO_ENVIRONMENT}"
|
- ./fotograf-de-scraper/backend/data:/app/data
|
||||||
SO_CONTEXT_IDENTIFIER: "${SO_CONTEXT_IDENTIFIER}"
|
restart: unless-stopped
|
||||||
WEBHOOK_TOKEN: "${WEBHOOK_TOKEN}"
|
|
||||||
WEBHOOK_SECRET: "${WEBHOOK_SECRET}"
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
|
|
||||||
interval: 10s
|
|
||||||
timeout: 5s
|
|
||||||
retries: 5
|
|
||||||
start_period: 30s
|
|
||||||
|
|
||||||
lead-engine:
|
fotograf-de-scraper-frontend:
|
||||||
build:
|
build:
|
||||||
context: ./lead-engine
|
context: ./fotograf-de-scraper/frontend
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
container_name: lead-engine
|
args:
|
||||||
restart: unless-stopped
|
VITE_API_BASE_URL: "http://192.168.178.6:8002"
|
||||||
|
container_name: fotograf-de-scraper-frontend
|
||||||
ports:
|
ports:
|
||||||
- "8501:8501" # UI (Streamlit)
|
- "3009:80"
|
||||||
- "8004:8004" # API / Monitor
|
depends_on:
|
||||||
- "8099:8004" # Direct Test Port
|
- fotograf-de-scraper-backend
|
||||||
environment:
|
restart: unless-stopped
|
||||||
PYTHONUNBUFFERED: "1"
|
|
||||||
GEMINI_API_KEY: "${GEMINI_API_KEY}"
|
|
||||||
SERP_API: "${SERP_API}"
|
|
||||||
INFO_Application_ID: "${INFO_Application_ID}"
|
|
||||||
INFO_Tenant_ID: "${INFO_Tenant_ID}"
|
|
||||||
INFO_Secret: "${INFO_Secret}"
|
|
||||||
CAL_APPID: "${CAL_APPID}"
|
|
||||||
CAL_SECRET: "${CAL_SECRET}"
|
|
||||||
CAL_TENNANT_ID: "${CAL_TENNANT_ID}"
|
|
||||||
TEAMS_WEBHOOK_URL: "${TEAMS_WEBHOOK_URL}"
|
|
||||||
FEEDBACK_SERVER_BASE_URL: "${FEEDBACK_SERVER_BASE_URL}"
|
|
||||||
WORDPRESS_BOOKING_URL: "${WORDPRESS_BOOKING_URL}"
|
|
||||||
MS_BOOKINGS_URL: "${MS_BOOKINGS_URL}"
|
|
||||||
volumes:
|
|
||||||
- ./lead-engine:/app
|
|
||||||
- ./lead-engine/data:/app/data # Local persistent database
|
|
||||||
|
|
||||||
# --- INFRASTRUCTURE SERVICES ---
|
|
||||||
|
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
gtm_architect_data: {}
|
gtm_architect_data: {}
|
||||||
|
|||||||
@@ -3,6 +3,9 @@ FROM node:20-alpine AS builder
|
|||||||
|
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Accept build arguments
|
||||||
|
ARG VITE_API_BASE_URL
|
||||||
|
|
||||||
# Copy package.json and package-lock.json
|
# Copy package.json and package-lock.json
|
||||||
COPY package*.json ./
|
COPY package*.json ./
|
||||||
|
|
||||||
@@ -12,6 +15,9 @@ RUN npm install
|
|||||||
# Copy the rest of the application source code
|
# Copy the rest of the application source code
|
||||||
COPY . .
|
COPY . .
|
||||||
|
|
||||||
|
# Write the build arg to .env.production so Vite picks it up during build
|
||||||
|
RUN echo "VITE_API_BASE_URL=${VITE_API_BASE_URL}" > .env.production
|
||||||
|
|
||||||
# Build the application
|
# Build the application
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
|
|||||||
66
modify_compose_for_user.py
Normal file
66
modify_compose_for_user.py
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
import yaml
|
||||||
|
|
||||||
|
with open('docker-compose.yml', 'r') as f:
|
||||||
|
data = yaml.safe_load(f)
|
||||||
|
|
||||||
|
services = data.get('services', {})
|
||||||
|
|
||||||
|
# We only keep the following core services
|
||||||
|
core_services = [
|
||||||
|
'nginx',
|
||||||
|
'dashboard',
|
||||||
|
'company-explorer',
|
||||||
|
'transcription-tool'
|
||||||
|
]
|
||||||
|
|
||||||
|
# Create a filtered services dict
|
||||||
|
new_services = {}
|
||||||
|
for k, v in services.items():
|
||||||
|
if k in core_services:
|
||||||
|
new_services[k] = v
|
||||||
|
|
||||||
|
# Add fotograf-de services since they are in subdirectories but belong to the main stack
|
||||||
|
new_services['fotograf-de-scraper-backend'] = {
|
||||||
|
'build': {
|
||||||
|
'context': './fotograf-de-scraper/backend',
|
||||||
|
'dockerfile': 'Dockerfile'
|
||||||
|
},
|
||||||
|
'container_name': 'fotograf-de-scraper-backend',
|
||||||
|
'env_file': ['./fotograf-de-scraper/.env'],
|
||||||
|
'environment': ['TZ=Europe/Berlin'],
|
||||||
|
'ports': ['8002:8000'],
|
||||||
|
'volumes': [
|
||||||
|
'./fotograf-de-scraper/backend:/app',
|
||||||
|
'./fotograf-de-scraper/backend/data:/app/data'
|
||||||
|
],
|
||||||
|
'restart': 'unless-stopped'
|
||||||
|
}
|
||||||
|
|
||||||
|
new_services['fotograf-de-scraper-frontend'] = {
|
||||||
|
'build': {
|
||||||
|
'context': './fotograf-de-scraper/frontend',
|
||||||
|
'dockerfile': 'Dockerfile',
|
||||||
|
'args': {'VITE_API_BASE_URL': '/fotograf-de-api'}
|
||||||
|
},
|
||||||
|
'container_name': 'fotograf-de-scraper-frontend',
|
||||||
|
'ports': ['3009:80'],
|
||||||
|
'depends_on': ['fotograf-de-scraper-backend'],
|
||||||
|
'restart': 'unless-stopped'
|
||||||
|
}
|
||||||
|
|
||||||
|
# Update NGINX depends_on
|
||||||
|
if 'nginx' in new_services and 'depends_on' in new_services['nginx']:
|
||||||
|
new_services['nginx']['depends_on'] = {
|
||||||
|
'dashboard': {'condition': 'service_started'},
|
||||||
|
'company-explorer': {'condition': 'service_healthy'},
|
||||||
|
'transcription-tool': {'condition': 'service_started'},
|
||||||
|
'fotograf-de-scraper-frontend': {'condition': 'service_started'}
|
||||||
|
}
|
||||||
|
|
||||||
|
data['services'] = new_services
|
||||||
|
|
||||||
|
# Prune unused volumes
|
||||||
|
data['volumes'] = {'transcription_uploads': {}}
|
||||||
|
|
||||||
|
with open('docker-compose.yml', 'w') as f:
|
||||||
|
yaml.dump(data, f, sort_keys=False)
|
||||||
@@ -38,47 +38,47 @@ http {
|
|||||||
proxy_set_header Connection "upgrade";
|
proxy_set_header Connection "upgrade";
|
||||||
}
|
}
|
||||||
|
|
||||||
location /lead/ {
|
# location /lead/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
# auth_basic "Restricted Access - Local AI Suite";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
# auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
proxy_pass http://lead-engine:8501/;
|
# proxy_pass http://lead-engine:8501/;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
proxy_http_version 1.1;
|
# proxy_http_version 1.1;
|
||||||
proxy_read_timeout 86400;
|
# proxy_read_timeout 86400;
|
||||||
}
|
# }
|
||||||
|
|
||||||
location /gtm/ {
|
# location /gtm/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
# auth_basic "Restricted Access - Local AI Suite";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
# auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
proxy_pass http://gtm-architect:3005/;
|
# proxy_pass http://gtm-architect:3005/;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
}
|
# }
|
||||||
|
|
||||||
location /market/ {
|
# location /market/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
# auth_basic "Restricted Access - Local AI Suite";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
# auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
proxy_pass http://market-intelligence:3001/;
|
# proxy_pass http://market-intelligence:3001/;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
}
|
# }
|
||||||
|
|
||||||
location /b2b/ {
|
# location /b2b/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
# auth_basic "Restricted Access - Local AI Suite";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
# auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
proxy_pass http://b2b-marketing-assistant:3002/;
|
# proxy_pass http://b2b-marketing-assistant:3002/;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
}
|
# }
|
||||||
|
|
||||||
location /tr/ {
|
location /tr/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
auth_basic "Restricted Access - Local AI Suite";
|
||||||
@@ -91,72 +91,93 @@ http {
|
|||||||
proxy_set_header Connection "upgrade";
|
proxy_set_header Connection "upgrade";
|
||||||
}
|
}
|
||||||
|
|
||||||
location /content/ {
|
# location /content/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
# auth_basic "Restricted Access - Local AI Suite";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
# auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
proxy_pass http://content-engine:3000/;
|
# proxy_pass http://content-engine:3000/;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
}
|
# }
|
||||||
|
|
||||||
location /competitor/ {
|
# location /competitor/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
# auth_basic "Restricted Access - Local AI Suite";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
# auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
proxy_pass http://competitor-analysis:3000/;
|
# proxy_pass http://competitor-analysis:3000/;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
}
|
# }
|
||||||
|
|
||||||
location /heatmap/ {
|
# location /heatmap/ {
|
||||||
auth_basic "Restricted Access - Local AI Suite";
|
# auth_basic "Restricted Access - Local AI Suite";
|
||||||
auth_basic_user_file /etc/nginx/.htpasswd;
|
# auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
proxy_pass http://heatmap-frontend:80/;
|
# proxy_pass http://heatmap-frontend:80/;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
}
|
# }
|
||||||
|
|
||||||
location /feedback/ {
|
# location /feedback/ {
|
||||||
auth_basic off;
|
# auth_basic off;
|
||||||
proxy_http_version 1.1;
|
# proxy_http_version 1.1;
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
# proxy_set_header Connection "upgrade";
|
||||||
rewrite ^/feedback/(.*)$ /$1 break;
|
# rewrite ^/feedback/(.*)$ /$1 break;
|
||||||
proxy_pass http://lead-engine:8004;
|
# proxy_pass http://lead-engine:8004;
|
||||||
proxy_set_header Host $host;
|
# proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
# proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
}
|
# }
|
||||||
|
|
||||||
# Smartlead Webhooks (public)
|
# Smartlead Webhooks (public)
|
||||||
location /public/smartlead/ {
|
# location /public/smartlead/ {
|
||||||
auth_basic off;
|
# auth_basic off;
|
||||||
# Rewrite the URL to remove the public prefix and pass the rest to the webhook handler
|
# # Rewrite the URL to remove the public prefix and pass the rest to the webhook handler
|
||||||
# e.g., /public/smartlead/hot-lead -> /webhook/hot-lead
|
# # e.g., /public/smartlead/hot-lead -> /webhook/hot-lead
|
||||||
rewrite ^/public/smartlead/(.*)$ /webhook/$1 break;
|
# rewrite ^/public/smartlead/(.*)$ /webhook/$1 break;
|
||||||
|
#
|
||||||
|
# proxy_pass http://lead-engine:8004;
|
||||||
|
# proxy_set_header Host $host;
|
||||||
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
# proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
# }
|
||||||
|
|
||||||
proxy_pass http://lead-engine:8004;
|
# location /connector/ {
|
||||||
|
# auth_basic off;
|
||||||
|
# proxy_pass http://connector-superoffice:8000/;
|
||||||
|
# proxy_set_header Host $host;
|
||||||
|
# proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
# proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
# proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
# proxy_set_header Upgrade $http_upgrade;
|
||||||
|
# proxy_set_header Connection "upgrade";
|
||||||
|
# }
|
||||||
|
|
||||||
|
location /fotograf-de/ {
|
||||||
|
auth_basic "Restricted Access - Local AI Suite";
|
||||||
|
auth_basic_user_file /etc/nginx/.htpasswd;
|
||||||
|
proxy_pass http://fotograf-de-scraper-frontend:80/;
|
||||||
proxy_set_header Host $host;
|
proxy_set_header Host $host;
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
}
|
|
||||||
|
|
||||||
location /connector/ {
|
|
||||||
auth_basic off;
|
|
||||||
proxy_pass http://connector-superoffice:8000/;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
|
||||||
proxy_set_header X-Forwarded-Proto $scheme;
|
|
||||||
proxy_set_header Upgrade $http_upgrade;
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
proxy_set_header Connection "upgrade";
|
proxy_set_header Connection "upgrade";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Fotograf.de Backend API (internal)
|
||||||
|
location /fotograf-de-api/ {
|
||||||
|
auth_basic off;
|
||||||
|
rewrite ^/fotograf-de-api/(.*)$ /$1 break;
|
||||||
|
proxy_pass http://fotograf-de-scraper-backend:8000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user