# Production compose: registry-only. No local source build is permitted here. # Use docker-compose.dev.yml as an override for local source builds. name: glpi-neuroforge-mega services: ollama: image: ollama/ollama:latest restart: unless-stopped volumes: - ollama-data:/root/.ollama ports: - 127.0.0.1:${OLLAMA_HOST_PORT:-11434}:11434 security_opt: - no-new-privileges:true searxng: image: ${SEARXNG_IMAGE:-docker.io/searxng/searxng:latest} profiles: - research restart: unless-stopped environment: SEARXNG_SECRET: ${SEARXNG_SECRET} SEARXNG_BASE_URL: http://searxng:8080/ FORCE_OWNERSHIP: 'false' volumes: - ./deploy/searxng/settings.yml:/etc/searxng/settings.yml:ro - searxng-cache:/var/cache/searxng ports: - 127.0.0.1:${SEARXNG_HOST_PORT:-8888}:8080 read_only: true tmpfs: - /tmp:size=64m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL neuroforge: image: git.send.nrw/sendnrw/glpi-neuroforge-mega-neuroforge:${IMAGE_TAG:?Set IMAGE_TAG to an immutable release tag, for example 1.5.9} command: - -data - /app/data - -listen - :8080 restart: unless-stopped environment: NEUROFORGE_ADMIN_TOKEN: ${NEUROFORGE_ADMIN_TOKEN:?Set a unique NeuroForge admin token} NEUROFORGE_APP_API_KEY: ${NEUROFORGE_APP_API_KEY:?Set a unique NeuroForge app API key} NEUROFORGE_INTEGRATION_TOKEN: ${NEUROFORGE_INTEGRATION_TOKEN:?Set a unique NeuroForge integration token} NEUROFORGE_CONTROL_READ_TOKEN: ${NEUROFORGE_CONTROL_READ_TOKEN:?Set a unique NeuroForge control read token} NEUROFORGE_WORKER_TOKEN: ${NEUROFORGE_WORKER_TOKEN:?Set a unique NeuroForge worker token} NEUROFORGE_METRICS_TOKEN: ${NEUROFORGE_METRICS_TOKEN:?Set a unique NeuroForge metrics token} NEUROFORGE_CLUSTER_TOKEN: ${NEUROFORGE_CLUSTER_TOKEN:-} OPENAI_API_KEY: ${OPENAI_API_KEY:-} NEUROFORGE_OLLAMA_URL: ${OLLAMA_BASE_URL:-http://ollama:11434} NEUROFORGE_OLLAMA_CHAT_MODEL: ${OLLAMA_MODEL:-gemma3} NEUROFORGE_OLLAMA_EMBEDDING_MODEL: ${OLLAMA_EMBEDDING_MODEL:-embeddinggemma} NEUROFORGE_OLLAMA_NUM_CTX: ${NEUROFORGE_OLLAMA_NUM_CTX:-8192} NEUROFORGE_OLLAMA_NUM_PREDICT: ${NEUROFORGE_OLLAMA_NUM_PREDICT:-0} NEUROFORGE_READINESS_OLLAMA_LIVE: ${NEUROFORGE_READINESS_OLLAMA_LIVE:-true} NEUROFORGE_CONTROLLED_LEARNING: ${NEUROFORGE_CONTROLLED_LEARNING:-true} NEUROFORGE_GOAL_LEARNING_ENABLED: ${NEUROFORGE_GOAL_LEARNING_ENABLED:-false} NEUROFORGE_RESEARCH_ENABLED: ${NEUROFORGE_RESEARCH_ENABLED:-false} NEUROFORGE_SEARXNG_ENABLED: ${NEUROFORGE_SEARXNG_ENABLED:-false} NEUROFORGE_SEARXNG_URL: ${NEUROFORGE_SEARXNG_URL:-http://searxng:8080} NEUROFORGE_RESEARCH_GOAL_ENABLED: ${NEUROFORGE_RESEARCH_GOAL_ENABLED:-true} NEUROFORGE_AUTONOMY_ENABLED: ${NEUROFORGE_AUTONOMY_ENABLED:-false} NEUROFORGE_AUTONOMY_INTERVAL_MINUTES: ${NEUROFORGE_AUTONOMY_INTERVAL_MINUTES:-30} NEUROFORGE_RESEARCH_MAX_QUERIES: ${NEUROFORGE_RESEARCH_MAX_QUERIES:-2} NEUROFORGE_RESEARCH_MAX_PAGES: ${NEUROFORGE_RESEARCH_MAX_PAGES:-4} NEUROFORGE_KB_STAGING_ENABLED: ${NEUROFORGE_KB_STAGING_ENABLED:-true} NEUROFORGE_KB_STAGING_URL: http://knowledge:8080/api/integrations/staging NEUROFORGE_KB_STAGING_TOKEN: ${KB_INTEGRATION_TOKEN:?Set the Knowledge integration token} NEUROFORGE_KB_STAGING_MIN_EVIDENCE: ${NEUROFORGE_KB_STAGING_MIN_EVIDENCE:-4} NEUROFORGE_KB_STAGING_MIN_SOURCES: ${NEUROFORGE_KB_STAGING_MIN_SOURCES:-2} NEUROFORGE_KB_STAGING_MIN_CORROBORATIONS: ${NEUROFORGE_KB_STAGING_MIN_CORROBORATIONS:-0} NEUROFORGE_KB_STAGING_MAX_EVIDENCE: ${NEUROFORGE_KB_STAGING_MAX_EVIDENCE:-12} NEUROFORGE_KB_STAGING_SYNTHESIS_MODE: ${NEUROFORGE_KB_STAGING_SYNTHESIS_MODE:-llm} NEUROFORGE_KB_STAGING_REQUIRE_AUTHORITATIVE_SOURCE: ${NEUROFORGE_KB_STAGING_REQUIRE_AUTHORITATIVE_SOURCE:-true} NEUROFORGE_KB_STAGING_MIN_AUTHORITATIVE_SOURCES: ${NEUROFORGE_KB_STAGING_MIN_AUTHORITATIVE_SOURCES:-1} NEUROFORGE_KB_STAGING_AUTHORITATIVE_DOMAINS: ${NEUROFORGE_KB_STAGING_AUTHORITATIVE_DOMAINS:-} NEUROFORGE_KB_STAGING_VERIFY_CLAIMS: ${NEUROFORGE_KB_STAGING_VERIFY_CLAIMS:-true} NEUROFORGE_KB_STAGING_MIN_CLAIM_COVERAGE: ${NEUROFORGE_KB_STAGING_MIN_CLAIM_COVERAGE:-1.0} NEUROFORGE_KB_STAGING_REQUIRE_AUTHORITATIVE_ACTIONS: ${NEUROFORGE_KB_STAGING_REQUIRE_AUTHORITATIVE_ACTIONS:-true} NEUROFORGE_KB_STAGING_MAX_VERIFICATION_STATEMENTS: ${NEUROFORGE_KB_STAGING_MAX_VERIFICATION_STATEMENTS:-32} NEUROFORGE_KB_STAGING_VERIFICATION_REPAIR: ${NEUROFORGE_KB_STAGING_VERIFICATION_REPAIR:-true} NEUROFORGE_KB_STAGING_SYNTHESIS_MAX_TOKENS: ${NEUROFORGE_KB_STAGING_SYNTHESIS_MAX_TOKENS:-2600} NEUROFORGE_KB_STAGING_EVIDENCE_PROMPT_MAX_CHARS: ${NEUROFORGE_KB_STAGING_EVIDENCE_PROMPT_MAX_CHARS:-14000} NEUROFORGE_KB_STAGING_MIN_ARTICLE_CHARS: ${NEUROFORGE_KB_STAGING_MIN_ARTICLE_CHARS:-3500} NEUROFORGE_KB_STAGING_TARGET_ARTICLE_CHARS: ${NEUROFORGE_KB_STAGING_TARGET_ARTICLE_CHARS:-6500} NEUROFORGE_KB_STAGING_MAX_ARTICLE_CHARS: ${NEUROFORGE_KB_STAGING_MAX_ARTICLE_CHARS:-10000} NEUROFORGE_KB_STAGING_MIN_ANSWER_CHARS: ${NEUROFORGE_KB_STAGING_MIN_ANSWER_CHARS:-160} NEUROFORGE_KB_STAGING_MAX_ANSWER_CHARS: ${NEUROFORGE_KB_STAGING_MAX_ANSWER_CHARS:-1200} ports: - 127.0.0.1:${NEUROFORGE_HOST_PORT:-8090}:8080 volumes: - neuroforge-data:/app/data depends_on: ollama: condition: service_started read_only: true tmpfs: - /tmp:size=64m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL healthcheck: test: - CMD - wget - -q - -O - '-' - http://127.0.0.1:8080/readyz interval: 15s timeout: 3s retries: 8 start_period: 15s stop_grace_period: 35s neuroforge-worker: image: git.send.nrw/sendnrw/glpi-neuroforge-mega-neuroforge-worker:${IMAGE_TAG:?Set IMAGE_TAG to an immutable release tag, for example 1.5.9} command: - -server - http://neuroforge:8080 - -id - mega-worker-1 restart: unless-stopped environment: NEUROFORGE_WORKER_TOKEN: ${NEUROFORGE_WORKER_TOKEN:?Set a unique NeuroForge worker token} depends_on: neuroforge: condition: service_healthy read_only: true tmpfs: - /tmp:size=32m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL agent-data-init: image: git.send.nrw/sendnrw/glpi-neuroforge-mega-agent-data-init:${IMAGE_TAG:?Set IMAGE_TAG to an immutable release tag, for example 1.5.9} restart: 'no' user: 0:0 volumes: - agent-data:/app/data security_opt: - no-new-privileges:true cap_drop: - ALL cap_add: - CHOWN - FOWNER agent: image: git.send.nrw/sendnrw/glpi-neuroforge-mega-agent:${IMAGE_TAG:?Set IMAGE_TAG to an immutable release tag, for example 1.5.9} restart: unless-stopped environment: AI_CONTENT_LABEL_ENABLED: ${AI_CONTENT_LABEL_ENABLED:-} AUTO_CATEGORY: ${AUTO_CATEGORY:-} AUTO_ESCALATION: ${AUTO_ESCALATION:-} AUTO_PRIORITY: ${AUTO_PRIORITY:-} AUTO_REPLY: ${AUTO_REPLY:-} BRAIN_ACTIVITY_API_KEY: ${NEUROFORGE_INTEGRATION_TOKEN:?Set the NeuroForge integration token} BRAIN_ACTIVITY_URL: http://neuroforge:8080/api/v1/integrations/events CATEGORY_CONFIDENCE: ${CATEGORY_CONFIDENCE:-} CATEGORY_PROMPT_LIMIT: ${CATEGORY_PROMPT_LIMIT:-} CHANGE_CALENDAR_ENABLED: ${CHANGE_CALENDAR_ENABLED:-} CHANGE_LOOKAHEAD: ${CHANGE_LOOKAHEAD:-} CHANGE_LOOKBACK: ${CHANGE_LOOKBACK:-} COMMUNICATION_CLOSING: ${COMMUNICATION_CLOSING:-} COMMUNICATION_LANGUAGE: ${COMMUNICATION_LANGUAGE:-} COMMUNICATION_SALUTATION: ${COMMUNICATION_SALUTATION:-} COMMUNICATION_SIGNATURE: ${COMMUNICATION_SIGNATURE:-} COMMUNICATION_STYLE: ${COMMUNICATION_STYLE:-} CONTEXT_BLOCK_AUTO_REPLY_ON_ERRORS: ${CONTEXT_BLOCK_AUTO_REPLY_ON_ERRORS:-} CONTEXT_BLOCK_AUTO_REPLY_ON_INCIDENT: ${CONTEXT_BLOCK_AUTO_REPLY_ON_INCIDENT:-} CONTEXT_ENABLED: ${CONTEXT_ENABLED:-} CONTEXT_INCIDENT_REPLY_TEXT: ${CONTEXT_INCIDENT_REPLY_TEXT:-} CONTEXT_MAINTENANCE_REPLY_TEXT: ${CONTEXT_MAINTENANCE_REPLY_TEXT:-} CONTEXT_RELEVANCE_MIN_SCORE: ${CONTEXT_RELEVANCE_MIN_SCORE:-} CONTEXT_STATUS_REPLY_ENABLED: ${CONTEXT_STATUS_REPLY_ENABLED:-} CONTEXT_STATUS_REPLY_MIN_AI_CONFIDENCE: ${CONTEXT_STATUS_REPLY_MIN_AI_CONFIDENCE:-} CONTEXT_STATUS_REPLY_MIN_FINAL_SCORE: ${CONTEXT_STATUS_REPLY_MIN_FINAL_SCORE:-} CONTEXT_STATUS_REPLY_MIN_RELEVANCE: ${CONTEXT_STATUS_REPLY_MIN_RELEVANCE:-} CONTEXT_TIMEOUT: ${CONTEXT_TIMEOUT:-} CONTROL_READ_TOKEN: ${CONTROL_READ_TOKEN:?Set the Agent control read token} DATA_DIR: /app/data DRY_RUN: ${DRY_RUN:-} ESCALATION_ADD_PRIVATE_FOLLOWUP: ${ESCALATION_ADD_PRIVATE_FOLLOWUP:-} ESCALATION_ALLOWED_ACTIONS: ${ESCALATION_ALLOWED_ACTIONS:-} ESCALATION_ALLOWED_REASON_CODES: ${ESCALATION_ALLOWED_REASON_CODES:-} ESCALATION_ANALYSIS_TIMEOUT: ${ESCALATION_ANALYSIS_TIMEOUT:-} ESCALATION_CONFIDENCE: ${ESCALATION_CONFIDENCE:-} ESCALATION_ENABLED: ${ESCALATION_ENABLED:-} ESCALATION_MAJOR_INCIDENT_MIN_RELEVANCE: ${ESCALATION_MAJOR_INCIDENT_MIN_RELEVANCE:-} ESCALATION_MAJOR_INCIDENT_NOTE: ${ESCALATION_MAJOR_INCIDENT_NOTE:-} ESCALATION_MANAGER_REVIEW_GROUP_ID: ${ESCALATION_MANAGER_REVIEW_GROUP_ID:-} ESCALATION_MANAGER_REVIEW_MIN_LEVEL: ${ESCALATION_MANAGER_REVIEW_MIN_LEVEL:-} ESCALATION_MANAGER_REVIEW_NOTE: ${ESCALATION_MANAGER_REVIEW_NOTE:-} ESCALATION_MANAGER_REVIEW_USER_ID: ${ESCALATION_MANAGER_REVIEW_USER_ID:-} ESCALATION_MAX_LEVEL: ${ESCALATION_MAX_LEVEL:-} ESCALATION_MIN_AGE: ${ESCALATION_MIN_AGE:-} ESCALATION_MIN_INACTIVITY: ${ESCALATION_MIN_INACTIVITY:-} ESCALATION_SCAN_INTERVAL: ${ESCALATION_SCAN_INTERVAL:-} ESCALATION_SECOND_LEVEL_GROUP_ID: ${ESCALATION_SECOND_LEVEL_GROUP_ID:-} ESCALATION_SECOND_LEVEL_NOTE: ${ESCALATION_SECOND_LEVEL_NOTE:-} ESCALATION_SECURITY_GROUP_ID: ${ESCALATION_SECURITY_GROUP_ID:-} ESCALATION_SECURITY_NOTE: ${ESCALATION_SECURITY_NOTE:-} ESCALATION_SERVICE_OWNER_GROUP_ID: ${ESCALATION_SERVICE_OWNER_GROUP_ID:-} ESCALATION_SERVICE_OWNER_MIN_LEVEL: ${ESCALATION_SERVICE_OWNER_MIN_LEVEL:-} ESCALATION_SERVICE_OWNER_NOTE: ${ESCALATION_SERVICE_OWNER_NOTE:-} ESCALATION_SERVICE_OWNER_USER_ID: ${ESCALATION_SERVICE_OWNER_USER_ID:-} ESCALATION_SLA_RISK_WINDOW: ${ESCALATION_SLA_RISK_WINDOW:-} ESCALATION_WEBHOOK_ALLOW_INSECURE_HTTP: ${ESCALATION_WEBHOOK_ALLOW_INSECURE_HTTP:-} ESCALATION_WEBHOOK_BEARER_TOKEN: ${ESCALATION_WEBHOOK_BEARER_TOKEN:-} ESCALATION_WEBHOOK_TIMEOUT: ${ESCALATION_WEBHOOK_TIMEOUT:-} ESCALATION_WEBHOOK_URL: ${ESCALATION_WEBHOOK_URL:-} GLPI_AGENT_USER_ID: ${GLPI_AGENT_USER_ID:-} GLPI_ALLOWED_STATUS_IDS: ${GLPI_ALLOWED_STATUS_IDS:-} GLPI_ALLOW_INSECURE_HTTP: ${GLPI_ALLOW_INSECURE_HTTP:-} GLPI_API_VERSION: ${GLPI_API_VERSION:-} GLPI_CHANGE_FILTER: ${GLPI_CHANGE_FILTER:-} GLPI_CHANGE_LIMIT: ${GLPI_CHANGE_LIMIT:-} GLPI_CHANGE_PATH: ${GLPI_CHANGE_PATH:-} GLPI_CLIENT_ID: ${GLPI_CLIENT_ID:-} GLPI_CLIENT_SECRET: ${GLPI_CLIENT_SECRET:-} GLPI_ESCALATION_FILTER: ${GLPI_ESCALATION_FILTER:-} GLPI_ESCALATION_GROUP_PATCH_FIELD: ${GLPI_ESCALATION_GROUP_PATCH_FIELD:-} GLPI_ESCALATION_ITIL_LINK_BODY: ${GLPI_ESCALATION_ITIL_LINK_BODY:-} GLPI_ESCALATION_ITIL_LINK_PATH: ${GLPI_ESCALATION_ITIL_LINK_PATH:-} GLPI_ESCALATION_LIMIT: ${GLPI_ESCALATION_LIMIT:-} GLPI_ESCALATION_USER_PATCH_FIELD: ${GLPI_ESCALATION_USER_PATCH_FIELD:-} GLPI_KB_AUTO_REPLY: ${GLPI_KB_AUTO_REPLY:-} GLPI_KB_AUTO_REPLY_ALLOW_UNCATEGORIZED: ${GLPI_KB_AUTO_REPLY_ALLOW_UNCATEGORIZED:-} GLPI_KB_AUTO_REPLY_CATEGORY_IDS: ${GLPI_KB_AUTO_REPLY_CATEGORY_IDS:-} GLPI_KB_AUTO_REPLY_ITIL_CATEGORY_IDS: ${GLPI_KB_AUTO_REPLY_ITIL_CATEGORY_IDS:-} GLPI_KB_AUTO_REPLY_UNCATEGORIZED_ARTICLE_IDS: ${GLPI_KB_AUTO_REPLY_UNCATEGORIZED_ARTICLE_IDS:-} GLPI_KB_ENABLED: ${GLPI_KB_ENABLED:-} GLPI_KB_FILTER: ${GLPI_KB_FILTER:-} GLPI_KB_LIMIT: ${GLPI_KB_LIMIT:-} GLPI_KB_PATH: ${GLPI_KB_PATH:-} GLPI_KB_SOURCE: ${GLPI_KB_SOURCE:-} GLPI_KB_SYNC_INTERVAL: ${GLPI_KB_SYNC_INTERVAL:-} GLPI_MAJOR_INCIDENT_FILTER: ${GLPI_MAJOR_INCIDENT_FILTER:-} GLPI_MAJOR_INCIDENT_LIMIT: ${GLPI_MAJOR_INCIDENT_LIMIT:-} GLPI_PASSWORD: ${GLPI_PASSWORD:-} GLPI_POLL_INTERVAL: ${GLPI_POLL_INTERVAL:-} GLPI_POLL_LIMIT: ${GLPI_POLL_LIMIT:-} GLPI_TICKET_FILTER: ${GLPI_TICKET_FILTER:-} GLPI_TIMEOUT: ${GLPI_TIMEOUT:-} GLPI_URL: ${GLPI_URL:-} GLPI_USERNAME: ${GLPI_USERNAME:-} GLPI_USER_DEVICE_FILTER_TEMPLATE: ${GLPI_USER_DEVICE_FILTER_TEMPLATE:-} GLPI_USER_DEVICE_LIMIT: ${GLPI_USER_DEVICE_LIMIT:-} GLPI_USER_DEVICE_PATHS: ${GLPI_USER_DEVICE_PATHS:-} HTTP_ADDR: :8080 KNOWLEDGE_ALLOWED_SOURCES: ${KNOWLEDGE_ALLOWED_SOURCES:-} KNOWLEDGE_AUDIT_TOP_K: ${KNOWLEDGE_AUDIT_TOP_K:-} KNOWLEDGE_AUTO_REPLY_SOURCES: ${KNOWLEDGE_AUTO_REPLY_SOURCES:-} KNOWLEDGE_CANDIDATE_MAX_GAP: ${KNOWLEDGE_CANDIDATE_MAX_GAP:-} KNOWLEDGE_CATEGORY_MAP_FILE: ${KNOWLEDGE_CATEGORY_MAP_FILE:-} KNOWLEDGE_CATEGORY_MODE: ${KNOWLEDGE_CATEGORY_MODE:-} KNOWLEDGE_CATEGORY_SOURCES: ${KNOWLEDGE_CATEGORY_SOURCES:-} KNOWLEDGE_CHUNK_OVERLAP_WORDS: ${KNOWLEDGE_CHUNK_OVERLAP_WORDS:-} KNOWLEDGE_CHUNK_WORDS: ${KNOWLEDGE_CHUNK_WORDS:-} KNOWLEDGE_DIR: /app/knowledge KNOWLEDGE_EMBEDDING_PROFILE: ${KNOWLEDGE_EMBEDDING_PROFILE:-} KNOWLEDGE_EMBED_BATCH_SIZE: ${KNOWLEDGE_EMBED_BATCH_SIZE:-} KNOWLEDGE_EVIDENCE_WEIGHT_AI: ${KNOWLEDGE_EVIDENCE_WEIGHT_AI:-} KNOWLEDGE_EVIDENCE_WEIGHT_CATEGORY: ${KNOWLEDGE_EVIDENCE_WEIGHT_CATEGORY:-} KNOWLEDGE_EVIDENCE_WEIGHT_RETRIEVAL: ${KNOWLEDGE_EVIDENCE_WEIGHT_RETRIEVAL:-} KNOWLEDGE_IGNORE_GLOBS: ${KNOWLEDGE_IGNORE_GLOBS:-} KNOWLEDGE_INDEX_MODE: ${KNOWLEDGE_INDEX_MODE:-} KNOWLEDGE_INDEX_SCAN_INTERVAL: ${KNOWLEDGE_INDEX_SCAN_INTERVAL:-} KNOWLEDGE_MAX_CHUNKS_PER_DOC: ${KNOWLEDGE_MAX_CHUNKS_PER_DOC:-} KNOWLEDGE_MAX_QUERY_CHUNKS: ${KNOWLEDGE_MAX_QUERY_CHUNKS:-} KNOWLEDGE_MIN_SCORE: ${KNOWLEDGE_MIN_SCORE:-} KNOWLEDGE_RETRIEVAL_FLOOR: ${KNOWLEDGE_RETRIEVAL_FLOOR:-} KNOWLEDGE_TOP_K: ${KNOWLEDGE_TOP_K:-} KNOWLEDGE_VECTOR_BACKEND: ${KNOWLEDGE_VECTOR_BACKEND:-dual} KNOWLEDGE_WEB_EDIT_ENABLED: ${AGENT_LEGACY_KNOWLEDGE_EDITOR_ENABLED:-false} KNOWLEDGE_WEIGHT_CATEGORY: ${KNOWLEDGE_WEIGHT_CATEGORY:-} KNOWLEDGE_WEIGHT_KEYWORDS: ${KNOWLEDGE_WEIGHT_KEYWORDS:-} KNOWLEDGE_WEIGHT_LEXICAL: ${KNOWLEDGE_WEIGHT_LEXICAL:-} KNOWLEDGE_WEIGHT_SEMANTIC: ${KNOWLEDGE_WEIGHT_SEMANTIC:-} KNOWLEDGE_WEIGHT_TITLE: ${KNOWLEDGE_WEIGHT_TITLE:-} LEARNING_ENABLED: ${LEARNING_ENABLED:-} LEARNING_EXAMPLES_PER_CATEGORY: ${LEARNING_EXAMPLES_PER_CATEGORY:-} LEARNING_MAX_EXAMPLES: ${LEARNING_MAX_EXAMPLES:-} LOG_LEVEL: ${LOG_LEVEL:-} MAJOR_INCIDENTS_ENABLED: ${MAJOR_INCIDENTS_ENABLED:-} NEUROFORGE_API_KEY: ${NEUROFORGE_INTEGRATION_TOKEN:?Set the NeuroForge integration token} NEUROFORGE_FAIL_OPEN: ${NEUROFORGE_FAIL_OPEN:-true} NEUROFORGE_NAMESPACE: ${NEUROFORGE_NAMESPACE:-glpi-agent} NEUROFORGE_SEARCH_K: ${NEUROFORGE_SEARCH_K:-128} NEUROFORGE_TIMEOUT: ${NEUROFORGE_TIMEOUT:-} NEUROFORGE_URL: http://neuroforge:8080 OLLAMA_EMBEDDING_MODEL: ${OLLAMA_EMBEDDING_MODEL:-} OLLAMA_FAILOVER_ATTEMPTS: ${OLLAMA_FAILOVER_ATTEMPTS:-} OLLAMA_FAILOVER_ENABLED: ${OLLAMA_FAILOVER_ENABLED:-} OLLAMA_JSON_RETRIES: ${OLLAMA_JSON_RETRIES:-} OLLAMA_KEEP_ALIVE: ${OLLAMA_KEEP_ALIVE:-} OLLAMA_MAX_CONCURRENT: ${OLLAMA_MAX_CONCURRENT:-} OLLAMA_MODEL: ${OLLAMA_MODEL:-} OLLAMA_NODE_FAILURE_COOLDOWN: ${OLLAMA_NODE_FAILURE_COOLDOWN:-} OLLAMA_NODE_HEALTH_INTERVAL: ${OLLAMA_NODE_HEALTH_INTERVAL:-} OLLAMA_NODE_MAX_INFLIGHT: ${OLLAMA_NODE_MAX_INFLIGHT:-} OLLAMA_NODE_NAMES: ${OLLAMA_NODE_NAMES:-} OLLAMA_NODE_REQUEST_TIMEOUT: ${OLLAMA_NODE_REQUEST_TIMEOUT:-} OLLAMA_NODE_WEIGHTS: ${OLLAMA_NODE_WEIGHTS:-} OLLAMA_NUM_PREDICT: ${OLLAMA_NUM_PREDICT:-} OLLAMA_REQUIRE_EMBEDDING_MODEL: ${OLLAMA_REQUIRE_EMBEDDING_MODEL:-} OLLAMA_REQUIRE_SAME_MODEL_DIGEST: ${OLLAMA_REQUIRE_SAME_MODEL_DIGEST:-} OLLAMA_ROUTING_MODE: ${OLLAMA_ROUTING_MODE:-} OLLAMA_THINK: ${OLLAMA_THINK:-} OLLAMA_TIMEOUT: ${OLLAMA_TIMEOUT:-} OLLAMA_URL: ${OLLAMA_BASE_URL:-http://ollama:11434} OLLAMA_URLS: ${OLLAMA_URLS:-http://ollama:11434} OUTCOME_LEARNING_ENABLED: ${OUTCOME_LEARNING_ENABLED:-true} OUTCOME_LEARNING_FAIL_OPEN: ${OUTCOME_LEARNING_FAIL_OPEN:-false} OUTCOME_LEARNING_MAX_OUTCOMES: ${OUTCOME_LEARNING_MAX_OUTCOMES:-2000} OUTCOME_RETRIEVAL_ENABLED: ${OUTCOME_RETRIEVAL_ENABLED:-true} OUTCOME_RETRIEVAL_FAIL_OPEN: ${OUTCOME_RETRIEVAL_FAIL_OPEN:-true} OUTCOME_RETRIEVAL_MIN_SIMILARITY: ${OUTCOME_RETRIEVAL_MIN_SIMILARITY:-0.58} OUTCOME_RETRIEVAL_SEARCH_K: ${OUTCOME_RETRIEVAL_SEARCH_K:-6} PRIORITY_ALLOWED_REASON_CODES: ${PRIORITY_ALLOWED_REASON_CODES:-} PRIORITY_ANALYSIS_TIMEOUT: ${PRIORITY_ANALYSIS_TIMEOUT:-} PRIORITY_CONFIDENCE: ${PRIORITY_CONFIDENCE:-} PRIORITY_ENABLED: ${PRIORITY_ENABLED:-} PRIORITY_MAX_INCREASE: ${PRIORITY_MAX_INCREASE:-} QUEUE_SIZE: ${QUEUE_SIZE:-} RAG_ENABLED: ${RAG_ENABLED:-} REPLY_CONFIDENCE: ${REPLY_CONFIDENCE:-} UPTIME_KUMA_API_KEY: ${UPTIME_KUMA_API_KEY:-} UPTIME_KUMA_ENABLED: ${UPTIME_KUMA_ENABLED:-} UPTIME_KUMA_INCLUDE_MAINTENANCE: ${UPTIME_KUMA_INCLUDE_MAINTENANCE:-} UPTIME_KUMA_MAX_ISSUES: ${UPTIME_KUMA_MAX_ISSUES:-} UPTIME_KUMA_MODE: ${UPTIME_KUMA_MODE:-} UPTIME_KUMA_STATUS_PAGES: ${UPTIME_KUMA_STATUS_PAGES:-} UPTIME_KUMA_TIMEOUT: ${UPTIME_KUMA_TIMEOUT:-} UPTIME_KUMA_URL: ${UPTIME_KUMA_URL:-} USER_DEVICE_CONTEXT_ENABLED: ${USER_DEVICE_CONTEXT_ENABLED:-} WEBHOOK_SECRET: ${WEBHOOK_SECRET:-} WEB_ALLOW_ANONYMOUS: ${WEB_ALLOW_ANONYMOUS:-} WEB_PASSWORD: ${WEB_PASSWORD:-} WEB_USERNAME: ${WEB_USERNAME:-} WORKERS: ${WORKERS:-} ports: - 127.0.0.1:${AGENT_HOST_PORT:-8080}:8080 volumes: - agent-data:/app/data - ${KB_DATA_PATH:-./knowledge}:/app/knowledge:ro depends_on: agent-data-init: condition: service_completed_successfully ollama: condition: service_started read_only: true tmpfs: - /tmp:size=64m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL healthcheck: test: - CMD - /app/glpi-ai-agent - healthcheck interval: 15s timeout: 3s retries: 8 start_period: 10s stop_grace_period: 20s knowledge: image: git.send.nrw/sendnrw/glpi-neuroforge-mega-knowledge:${IMAGE_TAG:?Set IMAGE_TAG to an immutable release tag, for example 1.5.9} restart: unless-stopped environment: APP_MODE: ${KB_APP_MODE:-editor} DATA_DIR: /data/knowledge BACKUP_DIR: /data/backups STAGING_DIR: /data/staging LISTEN_ADDR: :8080 APP_TITLE: ${APP_TITLE:-} APP_SUBTITLE: ${APP_SUBTITLE:-} AUTO_RELOAD_INTERVAL: ${AUTO_RELOAD_INTERVAL:-} BASIC_AUTH_USER: ${BASIC_AUTH_USER:?Set the Knowledge web user} BASIC_AUTH_PASSWORD: ${BASIC_AUTH_PASSWORD:?Set the Knowledge web password} AI_FALLBACK_ENABLED: ${AI_FALLBACK_ENABLED:-false} OLLAMA_BASE_URL: ${OLLAMA_BASE_URL:-http://ollama:11434} OLLAMA_MODEL: ${OLLAMA_MODEL:-gemma3} OLLAMA_TIMEOUT: ${OLLAMA_TIMEOUT:-10m} OLLAMA_MAX_CONCURRENT: ${OLLAMA_MAX_CONCURRENT:-2} OLLAMA_STAGING_AUTO_REPLY: ${OLLAMA_STAGING_AUTO_REPLY:-false} OLLAMA_STAGING_MIN_SCORE: ${OLLAMA_STAGING_MIN_SCORE:-0.72} BRAIN_ACTIVITY_URL: http://neuroforge:8080/api/v1/integrations/events BRAIN_ACTIVITY_API_KEY: ${NEUROFORGE_INTEGRATION_TOKEN:?Set the NeuroForge integration token} KB_INTEGRATION_TOKEN: ${KB_INTEGRATION_TOKEN:?Set the Knowledge integration token} ports: - 127.0.0.1:${KNOWLEDGE_HOST_PORT:-8081}:8080 volumes: - ${KB_DATA_PATH:-./knowledge}:/data/knowledge:${KB_DATA_MOUNT_MODE:-rw} - ${KB_STAGING_PATH:-./staging}:/data/staging:rw - ${KB_BACKUP_PATH:-./backups}:/data/backups:rw depends_on: ollama: condition: service_started read_only: true tmpfs: - /tmp:size=32m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL stop_grace_period: 35s control: image: git.send.nrw/sendnrw/glpi-neuroforge-mega-control:${IMAGE_TAG:?Set IMAGE_TAG to an immutable release tag, for example 1.5.9} restart: unless-stopped environment: CONTROL_ADDR: :8070 CONTROL_BASIC_AUTH_USER: ${CONTROL_BASIC_AUTH_USER:?Set the Control Center user} CONTROL_BASIC_AUTH_PASSWORD: ${CONTROL_BASIC_AUTH_PASSWORD:?Set the Control Center password} AGENT_URL: http://agent:8080 KNOWLEDGE_URL: http://knowledge:8080 NEUROFORGE_URL: http://neuroforge:8080 NEUROFORGE_API_KEY: ${NEUROFORGE_CONTROL_READ_TOKEN:?Set the NeuroForge control read token} CONTROL_READ_TOKEN: ${CONTROL_READ_TOKEN:?Set the Agent control read token} CODEBASE_MEMORY_URL: ${CODEBASE_MEMORY_URL:-} PUBLIC_CODEBASE_MEMORY_URL: ${PUBLIC_CODEBASE_MEMORY_URL:-} KNOWLEDGE_VECTOR_BACKEND: ${KNOWLEDGE_VECTOR_BACKEND:-dual} NEUROFORGE_SEARCH_K: ${NEUROFORGE_SEARCH_K:-128} NEUROFORGE_FAIL_OPEN: ${NEUROFORGE_FAIL_OPEN:-true} NEUROFORGE_CONTROLLED_LEARNING: ${NEUROFORGE_CONTROLLED_LEARNING:-true} NEUROFORGE_GOAL_LEARNING_ENABLED: ${NEUROFORGE_GOAL_LEARNING_ENABLED:-false} OUTCOME_LEARNING_ENABLED: ${OUTCOME_LEARNING_ENABLED:-true} OUTCOME_RETRIEVAL_ENABLED: ${OUTCOME_RETRIEVAL_ENABLED:-true} OUTCOME_RETRIEVAL_SEARCH_K: ${OUTCOME_RETRIEVAL_SEARCH_K:-6} OUTCOME_RETRIEVAL_MIN_SIMILARITY: ${OUTCOME_RETRIEVAL_MIN_SIMILARITY:-0.58} OUTCOME_RETRIEVAL_FAIL_OPEN: ${OUTCOME_RETRIEVAL_FAIL_OPEN:-true} NEUROFORGE_RESEARCH_ENABLED: ${NEUROFORGE_RESEARCH_ENABLED:-false} NEUROFORGE_SEARXNG_ENABLED: ${NEUROFORGE_SEARXNG_ENABLED:-false} NEUROFORGE_KB_STAGING_ENABLED: ${NEUROFORGE_KB_STAGING_ENABLED:-true} NEUROFORGE_AUTONOMY_ENABLED: ${NEUROFORGE_AUTONOMY_ENABLED:-false} PUBLIC_AGENT_URL: http://localhost:${AGENT_HOST_PORT:-8080} PUBLIC_KNOWLEDGE_URL: http://localhost:${KNOWLEDGE_HOST_PORT:-8081} PUBLIC_NEUROFORGE_URL: http://localhost:${NEUROFORGE_HOST_PORT:-8090}/admin ports: - 127.0.0.1:${CONTROL_HOST_PORT:-8070}:8070 read_only: true tmpfs: - /tmp:size=16m,mode=1777 security_opt: - no-new-privileges:true cap_drop: - ALL extra_hosts: - host.docker.internal:host-gateway stop_grace_period: 25s volumes: neuroforge-data: null agent-data: null ollama-data: null searxng-cache: null