docker-compose.template.yml
Rama master · réplica de lectura del repositorio original.
# ──────────────────────────────────────────────────────────────
# docker-compose.example.yml — Template für Nova
#
# Kopieren nach ../docker-compose.yml (außerhalb des Repos) und anpassen.
# Pfade in diesem Template gehen davon aus, dass die echte Compose-Datei
# einen Ordner über dem Repo liegt und das Repo unter ./novaberg/ erreichbar
# ist.
#
# Voraussetzungen:
# - Ollama läuft host-native auf Ports 11434 (GPU) und 11435 (CPU)
# - .env mit TELEGRAM_BOT_TOKEN etc. liegt auf derselben Ebene wie die
# Compose-Datei
# - searxng/ als lokaler Ordner mit settings.yml liegt auf derselben
# Ebene wie die Compose-Datei
# ──────────────────────────────────────────────────────────────
services:
postgres:
image: pgvector/pgvector:pg16
container_name: ki_postgres
environment:
POSTGRES_DB: gedaechtnis
POSTGRES_USER: ki
POSTGRES_PASSWORD: ki
volumes:
- postgres_data:/var/lib/postgresql/data
- ./novaberg/db/init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
healthcheck:
test: ["CMD-SHELL", "pg_isready -U ki -d gedaechtnis"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
redis:
image: redis/redis-stack-server:latest
container_name: ki_redis
volumes:
- redis_data:/data
ports:
- "6379:6379"
command: redis-stack-server --appendonly yes --dir /data
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 5s
timeout: 5s
retries: 10
restart: unless-stopped
searxng:
image: searxng/searxng:latest
container_name: ki_searxng
volumes:
- ./searxng:/etc/searxng:rw
ports:
- "8080:8080"
environment:
- SEARXNG_BASE_URL=http://localhost:8080/
- INSTANCE_NAME=nova-search
healthcheck:
test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost:8080/healthz"]
interval: 10s
timeout: 5s
retries: 5
restart: unless-stopped
server:
build:
context: ./novaberg/server
dockerfile: Dockerfile
container_name: ki_server
ports:
- "8000:8000"
environment:
OLLAMA_GPU_URL: http://host.docker.internal:11434
OLLAMA_CPU_URL: http://host.docker.internal:11435
REDIS_URL: redis://redis:6379
POSTGRES_URL: postgresql://ki:ki@postgres:5432/gedaechtnis
OLLAMA_CONNECTOR: qwen36
# v2-moe seit A4 (Chat 107, EMBEDDING-CASING-BLIND). Vor dem ersten Start:
# ollama pull nomic-embed-text-v2-moe (955 MB VRAM, passt neben gemma4-gpu)
EMBED_MODEL: nomic-embed-text-v2-moe
SEARXNG_URL: http://searxng:8080
extra_hosts:
- "host.docker.internal:host-gateway"
depends_on:
postgres:
condition: service_healthy
redis:
condition: service_healthy
searxng:
condition: service_healthy
volumes:
- ./novaberg/server:/app
restart: unless-stopped
# ── Matrix-Homeserver ─────────────────────────────────────────
# Der Fernkanal. Der Unterschied zu einem Bot ist keine Bequemlichkeit,
# sondern eine Faehigkeit: Ein Bot hat genau einen Absender, ein
# Application Service darf im Namen jedes Nutzers seines Namensraums
# senden. Damit erscheint eine Aeusserung, die am Desktop gemacht wurde,
# im Matrix-Client als Nachricht DES MENSCHEN. Konzept:
# docs/novaberg-matrix-kanal_k.md
#
# VOR dem ersten Start sind vier Dinge anzulegen — die Anleitung steht in
# README.md, Abschnitt "Matrix channel (optional)". Kurzform:
# 1. Datenbank `synapse` mit LC_COLLATE=C und LC_CTYPE=C
# (NACHTRAEGLICH nur ueber einen Neuaufbau aenderbar)
# 2. matrix/data/homeserver.yaml aus matrix/data/homeserver.template.yaml
# 3. matrix/config/novaberg-as.yaml aus dem Muster daneben, mit zwei
# selbst erzeugten Tokens
# 4. dieselben Tokens in matrix/config/as-tokens.env
#
# `server_name` steckt in JEDER Nutzer- und Raum-Kennung und ist
# nachtraeglich nicht aenderbar. Deshalb eine Domain und nicht die
# Adresse des Wirts: Die kommt aus DHCP und wechselt.
#
# `depends_on` auf postgres ist keine Bequemlichkeit — ohne die
# Datenbank startet der Homeserver nicht.
synapse:
image: ghcr.io/element-hq/synapse:latest
container_name: ki_synapse
restart: unless-stopped
environment:
SYNAPSE_CONFIG_PATH: /data/homeserver.yaml
ports:
# Client-Server-API, ohne TLS. Vertretbar im privaten Netz hinter
# einem VPN-Tunnel; im blanken WLAN gehen Passwort und Nachrichtentext
# im Klartext. Ein Reverse Proxy mit Zertifikat ist offen.
- "8008:8008"
depends_on:
postgres:
condition: service_healthy
volumes:
- ./matrix/data:/data
# Die AS-Registrierung liegt getrennt von den Daten: Sie gehoert dem
# Menschen, nicht dem Server-Nutzer (UID 991), und wird von Hand
# gepflegt statt vom Behaelter geschrieben.
- ./matrix/config:/config:ro
# Der Connector zum Matrix-Raum. Duenner Client wie jeder Kanal hier —
# mit zwei Unterschieden: Er empfaengt Ereignisse per Push vom Homeserver
# (PUT /_matrix/app/v1/transactions/{txnId}) statt per Polling, und er
# sendet unter zwei Identitaeten.
matrix-bot:
build: ./novaberg/matrix_bot
container_name: ki_matrix_bot
restart: unless-stopped
# Traegt MATRIX_AS_TOKEN und MATRIX_HS_TOKEN. Muster:
# matrix/config/as-tokens.env.template
env_file: ./matrix/config/as-tokens.env
environment:
NOVA_API_URL: http://server:8000
MATRIX_HOMESERVER: http://synapse:8008
MATRIX_SERVER_NAME: novaberg.de
MATRIX_USER_MAP: "meister:meister"
MATRIX_CHARACTER: nova
volumes:
# Die Raum-Kennung ueberlebt hier den Neustart. OHNE DIESEN MOUNT legt
# jeder Start einen NEUEN Raum an, und der Verlauf des alten bleibt
# liegen, ohne dass etwas anschlaegt. Daneben liegt der Fingerabdruck
# des Profilbildes — ohne ihn laedt jeder Start dasselbe Bild erneut
# hoch, und der Medienspeicher fuellt sich mit Kopien.
- ./matrix/state:/state
# Dasselbe Verzeichnis wie bei Synapse, aus einem anderen Grund: Der
# Connector liest hier das Profilbild der Figur.
- ./matrix/config:/config:ro
depends_on:
- server
- synapse
# ── Telegram-Bot — abgeschaltet am 24.08.2026 ──────────────────
# Der Matrix-Kanal hat ihn abgeloest; der Grund steht in
# docs/novaberg-matrix-kanal_k.md und ist keine Geschmacksfrage: Ein
# Telegram-Bot hat genau einen Absender, weshalb jede Aeusserung von
# einem anderen Client im Kanal als `[Du] ...` aus Novas Mund
# erschien statt als Nachricht des Menschen.
#
# `telegram_bot/` bleibt im Repositorium liegen — der Dienst ist aus,
# der Code ist nicht geloescht. Wer den Kanal zurueckholen will,
# stellt diesen Block wieder her:
#
# telegram-bot:
# build: ./novaberg/telegram_bot
# container_name: ki_telegram
# restart: unless-stopped
# env_file: .env
# environment:
# NOVA_API_URL: http://server:8000
# depends_on:
# - server
volumes:
postgres_data:
redis_data: