File size: 4,040 Bytes
ffcad5d
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
# ---------------------------------------------------------------------------
# Docker Compose for Cybersecurity Panel
#
# Default (`docker compose up --build`): production-shaped single container
# (same as HuggingFace Spaces). Port host 7861 → container 7860.
#
# Dev with hot reload:
#   docker compose --profile dev up --build
# Backend: uvicorn --reload on :8000
# Frontend: CRA npm start on :3000 (REACT_APP_API_URL=http://localhost:8000)
#
# Secrets: prefer C:\Users\dream\.secrets\shared.env (mounted / copied via
# env_file). Override with a local .env as needed.
#
# Image/container naming follows: <repo>-<branch>-<date>
# ---------------------------------------------------------------------------

x-shared-env: &shared-env
  # Non-secret defaults only. API keys / JWT come from env_file
  # (C:/Users/dream/.secrets/shared.env) — do NOT set OPENAI_API_KEY /
  # VLLM_API_KEY here with ${VAR:-} or an empty host env will blank the
  # values that env_file already injected.
  GEMINI_MODEL: ${GEMINI_MODEL:-gemini-2.5-flash}
  CORS_ORIGINS: ${CORS_ORIGINS:-http://localhost:3000,http://127.0.0.1:3000}

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile
    image: cybersecurity-panel-dev-cursor-${COMPOSE_DATE:-local}
    container_name: cybersecurity-panel-dev-cursor-${COMPOSE_DATE:-local}
    ports:
      - "${CYBERPANEL_HOST_PORT:-7861}:7860"
    env_file:
      - path: ${SHARED_ENV_FILE:-C:/Users/dream/.secrets/shared.env}
        required: false
      - path: .env
        required: false
    environment:
      <<: *shared-env
      JWT_SECRET_KEY: ${JWT_SECRET_KEY:-CHANGEME-by-overriding-in-dot-env-file}
      CONFIG_PATH: ${CONFIG_PATH:-/home/user/app/cybersecurity_config.yaml}
      CORS_ORIGINS: ${CORS_ORIGINS:-*}
      DATA_DIR: /data
    volumes:
      - cybersecurity_data:/data

  backend:
    profiles: ["dev"]
    build:
      context: .
      dockerfile: Dockerfile.dev
      target: backend
    image: cybersecurity-panel-backend-dev-cursor-${COMPOSE_DATE:-local}
    container_name: cybersecurity-panel-backend-dev-cursor-${COMPOSE_DATE:-local}
    ports:
      - "${BACKEND_HOST_PORT:-8000}:8000"
    env_file:
      - path: ${SHARED_ENV_FILE:-C:/Users/dream/.secrets/shared.env}
        required: false
      - path: .env
        required: false
    environment:
      <<: *shared-env
      CONFIG_PATH: /app/cybersecurity_config.yaml
      DATA_DIR: /data
      PYTHONPATH: /app/multi_llm_chatbot_backend
      # Keep a host-readable copy of shared.env for _load_shared_env_var fallback
      SHARED_ENV: /run/secrets/shared.env
    volumes:
      - ./multi_llm_chatbot_backend:/app/multi_llm_chatbot_backend
      - ./cybersecurity_config.yaml:/app/cybersecurity_config.yaml:ro
      - ./personas:/app/personas:ro
      - ./tracks:/app/tracks:ro
      - cybersecurity_data:/data
      - type: bind
        source: ${SHARED_ENV_FILE:-C:/Users/dream/.secrets/shared.env}
        target: /run/secrets/shared.env
        read_only: true
    command:
      [
        "uvicorn",
        "app.main:app",
        "--host",
        "0.0.0.0",
        "--port",
        "8000",
        "--reload",
        "--reload-dir",
        "/app/multi_llm_chatbot_backend/app",
      ]

  frontend:
    profiles: ["dev"]
    build:
      context: .
      dockerfile: Dockerfile.dev
      target: frontend
    image: cybersecurity-panel-frontend-dev-cursor-${COMPOSE_DATE:-local}
    container_name: cybersecurity-panel-frontend-dev-cursor-${COMPOSE_DATE:-local}
    ports:
      - "${FRONTEND_HOST_PORT:-3000}:3000"
    environment:
      REACT_APP_API_URL: ${REACT_APP_API_URL:-http://localhost:8000}
      CHOKIDAR_USEPOLLING: "true"
      WATCHPACK_POLLING: "true"
    volumes:
      - ./frontend:/app
      - frontend_node_modules:/app/node_modules
    depends_on:
      - backend
    command: ["npm", "start"]

volumes:
  cybersecurity_data:
  frontend_node_modules: