Files
glpi-neural-brain/deployment/docker-compose.full.yml
jbergner 94dbd4ccab
All checks were successful
release-tag / release-image (push) Successful in 2m32s
RC-4
2026-08-09 18:41:47 +02:00

257 lines
13 KiB
YAML

# Integrated example for sibling project folders:
# ./glpi-ai-agent
# ./glpi-ai-knowledgebase
# ./glpi-neural-brain
# Run from glpi-neural-brain:
# docker compose -f deployment/docker-compose.full.yml up -d --build
services:
agent-data-init:
build:
context: ${AGENT_PROJECT_PATH:-../../glpi-ai-agent}
target: data-init
restart: "no"
user: "0:0"
volumes:
- agent-data:/app/data
security_opt: [no-new-privileges:true]
cap_drop: [ALL]
cap_add: [CHOWN, FOWNER]
agent:
build: ${AGENT_PROJECT_PATH:-../../glpi-ai-agent}
restart: unless-stopped
env_file: ${AGENT_ENV_FILE:-../../glpi-ai-agent/.env}
environment:
DATA_DIR: /app/data
KNOWLEDGE_DIR: /app/knowledge
OLLAMA_URL: http://ollama:11434
OLLAMA_URLS: ${OLLAMA_URLS:-http://ollama:11434}
OLLAMA_NODE_NAMES: ${OLLAMA_NODE_NAMES:-local-gpu}
OLLAMA_NODE_WEIGHTS: ${OLLAMA_NODE_WEIGHTS:-1}
OLLAMA_ROUTING_MODE: ${OLLAMA_ROUTING_MODE:-least_inflight}
OLLAMA_NODE_MAX_INFLIGHT: ${OLLAMA_NODE_MAX_INFLIGHT:-1}
BRAIN_ACTIVITY_URL: http://brain:8090/api/events
BRAIN_ACTIVITY_API_KEY: ${BRAIN_API_KEY:-}
ports:
- "127.0.0.1:${AGENT_PORT:-8080}:8080"
volumes:
- agent-data:/app/data
- ${KNOWLEDGE_HOST_PATH:-../../glpi-ai-agent/knowledge}:/app/knowledge:ro
depends_on:
agent-data-init:
condition: service_completed_successfully
security_opt: [no-new-privileges:true]
cap_drop: [ALL]
read_only: true
tmpfs: [/tmp:size=64m,mode=1777]
kb-editor:
build: ${KB_PROJECT_PATH:-../../glpi-ai-knowledgebase}
image: kb-helpdesk:neural-stack
restart: unless-stopped
ports:
- "${KB_EDITOR_PORT:-8081}:8080"
environment:
APP_MODE: editor
APP_TITLE: KB Administration
APP_SUBTITLE: Wissen und AI-THINK prüfen
DATA_DIR: /data/knowledge
BACKUP_DIR: /data/backups
STAGING_DIR: /data/staging
LISTEN_ADDR: :8080
BASIC_AUTH_USER: ${EDITOR_AUTH_USER:-}
BASIC_AUTH_PASSWORD: ${EDITOR_AUTH_PASSWORD:-}
BRAIN_ACTIVITY_URL: http://brain:8090/api/events
BRAIN_ACTIVITY_API_KEY: ${BRAIN_API_KEY:-}
volumes:
- ${KNOWLEDGE_HOST_PATH:-../../glpi-ai-agent/knowledge}:/data/knowledge:rw
- ${KB_BACKUP_HOST_PATH:-../../glpi-ai-knowledgebase/backups}:/data/backups:rw
- ${KB_STAGING_HOST_PATH:-../../glpi-ai-knowledgebase/staging}:/data/staging:rw
read_only: true
tmpfs: [/tmp:size=32m]
security_opt: [no-new-privileges:true]
cap_drop: [ALL]
kb-search:
image: kb-helpdesk:neural-stack
depends_on: [kb-editor]
restart: unless-stopped
ports:
- "${KB_SEARCH_PORT:-8082}:8080"
environment:
APP_MODE: google
APP_TITLE: IT Helpdesk Wissen
APP_SUBTITLE: Interne Lösungsdatenbank
AUTO_RELOAD_INTERVAL: 60s
DATA_DIR: /data/knowledge
# Deliberately isolated: production search never sees Brain AI-THINK drafts.
STAGING_DIR: /tmp/empty-staging
LISTEN_ADDR: :8080
OLLAMA_BASE_URL: http://ollama:11434
AI_FALLBACK_ENABLED: ${AI_FALLBACK_ENABLED:-false}
OLLAMA_MODEL: ${OLLAMA_CHAT_MODEL:-qwen3:8b}
BRAIN_ACTIVITY_URL: http://brain:8090/api/events
BRAIN_ACTIVITY_API_KEY: ${BRAIN_API_KEY:-}
volumes:
- ${KNOWLEDGE_HOST_PATH:-../../glpi-ai-agent/knowledge}:/data/knowledge:ro
read_only: true
tmpfs: [/tmp:size=32m]
security_opt: [no-new-privileges:true]
cap_drop: [ALL]
brain:
build:
context: ..
restart: unless-stopped
ports:
- "${BRAIN_PORT:-8090}:8090"
environment:
BRAIN_MODE: brain
BRAIN_LISTEN_ADDR: :8090
BRAIN_PUBLIC_URL: ${BRAIN_PUBLIC_URL:-}
BRAIN_DATA_DIR: /app/data
BRAIN_KNOWLEDGE_DIRS: /sources/knowledge
BRAIN_STAGING_DIRS: /sources/staging
BRAIN_AGENT_RUNS_FILES: /sources/agent-data/runs.jsonl
BRAIN_API_KEY: ${BRAIN_API_KEY:-}
OLLAMA_URL: http://ollama:11434
OLLAMA_URLS: ${OLLAMA_URLS:-http://ollama:11434}
OLLAMA_NODE_NAMES: ${OLLAMA_NODE_NAMES:-local-gpu}
OLLAMA_NODE_WEIGHTS: ${OLLAMA_NODE_WEIGHTS:-1}
OLLAMA_ROUTING_MODE: ${OLLAMA_ROUTING_MODE:-least_inflight}
OLLAMA_NODE_MAX_INFLIGHT: ${OLLAMA_NODE_MAX_INFLIGHT:-1}
OLLAMA_NODE_HEALTH_INTERVAL: ${OLLAMA_NODE_HEALTH_INTERVAL:-15s}
OLLAMA_NODE_FAILURE_COOLDOWN: ${OLLAMA_NODE_FAILURE_COOLDOWN:-30s}
OLLAMA_NODE_REQUEST_TIMEOUT: ${OLLAMA_NODE_REQUEST_TIMEOUT:-8m}
OLLAMA_FAILOVER_ENABLED: ${OLLAMA_FAILOVER_ENABLED:-true}
OLLAMA_FAILOVER_ATTEMPTS: ${OLLAMA_FAILOVER_ATTEMPTS:-0}
OLLAMA_REQUIRE_SAME_MODEL_DIGEST: ${OLLAMA_REQUIRE_SAME_MODEL_DIGEST:-true}
OLLAMA_REQUIRE_EMBEDDING_MODEL: ${OLLAMA_REQUIRE_EMBEDDING_MODEL:-true}
OLLAMA_CHAT_MODEL: ${OLLAMA_CHAT_MODEL:-qwen3:8b}
OLLAMA_EMBEDDING_MODEL: ${OLLAMA_EMBEDDING_MODEL:-embeddinggemma}
BRAIN_AUTO_ENRICH: ${BRAIN_AUTO_ENRICH:-true}
BRAIN_SCAN_INTERVAL: ${BRAIN_SCAN_INTERVAL:-5m}
BRAIN_KNOWLEDGE_FULL_VERIFY_INTERVAL: ${BRAIN_KNOWLEDGE_FULL_VERIFY_INTERVAL:-6h}
BRAIN_PERSIST_INTERVAL: ${BRAIN_PERSIST_INTERVAL:-5m}
BRAIN_LEARNING_ENABLED: ${BRAIN_LEARNING_ENABLED:-true}
BRAIN_THINKING_ENABLED: ${BRAIN_THINKING_ENABLED:-true}
BRAIN_LEARNING_SOURCES: ${BRAIN_LEARNING_SOURCES:-}
BRAIN_DISPLAY_SOURCES: ${BRAIN_DISPLAY_SOURCES:-}
BRAIN_THINKING_SOURCES: ${BRAIN_THINKING_SOURCES:-}
BRAIN_DEFAULT_VIEW: ${BRAIN_DEFAULT_VIEW:-neural}
BRAIN_MAX_DISPLAY_NODES: ${BRAIN_MAX_DISPLAY_NODES:-0}
BRAIN_LOW_POWER_MODE: ${BRAIN_LOW_POWER_MODE:-false}
BRAIN_SPEED_MODE: ${BRAIN_SPEED_MODE:-false}
BRAIN_SPEED_CPU_TASKS: ${BRAIN_SPEED_CPU_TASKS:-}
BRAIN_SPEED_GPU_TASKS: ${BRAIN_SPEED_GPU_TASKS:-4}
BRAIN_ENRICH_INTERVAL: ${BRAIN_ENRICH_INTERVAL:-90s}
BRAIN_ENRICH_BATCH_SIZE: ${BRAIN_ENRICH_BATCH_SIZE:-3}
BRAIN_ENRICH_STEP_DELAY: ${BRAIN_ENRICH_STEP_DELAY:-3s}
BRAIN_ENRICH_ANCHORS: ${BRAIN_ENRICH_ANCHORS:-48}
BRAIN_SIMILARITY_THRESHOLD: ${BRAIN_SIMILARITY_THRESHOLD:-0.68}
BRAIN_RELATION_THRESHOLD: ${BRAIN_RELATION_THRESHOLD:-0.72}
BRAIN_VECTOR_GRAPH_ENABLED: ${BRAIN_VECTOR_GRAPH_ENABLED:-false}
BRAIN_VECTOR_GRAPH_NEIGHBORS: ${BRAIN_VECTOR_GRAPH_NEIGHBORS:-4}
BRAIN_VECTOR_GRAPH_CANDIDATES: ${BRAIN_VECTOR_GRAPH_CANDIDATES:-96}
BRAIN_VECTOR_GRAPH_MIN_SIMILARITY: ${BRAIN_VECTOR_GRAPH_MIN_SIMILARITY:-0.80}
BRAIN_VECTOR_GRAPH_MIN_AFFINITY: ${BRAIN_VECTOR_GRAPH_MIN_AFFINITY:-0.35}
BRAIN_VECTOR_GRAPH_ORPHAN_PASS: ${BRAIN_VECTOR_GRAPH_ORPHAN_PASS:-false}
BRAIN_VECTOR_GRAPH_ORPHAN_NEIGHBORS: ${BRAIN_VECTOR_GRAPH_ORPHAN_NEIGHBORS:-2}
BRAIN_VECTOR_GRAPH_ORPHAN_CANDIDATES: ${BRAIN_VECTOR_GRAPH_ORPHAN_CANDIDATES:-256}
BRAIN_VECTOR_GRAPH_ORPHAN_MIN_SIMILARITY: ${BRAIN_VECTOR_GRAPH_ORPHAN_MIN_SIMILARITY:-0.80}
BRAIN_VECTOR_GRAPH_ORPHAN_MIN_AFFINITY: ${BRAIN_VECTOR_GRAPH_ORPHAN_MIN_AFFINITY:-0.30}
BRAIN_VECTOR_GRAPH_AGENT_OFFLOAD: ${BRAIN_VECTOR_GRAPH_AGENT_OFFLOAD:-false}
BRAIN_VECTOR_GRAPH_AGENT_REQUIRED: ${BRAIN_VECTOR_GRAPH_AGENT_REQUIRED:-false}
BRAIN_VECTOR_GRAPH_AGENT_WAIT: ${BRAIN_VECTOR_GRAPH_AGENT_WAIT:-2m}
BRAIN_THINKING_VECTOR_GUIDED: ${BRAIN_THINKING_VECTOR_GUIDED:-true}
BRAIN_VECTOR_GRAPH_LAYOUT: ${BRAIN_VECTOR_GRAPH_LAYOUT:-false}
BRAIN_VECTOR_GRAPH_REEVALUATE_INTERVAL: ${BRAIN_VECTOR_GRAPH_REEVALUATE_INTERVAL:-30m}
BRAIN_VECTOR_GRAPH_RELAX_LAYOUT: ${BRAIN_VECTOR_GRAPH_RELAX_LAYOUT:-true}
BRAIN_VECTOR_GRAPH_LAYOUT_RELAX_INTERVAL: ${BRAIN_VECTOR_GRAPH_LAYOUT_RELAX_INTERVAL:-2h}
BRAIN_VECTOR_GRAPH_LAYOUT_BLEND: ${BRAIN_VECTOR_GRAPH_LAYOUT_BLEND:-0.08}
BRAIN_VECTOR_GRAPH_LAYOUT_MAX_SHIFT: ${BRAIN_VECTOR_GRAPH_LAYOUT_MAX_SHIFT:-0.035}
BRAIN_ARTICLE_SYNTHESIS_ENABLED: ${BRAIN_ARTICLE_SYNTHESIS_ENABLED:-true}
BRAIN_ARTICLE_LANGUAGE: ${BRAIN_ARTICLE_LANGUAGE:-de-DE}
BRAIN_ARTICLE_SYNTHESIS_MODEL: ${BRAIN_ARTICLE_SYNTHESIS_MODEL:-qwen3:8b}
BRAIN_ARTICLE_REVIEW_MODEL: ${BRAIN_ARTICLE_REVIEW_MODEL:-qwen3:8b}
BRAIN_ARTICLE_REVIEW_REPAIR_ROUNDS: ${BRAIN_ARTICLE_REVIEW_REPAIR_ROUNDS:-1}
BRAIN_ARTICLE_MIN_SOURCES: ${BRAIN_ARTICLE_MIN_SOURCES:-3}
BRAIN_ARTICLE_MAX_SOURCES: ${BRAIN_ARTICLE_MAX_SOURCES:-8}
BRAIN_ARTICLE_MIN_PRODUCTION_RATIO: ${BRAIN_ARTICLE_MIN_PRODUCTION_RATIO:-0.70}
BRAIN_ARTICLE_MAX_GENERATION_DEPTH: ${BRAIN_ARTICLE_MAX_GENERATION_DEPTH:-2}
BRAIN_ARTICLE_MIN_CONFIDENCE: ${BRAIN_ARTICLE_MIN_CONFIDENCE:-0.74}
BRAIN_ARTICLE_MIN_TEXT_CHARS: ${BRAIN_ARTICLE_MIN_TEXT_CHARS:-180}
BRAIN_ARTICLE_MIN_ANSWER_CHARS: ${BRAIN_ARTICLE_MIN_ANSWER_CHARS:-420}
BRAIN_ARTICLE_CPU_QUALITY_ENABLED: ${BRAIN_ARTICLE_CPU_QUALITY_ENABLED:-true}
BRAIN_ARTICLE_CPU_QUALITY_AGENT_OFFLOAD: ${BRAIN_ARTICLE_CPU_QUALITY_AGENT_OFFLOAD:-false}
BRAIN_ARTICLE_CPU_QUALITY_AGENT_REQUIRED: ${BRAIN_ARTICLE_CPU_QUALITY_AGENT_REQUIRED:-false}
BRAIN_ARTICLE_CPU_QUALITY_AGENT_WAIT: ${BRAIN_ARTICLE_CPU_QUALITY_AGENT_WAIT:-20s}
BRAIN_ARTICLE_MAX_RESEARCH_QUERIES: ${BRAIN_ARTICLE_MAX_RESEARCH_QUERIES:-6}
BRAIN_ARTICLE_RESEARCH_RESULTS: ${BRAIN_ARTICLE_RESEARCH_RESULTS:-12}
BRAIN_ARTICLE_RESEARCH_ROUNDS: ${BRAIN_ARTICLE_RESEARCH_ROUNDS:-3}
BRAIN_ARTICLE_RESEARCH_FETCH_RESULTS: ${BRAIN_ARTICLE_RESEARCH_FETCH_RESULTS:-6}
BRAIN_ARTICLE_RESEARCH_EXPLORATION_RESULTS: ${BRAIN_ARTICLE_RESEARCH_EXPLORATION_RESULTS:-3}
BRAIN_ARTICLE_RESEARCH_PREFETCH_MIN_RELEVANCE: ${BRAIN_ARTICLE_RESEARCH_PREFETCH_MIN_RELEVANCE:-0.25}
BRAIN_ARTICLE_RESEARCH_MIN_RELEVANCE: ${BRAIN_ARTICLE_RESEARCH_MIN_RELEVANCE:-0.55}
BRAIN_ARTICLE_RESEARCH_MIN_QUALITY: ${BRAIN_ARTICLE_RESEARCH_MIN_QUALITY:-0.35}
BRAIN_ARTICLE_RESEARCH_PAGE_MAX_BYTES: ${BRAIN_ARTICLE_RESEARCH_PAGE_MAX_BYTES:-2097152}
BRAIN_ARTICLE_RESEARCH_PAGE_MAX_CHARS: ${BRAIN_ARTICLE_RESEARCH_PAGE_MAX_CHARS:-14000}
BRAIN_ARTICLE_RESEARCH_FETCH_TIMEOUT: ${BRAIN_ARTICLE_RESEARCH_FETCH_TIMEOUT:-20s}
BRAIN_ARTICLE_RESEARCH_ALLOW_PRIVATE: ${BRAIN_ARTICLE_RESEARCH_ALLOW_PRIVATE:-false}
BRAIN_RESEARCH_OLLAMA_MAX_INFLIGHT: ${BRAIN_RESEARCH_OLLAMA_MAX_INFLIGHT:-2}
BRAIN_RESEARCH_OLLAMA_QUEUE_SIZE: ${BRAIN_RESEARCH_OLLAMA_QUEUE_SIZE:-64}
BRAIN_RESEARCH_DEDUPE_THRESHOLD: ${BRAIN_RESEARCH_DEDUPE_THRESHOLD:-0.92}
BRAIN_RESEARCH_DEDUPE_TTL: ${BRAIN_RESEARCH_DEDUPE_TTL:-45m}
BRAIN_TOP_K: ${BRAIN_TOP_K:-8}
BRAIN_MAX_CONTEXT_CHARS: ${BRAIN_MAX_CONTEXT_CHARS:-16000}
BRAIN_RESEARCH_ENABLED: ${BRAIN_RESEARCH_ENABLED:-false}
BRAIN_AUTONOMOUS_RESEARCH_ENABLED: ${BRAIN_AUTONOMOUS_RESEARCH_ENABLED:-false}
BRAIN_AUTONOMOUS_RESEARCH_IDLE_ONLY: ${BRAIN_AUTONOMOUS_RESEARCH_IDLE_ONLY:-true}
BRAIN_AUTONOMOUS_RESEARCH_INTERVAL: ${BRAIN_AUTONOMOUS_RESEARCH_INTERVAL:-30m}
BRAIN_AUTONOMOUS_RESEARCH_TASKS_PER_CYCLE: ${BRAIN_AUTONOMOUS_RESEARCH_TASKS_PER_CYCLE:-1}
BRAIN_AUTONOMOUS_RESEARCH_MAX_TASKS_PER_DAY: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_TASKS_PER_DAY:-12}
BRAIN_AUTONOMOUS_RESEARCH_MAX_QUERIES_PER_TASK: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_QUERIES_PER_TASK:-6}
BRAIN_AUTONOMOUS_RESEARCH_MAX_PAGES_PER_TASK: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_PAGES_PER_TASK:-8}
BRAIN_AUTONOMOUS_RESEARCH_MAX_ROUNDS: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_ROUNDS:-3}
BRAIN_AUTONOMOUS_RESEARCH_MIN_PRIORITY: ${BRAIN_AUTONOMOUS_RESEARCH_MIN_PRIORITY:-0.65}
BRAIN_AUTONOMOUS_RESEARCH_COOLDOWN: ${BRAIN_AUTONOMOUS_RESEARCH_COOLDOWN:-168h}
BRAIN_AUTONOMOUS_RESEARCH_LEASE: ${BRAIN_AUTONOMOUS_RESEARCH_LEASE:-45m}
BRAIN_AUTONOMOUS_RESEARCH_MAX_ATTEMPTS: ${BRAIN_AUTONOMOUS_RESEARCH_MAX_ATTEMPTS:-3}
BRAIN_AUTONOMOUS_RESEARCH_QUERY_TRIGGERS: ${BRAIN_AUTONOMOUS_RESEARCH_QUERY_TRIGGERS:-true}
BRAIN_AUTONOMOUS_RESEARCH_OPPORTUNITY_LIMIT: ${BRAIN_AUTONOMOUS_RESEARCH_OPPORTUNITY_LIMIT:-8}
# In Docker, localhost points to this Brain container. Use the SearXNG
# service name (for example http://searxng:8080) or host.docker.internal.
SEARXNG_URL: ${SEARXNG_URL:-}
GLPI_KB_ENABLED: ${GLPI_KB_ENABLED:-false}
GLPI_URL: ${GLPI_URL:-}
GLPI_API_VERSION: ${GLPI_API_VERSION:-v2.3}
GLPI_CLIENT_ID: ${GLPI_CLIENT_ID:-}
GLPI_CLIENT_SECRET: ${GLPI_CLIENT_SECRET:-}
GLPI_USERNAME: ${GLPI_USERNAME:-}
GLPI_PASSWORD: ${GLPI_PASSWORD:-}
GLPI_ALLOW_INSECURE_HTTP: ${GLPI_ALLOW_INSECURE_HTTP:-false}
GLPI_TIMEOUT: ${GLPI_TIMEOUT:-20s}
GLPI_KB_PATH: ${GLPI_KB_PATH:-auto}
GLPI_KB_FILTER: ${GLPI_KB_FILTER:-}
GLPI_KB_LIMIT: ${GLPI_KB_LIMIT:-500}
GLPI_KB_SYNC_INTERVAL: ${GLPI_KB_SYNC_INTERVAL:-10m}
GLPI_KB_SOURCE: ${GLPI_KB_SOURCE:-GLPI Knowledge Base}
volumes:
- brain-data:/app/data
- ${KNOWLEDGE_HOST_PATH:-../../glpi-ai-agent/knowledge}:/sources/knowledge:ro
- ${KB_STAGING_HOST_PATH:-../../glpi-ai-knowledgebase/staging}:/sources/staging:rw
- agent-data:/sources/agent-data:ro
extra_hosts:
- "host.docker.internal:host-gateway"
ollama:
image: ollama/ollama:latest
restart: unless-stopped
volumes:
- ollama-data:/root/.ollama
volumes:
agent-data:
brain-data:
ollama-data: