Эх сурвалжийг харах

varundus 2026-09-14 07:00

ardo 1 сар өмнө
parent
commit
8472081c8c

+ 15 - 1
main/docker-compose.yml

@@ -240,7 +240,7 @@ services:
     restart: unless-stopped
     mem_limit: 6g
     cpus: 3.0
-    command: ["--model-id", "BAAI/bge-reranker-base", "--port", "80", "--max-concurrent-requests", "2", "--auto-truncate", "--max-batch-tokens", "2048"]
+    command: ["--model-id", "BAAI/bge-reranker-base", "--port", "80", "--max-concurrent-requests", "2", "--auto-truncate", "--max-batch-tokens", "2048", "--max-client-batch-size", "256"]
     ports:
       - "8082:80"  # reranker
     volumes:
@@ -250,6 +250,20 @@ services:
       HF_HOME: /data
     networks:
       - ai_network
+  reranker-adapter:
+    image: python:3.12-alpine
+    container_name: reranker-adapter
+    restart: unless-stopped
+    command: ["python3", "/app/adapter.py"]
+    volumes:
+      - ./reranker-adapter:/app:ro
+    ports:
+      - "127.0.0.1:8083:80"
+    networks:
+      - ai_network
+    mem_limit: 256m
+    environment:
+      - TZ=Europe/Tallinn
 volumes:
   portainer_data:
     driver: local

+ 68 - 0
main/reranker-adapter/adapter.py

@@ -0,0 +1,68 @@
+"""OWUI (Cohere-stiil) -> TEI rerank adapter.
+
+OWUI saadab:  {"model":..,"query":..,"documents":[...],"top_n":N}
+              ootab: {"results":[{"index":i,"relevance_score":s}, ...]}
+TEI ootab:    {"query":..,"texts":[...]}
+              tagastab: [{"index":i,"score":s}, ...]
+"""
+import json
+import urllib.request
+from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
+
+TEI = "http://reranker:80/rerank"
+
+
+class Handler(BaseHTTPRequestHandler):
+    server_version = "rerank-adapter/1.0"
+
+    def _send(self, code, obj):
+        body = json.dumps(obj).encode()
+        self.send_response(code)
+        self.send_header("Content-Type", "application/json")
+        self.send_header("Content-Length", str(len(body)))
+        self.end_headers()
+        self.wfile.write(body)
+
+    def do_GET(self):
+        self._send(200, {"ok": True, "tei": TEI})
+
+    def do_POST(self):
+        try:
+            n = int(self.headers.get("Content-Length") or 0)
+            body = json.loads(self.rfile.read(n) or b"{}")
+        except Exception as e:
+            return self._send(400, {"error": "bad json: %s" % e})
+
+        docs = body.get("documents") or body.get("texts") or []
+        if isinstance(docs, str):
+            docs = [docs]
+        docs = [d if isinstance(d, str) else json.dumps(d) for d in docs]
+        if not docs:
+            return self._send(200, {"results": []})
+
+        req = urllib.request.Request(
+            TEI,
+            data=json.dumps({"query": body.get("query", ""), "texts": docs}).encode(),
+            headers={"Content-Type": "application/json"},
+        )
+        try:
+            out = json.load(urllib.request.urlopen(req, timeout=600))
+        except Exception as e:
+            return self._send(500, {"error": "tei: %s" % e})
+
+        if isinstance(out, dict):
+            out = out.get("results") or out.get("data") or []
+        results = []
+        for o in out:
+            try:
+                results.append({"index": int(o["index"]), "relevance_score": float(o["score"])})
+            except Exception:
+                continue
+        self._send(200, {"results": results})
+
+    def log_message(self, *a):
+        pass
+
+
+if __name__ == "__main__":
+    ThreadingHTTPServer(("0.0.0.0", 80), Handler).serve_forever()

+ 1 - 1
third/server/openwebui/LOEMIND.md

@@ -76,7 +76,7 @@ Teenuse konfiguratsioon:
 | `qwen3:30b-fast` | 18 GB | LLM vestlus |
 | `deepseek-r1:14b` | 9.0 GB | LLM vestlus (reasoning) |
 | `translategemma:12b` | 8.1 GB | Tõlkimine |
-| `bge-m3:latest` | 1.2 GB | Varu-embedding |
+| `bge-m3:latest` | 1.2 GB | ⛔ **ei kasutata embeddinguks** — ainult `nomic-embed-text` (Ardo otsus 13.09.2026) |
 
 ### Mudelite haldus
 

+ 343 - 0
third/server/openwebui/LOEMIND.md.bak-embed-20260913-190443

@@ -0,0 +1,343 @@
+# Open WebUI – Docker kasutusjuhend
+
+Professionaalne LLM veebiliides. Vestlus, RAG (dokumentide põhine küsimine), veebiotsing.
+
+## Arhitektuur (2025-07-05 seisuga)
+
+| Komponent | Asukoht | Staatus |
+|-----------|---------|---------|
+| **Open WebUI** | Docker konteiner (`open-webui`) | port 3010 |
+| **Ollama** | Native systemd teenus (`ollama.service`) | port 11434 |
+| **Ollama GPU** | ROCm 7.2.2, gfx1151 (Radeon 8060S) | hostil |
+| **mcp-filesystem-sse** | Docker konteiner (`mcp-filesystem-sse`) | port 3100 |
+| **mcp-terminal** | Docker konteiner (`mcp-terminal`) | port 3110 |
+| **tika** | Docker konteiner (`tika`) | port 9998 |
+| **Qdrant** | Docker konteiner (`qdrant`) | port 6333-6334 |
+| **SearXNG** | Docker konteiner (`searxng`) | port 8888 |
+| **PostgreSQL** | Docker konteiner (`postgres_postgis`) | port 5432 |
+
+**NB!** Ollama EI OLE enam Dockeris. See jookseb native systemd teenusena koos ROCm GPU toega.
+Vana Dockeri konteiner (`ollama-rocm`) on eemaldatud.
+
+## GPU / ROCm
+
+Server: **AZW GTR Pro** mini-PC
+- CPU: AMD Ryzen AI Max+ 395 (16C/32T, Zen 5)
+- GPU: AMD Radeon 8060S (RDNA 3.5, gfx1151, 40 CU)
+- ROCm: 7.2.2 installeeritud hostil (`/opt/rocm/`)
+- NPU: AMD RyzenAI (aie2p) – hetkel kasutamata
+
+ROCm teegid on registreeritud süsteemis:
+
+    # Kontrolli GPU olekut
+    rocm-smi
+    rocminfo
+    cat /sys/class/drm/card1/device/gpu_busy_percent
+
+    # ROCm teegid
+    ls /opt/rocm/lib/libamdhip64*
+    ldconfig -p | grep amdhip64
+
+## Ollama haldus (native, systemd)
+
+Ollama teenus jookseb hostil `ollama.service` nimega:
+
+    # Ollama teenuse olek
+    sudo systemctl status ollama
+
+    # Taaskäivita
+    sudo systemctl restart ollama
+
+    # Logid
+    journalctl -u ollama -f
+    journalctl -u ollama --no-pager -n 50
+
+    # Kontrolli GPU tuvastust
+    journalctl -u ollama --no-pager | grep -iE 'gpu|rocm|gfx|inference'
+
+    # Kasuta ollama CLI-d
+    ollama list        # mudelite nimekiri
+    ollama ps          # hetkel laetud mudelid
+    ollama show <nimi> # mudeli detailid
+
+Teenuse konfiguratsioon:
+- Service fail: `/etc/systemd/system/ollama.service`
+- Override: `/etc/systemd/system/ollama.service.d/override.conf`
+- Mudelite asukoht: `/home/ardo/.ollama/models`
+- Kasutaja: `ollama` (grupid: `render`, `video`, `ardo`)
+- GPU override: `HSA_OVERRIDE_GFX_VERSION=11.5.1`
+- ROCm teegid: `LD_LIBRARY_PATH=/opt/rocm/lib`
+
+### Paigaldatud mudelid
+
+| Mudel | Suurus | Kasutus |
+|-------|--------|---------|
+| `nomic-embed-text:latest` | 274 MB | **RAG embedding (GPU)** |
+| `qwen3:30b-fast` | 18 GB | LLM vestlus |
+| `deepseek-r1:14b` | 9.0 GB | LLM vestlus (reasoning) |
+| `translategemma:12b` | 8.1 GB | Tõlkimine |
+| `bge-m3:latest` | 1.2 GB | Varu-embedding |
+
+### Mudelite haldus
+
+    # Lae mudel
+    ollama pull qwen3:30b-fast
+
+    # Eemalda mudel
+    ollama rm nomic-embed-text-cpu
+
+    # Testi mudelit (verbose näitab tok/sek)
+    ollama run nomic-embed-text "test" --verbose
+
+## Embedding konfiguratsioon (RAG)
+
+OpenWebUI embeddingud on seadistatud kasutama **nomic-embed-text:latest** mudelit
+koos GPU kiirendusega. **Ära kasuta** `nomic-embed-text-cpu` mudelit – see on
+ainult CPU jaoks (`num_gpu=0`) ja oluliselt aeglasem.
+
+Compose failis: `RAG_EMBEDDING_MODEL=nomic-embed-text`
+
+### Jõudluse võrdlus
+
+| Mõõdik | CPU mudel (-cpu) | GPU mudel (latest) | Kiirendus |
+|--------|-------------------|---------------------|-----------|
+| 901 embedit (batch) | ~39 s | ~9.5 s | **4x** |
+| 848 embedit (batch) | ~39 s | ~8.1 s | **5x** |
+| Üksik API päring | ~28 s | ~0.3 s | **100x** |
+
+### Embedding API test
+
+    # Testi embeddingut
+    curl http://localhost:11434/api/embeddings       -d '{
+        "model": "nomic-embed-text",
+        "prompt": "How to implement semantic search with Python"
+      }'
+
+### Vektorbaasi puhastamine
+
+    # Qdrant kollektsiooni kustutamine
+    curl -X DELETE http://qdrant:6333/collections/open-webui_files
+
+    # Läbi OpenWebUI skripti
+    docker exec -ti open-webui bash -c "python /scripts/clean_qdrant.py"
+
+## Seadistus
+
+Kasutab:
+- **Ollama** (native, systemd) – LLM mudelid ja embeddingud
+- **SearXNG** – Veebiotsing
+- **Qdrant** – Vektorbaas (väljaspool seda compose'i)
+- **PostgreSQL** – Andmebaas
+
+Olulised keskkonnamuutujad compose failis:
+- `USE_OLLAMA_DOCKER=false` – väldib OpenWebUI sisemist ollama käivitust
+- `RAG_EMBEDDING_MODEL=nomic-embed-text` – GPU embedding mudel
+- `RAG_EMBEDDING_ENGINE=ollama` – embedding API läbi ollama
+- `OLLAMA_API_BASE_URL=http://100.87.1.24:11434` – ollama API
+- `VECTOR_DB=qdrant` – vektorbaasi tüüp
+
+## Docker käsud
+
+    # Ava kaust
+    cd /opt/docker-compose/third/server/openwebui/
+
+    # Käivita (ainult open-webui teenus)
+    docker-compose up -d open-webui
+
+    # Käivita kõik teenused
+    docker-compose up -d
+
+    # Peata
+    docker-compose down
+
+    # Taaskäivita
+    docker-compose restart open-webui
+
+    # Logid (ainult open-webui)
+    docker-compose logs -f open-webui
+
+    # Logid (kõik)
+    docker-compose logs -f
+
+    # Uuenda
+    docker-compose pull open-webui
+    docker-compose up -d open-webui
+
+## Docker otse
+
+    # Konteinerite seis
+    docker ps | grep -E "open-webui|tika|mcp"
+
+    # Logid nime järgi
+    docker logs open-webui
+    docker logs tika
+
+    # Sisene konteinerisse
+    docker exec -it open-webui /bin/bash
+    docker exec -it tika /bin/bash
+
+## Teenused
+
+| Teenus | Port | URL |
+|--------|------|-----|
+| Open WebUI | 3010 | http://100.87.1.24:3010 |
+| Ollama API | 11434 | http://100.87.1.24:11434 (native, mitte Docker) |
+| MCP Filesystem | 3100 | http://127.0.0.1:3100/mcp (ainult localhost) |
+| MCP Terminal | 3110 | http://127.0.0.1:3110/mcp (ainult localhost) |
+| Apache Tika | 9998 | http://100.87.1.24:9998 |
+
+## Tervisekontroll
+
+Open WebUI kontrollib iseenda tervist iga 30 sekundi järel:
+
+    # Testi käsitsi
+    curl http://100.87.1.24:3010/health
+
+    # Ollama tervisekontroll
+    curl http://100.87.1.24:11434/api/tags
+
+## Olulised kataloogid
+
+| Asukoht | Sisu |
+|---------|------|
+| `/opt/docker-compose/third/server/openwebui/` | Compose failid ja see dokument |
+| `/data/docker/open-webui/scripts` | Skriptid |
+| `/backups/docker/open-webui` | Varukoopiad |
+| `/home/ardo/.ollama/models` | Ollama mudelid (35 GB) |
+| `/opt/rocm/` | ROCm installatsioon |
+| `/etc/systemd/system/ollama.service` | Ollama systemd teenus |
+| `/etc/systemd/system/ollama.service.d/override.conf` | Ollama teenuse override |
+
+## Fallback: Dockeri ollama taastamine
+
+Kui on vaja minna tagasi Dockeri ollama peale (nt probleemid native installiga):
+
+    # Peata native ollama
+    sudo systemctl stop ollama
+
+    # Käivita Docker ollama (vana startup.sh põhjal)
+    docker run -d       --name ollama-rocm       --restart unless-stopped       --device /dev/kfd       --device /dev/dri       --security-opt seccomp=unconfined       --security-opt label=disable       -p 11434:11434       -v /home/ardo/.ollama/:/root/.ollama/       -e OLLAMA_HOST=0.0.0.0:11434       -e HSA_OVERRIDE_GFX_VERSION=11.5.1       -e OLLAMA_NUM_PARALLEL=4       ollama/ollama:rocm
+
+    # Vajadusel muuda OpenWebUI compose failis:
+    #   USE_OLLAMA_DOCKER=true
+    # ja taaskäivita:
+    #   docker-compose up -d open-webui
+
+## MCP tööriistade kasutamine OpenWebUIs
+
+Vestluses ava `@` menüü või klõpsa `+` nuppu ja vali **Filesystem** või **Terminal**.
+
+### @Filesystem — failihaldus (AI tööriist)
+
+| Tööriist | Näide |
+|----------|-------|
+| `list_directory` | `@Filesystem list directory path=/data` |
+| `read_file` | `@Filesystem read file path=/scripts/clean_qdrant.py` |
+| `write_file` | `@Filesystem write file path=/backups/märkmed.txt content="Tere!"` |
+| `search_files` | `@Filesystem search files path=/scripts pattern=*.py` |
+| `get_file_info` | `@Filesystem get file info path=/data` |
+| `create_directory` | `@Filesystem create directory path=/backups/test` |
+
+Lubatud kataloogid: `/data`, `/scripts`, `/backups`
+
+### @Terminal — käsurida (AI tööriist)
+
+| Tööriist | Näide |
+|----------|-------|
+| `run_command` | `@Terminal run_command: docker ps` |
+| | `@Terminal run_command: df -h /` |
+| | `@Terminal run_command: docker logs open-webui --tail 20` |
+| | `@Terminal run_command: curl -s http://open-webui:8080/health` |
+| | `@Terminal run_command: uname -a` |
+
+Lubatud käsud: `ls`, `cat`, `grep`, `df`, `du`, `ps`, `docker ps/logs/inspect`, `curl`, `ping`, `uname`, `echo`, `stat`, `which`, `whoami`, `env`, `tree`, `find`, `head`, `tail`, `sort`, `uniq`, `file`, `free`, `uptime`, `id`, `date`, `host`
+Blokeeritud: `rm`, `sudo`, `shutdown`, `|` (torud), `$()`, `>`, `&&`, `docker rm/stop/kill`
+
+Näidisvestlus AI-ga:
+
+> **Sina:** "Vaata, mis toimub – docker logs open-webui --tail 10"
+> **AI:** (kasutab @Terminal run_command) "Siin on viimased logiread..."
+>
+> **Sina:** "Leia /scripts kataloogist kõik Python skriptid"
+> **AI:** (kasutab @Filesystem search_files) "Leidsin faili clean_qdrant.py"
+
+## Tailscale MCP serverite eksponeerimiseks
+
+MCP serverid on seotud ainult `127.0.0.1`-ga (turvalisuse mõttes).
+Kui vajad neile ligipääsu läbi Tailscale'i, kasuta:
+
+    # MCP Filesystem (Streamable HTTP)
+    sudo tailscale serve --bg --https 3100 http://127.0.0.1:3100
+
+    # MCP Terminal (Streamable HTTP)
+    sudo tailscale serve --bg --https 3110 http://127.0.0.1:3110
+
+    # Kontrolli staatust
+    sudo tailscale serve status
+
+    # Keela
+    sudo tailscale serve --https=3100 off
+    sudo tailscale serve --https=3110 off
+
+Pärast seda on MCP serverid kättesaadavad:
+- `https://100.87.1.24:3100/mcp`
+- `https://100.87.1.24:3110/mcp`
+
+**NB!** Brauseris `/sse` avamine ei tööta, sest SSE on püsiv ühendus (Streamable HTTP),
+mitte tavalise GET-päringuga laetav leht. MCP klient (OpenWebUI) haldab ühendust ise.
+
+## Võrguinfo
+
+- Kõik konteinerid on `main_ai_network` peal (compose'is `ai_network`)
+- Ligipääs Ollamale, SearXNG-le ja Qdrantile läbi `host.docker.internal`
+- `extra_hosts` on seadistatud compose failis
+
+## Vead ja tõrkeotsing
+
+### Embedimine aeglane
+- Kontrolli, et `RAG_EMBEDDING_MODEL=nomic-embed-text` (ilma `-cpu`-ta)
+- Kontrolli `ollama ps` – peaks näitama "100% GPU"
+- Kui mudel on `nomic-embed-text-cpu`, eemalda see: `ollama rm nomic-embed-text-cpu`
+- Kontrolli GPU olekut: `cat /sys/class/drm/card1/device/gpu_busy_percent`
+
+### Failide üleslaadimine ebaõnnestub – "Too many open files"
+- Põhjus: compose failis puudub `ulimits:` seadistus, Dockeri vaikimisi limiit on 1024
+- Lahendus: kontrolli, et compose failis on `ulimits.nofile.soft=65536` ja `hard=65536`
+- Kontrolli konteineri limiiti: `docker exec open-webui cat /proc/1/limits | grep "open files"`
+- Peaks näitama: `Max open files  65536  65536`
+
+### Ollama ei leia GPU-d
+
+    # Kontrolli ROCm teeke
+    ldconfig -p | grep amdhip64
+
+    # Kontrolli HSA override
+    journalctl -u ollama --no-pager | grep HSA_OVERRIDE
+
+    # Taaskäivita ollama
+    sudo systemctl restart ollama
+
+    # Kontrolli logisid
+    journalctl -u ollama -f | grep -i gpu
+
+### OpenWebUI ei ühendu Ollamaga
+
+    # Testi ollama API-t
+    curl http://100.87.1.24:11434/api/tags
+
+    # Kontrolli compose faili
+    grep OLLAMA /opt/docker-compose/third/server/open-webui/docker-compose.yml
+
+    # Taaskäivita OpenWebUI
+    cd /opt/docker-compose/third/server/openwebui/
+    docker-compose restart open-webui
+
+## Ajalugu
+
+| Kuupäev | Muudatus |
+|---------|----------|
+| 2025-07-05 | Ollama viidud Dockerist native systemd peale (ROCm GPU tugi) |
+| 2025-07-05 | Embedding mudel muudetud `nomic-embed-text-cpu` -> `nomic-embed-text:latest` |
+| 2025-07-05 | Lisatud `USE_OLLAMA_DOCKER=false` compose faili |
+| 2025-07-05 | `startup.sh` OpenWebUI osa asendatud docker-compose haldusega |
+| 2025-07-05 | Lisatud `ulimits.nofile=65536` compose faili (parandab "Too many open files") |

+ 5 - 1
third/server/openwebui/docker-compose.yml

@@ -11,6 +11,7 @@ services:
   open-webui:
     image: ghcr.io/open-webui/open-webui:main
     container_name: open-webui
+    mem_limit: 8g
     restart: always
     ports:
       # Kui kasutad tailscale'i siis
@@ -21,6 +22,7 @@ services:
     volumes:
       - data:/app/backend/data
       - /data/docker/open-webui/scripts:/scripts
+      - /data/docker/open-webui/patches/qdrant_multitenancy.py:/app/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py
       #- /data/docker/open-webui/patches/searxng.py:/app/backend/open_webui/retrieval/web/searxng.py
       - /backups/docker/open-webui:/backups
       - /etc/localtime:/etc/localtime
@@ -43,7 +45,9 @@ services:
       # --- RAG ja EMBEDDINGUD ---
       - OLLAMA_BASE_URL=http://100.87.1.24:11434
       - RAG_EMBEDDING_ENGINE=ollama
-      - RAG_EMBEDDING_MODEL=bge-m3
+      - RAG_EMBEDDING_MODEL=nomic-embed-text
+      # ⛔ ÄRA muuda: embeddinguks AINULT nomic-embed-text (Ardo otsus 13.09.2026).
+      #    bge-m3 ei tohi kasutada (Qdrant vektorid on 768-dim = nomic).
       - USE_OLLAMA_DOCKER=false
       # Chunking (märgid, mitte sõnad)
       #- RAG_TEXT_SPLITTER=recursive

+ 158 - 0
third/server/openwebui/docker-compose.yml.bak-embed-20260913-190443

@@ -0,0 +1,158 @@
+version: "3.9"
+# Tailscale ühendus:
+# sudo tailscale serve --bg --https 3000 http://127.0.0.1:3000
+# sudo tailscale serve --https=3000 off
+# sudo tailscale serve status
+
+# ═══════════════════════════════════════════════════════════════
+# OPEN WEBUI - Professionaalne LLM liides
+# ═══════════════════════════════════════════════════════════════
+services:
+  open-webui:
+    image: ghcr.io/open-webui/open-webui:main
+    container_name: open-webui
+    mem_limit: 8g
+    restart: always
+    ports:
+      # Kui kasutad tailscale'i siis
+      #- "127.0.0.1:3000:8080"
+      - "100.87.1.24:3010:8080"   # ainult tailnet; avalikult läbi prod (openwebui.odamus.com)
+    #env_file:
+      #- /data/docker/open-webui/.env
+    volumes:
+      - data:/app/backend/data
+      - /data/docker/open-webui/scripts:/scripts
+      - /data/docker/open-webui/patches/qdrant_multitenancy.py:/app/backend/open_webui/retrieval/vector/dbs/qdrant_multitenancy.py
+      #- /data/docker/open-webui/patches/searxng.py:/app/backend/open_webui/retrieval/web/searxng.py
+      - /backups/docker/open-webui:/backups
+      - /etc/localtime:/etc/localtime
+      #- /data/docker/open-webui/.env:/app/backend/open_webui/.env
+      #- /data/docker/open-webui/patches:/patches:ro
+    #entrypoint: ["/bin/sh", "-c", "python /patches/patch_ollama_embeddings.py; python /patches/patch_qdrant.py && exec /app/backend/start.sh"]
+    environment:
+       # --- PÕHISED ---
+      - WEBUI_SECRET_KEY=ai_webui_secret_2026_change_me_to_random_string
+      - TZ=Europe/Tallinn
+      - LANG=C.UTF-8
+      - CHAT_STREAM_RESPONSE_CHUNK_MAX_BUFFER_SIZE=52428800
+      - ENABLE_SIGNUP=false   # esimesel korral true, hiljem false
+      - OPENAI_API_BASE_URLS=http://100.87.1.24:8070/v1
+      - OPENAI_API_KEYS=sk-dummy-key-not-required
+
+      - OLLAMA_API_BASE_URL=http://100.87.1.24:11434
+      - RAG_EMBEDDING_OPENAI_API_BASE_URL=http://100.87.1.24:11434
+
+      # --- RAG ja EMBEDDINGUD ---
+      - OLLAMA_BASE_URL=http://100.87.1.24:11434
+      - RAG_EMBEDDING_ENGINE=ollama
+      - RAG_EMBEDDING_MODEL=nomic-embed-text
+      - USE_OLLAMA_DOCKER=false
+      # Chunking (märgid, mitte sõnad)
+      #- RAG_TEXT_SPLITTER=recursive
+      #- RAG_CHUNK_SIZE=1000
+      #- RAG_CHUNK_OVERLAP=100
+      #- RAG_CHUNK_MIN_SIZE=100
+      # Hybrid search + reranker
+      #- RAG_HYBRID_SEARCH_ENABLED=true
+      #- RAG_TOP_K=20
+      # Full context režiim maha (kasuta fokuseeritud RAG-i)
+      - RAG_FULL_CONTEXT_MODE=false
+
+      # TEKSTI TÜKELDAMINE – need on kõige olulisemad suurte failide jaoks
+      - TEXT_SPLITTER=recursive
+      # kasuta rekursiivset tükeldajat (toetab keelepiire)
+      - CHUNK_SIZE=1500
+      # vähenda 500 tähemärgile, et vältida kontekstiületust
+      - CHUNK_OVERLAP=150
+      # kattuvus tükkide vahel
+      - CHUNK_MIN_SIZE_TARGET=300
+      # kui vaja, aga pole kohustuslik
+      - HYBRID_SEARCH_ENABLED=true
+      - TOP_K=20
+
+      - RAG_WEB_SEARCH_RESULT_COUNT=3
+      - WEB_LOADER_ENGINE=default
+      - CONCURRENT_REQUESTS=20   # kui pole juba
+
+      # Failide üleslaadimise piirangud
+      - UPLOAD_MAX_SIZE=6291456
+      # 6 MB baitides
+      - ALLOWED_FILE_EXTENSIONS=md,pdf,txt,docx
+      # luba ka markdown
+
+      # --- QDRANT --- (AINULT NEED!)
+      - VECTOR_DB=qdrant
+      - QDRANT_URI=http://qdrant:6333
+      #- VECTOR_DB=postgres
+      #- VECTOR_DB=weaviate
+      #- WEAVIATE_HOST=http://weaviate:8080
+
+      # --- SEARXNG (veebiotsing) ---
+      - ENABLE_RAG_WEB_SEARCH=true
+      - BYPASS_RETRIEVAL_ACCESS_CONTROL=true
+      - BYPASS_WEB_SEARCH_EMBEDDING_AND_RETRIEVAL=true
+      - RAG_WEB_SEARCH_ENGINE=searxng
+      - SEARXNG_QUERY_URL=http://100.87.1.24:8888/search?q=<query>&format=json&categories=general,news,science
+      #- SEARXNG_QUERY_URL=http://searxng:8080/search?q=<query>&format=json&categories=general,news,science
+      #- SEARXNG_QUERY_URL=http://localhost:8080/search?q=<query>&format=json&categories=general,news,science
+      - DATABASE_URL=postgresql://ai_user:ai_secure_pass_2026@postgres:5432/openwebui_test_db
+
+      # --- MCP TOOL SERVER ÜHENDUSED ---
+      - 'TOOL_SERVER_CONNECTIONS=[{"url":"http://mcp-filesystem-sse:3100/mcp","path":"","type":"mcp","auth_type":"none","key":"","headers":{},"config":{"enable":true,"access_grants":[]},"info":{"id":"filesystem","name":"Filesystem","description":"YOU CAN AND MUST USE THIS TOOL to create directories, write files, and read files on the server. Creates parent directories automatically. Use write_file to save code files. Allowed paths: /projects/data, /data, /scripts, /backups"}},{"url":"http://mcp-terminal:3110/mcp","path":"","type":"mcp","auth_type":"none","key":"","headers":{},"config":{"enable":true,"access_grants":[]},"info":{"id":"terminal","name":"Terminal","description":"YOU CAN AND MUST USE THIS TOOL to execute shell commands (mkdir, npm, npx, node, ng, python3, ls, cat). Also provides write_file and create_directory tools for saving files. This has WORKING WRITE ACCESS to /projects/data"}}]'
+    networks:
+      - ai_network
+      - prod_net
+    ulimits:
+      nofile:
+        soft: 65536
+        hard: 65536
+    extra_hosts:
+      - "host.docker.internal:host-gateway"
+    healthcheck:
+      test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]
+      interval: 30s
+      timeout: 10s
+      retries: 3
+      start_period: 60s
+  mcp-terminal:
+    build: ./mcp-servers
+    container_name: mcp-terminal
+    entrypoint: ["/entrypoint-terminal.sh"]
+    restart: unless-stopped
+    ports:
+      - "127.0.0.1:3110:3110"
+    environment:
+      - TZ=Europe/Tallinn
+      - LANG=C.UTF-8
+    volumes:
+      - /data/mcp-filesystem:/projects/data
+      - /etc/localtime:/etc/localtime
+      - /var/run/docker.sock:/var/run/docker.sock
+    networks:
+      - ai_network
+
+  tika:
+    image: apache/tika:latest-full     # "full" sisaldab Tesseract OCR-i (soovitatav)
+    container_name: tika
+    ports:
+      - "9998:9998"                     # Vajadusel väljapoole eksponeerimiseks
+    restart: unless-stopped
+    environment:
+      - TZ=Europe/Tallinn
+      - LANG=C.UTF-8
+    volumes:
+      - /etc/localtime:/etc/localtime
+    networks:
+      - ai_network
+
+volumes:
+  data:
+    name: 'open-webui_data'
+    driver: local
+
+networks:
+  ai_network:
+    external: true
+    name: main_ai_network
+  prod_net:
+    external: true