docker-compose.yml 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526
  1. name: dataops-test
  2. services:
  3. postgres:
  4. image: pgvector/pgvector:pg16
  5. environment:
  6. POSTGRES_DB: dataops
  7. POSTGRES_USER: dataops
  8. POSTGRES_PASSWORD: dataops-test-password
  9. ports:
  10. - "15432:5432"
  11. volumes:
  12. - dataops-test-postgres:/var/lib/postgresql/data
  13. - ./postgres/init:/docker-entrypoint-initdb.d:ro
  14. - ../../database:/dataops-schema:ro
  15. healthcheck:
  16. test: ["CMD-SHELL", "pg_isready -U dataops -d dataops"]
  17. interval: 5s
  18. timeout: 5s
  19. retries: 20
  20. networks:
  21. - dataops-test-net
  22. source-postgres:
  23. image: postgres:16-alpine
  24. environment:
  25. POSTGRES_DB: acceptance
  26. POSTGRES_USER: source_reader
  27. POSTGRES_PASSWORD: source-test-password
  28. ports:
  29. - "25432:5432"
  30. volumes:
  31. - dataops-test-source-postgres:/var/lib/postgresql/data
  32. - ./datasources/postgres/init.sql:/docker-entrypoint-initdb.d/010-acceptance.sql:ro
  33. healthcheck:
  34. test: ["CMD-SHELL", "pg_isready -U source_reader -d acceptance"]
  35. interval: 5s
  36. timeout: 5s
  37. retries: 20
  38. networks:
  39. - dataops-test-net
  40. source-mysql:
  41. image: mysql:8.4
  42. environment:
  43. MYSQL_DATABASE: acceptance
  44. MYSQL_USER: source_reader
  45. MYSQL_PASSWORD: source-test-password
  46. MYSQL_ROOT_PASSWORD: source-root-test-password
  47. ports:
  48. - "23306:3306"
  49. volumes:
  50. - dataops-test-source-mysql:/var/lib/mysql
  51. - ./datasources/mysql/init.sql:/docker-entrypoint-initdb.d/010-acceptance.sql:ro
  52. healthcheck:
  53. test:
  54. - CMD-SHELL
  55. - mysqladmin ping -h 127.0.0.1 -u source_reader -psource-test-password --silent
  56. interval: 5s
  57. timeout: 5s
  58. retries: 30
  59. start_period: 20s
  60. networks:
  61. - dataops-test-net
  62. neo4j:
  63. image: neo4j:5.26-community
  64. environment:
  65. NEO4J_AUTH: neo4j/Passw0rd
  66. NEO4J_server_memory_heap_initial__size: 256m
  67. NEO4J_server_memory_heap_max__size: 512m
  68. NEO4J_server_memory_pagecache_size: 256m
  69. ports:
  70. - "17474:7474"
  71. - "17687:7687"
  72. volumes:
  73. - dataops-test-neo4j:/data
  74. healthcheck:
  75. test: ["CMD-SHELL", "cypher-shell -u neo4j -p Passw0rd 'RETURN 1' >/dev/null 2>&1"]
  76. interval: 10s
  77. timeout: 10s
  78. retries: 30
  79. start_period: 20s
  80. networks:
  81. - dataops-test-net
  82. minio:
  83. image: minio/minio:RELEASE.2025-04-22T22-12-26Z
  84. command: server /data --console-address ":9001"
  85. environment:
  86. MINIO_ROOT_USER: dataops-test
  87. MINIO_ROOT_PASSWORD: dataops-test-password
  88. ports:
  89. - "19000:9000"
  90. - "19001:9001"
  91. volumes:
  92. - dataops-test-minio:/data
  93. healthcheck:
  94. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  95. interval: 5s
  96. timeout: 5s
  97. retries: 20
  98. networks:
  99. - dataops-test-net
  100. minio-init:
  101. image: minio/mc:RELEASE.2025-04-16T18-13-26Z
  102. depends_on:
  103. minio:
  104. condition: service_healthy
  105. entrypoint:
  106. - /bin/sh
  107. - -c
  108. - >-
  109. mc alias set local http://minio:9000 dataops-test dataops-test-password &&
  110. mc mb --ignore-existing local/dataops-bucket
  111. restart: "no"
  112. networks:
  113. - dataops-test-net
  114. n8n:
  115. image: n8nio/n8n:1.100.1
  116. environment:
  117. DB_TYPE: postgresdb
  118. DB_POSTGRESDB_HOST: postgres
  119. DB_POSTGRESDB_PORT: 5432
  120. DB_POSTGRESDB_DATABASE: n8n
  121. DB_POSTGRESDB_USER: dataops
  122. DB_POSTGRESDB_PASSWORD: dataops-test-password
  123. N8N_HOST: localhost
  124. N8N_PORT: 5678
  125. N8N_PROTOCOL: http
  126. N8N_SECURE_COOKIE: "false"
  127. N8N_ENCRYPTION_KEY: dataops-local-test-encryption-key
  128. N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
  129. WEBHOOK_URL: http://localhost:15678/
  130. GENERIC_TIMEZONE: Asia/Shanghai
  131. TZ: Asia/Shanghai
  132. ports:
  133. - "15678:5678"
  134. volumes:
  135. - dataops-test-n8n:/home/node/.n8n
  136. depends_on:
  137. postgres:
  138. condition: service_healthy
  139. healthcheck:
  140. test: ["CMD-SHELL", "wget --spider -q http://127.0.0.1:5678/healthz"]
  141. interval: 10s
  142. timeout: 5s
  143. retries: 30
  144. start_period: 30s
  145. networks:
  146. - dataops-test-net
  147. kestra:
  148. image: kestra/kestra:v1.3.20
  149. command:
  150. - server
  151. - standalone
  152. - --worker-thread=16
  153. - --config
  154. - /etc/kestra/application.yml
  155. stop_grace_period: 6m
  156. environment:
  157. KESTRA_DB_HOST: postgres
  158. KESTRA_DB_NAME: kestra
  159. KESTRA_DB_USERNAME: dataops
  160. KESTRA_DB_PASSWORD: dataops-test-password
  161. KESTRA_USERNAME: ${KESTRA_USERNAME:-admin@dataops.local}
  162. KESTRA_PASSWORD: ${KESTRA_PASSWORD:-DataOpsKestra1!}
  163. ports:
  164. - "127.0.0.1:18080:8080"
  165. volumes:
  166. - dataops-test-kestra:/app/storage
  167. - ./kestra/application.yml:/etc/kestra/application.yml:ro
  168. depends_on:
  169. postgres:
  170. condition: service_healthy
  171. healthcheck:
  172. test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:8081/health"]
  173. interval: 10s
  174. timeout: 5s
  175. retries: 30
  176. start_period: 30s
  177. networks:
  178. - dataops-test-net
  179. kestra-mcp:
  180. image: ghcr.io/kestra-io/mcp-server-python@sha256:1fd62028f60914af31e244ddb0086ed5017420313e2c8547ea9c01b8d24dfc1d
  181. profiles:
  182. - kestra-mcp
  183. stdin_open: true
  184. environment:
  185. KESTRA_BASE_URL: http://kestra:8080/api/v1
  186. KESTRA_TENANT_ID: main
  187. KESTRA_USERNAME: ${KESTRA_USERNAME:-admin@dataops.local}
  188. KESTRA_PASSWORD: ${KESTRA_PASSWORD:-DataOpsKestra1!}
  189. KESTRA_MCP_DISABLED_TOOLS: ee,files,kv,namespace
  190. KESTRA_MCP_LOG_LEVEL: ERROR
  191. depends_on:
  192. kestra:
  193. condition: service_healthy
  194. networks:
  195. - dataops-test-net
  196. dataops-scheduling-mcp:
  197. image: dataops-platform-mcp:local
  198. build:
  199. context: ../..
  200. dockerfile: deploy/docker/mcp.Dockerfile
  201. profiles:
  202. - dataops-mcp
  203. stdin_open: true
  204. read_only: true
  205. tmpfs:
  206. - /tmp:size=32m,mode=1777
  207. pids_limit: 64
  208. environment:
  209. DATAOPS_MCP_SUBJECT: ${DATAOPS_MCP_SUBJECT:-}
  210. DATAOPS_MCP_ROLES: ${DATAOPS_MCP_ROLES:-}
  211. DATAOPS_MCP_BUSINESS_DOMAINS: ${DATAOPS_MCP_BUSINESS_DOMAINS:-}
  212. DATAOPS_MCP_ENVIRONMENTS: ${DATAOPS_MCP_ENVIRONMENTS:-}
  213. DATAOPS_MCP_CORRELATION_ID: ${DATAOPS_MCP_CORRELATION_ID:-}
  214. DATAOPS_MCP_DATABASE_URL: postgresql://dataops:dataops-test-password@postgres:5432/dataops
  215. KESTRA_BASE_URL: http://kestra:8080/api/v1
  216. KESTRA_TENANT_ID: main
  217. KESTRA_USERNAME: ${KESTRA_USERNAME:-admin@dataops.local}
  218. KESTRA_PASSWORD: ${KESTRA_PASSWORD:-DataOpsKestra1!}
  219. RUNNER_TASK_TOKEN_SECRET: ${RUNNER_TASK_TOKEN_SECRET:-dataops-local-runner-task-token-secret-change-me}
  220. RUNNER_TASK_TOKEN_TTL_SECONDS: 60
  221. command:
  222. - --kind
  223. - scheduling
  224. - --factory
  225. - app.core.mcp.bootstrap:build_scheduling_gateway
  226. depends_on:
  227. postgres:
  228. condition: service_healthy
  229. kestra:
  230. condition: service_healthy
  231. runner:
  232. condition: service_healthy
  233. networks:
  234. - dataops-test-net
  235. dataops-context-mcp:
  236. image: dataops-platform-mcp:local
  237. build:
  238. context: ../..
  239. dockerfile: deploy/docker/mcp.Dockerfile
  240. profiles:
  241. - dataops-mcp
  242. stdin_open: true
  243. read_only: true
  244. tmpfs:
  245. - /tmp:size=32m,mode=1777
  246. pids_limit: 64
  247. environment:
  248. DATAOPS_MCP_SUBJECT: ${DATAOPS_MCP_SUBJECT:-}
  249. DATAOPS_MCP_ROLES: ${DATAOPS_MCP_ROLES:-}
  250. DATAOPS_MCP_BUSINESS_DOMAINS: ${DATAOPS_MCP_BUSINESS_DOMAINS:-}
  251. DATAOPS_MCP_ENVIRONMENTS: ${DATAOPS_MCP_ENVIRONMENTS:-}
  252. DATAOPS_MCP_CORRELATION_ID: ${DATAOPS_MCP_CORRELATION_ID:-}
  253. DATAOPS_MCP_DATABASE_URL: postgresql://dataops:dataops-test-password@postgres:5432/dataops
  254. DATAOPS_MCP_CONTEXT_MAX_CONCURRENCY: 10
  255. command:
  256. - --kind
  257. - context
  258. - --factory
  259. - app.core.mcp.bootstrap:build_context_service
  260. depends_on:
  261. postgres:
  262. condition: service_healthy
  263. networks:
  264. - dataops-test-net
  265. runner:
  266. build:
  267. context: ../..
  268. dockerfile: deploy/docker/runner.Dockerfile
  269. environment:
  270. RUNNER_LISTEN_HOST: 0.0.0.0
  271. RUNNER_LISTEN_PORT: 5600
  272. RUNNER_WORKERS: 2
  273. RUNNER_THREADS: 2
  274. RUNNER_TASK_TOKEN_SECRET: ${RUNNER_TASK_TOKEN_SECRET:-dataops-local-runner-task-token-secret-change-me}
  275. RUNNER_TASK_TOKEN_TTL_SECONDS: 60
  276. RUNNER_DATASOURCE_POOL_SIZE: 1
  277. RUNNER_DATASOURCE_MAX_OVERFLOW: 1
  278. RUNNER_DATASOURCE_MAX_IDLE_POOLS: 4
  279. RUNNER_DATASOURCE_CONNECTION_BUDGET: 32
  280. RUNNER_HTTP_ALLOWED_HOSTS: ${RUNNER_HTTP_ALLOWED_HOSTS:-}
  281. DATABASE_URL: postgresql://dataops:dataops-test-password@postgres:5432/dataops
  282. NEO4J_URI: bolt://neo4j:7687
  283. NEO4J_USER: neo4j
  284. NEO4J_PASSWORD: Passw0rd
  285. DATASOURCE_CREDENTIAL_MASTER_KEY: ${DATASOURCE_CREDENTIAL_MASTER_KEY:-MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=}
  286. DATASOURCE_CREDENTIAL_KEY_VERSION: ${DATASOURCE_CREDENTIAL_KEY_VERSION:-v1}
  287. ports:
  288. - "127.0.0.1:15600:5600"
  289. read_only: true
  290. tmpfs:
  291. - /tmp:size=64m,mode=1777
  292. pids_limit: 128
  293. deploy:
  294. resources:
  295. limits:
  296. cpus: "1.0"
  297. memory: 512M
  298. pids: 128
  299. depends_on:
  300. postgres:
  301. condition: service_healthy
  302. neo4j:
  303. condition: service_healthy
  304. healthcheck:
  305. test:
  306. - CMD
  307. - python
  308. - -c
  309. - import urllib.request; urllib.request.urlopen('http://127.0.0.1:5600/health', timeout=5)
  310. interval: 10s
  311. timeout: 5s
  312. retries: 20
  313. start_period: 20s
  314. networks:
  315. dataops-test-net:
  316. aliases:
  317. - dataops-runner
  318. backend:
  319. build:
  320. context: ../..
  321. dockerfile: deploy/docker/backend.Dockerfile
  322. environment:
  323. FLASK_ENV: production
  324. LISTEN_HOST: 0.0.0.0
  325. LISTEN_PORT: 5500
  326. GUNICORN_WORKERS: 2
  327. DATABASE_URL: postgresql://dataops:dataops-test-password@postgres:5432/dataops
  328. NEO4J_URI: bolt://neo4j:7687
  329. NEO4J_HTTP_URI: http://neo4j:7474
  330. NEO4J_USER: neo4j
  331. NEO4J_PASSWORD: Passw0rd
  332. NEO4J_ENCRYPTED: "false"
  333. MINIO_HOST: minio:9000
  334. MINIO_USER: dataops-test
  335. MINIO_PASSWORD: dataops-test-password
  336. MINIO_BUCKET: dataops-bucket
  337. MINIO_SECURE: "false"
  338. DATAFLOW_DEFAULT_DB_HOST: postgres
  339. DATAFLOW_DEFAULT_DB_PORT: 5432
  340. DATAFLOW_DEFAULT_DB_NAME: dataops
  341. DATAFLOW_SCHEMA: dags
  342. N8N_API_URL: http://n8n:5678
  343. N8N_API_KEY: ${N8N_API_KEY:-}
  344. API_BASE_URL: http://backend:5500/api
  345. DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
  346. LLM_BASE_URL: https://api.deepseek.com
  347. LLM_MODEL_NAME: deepseek-chat
  348. KNOWLEDGE_ENABLED: "true"
  349. KNOWLEDGE_LIGHTRAG_ENABLED: ${KNOWLEDGE_LIGHTRAG_ENABLED:-false}
  350. KNOWLEDGE_LIGHTRAG_SHADOW_ONLY: "true"
  351. KNOWLEDGE_LIGHTRAG_BASE_URL: http://lightrag:9621
  352. KNOWLEDGE_LIGHTRAG_API_KEY: ${LIGHTRAG_API_KEY:-local-shadow-only-key}
  353. QWEN_EMBEDDING_BASE_URL: ${QWEN_EMBEDDING_BASE_URL:-}
  354. QWEN_EMBEDDING_API_KEY: ${QWEN_EMBEDDING_API_KEY:-}
  355. QWEN_EMBEDDING_MODEL: ${QWEN_EMBEDDING_MODEL:-text-embedding-v3}
  356. SECRET_KEY: dataops-local-test-secret-key
  357. DATASOURCE_CREDENTIAL_MASTER_KEY: ${DATASOURCE_CREDENTIAL_MASTER_KEY:-MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=}
  358. DATASOURCE_CREDENTIAL_KEY_VERSION: ${DATASOURCE_CREDENTIAL_KEY_VERSION:-v1}
  359. LOG_DIR: /app/logs
  360. LOG_TO_CONSOLE: "true"
  361. ports:
  362. - "15500:5500"
  363. volumes:
  364. - dataops-test-backend-logs:/app/logs
  365. - dataops-test-upload:/data/upload
  366. - dataops-test-archive:/data/archive
  367. depends_on:
  368. postgres:
  369. condition: service_healthy
  370. neo4j:
  371. condition: service_healthy
  372. minio-init:
  373. condition: service_completed_successfully
  374. healthcheck:
  375. test:
  376. - CMD
  377. - python
  378. - -c
  379. - import urllib.request; urllib.request.urlopen('http://127.0.0.1:5500/api/system/health', timeout=5)
  380. interval: 10s
  381. timeout: 10s
  382. retries: 20
  383. start_period: 20s
  384. networks:
  385. - dataops-test-net
  386. lightrag-neo4j:
  387. image: neo4j:5.26-community
  388. profiles:
  389. - knowledge-shadow
  390. environment:
  391. NEO4J_AUTH: neo4j/lightrag-test-password
  392. NEO4J_server_memory_heap_initial__size: 256m
  393. NEO4J_server_memory_heap_max__size: 512m
  394. NEO4J_server_memory_pagecache_size: 256m
  395. volumes:
  396. - dataops-test-lightrag-neo4j:/data
  397. healthcheck:
  398. test: ["CMD-SHELL", "cypher-shell -u neo4j -p lightrag-test-password 'RETURN 1' >/dev/null 2>&1"]
  399. interval: 10s
  400. timeout: 10s
  401. retries: 30
  402. start_period: 20s
  403. networks:
  404. - dataops-test-net
  405. lightrag:
  406. image: ghcr.io/hkuds/lightrag@sha256:67ccf8d9f74eb29da872bf8b3e6513605f5ac601fb0509c5b0ca16d98d2d307d
  407. profiles:
  408. - knowledge-shadow
  409. environment:
  410. HOST: 0.0.0.0
  411. PORT: 9621
  412. WORKSPACE: ${LIGHTRAG_SHADOW_WORKSPACE:-dataops-global-shadow-g1}
  413. LIGHTRAG_API_KEY: ${LIGHTRAG_API_KEY:-local-shadow-only-key}
  414. LIGHTRAG_KV_STORAGE: PGKVStorage
  415. LIGHTRAG_DOC_STATUS_STORAGE: PGDocStatusStorage
  416. LIGHTRAG_VECTOR_STORAGE: PGVectorStorage
  417. LIGHTRAG_GRAPH_STORAGE: Neo4JStorage
  418. POSTGRES_HOST: postgres
  419. POSTGRES_PORT: 5432
  420. POSTGRES_USER: lightrag
  421. POSTGRES_PASSWORD: lightrag-test-password
  422. POSTGRES_DATABASE: dataops_lightrag
  423. POSTGRES_ENABLE_VECTOR: "true"
  424. NEO4J_URI: bolt://lightrag-neo4j:7687
  425. NEO4J_USERNAME: neo4j
  426. NEO4J_PASSWORD: lightrag-test-password
  427. NEO4J_DATABASE: neo4j
  428. LLM_BINDING: openai
  429. LLM_BINDING_HOST: ${LIGHTRAG_LLM_BASE_URL:-https://api.deepseek.com/v1}
  430. LLM_BINDING_API_KEY: ${LIGHTRAG_LLM_API_KEY:-}
  431. LLM_MODEL: ${LIGHTRAG_LLM_MODEL:-deepseek-chat}
  432. EMBEDDING_BINDING: openai
  433. EMBEDDING_BINDING_HOST: ${QWEN_EMBEDDING_BASE_URL:-}
  434. EMBEDDING_BINDING_API_KEY: ${QWEN_EMBEDDING_API_KEY:-}
  435. EMBEDDING_MODEL: ${QWEN_EMBEDDING_MODEL:-text-embedding-v3}
  436. EMBEDDING_DIM: 1024
  437. LIGHTRAG_PARSER: "*:legacy-F"
  438. depends_on:
  439. postgres:
  440. condition: service_healthy
  441. lightrag-neo4j:
  442. condition: service_healthy
  443. healthcheck:
  444. test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:9621/health >/dev/null"]
  445. interval: 10s
  446. timeout: 5s
  447. retries: 30
  448. start_period: 30s
  449. networks:
  450. - dataops-test-net
  451. lightrag-projector:
  452. build:
  453. context: ../..
  454. dockerfile: deploy/docker/backend.Dockerfile
  455. profiles:
  456. - knowledge-shadow
  457. command: ["python", "-m", "app.core.knowledge.lightrag.worker"]
  458. environment:
  459. DATABASE_URL: postgresql://dataops:dataops-test-password@postgres:5432/dataops
  460. KNOWLEDGE_LIGHTRAG_BASE_URL: http://lightrag:9621
  461. KNOWLEDGE_LIGHTRAG_API_KEY: ${LIGHTRAG_API_KEY:-local-shadow-only-key}
  462. KNOWLEDGE_LIGHTRAG_TIMEOUT_SECONDS: 15
  463. LIGHTRAG_SHADOW_WORKSPACE: ${LIGHTRAG_SHADOW_WORKSPACE:-dataops-global-shadow-g1}
  464. depends_on:
  465. postgres:
  466. condition: service_healthy
  467. lightrag:
  468. condition: service_healthy
  469. restart: unless-stopped
  470. networks:
  471. - dataops-test-net
  472. frontend:
  473. build:
  474. context: ../..
  475. dockerfile: deploy/docker/frontend.Dockerfile
  476. args:
  477. VUE_APP_N8N_URL: http://localhost:15678
  478. VUE_APP_N8N_CHAT_URL: ""
  479. VUE_APP_MINIO_PUBLIC_URL: http://localhost:19000/dataops-bucket
  480. VUE_APP_PREVIEW_URL: ""
  481. ports:
  482. - "18183:80"
  483. depends_on:
  484. backend:
  485. condition: service_healthy
  486. healthcheck:
  487. test: ["CMD-SHELL", "wget --spider -q http://127.0.0.1/"]
  488. interval: 10s
  489. timeout: 5s
  490. retries: 20
  491. networks:
  492. - dataops-test-net
  493. networks:
  494. dataops-test-net:
  495. name: dataops-test-net
  496. volumes:
  497. dataops-test-postgres:
  498. dataops-test-source-postgres:
  499. dataops-test-source-mysql:
  500. dataops-test-neo4j:
  501. dataops-test-minio:
  502. dataops-test-n8n:
  503. dataops-test-kestra:
  504. dataops-test-backend-logs:
  505. dataops-test-upload:
  506. dataops-test-archive:
  507. dataops-test-lightrag-neo4j: