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