Files
glpi-ai-deployment/compose.yml
2026-07-29 21:54:43 +02:00

221 lines
5.7 KiB
YAML

services:
###########################################################################
# Initialisiert das persistente Agent-Datenvolume.
#
# Wichtig:
# Kein "chown -R" bei jedem Deployment. Der Agent schreibt anschließend
# selbst als UID/GID 65532, daher genügt normalerweise das Root-Verzeichnis.
###########################################################################
agent-data-init:
image: alpine:3.22
user: "0:0"
command:
- sh
- -c
- |
set -eu
mkdir -p /app/data
chown 65532:65532 /app/data
volumes:
- agent-data:/app/data
restart: "no"
###########################################################################
# GLPI AI Agent
###########################################################################
agent:
image: git.send.nrw/sendnrw/glpi-ai-agent:latest
restart: unless-stopped
env_file:
- .env
ports:
- "${AGENT_PORT:-7080}:7080"
volumes:
# Persistenter Agent-State:
# - Knowledge-Index
# - Runs/Audit
# - Learning
# - Managed KBs
# - GLPI-KB-Cache
- agent-data:/app/data
# Gleicher Knowledge-Pfad wie Editor/Search.
- "${KB_DATA_PATH:-./knowledge}:/app/knowledge:ro"
depends_on:
agent-data-init:
condition: service_completed_successfully
# Nur Startreihenfolge.
# Der Agent selbst überwacht Ollama und soll sein WebUI auch dann
# bereitstellen können, wenn Ollama gerade nicht verfügbar ist.
ollama:
condition: service_started
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
read_only: true
tmpfs:
- /tmp:size=64m,mode=1777
###########################################################################
# Ollama
###########################################################################
ollama:
image: ollama/ollama:latest
restart: unless-stopped
volumes:
- ollama-data:/root/.ollama
# ollama CLI spricht dabei mit dem lokalen Ollama-Server.
healthcheck:
test: ["CMD", "ollama", "list"]
interval: 30s
timeout: 10s
retries: 5
start_period: 30s
# CPU-Betrieb:
# keine weitere Konfiguration erforderlich.
#
# NVIDIA-Beispiel:
#
# gpus: all
#
# Siehe offizielle Ollama-Docker-Dokumentation.
###########################################################################
# Knowledge Base Editor
###########################################################################
kb-editor:
image: git.send.nrw/sendnrw/glpi-ai-knowledgebase:latest
restart: unless-stopped
ports:
- "${KB_EDITOR_PORT:-7082}:8080"
environment:
APP_MODE: editor
APP_TITLE: "${EDITOR_TITLE:-KB Administration}"
APP_SUBTITLE: "${EDITOR_SUBTITLE:-Wissensbasis verwalten}"
DATA_DIR: /data/knowledge
BACKUP_DIR: /data/backups
LISTEN_ADDR: :8080
BASIC_AUTH_USER: "${EDITOR_AUTH_USER:-}"
BASIC_AUTH_PASSWORD: "${EDITOR_AUTH_PASSWORD:-}"
AI_FALLBACK_ENABLED: "${AI_FALLBACK_ENABLED:-false}"
OLLAMA_BASE_URL: "${OLLAMA_BASE_URL:-http://ollama:11434}"
OLLAMA_MODEL: "${OLLAMA_MODEL:-qwen3:8b}"
OLLAMA_TIMEOUT: "${OLLAMA_TIMEOUT:-10m}"
OLLAMA_MAX_CONCURRENT: "${OLLAMA_MAX_CONCURRENT:-1}"
OLLAMA_STAGING_AUTO_REPLY: "${OLLAMA_STAGING_AUTO_REPLY:-false}"
OLLAMA_STAGING_MIN_SCORE: "${OLLAMA_STAGING_MIN_SCORE:-0.70}"
volumes:
- "${KB_DATA_PATH:-./knowledge}:/data/knowledge:rw"
- "${KB_BACKUP_PATH:-./backups}:/data/backups:rw"
- "${KB_STAGING_PATH:-./staging}:/data/staging:rw"
read_only: true
tmpfs:
- /tmp:size=32m,mode=1777
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
###########################################################################
# Knowledge Base Search
###########################################################################
kb-search:
image: git.send.nrw/sendnrw/glpi-ai-knowledgebase:latest
restart: unless-stopped
ports:
- "${KB_SEARCH_PORT:-7081}:8080"
environment:
APP_MODE: google
APP_TITLE: "${SEARCH_TITLE:-KB-Datenbank}"
APP_SUBTITLE: "${SEARCH_SUBTITLE:-Interne Lösungsdatenbank}"
AUTO_RELOAD_INTERVAL: "${AUTO_RELOAD_INTERVAL:-60s}"
DATA_DIR: /data/knowledge
LISTEN_ADDR: :8080
BASIC_AUTH_USER: "${SEARCH_AUTH_USER:-}"
BASIC_AUTH_PASSWORD: "${SEARCH_AUTH_PASSWORD:-}"
AI_FALLBACK_ENABLED: "${AI_FALLBACK_ENABLED:-true}"
OLLAMA_BASE_URL: "${OLLAMA_BASE_URL:-http://ollama:11434}"
OLLAMA_MODEL: "${OLLAMA_MODEL:-qwen3:8b}"
OLLAMA_TIMEOUT: "${OLLAMA_TIMEOUT:-10m}"
OLLAMA_MAX_CONCURRENT: "${OLLAMA_MAX_CONCURRENT:-1}"
OLLAMA_STAGING_AUTO_REPLY: "${OLLAMA_STAGING_AUTO_REPLY:-false}"
OLLAMA_STAGING_MIN_SCORE: "${OLLAMA_STAGING_MIN_SCORE:-0.70}"
volumes:
- "${KB_DATA_PATH:-./knowledge}:/data/knowledge:ro"
- "${KB_STAGING_PATH:-./staging}:/data/staging:rw"
# Search funktioniert grundsätzlich auch ohne Editor.
# Deshalb würde ich hier keine harte Startabhängigkeit vom Editor setzen.
read_only: true
tmpfs:
- /tmp:size=32m,mode=1777
security_opt:
- no-new-privileges:true
cap_drop:
- ALL
###############################################################################
# PERSISTENTE VOLUMES
###############################################################################
volumes:
# Expliziter Name verhindert, dass ein geänderter Compose-Projektname
# scheinbar ein neues/leeres Agent-Volume erzeugt.
agent-data:
name: glpi-ai-agent-data
# Enthält heruntergeladene Ollama-Modelle.
ollama-data:
name: glpi-ai-ollama-data