[32788f42] Keine Zusammenfassung angegeben.

Keine Zusammenfassung angegeben.
This commit is contained in:
2026-04-08 16:39:30 +00:00
parent 2cfda1da57
commit e8c2cdfff9
6 changed files with 409 additions and 275 deletions

View File

@@ -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"}

View File

@@ -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 &rarr;</a> <a href="/b2b/" class="btn">Starten &rarr;</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 &rarr;</a> <a href="/market/" class="btn">Starten &rarr;</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 &rarr;</a> <a href="/gtm/" class="btn">Starten &rarr;</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 &rarr;</a> <a href="/content/" class="btn">Starten &rarr;</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 &rarr;</a> <a href="/ce/" class="btn">Starten &rarr;</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 &rarr;</a> <a href="/competitor/" class="btn">Starten &rarr;</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 &rarr;</a> <a href="/lead/" class="btn" target="_blank">Starten &rarr;</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 &rarr;</a> <a href="/tr/" class="btn">Starten &rarr;</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 &rarr;</a> <a href="/heatmap/" class="btn">Starten &rarr;</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 &rarr;</a>
</div>
</div> </div>
<footer> <footer>
&copy; 2025 Local AI Suite | Secured Access &copy; 2026 Local AI Suite | Secured Access
</footer> </footer>
</body> </body>
</html> </html>

View File

@@ -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: {}

View File

@@ -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

View 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)

View File

@@ -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_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;
} # }
location /connector/ { # location /connector/ {
auth_basic off; # auth_basic off;
proxy_pass http://connector-superoffice:8000/; # 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;
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;
}
} }
} }