PaddlePaddle + PP-OCRv5 model + warmup OCR needs more than 4G on
CPU-only servers. Container was OOM-killed during warmup.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
PaddleOCR JIT-compiles on the first .ocr() call, which takes minutes
on CPU-only servers. This causes Traefik 504 Gateway Timeout.
Run a dummy OCR during startup so the first real request is fast.
Also simplify Traefik labels on paddleocr-service.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Gitea runner on Mac Mini uses label 'docker', not 'ubuntu-latest'.
Also need alpine container with curl installed.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The deploy workflow was missing from the coolify branch, so pushes
to coolify never triggered a Coolify redeploy via Gitea Actions.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The docker-compose.coolify.yml references paddleocr-service/Dockerfile
but the directory only existed on main. Coolify clones the coolify branch
and needs the source files to build the container.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add PaddleOCR PP-OCRv5 service with 4G memory limit, model volume,
and health check (5min start period for model loading). Domain routing
(ocr.breakpilot.com) to be configured in Coolify UI.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Remove backend-core, billing-service, night-scheduler, and admin-core
as they are not used by any compliance/SDK service. Update
health-aggregator CHECK_SERVICES to reference consent-service instead.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Dockerfile hardcoded TARGETARCH=arm64 for Mac Mini. Coolify server
is x86_64, causing exit code 126 (wrong binary arch). Now uses Docker
BuildKit's auto-detected TARGETARCH with dpkg fallback.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Add QDRANT_API_KEY to config.py (empty string = no auth)
- Pass api_key to QdrantClient constructor (None when empty)
- Add QDRANT_API_KEY to coolify compose and env example
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Add docker-compose.coolify.yml (17 services), .env.coolify.example,
and Gitea Action workflow for Coolify API deployment. Removes nginx,
vault, gitea, woodpecker, mailpit, and dev-only services. Adds Traefik
labels for *.breakpilot.ai domain routing with Let's Encrypt SSL.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Collections may not exist if init_collections() failed at startup
(e.g. Qdrant not ready). Now index_documents() ensures the
collection exists before upserting.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Host already has Ollama running (LibreChat). Our container only needs
internal docker network access via container name.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Network already exists from compliance project — use external: true
and pre-create with docker network create before docker compose up.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- backend-core Dockerfile defaults TARGETARCH=arm64, override with build arg
- Add set -e in helper container to fail fast on build errors
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Neue statische Website fuer Kinder (6-12 Jahre) mit 8 Holzprojekten,
SVG-Illustrationen, Sicherheitshinweisen und kindgerechtem Design.
Next.js 15 + Tailwind + Framer Motion.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Migrate rag-service S3 config from local MinIO (minio:9000) to
Hetzner Object Storage (nbg1.your-objectstorage.com) with HTTPS.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
ChatInterface.tsx war falsch — der echte Investor Agent laeuft in
ChatFAB.tsx. Animierte Punkte + firstChunk-Logik dort implementiert.
Session-History laeuft bereits korrekt (FAB permanent gemountet).
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
isWaiting im async Closure war immer true — lokale Variable
firstChunk ersetzt den State-Check zuverlaessig.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Drei animierte Punkte (iMessage-Style) erscheinen sofort nach dem
Absenden und verschwinden wenn der erste Token eintrifft.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Qwen3.5 denkt standardmaessig intern durch (think: true) — das
ueberschreitet den 2-Minuten-Timeout des Investor Agents.
think: false + num_ctx 8192 sorgt fuer schnelle direkte Antworten.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Camunda war nie aktiv (nur Frontend-Stub ohne Backend) — komplett entfernt.
Jitsi (5 Services), Synapse (2 Services) und Voice Service werden
ausschließlich vom Lehrer-Stack genutzt und gehören nicht in Core.
Nginx-Container-Namen auf bp-lehrer-jitsi-* aktualisiert (shared Network).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Serves original regulation PDFs from ~/rag-originals/ on port 3002
for the RAG QA Split-View Chunk-Browser. Adds volume mount to nginx.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- Increase proxy_read_timeout from 300s to 600s for large PDF uploads
- Add proxy_send_timeout 600s (was defaulting to 60s)
- Fixes 504 Gateway Timeout when uploading 7.5MB+ IFRS PDFs
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
qdrant-client 1.17.0 removed the search() method in favor of
query_points(). Update the wrapper to use the new API.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Switch to Ollama's bge-m3 model (1024-dim) for generating embeddings,
solving the dimension mismatch with Qdrant collections. Embedding-service
still used for chunking, reranking, and PDF extraction.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The Qdrant collections use 1024-dim vectors (bge-m3) but the
embedding-service was configured with all-MiniLM-L6-v2 (384-dim).
Also increase memory limit to 8G for the larger model.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
The embedding-service exposes endpoints at root level (/chunk, /embed,
/extract-pdf, /rerank) not under /api/v1/. Fix the RAG service's
embedding client to use the correct paths.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>