# --------------------------------------------------------------------------- # 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: -- # --------------------------------------------------------------------------- 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: