Replace Clay with n8n, Ollama, SearXNG and browserless; add Telegram assistant

Remove the Clay role (Claude Code web UI) and its Anthropic API key.

New roles:
- ollama: local CPU LLM (qwen3:4b-instruct), internal network only
- browserless: headless Chromium for JavaScript-heavy pages
- searxng: metasearch backend for the chat web_search tool
- n8n at agent.ladkau.de: web chat (/chat), scheduled workflows,
  Telegram bot; workflows and credentials are imported from the repo

Telegram bot: Gemini 3.8 -> Gemini 3.5 -> local Qwen fallback chain,
/qwen to force the local model, /stocks and a weekday schedule
(07:30, 13:00, 17:40) for the MTE.DE / PTX.F stock report.

Also: dashboard and check-services entries for the chat, vault checks
for the new secrets (n8n, SearXNG, Gemini, Telegram, SMTP), updated
CLAUDE.md, runbooks and README.
This commit is contained in:
ml
2026-10-03 17:10:33 +02:00
parent b3cf4e250a
commit 974486bc53
37 changed files with 2805 additions and 290 deletions
+6
View File
@@ -0,0 +1,6 @@
---
- name: Restart ollama
community.docker.docker_compose_v2:
project_src: "{{ ollama_data_dir }}"
state: present
recreate: always
+44
View File
@@ -0,0 +1,44 @@
---
- name: Create Ollama directories
ansible.builtin.file:
path: "{{ item }}"
state: directory
owner: root
group: root
mode: "0755"
loop:
- "{{ ollama_data_dir }}"
- "{{ ollama_data_dir }}/models"
tags: ollama
- name: Deploy Docker Compose file
ansible.builtin.template:
src: docker-compose.yml.j2
dest: "{{ ollama_data_dir }}/docker-compose.yml"
owner: root
group: root
mode: "0644"
notify: Restart ollama
tags: ollama
- name: Start Ollama
community.docker.docker_compose_v2:
project_src: "{{ ollama_data_dir }}"
state: present
pull: missing
tags: ollama
- name: List installed Ollama models
ansible.builtin.command: docker exec ollama ollama list
register: ollama_installed
changed_when: false
retries: 10
delay: 3
until: ollama_installed.rc == 0
tags: ollama
- name: Pull Ollama model
ansible.builtin.command: docker exec ollama ollama pull {{ ollama_model }}
when: ollama_model not in ollama_installed.stdout
changed_when: true
tags: ollama
@@ -0,0 +1,26 @@
# Managed by Ansible — do not edit manually
services:
ollama:
image: ollama/ollama:{{ ollama_version }}
container_name: ollama
restart: unless-stopped
environment:
OLLAMA_CONTEXT_LENGTH: "{{ ollama_context_length }}"
OLLAMA_FLASH_ATTENTION: "1"
OLLAMA_KV_CACHE_TYPE: "q8_0"
# One model, one request at a time — keeps RAM use predictable on the shared VPS
OLLAMA_MAX_LOADED_MODELS: "1"
OLLAMA_NUM_PARALLEL: "1"
# Unload the model after this idle time to free RAM for the other services
OLLAMA_KEEP_ALIVE: "{{ ollama_keep_alive }}"
volumes:
- {{ ollama_data_dir }}/models:/root/.ollama
mem_limit: {{ ollama_mem_limit }}
networks:
- ollama_internal
# Not exposed via Traefik. Containers that need the API join this network
# (declared as external there) and reach it at http://ollama:11434.
networks:
ollama_internal:
name: ollama_internal