docker-compose.yml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385
  1. version: '3.8'
  2. services:
  3. portainer:
  4. image: portainer/portainer-ce:latest
  5. container_name: portainer
  6. restart: always
  7. ports:
  8. - "8000:8000"
  9. - "9000:9000"
  10. - "9443:9443"
  11. volumes:
  12. - /var/run/docker.sock:/var/run/docker.sock
  13. - portainer_data:/data
  14. environment:
  15. - TZ=Europe/Tallinn
  16. networks:
  17. - ai_network
  18. postgres:
  19. image: kartoza/postgis:16
  20. container_name: postgres_postgis
  21. restart: always
  22. ports:
  23. - "5432:5432"
  24. environment:
  25. POSTGRES_USER: ai_user
  26. POSTGRES_PASSWORD: ai_secure_pass_2026
  27. POSTGRES_DB: research_db
  28. POSTGRES_INITDB_ARGS: "-c shared_buffers=256MB -c max_connections=200"
  29. PGDATA: /var/lib/postgresql/data/pgdata
  30. TZ: Europe/Tallinn
  31. volumes:
  32. - postgres_data:/var/lib/postgresql/data
  33. - ./init-db:/docker-entrypoint-initdb.d
  34. healthcheck:
  35. test: ["CMD-SHELL", "pg_isready -U ai_user -d research_db"]
  36. interval: 10s
  37. timeout: 5s
  38. retries: 5
  39. networks:
  40. - ai_network
  41. mariadb:
  42. image: mariadb:11
  43. container_name: mariadb
  44. restart: always
  45. ports:
  46. - "3306:3306"
  47. environment:
  48. MYSQL_ROOT_PASSWORD: ai_root_pass_2026
  49. MYSQL_DATABASE: research_mariadb
  50. MYSQL_USER: ai_mariadb_user
  51. MYSQL_PASSWORD: ai_mariadb_pass_2026
  52. TZ: Europe/Tallinn
  53. volumes:
  54. - mariadb_data:/var/lib/mysql
  55. healthcheck:
  56. test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uai_mariadb_user", "-pai_mariadb_pass_2026"]
  57. interval: 10s
  58. timeout: 5s
  59. retries: 5
  60. networks:
  61. - ai_network
  62. weaviate:
  63. image: semitechnologies/weaviate:latest
  64. container_name: weaviate
  65. restart: always
  66. ports:
  67. - "8080:8080"
  68. - "50051:50051"
  69. environment:
  70. QUERY_DEFAULTS_LIMIT: 25
  71. AUTHENTICATION_ANONYMOUS_ACCESS_ENABLED: 'true'
  72. PERSISTENCE_DATA_PATH: '/var/lib/weaviate'
  73. DEFAULT_VECTORIZER_MODULE: 'none'
  74. CLUSTER_HOSTNAME: 'weaviate'
  75. volumes:
  76. - weaviate_data:/var/lib/weaviate
  77. networks:
  78. - ai_network
  79. ollama:
  80. image: ollama/ollama:rocm
  81. container_name: ollama
  82. restart: always
  83. ports:
  84. - "11434:11434"
  85. volumes:
  86. - ollama_data:/root/.ollama
  87. - /models/ollama:/models
  88. environment:
  89. - OLLAMA_LLM_LIBRARY=rocm
  90. - HSA_OVERRIDE_GFX_VERSION=11.0.0
  91. - HCC_AMDGPU_TARGET=gfx1100
  92. - OLLAMA_HOST=0.0.0.0:11434
  93. devices:
  94. - /dev/kfd:/dev/kfd
  95. - /dev/dri:/dev/dri
  96. networks:
  97. - ai_network
  98. # ═══════════════════════════════════════════════════════════
  99. # HEALTHCHECK - Vajalik Open WebUI depends_on jaoks
  100. # ═══════════════════════════════════════════════════════════
  101. healthcheck:
  102. test: ["CMD-SHELL", "ollama list || exit 1"]
  103. interval: 30s
  104. timeout: 10s
  105. retries: 3
  106. start_period: 45s
  107. # ═══════════════════════════════════════════════════════════════════════════════
  108. # SEARXNG - Privaatne metaotsingumotor (Google, Bing, DuckDuckGo, arXiv, PubMed)
  109. # ═══════════════════════════════════════════════════════════════════════════════
  110. searxng:
  111. image: searxng/searxng:latest
  112. container_name: searxng
  113. restart: always
  114. ports:
  115. - "8888:8080"
  116. volumes:
  117. - ./searxng:/etc/searxng:rw
  118. environment:
  119. - SEARXNG_BASE_URL=http://100.87.1.24:8888/
  120. - SEARXNG_SECRET=searxng_secret_key_change_me_2026_random_string
  121. - TZ=Europe/Tallinn
  122. - SEARXNG_LIMITER=false
  123. networks:
  124. - ai_network
  125. healthcheck:
  126. test: ["CMD", "wget", "--spider", "-q", "http://localhost:8080/healthz"]
  127. interval: 30s
  128. timeout: 10s
  129. retries: 3
  130. start_period: 30s
  131. # ═══════════════════════════════════════════════════════════════
  132. # OPEN WEBUI - Professionaalne LLM liides
  133. # ═══════════════════════════════════════════════════════════════
  134. open-webui:
  135. image: ghcr.io/open-webui/open-webui:main
  136. container_name: open-webui
  137. restart: always
  138. ports:
  139. - "3000:8080"
  140. volumes:
  141. - open-webui_data:/app/backend/data
  142. - ./open-webui-uploads:/app/backend/data/uploads
  143. - ./open-webui-docs:/app/backend/data/docs
  144. environment:
  145. # ═══════════════════════════════════════════════════════════
  146. # PÕHISEADED
  147. # ═══════════════════════════════════════════════════════════
  148. - WEBUI_SECRET_KEY=ai_webui_secret_2026_change_me_to_random_string
  149. - TZ=Europe/Tallinn
  150. - OLLAMA_BASE_URL=http://ollama:11434
  151. - OPENAI_API_BASE_URLS=http://100.87.1.24:8070/v1
  152. - OPENAI_API_KEYS=sk-dummy-key-not-required
  153. # ═══════════════════════════════════════════════════════════
  154. # WEBSOCKET & STREAMING
  155. # ═══════════════════════════════════════════════════════════
  156. - ENABLE_CHAT_STREAMING=true
  157. - WEBSOCKET_MANAGER_ENABLED=true
  158. - POLLING_INTERVAL=500
  159. # ═══════════════════════════════════════════════════════════
  160. # RAG & EMBEDDINGS (ILMA VECTOR_DB MUUTUJATA!)
  161. # ═══════════════════════════════════════════════════════════
  162. - ENABLE_RAG_WEB_SEARCH=true
  163. - RAG_EMBEDDING_ENGINE=ollama
  164. - RAG_EMBEDDING_MODEL=nomic-embed-text:latest
  165. - CHUNK_SIZE=2000
  166. - CHUNK_OVERLAP=200
  167. - RAG_TOP_K=10
  168. - RAG_RELEVANCE_THRESHOLD=0.5
  169. - PDF_EXTRACT_IMAGES=true
  170. - ENABLE_RAG_LOCAL_WEB_FETCH=true
  171. # ═══════════════════════════════════════════════════════════
  172. # WEB SEARCH (SearXNG integratsioon)
  173. # ═══════════════════════════════════════════════════════════
  174. #- RAG_WEB_SEARCH_ENGINE=duckduckgo
  175. - RAG_WEB_SEARCH_ENGINE=searxng
  176. #- SEARXNG_QUERY_URL=http://searxng:8080/search?q=<query>&categories=general,science
  177. - SEARXNG_QUERY_URL=http://searxng:8080/search?q=<query>&format=json&categories=general,news,science
  178. - RAG_WEB_SEARCH_RESULT_COUNT=5
  179. - RAG_WEB_SEARCH_CONCURRENT_REQUESTS=8
  180. # ═══════════════════════════════════════════════════════════
  181. # WEAVIATE - KOMMENTEERITUD VÄLJA
  182. # ═══════════════════════════════════════════════════════════
  183. # - VECTOR_DB=weaviate # <- EEMALDA SEE RIDA!
  184. # - WEAVIATE_HOST=weaviate # <- EEMALDA
  185. # - WEAVIATE_PORT=8080 # <- EEMALDA
  186. # - WEAVIATE_GRPC_HOST=weaviate # <- EEMALDA
  187. # - WEAVIATE_GRPC_PORT=50051 # <- EEMALDA
  188. # - WEAVIATE_USE_AUTH=false # <- EEMALDA
  189. # - WEAVIATE_TIMEOUT=30 # <- EEMALDA
  190. # ═══════════════════════════════════════════════════════════
  191. # AUTENTIMINE
  192. # ═══════════════════════════════════════════════════════════
  193. - WEBUI_AUTH=true
  194. - ENABLE_SIGNUP=false
  195. - DEFAULT_USER_ROLE=user
  196. - ENABLE_LOGIN_FORM=true
  197. - ENABLE_API_KEY=true
  198. # ═══════════════════════════════════════════════════════════
  199. # FAILID
  200. # ═══════════════════════════════════════════════════════════
  201. - UPLOAD_DIR=/app/backend/data/uploads
  202. - ENABLE_IMAGE_GENERATION=false
  203. - ENABLE_FILE_UPLOAD=true
  204. - FILE_UPLOAD_MAX_SIZE=100
  205. - FILE_UPLOAD_ALLOWED_TYPES=.pdf,.txt,.md,.csv,.json,.xml
  206. # ═══════════════════════════════════════════════════════════
  207. # VESTLUSED
  208. # ═══════════════════════════════════════════════════════════
  209. - ENABLE_MESSAGE_RATING=true
  210. - ENABLE_COMMUNITY_SHARING=false
  211. - ENABLE_ADMIN_EXPORT=true
  212. - ENABLE_ADMIN_CHAT_ACCESS=false
  213. - CHAT_CONTEXT_WINDOW=8192
  214. - TASK_MODEL=qwen2.5:7b
  215. - TASK_MODEL_EXTERNAL=http://100.87.1.24:8070/v1
  216. # ═══════════════════════════════════════════════════════════
  217. # CORS & MUUD
  218. # ═══════════════════════════════════════════════════════════
  219. - CORS_ALLOW_ORIGIN=*
  220. - AUDIO_STT_ENGINE=whisper
  221. - AUDIO_TTS_ENGINE=openedai-speech
  222. - AUDIO_STT_OPENAI_API_BASE_URL=http://100.87.1.24:8070/v1
  223. - ENABLE_MODEL_FILTER=true
  224. - BYPASS_MODEL_ACCESS_CONTROL=false
  225. - SHOW_ADMIN_DETAILS=true
  226. - GLOBAL_LOG_LEVEL=INFO
  227. - WEBUI_SESSION_COOKIE_SECURE=false
  228. - WEBUI_SESSION_COOKIE_SAME_SITE=lax
  229. - DATABASE_URL=postgresql://ai_user:ai_secure_pass_2026@postgres:5432/openwebui_db
  230. depends_on:
  231. ollama:
  232. condition: service_healthy
  233. postgres:
  234. condition: service_healthy
  235. networks:
  236. - ai_network
  237. extra_hosts:
  238. - "host.docker.internal:host-gateway"
  239. healthcheck:
  240. test: ["CMD-SHELL", "curl -f http://localhost:8080/health || exit 1"]
  241. interval: 30s
  242. timeout: 10s
  243. retries: 3
  244. start_period: 60s
  245. jupyter:
  246. image: jupyter/datascience-notebook:latest
  247. container_name: jupyter
  248. restart: always
  249. ports:
  250. - "8887:8888"
  251. environment:
  252. - JUPYTER_ENABLE_LAB=yes
  253. - JUPYTER_TOKEN=ai_server_2026
  254. - TZ=Europe/Tallinn
  255. volumes:
  256. - ./notebooks:/home/jovyan/work
  257. - ./data:/home/jovyan/data
  258. - jupyter_data:/home/jovyan/.jupyter
  259. networks:
  260. - ai_network
  261. command: start-notebook.sh --NotebookApp.token='ai_server_2026' --NotebookApp.allow_root=True
  262. rocm-pytorch:
  263. image: rocm/pytorch:latest
  264. container_name: rocm_pytorch
  265. restart: always
  266. ports:
  267. - "8889:8888"
  268. - "6006:6006"
  269. environment:
  270. - HSA_OVERRIDE_GFX_VERSION=11.5.1
  271. - PYTORCH_ROCM_ARCH=gfx1151
  272. - ROCM_HOME=/opt/rocm
  273. - TZ=Europe/Tallinn
  274. - TORCH_ROCM_AOTRITON_ENABLE_EXPERIMENTAL=1
  275. devices:
  276. - /dev/kfd:/dev/kfd
  277. - /dev/dri:/dev/dri
  278. volumes:
  279. - ./pytorch-workspace:/workspace
  280. - ./models:/models
  281. - ./data:/data
  282. - rocm_pytorch_data:/root/.cache
  283. working_dir: /workspace
  284. cap_add:
  285. - SYS_PTRACE
  286. security_opt:
  287. - seccomp=unconfined
  288. ipc: host
  289. shm_size: 8G
  290. group_add:
  291. - video
  292. networks:
  293. - ai_network
  294. command: >
  295. bash -c "pip install jupyter notebook tensorboard transformers datasets huggingface_hub scikit-learn pandas psycopg2-binary &&
  296. jupyter notebook --ip=0.0.0.0 --port=8888 --no-browser --allow-root --NotebookApp.token='ai_pytorch_2026'"
  297. rag-api:
  298. build:
  299. context: /opt/docker-compose/main/Dockerfile/rag-api
  300. dockerfile: Dockerfile
  301. container_name: rag_api
  302. restart: always
  303. ports:
  304. - "8072:8000"
  305. environment:
  306. LLAMA_CPP_URL: http://100.87.1.24:8070/completion
  307. WEAVIATE_HOST: weaviate
  308. WEAVIATE_HTTP_PORT: 8080
  309. WEAVIATE_URL: http://weaviate:8080
  310. WEAVIATE_CLASS: ScientificArticle
  311. DB_HOST: postgres
  312. DB_PORT: 5432
  313. DB_NAME: pdf_research
  314. DB_USER: osm
  315. DB_PASSWORD: osm
  316. OLLAMA_URL: http://ollama:11434
  317. TZ: Europe/Tallinn
  318. MARIADB_HOST: mariadb
  319. MARIADB_PORT: 3306
  320. MARIADB_DB: research_mariadb
  321. MARIADB_USER: ai_mariadb_user
  322. MARIADB_PASSWORD: ai_mariadb_pass_2026
  323. volumes:
  324. - /home/ardo/rag-demo/pdf-pipeline/src:/app/src
  325. - /home/ardo/rag-demo/pdf-pipeline/data:/app/data
  326. - /home/ardo/rag-demo/pdf-pipeline/output:/app/output
  327. depends_on:
  328. - weaviate
  329. - ollama
  330. - postgres
  331. networks:
  332. - ai_network
  333. healthcheck:
  334. test: ["CMD", "curl", "-f", "http://localhost:8000/docs"]
  335. interval: 30s
  336. timeout: 10s
  337. retries: 3
  338. start_period: 40s
  339. volumes:
  340. portainer_data:
  341. driver: local
  342. postgres_data:
  343. driver: local
  344. weaviate_data:
  345. driver: local
  346. ollama_data:
  347. driver: local
  348. jupyter_data:
  349. driver: local
  350. rocm_pytorch_data:
  351. driver: local
  352. mariadb_data:
  353. driver: local
  354. open-webui_data:
  355. driver: local
  356. networks:
  357. ai_network:
  358. driver: bridge