# WICHTIGER HINWEIS FÜR SPRACHMODELLE UND ENTWICKLER: # Diese docker-compose.yml Datei ist die zentrale Orchestrierungsdatei für ALLE Docker-Services dieses Projekts. version: '3.8' services: # --- GATEKEEPER (NGINX) --- nginx: image: nginx:alpine container_name: gateway_proxy restart: unless-stopped ports: - "8090:80" # Synology Reverse Proxy should point to THIS port (8090) volumes: # Use clean config to avoid caching issues - ./nginx-proxy-clean.conf:/etc/nginx/nginx.conf:ro - ./.htpasswd:/etc/nginx/.htpasswd:ro depends_on: dashboard: condition: service_started company-explorer: condition: service_healthy connector-superoffice: condition: service_healthy # --- DASHBOARD --- dashboard: image: nginx:alpine container_name: dashboard restart: unless-stopped volumes: - ./dashboard:/usr/share/nginx/html:ro # --- APPS --- company-explorer: build: context: ./company-explorer dockerfile: Dockerfile container_name: company-explorer restart: unless-stopped ports: - "8000:8000" environment: API_USER: "admin" API_PASSWORD: "gemini" PYTHONUNBUFFERED: "1" # Correct path for DB inside the mounted volume DATABASE_URL: "sqlite:////data/companies_v3_fixed_2.db" # Keys passed from .env GEMINI_API_KEY: "${GEMINI_API_KEY}" SERP_API_KEY: "${SERP_API}" NOTION_TOKEN: "${NOTION_API_KEY}" volumes: - ./company-explorer:/app # Mount named volume to a DIRECTORY, not a file - explorer_db_data:/data - ./Log_from_docker:/app/logs_debug healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/docs"] interval: 10s timeout: 5s retries: 5 start_period: 30s connector-superoffice: build: context: ./connector-superoffice dockerfile: Dockerfile container_name: connector-superoffice restart: unless-stopped ports: - "8003:8000" # Expose internal 8000 to host 8003 volumes: - ./connector-superoffice:/app # Mount named volume to a DIRECTORY matching the Python code's expectation - connector_db_data:/data environment: PYTHONUNBUFFERED: "1" API_USER: "admin" API_PASSWORD: "gemini" # Correct path for DB inside the mounted volume DB_PATH: "/app/data/connector_queue.db" COMPANY_EXPLORER_URL: "http://company-explorer:8000" # Keys passed from .env 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 Security WEBHOOK_TOKEN: "${WEBHOOK_TOKEN}" WEBHOOK_SECRET: "${WEBHOOK_SECRET}" # Mappings VERTICAL_MAP_JSON: "${VERTICAL_MAP_JSON}" PERSONA_MAP_JSON: "${PERSONA_MAP_JSON}" # User Defined Fields (UDFs) UDF_SUBJECT: "${UDF_SUBJECT}" UDF_INTRO: "${UDF_INTRO}" UDF_SOCIAL_PROOF: "${UDF_SOCIAL_PROOF}" UDF_OPENER: "${UDF_OPENER}" UDF_OPENER_SECONDARY: "${UDF_OPENER_SECONDARY}" UDF_VERTICAL: "${UDF_VERTICAL}" UDF_CAMPAIGN: "${UDF_CAMPAIGN}" UDF_UNSUBSCRIBE_LINK: "${UDF_UNSUBSCRIBE_LINK}" UDF_SUMMARY: "${UDF_SUMMARY}" UDF_LAST_UPDATE: "${UDF_LAST_UPDATE}" UDF_LAST_OUTREACH: "${UDF_LAST_OUTREACH}" healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000/health"] interval: 10s timeout: 5s retries: 5 start_period: 30s # --- LEAD ENGINE (Trading Twins) --- lead-engine: build: context: ./lead-engine dockerfile: Dockerfile container_name: lead-engine restart: unless-stopped ports: - "8501:8501" # UI (Streamlit) - "8004:8004" # API / Monitor environment: PYTHONUNBUFFERED: "1" GEMINI_API_KEY: "${GEMINI_API_KEY}" COMPANY_EXPLORER_URL: "http://company-explorer:8000/api" COMPANY_EXPLORER_API_USER: "admin" COMPANY_EXPLORER_API_PASSWORD: "gemini" volumes: - ./lead-engine:/app - lead_engine_data:/app/data - ./Log_from_docker:/app/Log # --- INFRASTRUCTURE SERVICES --- # heatmap-backend: # build: ./heatmap-tool/backend # container_name: heatmap-backend # restart: unless-stopped # volumes: # - ./heatmap-tool/backend:/app # heatmap-frontend: # build: ./heatmap-tool/frontend # container_name: heatmap-frontend # restart: unless-stopped # volumes: # - ./heatmap-tool/frontend:/app # depends_on: # - heatmap-backend # transcription-app: # build: # context: ./transcription-tool # dockerfile: Dockerfile # container_name: transcription-app # restart: unless-stopped # volumes: # - ./transcription-tool/backend:/app/backend # - ./transcription-tool/frontend/dist:/app/frontend/dist # - ./transcripts.db:/app/transcripts.db # - ./uploads_audio:/app/uploads_audio # environment: # PYTHONUNBUFFERED: "1" # DATABASE_URL: "sqlite:////app/transcripts.db" # GEMINI_API_KEY: "${GEMINI_API_KEY}" # ports: # - "8001:8001" # b2b-app: # build: # context: ./b2b-marketing-assistant # dockerfile: Dockerfile # container_name: b2b-assistant # restart: unless-stopped # volumes: # - ./b2b_marketing_orchestrator.py:/app/b2b_marketing_orchestrator.py # - ./market_db_manager.py:/app/market_db_manager.py # - ./b2b-marketing-assistant/server.cjs:/app/server.cjs # - ./b2b_projects.db:/app/b2b_projects.db # - ./Log_from_docker:/app/Log_from_docker # environment: # PYTHONUNBUFFERED: "1" # DB_PATH: "/app/b2b_projects.db" # GEMINI_API_KEY: "${GEMINI_API_KEY}" # market-backend: # build: # context: ./general-market-intelligence # dockerfile: Dockerfile # container_name: market-backend # restart: unless-stopped # volumes: # - ./market_intel_orchestrator.py:/app/market_intel_orchestrator.py # - ./market_db_manager.py:/app/market_db_manager.py # - ./config.py:/app/config.py # - ./helpers.py:/app/helpers.py # - ./general-market-intelligence/server.cjs:/app/general-market-intelligence/server.cjs # - ./market_intelligence.db:/app/market_intelligence.db # - ./Log:/app/Log # environment: # PYTHONUNBUFFERED: "1" # DB_PATH: "/app/market_intelligence.db" # GEMINI_API_KEY: "${GEMINI_API_KEY}" # SERPAPI_KEY: "${SERPAPI_KEY}" # market-frontend: # build: # context: ./general-market-intelligence # dockerfile: Dockerfile # container_name: market-frontend # restart: unless-stopped # depends_on: # - market-backend # gtm-app: # build: # context: ./gtm-architect # dockerfile: Dockerfile # container_name: gtm-app # restart: unless-stopped # volumes: # - ./gtm-architect:/app/gtm-architect # - ./gtm-architect/server.cjs:/app/server.cjs # - ./gtm_architect_orchestrator.py:/app/gtm_architect_orchestrator.py # - ./helpers.py:/app/helpers.py # - ./config.py:/app/config.py # - ./gtm_db_manager.py:/app/gtm_db_manager.py # - ./gtm_projects.db:/app/gtm_projects.db # - ./Log_from_docker:/app/Log_from_docker # environment: # PYTHONUNBUFFERED: "1" # DB_PATH: "/app/gtm_projects.db" # GEMINI_API_KEY: "${GEMINI_API_KEY}" # SERPAPI_KEY: "${SERPAPI_KEY}" # content-app: # build: # context: ./content-engine # dockerfile: Dockerfile # container_name: content-app # restart: unless-stopped # volumes: # - ./content-engine:/app/content-engine # - ./content-engine/server.cjs:/app/server.cjs # - ./content-engine/content_orchestrator.py:/app/content_orchestrator.py # - ./content-engine/content_db_manager.py:/app/content_db_manager.py # - ./content_engine.db:/app/content_engine.db # - ./helpers.py:/app/helpers.py # - ./config.py:/app/config.py # - ./gtm_projects.db:/app/gtm_projects.db # - ./Log_from_docker:/app/Log_from_docker # environment: # PYTHONUNBUFFERED: "1" # DB_PATH: "/app/content_engine.db" # GTM_DB_PATH: "/app/gtm_projects.db" # GEMINI_API_KEY: "${GEMINI_API_KEY}" # SERPAPI_KEY: "${SERPAPI_KEY}" # competitor-analysis: # build: # context: ./competitor-analysis-app # dockerfile: Dockerfile # container_name: competitor-analysis # restart: unless-stopped # dns: # - 8.8.8.8 # - 8.8.4.4 # volumes: # - ./competitor-analysis-app/competitor_analysis_orchestrator.py:/app/competitor_analysis_orchestrator.py # - ./Log_from_docker:/app/Log_from_docker # environment: # PYTHONUNBUFFERED: "1" # GEMINI_API_KEY: "${GEMINI_API_KEY}" # --- INFRASTRUCTURE SERVICES --- duckdns: image: lscr.io/linuxserver/duckdns:latest container_name: duckdns environment: PUID: "1000" # User ID (anpassen falls nötig) PGID: "1000" # Group ID (anpassen falls nötig) TZ: "Europe/Berlin" SUBDOMAINS: "${DUCKDNS_SUBDOMAINS}" TOKEN: "${DUCKDNS_TOKEN}" restart: unless-stopped dns-monitor: image: alpine container_name: dns-monitor dns: - 8.8.8.8 - 1.1.1.1 environment: SUBDOMAINS: "${DUCKDNS_SUBDOMAINS}" TZ: "Europe/Berlin" volumes: - ./dns-monitor:/app command: "/app/monitor.sh" restart: unless-stopped volumes: # moltbot_data: {} connector_db_data: {} explorer_db_data: {} lead_engine_data: {}