app/mcp_server.py: FastMCP (mcp SDK), streamable-http auf /mcp, statischer
Bearer-Token (constant-time ASGI-Middleware), Fail-Fast ohne RAG_MCP_TOKEN.
Tools rag_search (mit semester/fach/typ-Filter) + get_file_chunks. Läuft aus
demselben Image wie der Ingestor und reused den Embed-Pfad → Vektoren sind
garantiert kompatibel zum Ingest (der offizielle qdrant-MCP-Server kann nur
fastembed → Dimension-/Schema-Mismatch).
app/qdrant_store.py: search_chunks (query_points + optionaler Payload-Filter)
und get_chunks_by_path (scroll, nach chunk_index sortiert).
app/bulk.py: Amplification-Guard — /bulk-import lehnt mit 409 ab solange ein
vorheriger Bulk noch BackgroundTasks abarbeitet.
docker-compose.coolify.yml: rag-mcp-Service (nicht public, externes
metamcp-net statt Stack-Coupling) + Traefik-Rate-Limit-Middleware am ingestor.
tests/conftest.py: Settings-env_file in Tests neutralisieren (Dev-.env darf
die Suite nicht kontaminieren). 68 passed, ruff clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Schützt .env.coolify (enthält WEBHOOK_SECRET) und weitere lokale
Env-Varianten davor, versehentlich committet zu werden.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Self-contained Stack (qdrant + ollama + ingestor) für Coolify-Deployment.
Ingestor zieht das vorgebaute Registry-Image statt selbst zu bauen.
Services kommunizieren nur intern; Ingestor wird via SERVICE_FQDN über
den Coolify-Proxy öffentlich (auto-TLS) damit Nextcloud den Webhook
erreicht, ohne ins Coolify-Netz zu müssen.
Baut die Session-Lehren ein: ollama-pull One-shot-Service zieht das
Embed-Modell automatisch (verhindert Ingestor-Startup-Crash), und
INGEST_ROOT hat den korrekten Default Documents/THB.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Embedding-Inferenz ist CPU-only und skaliert sonst auf alle Cores.
cpus: "2.0" + OLLAMA_NUM_PARALLEL=1 halten die Last konstant bei ~2
statt Peaks bis 8 Cores. Bewusster Trade-off: ~5x langsamere Bulk-
Laufzeit, dafuer predictable Host-Last (selten laufender Workload).
README dokumentiert, dass Coolify dieselben Limits spiegeln muss.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
actions/checkout@v4 ist eine node-action; python:3.12-slim hat kein node
installiert -> 'exec: node not found'. ersatz durch git clone analog
release.yml.
Bite-sized TDD-Tasks mit komplettem Code in jedem Step. Reihenfolge
bottom-up: pure-logic units zuerst (metadata, chunker), dann externe
Services (webdav, ollama, qdrant), dann Orchestrierung und API,
abschliessend Docker und README.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Initial commit fuer den RAG-Ingestor-Microservice. Enthaelt die
urspruengliche REQUIREMENTS.md und die ausgearbeitete Design-Spec
nach Brainstorming-Session.
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>