docker-compose.yml 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681
  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_POSTGRES_PASSWORD:-dataops-test-password}
  9. ports:
  10. - "${DATAOPS_POSTGRES_PORT:-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. kestra-db-init:
  23. image: postgres:16-alpine
  24. environment:
  25. PGPASSWORD: ${DATAOPS_POSTGRES_PASSWORD:-dataops-test-password}
  26. volumes:
  27. - ./postgres/init/010-kestra-runtime.sql:/opt/dataops/010-kestra-runtime.sql:ro
  28. command:
  29. - psql
  30. - -v
  31. - ON_ERROR_STOP=1
  32. - -h
  33. - postgres
  34. - -U
  35. - dataops
  36. - -d
  37. - postgres
  38. - -f
  39. - /opt/dataops/010-kestra-runtime.sql
  40. depends_on:
  41. postgres:
  42. condition: service_healthy
  43. restart: "no"
  44. networks:
  45. - dataops-test-net
  46. db-role-init:
  47. image: ${DATAOPS_MIGRATOR_IMAGE:-dataops-platform-migrator:local}
  48. build:
  49. context: ../..
  50. dockerfile: deploy/docker/backend.Dockerfile
  51. target: migrator
  52. environment:
  53. DB_ROLE_INIT_DATABASE_URL: postgresql://dataops:${DATAOPS_POSTGRES_PASSWORD:-dataops-test-password}@postgres:5432/dataops
  54. MIGRATION_DATABASE_URL: postgresql://dataops:${DATAOPS_POSTGRES_PASSWORD:-dataops-test-password}@postgres:5432/dataops
  55. DATABASE_URL: postgresql://dataops_app:${DATAOPS_RUNTIME_PASSWORD:-dataops-app-test-password}@postgres:5432/dataops
  56. BI_AI_CATALOG_CONTROL_DATABASE_URL: postgresql://dataops_bi_ai_catalog_control:${DATAOPS_BI_AI_CATALOG_CONTROL_PASSWORD:-dataops-bi-ai-control-test-password}@postgres:5432/dataops
  57. DATAOPS_MIGRATOR_USER: dataops
  58. DATAOPS_RUNTIME_USER: dataops_app
  59. DATAOPS_RUNTIME_PASSWORD: ${DATAOPS_RUNTIME_PASSWORD:-dataops-app-test-password}
  60. DATAOPS_BI_AI_CATALOG_CONTROL_USER: dataops_bi_ai_catalog_control
  61. DATAOPS_BI_AI_CATALOG_CONTROL_PASSWORD: ${DATAOPS_BI_AI_CATALOG_CONTROL_PASSWORD:-dataops-bi-ai-control-test-password}
  62. command: ["python", "-m", "app.core.edge_gateway.runtime_roles"]
  63. depends_on:
  64. postgres:
  65. condition: service_healthy
  66. restart: "no"
  67. networks:
  68. - dataops-test-net
  69. db-migrate:
  70. image: ${DATAOPS_MIGRATOR_IMAGE:-dataops-platform-migrator:local}
  71. build:
  72. context: ../..
  73. dockerfile: deploy/docker/backend.Dockerfile
  74. target: migrator
  75. command: ["alembic", "-c", "alembic.ini", "upgrade", "head"]
  76. environment:
  77. MIGRATION_DATABASE_URL: postgresql://dataops:${DATAOPS_POSTGRES_PASSWORD:-dataops-test-password}@postgres:5432/dataops
  78. depends_on:
  79. postgres:
  80. condition: service_healthy
  81. db-role-init:
  82. condition: service_completed_successfully
  83. restart: "no"
  84. networks:
  85. - dataops-test-net
  86. source-postgres:
  87. image: postgres:16-alpine
  88. environment:
  89. POSTGRES_DB: acceptance
  90. POSTGRES_USER: source_reader
  91. POSTGRES_PASSWORD: ${SOURCE_POSTGRES_PASSWORD:-source-test-password}
  92. ports:
  93. - "${SOURCE_POSTGRES_PORT:-25432}:5432"
  94. volumes:
  95. - dataops-test-source-postgres:/var/lib/postgresql/data
  96. - ./datasources/postgres/init.sql:/docker-entrypoint-initdb.d/010-acceptance.sql:ro
  97. healthcheck:
  98. test: ["CMD-SHELL", "pg_isready -U source_reader -d acceptance"]
  99. interval: 5s
  100. timeout: 5s
  101. retries: 20
  102. networks:
  103. - dataops-test-net
  104. source-mysql:
  105. image: mysql:8.4
  106. environment:
  107. MYSQL_DATABASE: acceptance
  108. MYSQL_USER: source_reader
  109. MYSQL_PASSWORD: ${SOURCE_MYSQL_PASSWORD:-source-test-password}
  110. MYSQL_ROOT_PASSWORD: ${SOURCE_MYSQL_ROOT_PASSWORD:-source-root-test-password}
  111. ports:
  112. - "${SOURCE_MYSQL_PORT:-23306}:3306"
  113. volumes:
  114. - dataops-test-source-mysql:/var/lib/mysql
  115. - ./datasources/mysql/init.sql:/docker-entrypoint-initdb.d/010-acceptance.sql:ro
  116. healthcheck:
  117. test:
  118. - CMD-SHELL
  119. - mysqladmin ping -h 127.0.0.1 -u source_reader -psource-test-password --silent
  120. interval: 5s
  121. timeout: 5s
  122. retries: 30
  123. start_period: 20s
  124. networks:
  125. - dataops-test-net
  126. neo4j:
  127. image: neo4j:5.26-community
  128. environment:
  129. NEO4J_AUTH: neo4j/${DATAOPS_NEO4J_PASSWORD:-Passw0rd}
  130. NEO4J_server_memory_heap_initial__size: 256m
  131. NEO4J_server_memory_heap_max__size: 512m
  132. NEO4J_server_memory_pagecache_size: 256m
  133. ports:
  134. - "${NEO4J_HTTP_PORT:-17474}:7474"
  135. - "${NEO4J_BOLT_PORT:-17687}:7687"
  136. volumes:
  137. - dataops-test-neo4j:/data
  138. healthcheck:
  139. test: ["CMD-SHELL", "cypher-shell -u neo4j -p Passw0rd 'RETURN 1' >/dev/null 2>&1"]
  140. interval: 10s
  141. timeout: 10s
  142. retries: 30
  143. start_period: 20s
  144. networks:
  145. - dataops-test-net
  146. minio:
  147. image: minio/minio:RELEASE.2025-04-22T22-12-26Z
  148. command: server /data --console-address ":9001"
  149. environment:
  150. MINIO_ROOT_USER: dataops-test
  151. MINIO_ROOT_PASSWORD: ${DATAOPS_MINIO_PASSWORD:-dataops-test-password}
  152. ports:
  153. - "${MINIO_API_PORT:-19000}:9000"
  154. - "${MINIO_CONSOLE_PORT:-19001}:9001"
  155. volumes:
  156. - dataops-test-minio:/data
  157. healthcheck:
  158. test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]
  159. interval: 5s
  160. timeout: 5s
  161. retries: 20
  162. networks:
  163. - dataops-test-net
  164. minio-init:
  165. image: minio/mc:RELEASE.2025-04-16T18-13-26Z
  166. depends_on:
  167. minio:
  168. condition: service_healthy
  169. entrypoint:
  170. - /bin/sh
  171. - -c
  172. - >-
  173. mc alias set local http://minio:9000 dataops-test dataops-test-password &&
  174. mc mb --ignore-existing local/dataops-bucket
  175. restart: "no"
  176. networks:
  177. - dataops-test-net
  178. n8n:
  179. image: n8nio/n8n:1.100.1
  180. environment:
  181. DB_TYPE: postgresdb
  182. DB_POSTGRESDB_HOST: postgres
  183. DB_POSTGRESDB_PORT: 5432
  184. DB_POSTGRESDB_DATABASE: n8n
  185. DB_POSTGRESDB_USER: dataops
  186. DB_POSTGRESDB_PASSWORD: ${DATAOPS_POSTGRES_PASSWORD:-dataops-test-password}
  187. N8N_HOST: localhost
  188. N8N_PORT: 5678
  189. N8N_PROTOCOL: http
  190. N8N_SECURE_COOKIE: "false"
  191. N8N_ENCRYPTION_KEY: ${N8N_ENCRYPTION_KEY:-dataops-local-test-encryption-key}
  192. N8N_ENFORCE_SETTINGS_FILE_PERMISSIONS: "true"
  193. WEBHOOK_URL: http://localhost:15678/
  194. GENERIC_TIMEZONE: Asia/Shanghai
  195. TZ: Asia/Shanghai
  196. ports:
  197. - "${N8N_PORT:-15678}:5678"
  198. volumes:
  199. - dataops-test-n8n:/home/node/.n8n
  200. depends_on:
  201. postgres:
  202. condition: service_healthy
  203. healthcheck:
  204. test: ["CMD-SHELL", "wget --spider -q http://127.0.0.1:5678/healthz"]
  205. interval: 10s
  206. timeout: 5s
  207. retries: 30
  208. start_period: 30s
  209. networks:
  210. - dataops-test-net
  211. kestra:
  212. image: kestra/kestra:v1.3.20
  213. command:
  214. - server
  215. - standalone
  216. - --worker-thread=16
  217. - --config
  218. - /etc/kestra/application.yml
  219. stop_grace_period: 6m
  220. environment:
  221. KESTRA_DB_HOST: postgres
  222. KESTRA_DB_NAME: kestra
  223. KESTRA_DB_USERNAME: kestra_runtime
  224. KESTRA_DB_PASSWORD: ${KESTRA_DB_PASSWORD:-kestra-local-test-password}
  225. KESTRA_USERNAME: ${KESTRA_USERNAME:-admin@dataops.local}
  226. KESTRA_PASSWORD: ${KESTRA_PASSWORD:-DataOpsKestra1!}
  227. ports:
  228. - "127.0.0.1:${KESTRA_PORT:-18080}:8080"
  229. volumes:
  230. - dataops-test-kestra:/app/storage
  231. - ./kestra/application.yml:/etc/kestra/application.yml:ro
  232. depends_on:
  233. kestra-db-init:
  234. condition: service_completed_successfully
  235. healthcheck:
  236. test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:8081/health"]
  237. interval: 10s
  238. timeout: 5s
  239. retries: 60
  240. start_period: 60s
  241. restart: unless-stopped
  242. networks:
  243. - dataops-test-net
  244. kestra-mcp:
  245. image: ghcr.io/kestra-io/mcp-server-python@sha256:1fd62028f60914af31e244ddb0086ed5017420313e2c8547ea9c01b8d24dfc1d
  246. profiles:
  247. - kestra-mcp
  248. stdin_open: true
  249. environment:
  250. KESTRA_BASE_URL: http://kestra:8080/api/v1
  251. KESTRA_TENANT_ID: main
  252. KESTRA_USERNAME: ${KESTRA_USERNAME:-admin@dataops.local}
  253. KESTRA_PASSWORD: ${KESTRA_PASSWORD:-DataOpsKestra1!}
  254. KESTRA_MCP_DISABLED_TOOLS: ee,files,kv,namespace
  255. KESTRA_MCP_LOG_LEVEL: ERROR
  256. depends_on:
  257. kestra:
  258. condition: service_healthy
  259. networks:
  260. - dataops-test-net
  261. dataops-scheduling-mcp:
  262. image: dataops-platform-mcp:local
  263. build:
  264. context: ../..
  265. dockerfile: deploy/docker/mcp.Dockerfile
  266. profiles:
  267. - dataops-mcp
  268. stdin_open: true
  269. read_only: true
  270. tmpfs:
  271. - /tmp:size=32m,mode=1777
  272. pids_limit: 64
  273. environment:
  274. DATAOPS_MCP_SUBJECT: ${DATAOPS_MCP_SUBJECT:-}
  275. DATAOPS_MCP_ROLES: ${DATAOPS_MCP_ROLES:-}
  276. DATAOPS_MCP_BUSINESS_DOMAINS: ${DATAOPS_MCP_BUSINESS_DOMAINS:-}
  277. DATAOPS_MCP_ENVIRONMENTS: ${DATAOPS_MCP_ENVIRONMENTS:-}
  278. DATAOPS_MCP_CORRELATION_ID: ${DATAOPS_MCP_CORRELATION_ID:-}
  279. DATAOPS_MCP_DATABASE_URL: postgresql://dataops_app:${DATAOPS_RUNTIME_PASSWORD:-dataops-app-test-password}@postgres:5432/dataops
  280. KESTRA_BASE_URL: http://kestra:8080/api/v1
  281. KESTRA_TENANT_ID: main
  282. KESTRA_USERNAME: ${KESTRA_USERNAME:-admin@dataops.local}
  283. KESTRA_PASSWORD: ${KESTRA_PASSWORD:-DataOpsKestra1!}
  284. RUNNER_TASK_TOKEN_SECRET: ${RUNNER_TASK_TOKEN_SECRET:-dataops-local-runner-task-token-secret-change-me}
  285. RUNNER_TASK_TOKEN_TTL_SECONDS: 60
  286. command:
  287. - --kind
  288. - scheduling
  289. - --factory
  290. - app.core.mcp.bootstrap:build_scheduling_gateway
  291. depends_on:
  292. postgres:
  293. condition: service_healthy
  294. db-migrate:
  295. condition: service_completed_successfully
  296. kestra:
  297. condition: service_healthy
  298. runner:
  299. condition: service_healthy
  300. networks:
  301. - dataops-test-net
  302. dataops-context-mcp:
  303. image: dataops-platform-mcp:local
  304. build:
  305. context: ../..
  306. dockerfile: deploy/docker/mcp.Dockerfile
  307. profiles:
  308. - dataops-mcp
  309. stdin_open: true
  310. read_only: true
  311. tmpfs:
  312. - /tmp:size=32m,mode=1777
  313. pids_limit: 64
  314. environment:
  315. DATAOPS_MCP_SUBJECT: ${DATAOPS_MCP_SUBJECT:-}
  316. DATAOPS_MCP_ROLES: ${DATAOPS_MCP_ROLES:-}
  317. DATAOPS_MCP_BUSINESS_DOMAINS: ${DATAOPS_MCP_BUSINESS_DOMAINS:-}
  318. DATAOPS_MCP_ENVIRONMENTS: ${DATAOPS_MCP_ENVIRONMENTS:-}
  319. DATAOPS_MCP_CORRELATION_ID: ${DATAOPS_MCP_CORRELATION_ID:-}
  320. DATAOPS_MCP_DATABASE_URL: postgresql://dataops_app:${DATAOPS_RUNTIME_PASSWORD:-dataops-app-test-password}@postgres:5432/dataops
  321. DATAOPS_MCP_CONTEXT_MAX_CONCURRENCY: 10
  322. command:
  323. - --kind
  324. - context
  325. - --factory
  326. - app.core.mcp.bootstrap:build_context_service
  327. depends_on:
  328. postgres:
  329. condition: service_healthy
  330. db-migrate:
  331. condition: service_completed_successfully
  332. networks:
  333. - dataops-test-net
  334. runner:
  335. image: ${DATAOPS_RUNNER_IMAGE:-dataops-platform-runner:local}
  336. build:
  337. context: ../..
  338. dockerfile: deploy/docker/runner.Dockerfile
  339. target: runtime
  340. environment:
  341. RUNNER_LISTEN_HOST: 0.0.0.0
  342. RUNNER_LISTEN_PORT: 5600
  343. RUNNER_WORKERS: 2
  344. RUNNER_THREADS: 2
  345. RUNNER_TASK_TOKEN_SECRET: ${RUNNER_TASK_TOKEN_SECRET:-dataops-local-runner-task-token-secret-change-me}
  346. RUNNER_TASK_TOKEN_TTL_SECONDS: 60
  347. RUNNER_DATASOURCE_POOL_SIZE: 1
  348. RUNNER_DATASOURCE_MAX_OVERFLOW: 1
  349. RUNNER_DATASOURCE_MAX_IDLE_POOLS: 4
  350. RUNNER_DATASOURCE_CONNECTION_BUDGET: 32
  351. RUNNER_HTTP_ALLOWED_HOSTS: ${RUNNER_HTTP_ALLOWED_HOSTS:-}
  352. RUNNER_MINIO_HOST: minio:9000
  353. RUNNER_MINIO_USER: dataops-test
  354. RUNNER_MINIO_PASSWORD: ${DATAOPS_MINIO_PASSWORD:-dataops-test-password}
  355. RUNNER_MINIO_BUCKET: dataops-bucket
  356. RUNNER_MINIO_SECURE: "false"
  357. RUNNER_ARTIFACT_MAX_BYTES: 33554432
  358. RUNNER_ARTIFACT_MAX_ROWS: 100000
  359. RUNNER_ARTIFACT_MEMORY_LIMIT_BYTES: 268435456
  360. RUNNER_ARTIFACT_TTL_SECONDS: 3600
  361. DATABASE_URL: postgresql://dataops_app:${DATAOPS_RUNTIME_PASSWORD:-dataops-app-test-password}@postgres:5432/dataops
  362. BI_AI_CATALOG_CONTROL_DATABASE_URL: postgresql://dataops_bi_ai_catalog_control:${DATAOPS_BI_AI_CATALOG_CONTROL_PASSWORD:-dataops-bi-ai-control-test-password}@postgres:5432/dataops
  363. NEO4J_URI: bolt://neo4j:7687
  364. NEO4J_USER: neo4j
  365. NEO4J_PASSWORD: ${DATAOPS_NEO4J_PASSWORD:-Passw0rd}
  366. DATASOURCE_CREDENTIAL_MASTER_KEY: ${DATASOURCE_CREDENTIAL_MASTER_KEY:-MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=}
  367. DATASOURCE_CREDENTIAL_KEY_VERSION: ${DATASOURCE_CREDENTIAL_KEY_VERSION:-v1}
  368. ports:
  369. - "127.0.0.1:${RUNNER_PORT:-15600}:5600"
  370. command: ["gunicorn", "--config", "app/runner/gunicorn_config.py", "app.runner.wsgi:application"]
  371. read_only: true
  372. tmpfs:
  373. - /tmp:size=64m,mode=1777
  374. pids_limit: 128
  375. deploy:
  376. resources:
  377. limits:
  378. cpus: "1.0"
  379. memory: 512M
  380. pids: 128
  381. depends_on:
  382. postgres:
  383. condition: service_healthy
  384. db-migrate:
  385. condition: service_completed_successfully
  386. neo4j:
  387. condition: service_healthy
  388. minio-init:
  389. condition: service_completed_successfully
  390. healthcheck:
  391. test:
  392. - CMD
  393. - python
  394. - -c
  395. - import urllib.request; urllib.request.urlopen('http://127.0.0.1:5600/health', timeout=5)
  396. interval: 10s
  397. timeout: 5s
  398. retries: 20
  399. start_period: 20s
  400. networks:
  401. dataops-test-net:
  402. aliases:
  403. - dataops-runner
  404. backend:
  405. image: ${DATAOPS_BACKEND_IMAGE:-dataops-platform-backend:local}
  406. labels:
  407. com.dataops.local_env: ${DATAOPS_LOCAL_ENV_LABEL:-dataops-local}
  408. build:
  409. context: ../..
  410. dockerfile: deploy/docker/backend.Dockerfile
  411. target: runtime
  412. environment:
  413. FLASK_ENV: production
  414. LISTEN_HOST: 0.0.0.0
  415. LISTEN_PORT: 5500
  416. GUNICORN_WORKERS: 2
  417. DATABASE_URL: postgresql://dataops_app:${DATAOPS_RUNTIME_PASSWORD:-dataops-app-test-password}@postgres:5432/dataops
  418. BI_AI_CATALOG_CONTROL_DATABASE_URL: postgresql://dataops_bi_ai_catalog_control:${DATAOPS_BI_AI_CATALOG_CONTROL_PASSWORD:-dataops-bi-ai-control-test-password}@postgres:5432/dataops
  419. NEO4J_URI: bolt://neo4j:7687
  420. NEO4J_HTTP_URI: http://neo4j:7474
  421. NEO4J_USER: neo4j
  422. NEO4J_PASSWORD: ${DATAOPS_NEO4J_PASSWORD:-Passw0rd}
  423. NEO4J_ENCRYPTED: "false"
  424. MINIO_HOST: minio:9000
  425. MINIO_USER: dataops-test
  426. MINIO_PASSWORD: ${DATAOPS_MINIO_PASSWORD:-dataops-test-password}
  427. MINIO_BUCKET: dataops-bucket
  428. MINIO_SECURE: "false"
  429. DATAFLOW_DEFAULT_DB_HOST: postgres
  430. DATAFLOW_DEFAULT_DB_PORT: 5432
  431. DATAFLOW_DEFAULT_DB_NAME: dataops
  432. DATAFLOW_SCHEMA: dags
  433. N8N_API_URL: http://n8n:5678
  434. N8N_API_KEY: ${N8N_API_KEY:-}
  435. KESTRA_BASE_URL: http://kestra:8080/api/v1
  436. KESTRA_TENANT_ID: main
  437. KESTRA_USERNAME: ${KESTRA_USERNAME:-admin@dataops.local}
  438. KESTRA_PASSWORD: ${KESTRA_PASSWORD:-DataOpsKestra1!}
  439. RUNNER_TASK_TOKEN_SECRET: ${RUNNER_TASK_TOKEN_SECRET:-dataops-local-runner-task-token-secret-change-me}
  440. RUNNER_TASK_TOKEN_TTL_SECONDS: 60
  441. DATA_FACTORY_ACTIVATION_ENABLED: ${DATA_FACTORY_ACTIVATION_ENABLED:-false}
  442. EDGE_MTLS_TRUSTED_PROXY_IPS: 172.31.0.10
  443. EDGE_GATEWAY_SIGNING_PRIVATE_KEY_FILE: /run/secrets/edge_gateway_signing_private_key
  444. EDGE_GATEWAY_SIGNING_PUBLIC_KEY: ${EDGE_GATEWAY_SIGNING_PUBLIC_KEY:-}
  445. EDGE_GATEWAY_SIGNING_KEY_ID: ${EDGE_GATEWAY_SIGNING_KEY_ID:-}
  446. API_BASE_URL: http://backend:5500/api
  447. DEEPSEEK_API_KEY: ${DEEPSEEK_API_KEY:-}
  448. LLM_BASE_URL: https://api.deepseek.com
  449. LLM_MODEL_NAME: deepseek-chat
  450. KNOWLEDGE_ENABLED: "true"
  451. KNOWLEDGE_LIGHTRAG_ENABLED: ${KNOWLEDGE_LIGHTRAG_ENABLED:-false}
  452. KNOWLEDGE_LIGHTRAG_SHADOW_ONLY: "true"
  453. KNOWLEDGE_LIGHTRAG_BASE_URL: http://lightrag:9621
  454. KNOWLEDGE_LIGHTRAG_API_KEY: ${LIGHTRAG_API_KEY:-local-shadow-only-key}
  455. QWEN_EMBEDDING_BASE_URL: ${QWEN_EMBEDDING_BASE_URL:-}
  456. QWEN_EMBEDDING_API_KEY: ${QWEN_EMBEDDING_API_KEY:-}
  457. QWEN_EMBEDDING_MODEL: ${QWEN_EMBEDDING_MODEL:-text-embedding-v3}
  458. SECRET_KEY: ${SECRET_KEY:-dataops-local-test-secret-key}
  459. AUDIT_EVIDENCE_SECRET: ${AUDIT_EVIDENCE_SECRET:-dataops-local-audit-evidence-secret-change-me}
  460. AUDIT_EVIDENCE_KEY_VERSION: ${AUDIT_EVIDENCE_KEY_VERSION:-local-v1}
  461. SECURITY_SIEM_HOST_ALLOWLIST: ${SECURITY_SIEM_HOST_ALLOWLIST:-}
  462. RULE_GENERATION_RECEIPT_SECRET: ${RULE_GENERATION_RECEIPT_SECRET:-}
  463. DATASOURCE_CREDENTIAL_MASTER_KEY: ${DATASOURCE_CREDENTIAL_MASTER_KEY:-MDEyMzQ1Njc4OWFiY2RlZjAxMjM0NTY3ODlhYmNkZWY=}
  464. DATASOURCE_CREDENTIAL_KEY_VERSION: ${DATASOURCE_CREDENTIAL_KEY_VERSION:-v1}
  465. LOG_DIR: /app/logs
  466. LOG_TO_CONSOLE: "true"
  467. ports:
  468. - "${BACKEND_PORT:-15500}:5500"
  469. volumes:
  470. - dataops-test-backend-logs:/app/logs
  471. - dataops-test-upload:/data/upload
  472. - dataops-test-archive:/data/archive
  473. secrets:
  474. - edge_gateway_signing_private_key
  475. depends_on:
  476. postgres:
  477. condition: service_healthy
  478. db-migrate:
  479. condition: service_completed_successfully
  480. neo4j:
  481. condition: service_healthy
  482. minio-init:
  483. condition: service_completed_successfully
  484. kestra:
  485. condition: service_healthy
  486. runner:
  487. condition: service_healthy
  488. healthcheck:
  489. test:
  490. - CMD
  491. - python
  492. - -c
  493. - import urllib.request; urllib.request.urlopen('http://127.0.0.1:5500/api/system/health', timeout=5)
  494. interval: 10s
  495. timeout: 10s
  496. retries: 20
  497. start_period: 20s
  498. networks:
  499. dataops-test-net:
  500. edge-control-net:
  501. ipv4_address: 172.31.0.20
  502. edge-mtls-proxy:
  503. image: nginx:1.27-alpine
  504. profiles:
  505. - enterprise-edge
  506. ports:
  507. - "${DATAOPS_EDGE_MTLS_PORT:-18443}:8443"
  508. volumes:
  509. - ./edge-mtls-nginx.conf:/etc/nginx/conf.d/default.conf:ro
  510. - ${DATAOPS_EDGE_MTLS_CERT_DIR:-./edge-mtls-certs}:/etc/nginx/edge-mtls:ro
  511. read_only: true
  512. tmpfs:
  513. - /var/cache/nginx:size=16m
  514. - /var/run:size=1m
  515. - /tmp:size=8m
  516. depends_on:
  517. backend:
  518. condition: service_healthy
  519. networks:
  520. edge-control-net:
  521. ipv4_address: 172.31.0.10
  522. lightrag-neo4j:
  523. image: neo4j:5.26-community
  524. profiles:
  525. - knowledge-shadow
  526. environment:
  527. NEO4J_AUTH: neo4j/lightrag-test-password
  528. NEO4J_server_memory_heap_initial__size: 256m
  529. NEO4J_server_memory_heap_max__size: 512m
  530. NEO4J_server_memory_pagecache_size: 256m
  531. volumes:
  532. - dataops-test-lightrag-neo4j:/data
  533. healthcheck:
  534. test: ["CMD-SHELL", "cypher-shell -u neo4j -p lightrag-test-password 'RETURN 1' >/dev/null 2>&1"]
  535. interval: 10s
  536. timeout: 10s
  537. retries: 30
  538. start_period: 20s
  539. networks:
  540. - dataops-test-net
  541. lightrag:
  542. image: ghcr.io/hkuds/lightrag@sha256:67ccf8d9f74eb29da872bf8b3e6513605f5ac601fb0509c5b0ca16d98d2d307d
  543. profiles:
  544. - knowledge-shadow
  545. environment:
  546. HOST: 0.0.0.0
  547. PORT: 9621
  548. WORKSPACE: ${LIGHTRAG_SHADOW_WORKSPACE:-dataops-global-shadow-g1}
  549. LIGHTRAG_API_KEY: ${LIGHTRAG_API_KEY:-local-shadow-only-key}
  550. LIGHTRAG_KV_STORAGE: PGKVStorage
  551. LIGHTRAG_DOC_STATUS_STORAGE: PGDocStatusStorage
  552. LIGHTRAG_VECTOR_STORAGE: PGVectorStorage
  553. LIGHTRAG_GRAPH_STORAGE: Neo4JStorage
  554. POSTGRES_HOST: postgres
  555. POSTGRES_PORT: 5432
  556. POSTGRES_USER: lightrag
  557. POSTGRES_PASSWORD: ${LIGHTRAG_POSTGRES_PASSWORD:-lightrag-test-password}
  558. POSTGRES_DATABASE: dataops_lightrag
  559. POSTGRES_ENABLE_VECTOR: "true"
  560. NEO4J_URI: bolt://lightrag-neo4j:7687
  561. NEO4J_USERNAME: neo4j
  562. NEO4J_PASSWORD: ${LIGHTRAG_NEO4J_PASSWORD:-lightrag-test-password}
  563. NEO4J_DATABASE: neo4j
  564. LLM_BINDING: openai
  565. LLM_BINDING_HOST: ${LIGHTRAG_LLM_BASE_URL:-https://api.deepseek.com/v1}
  566. LLM_BINDING_API_KEY: ${LIGHTRAG_LLM_API_KEY:-}
  567. LLM_MODEL: ${LIGHTRAG_LLM_MODEL:-deepseek-chat}
  568. EMBEDDING_BINDING: openai
  569. EMBEDDING_BINDING_HOST: ${QWEN_EMBEDDING_BASE_URL:-}
  570. EMBEDDING_BINDING_API_KEY: ${QWEN_EMBEDDING_API_KEY:-}
  571. EMBEDDING_MODEL: ${QWEN_EMBEDDING_MODEL:-text-embedding-v3}
  572. EMBEDDING_DIM: 1024
  573. LIGHTRAG_PARSER: "*:legacy-F"
  574. depends_on:
  575. postgres:
  576. condition: service_healthy
  577. lightrag-neo4j:
  578. condition: service_healthy
  579. healthcheck:
  580. test: ["CMD-SHELL", "curl -fsS http://127.0.0.1:9621/health >/dev/null"]
  581. interval: 10s
  582. timeout: 5s
  583. retries: 30
  584. start_period: 30s
  585. networks:
  586. - dataops-test-net
  587. lightrag-projector:
  588. image: ${DATAOPS_LIGHTRAG_PROJECTOR_IMAGE:-dataops-platform-lightrag-projector:local}
  589. build:
  590. context: ../..
  591. dockerfile: deploy/docker/backend.Dockerfile
  592. target: runtime
  593. profiles:
  594. - knowledge-shadow
  595. command: ["python", "-m", "app.core.knowledge.lightrag.worker"]
  596. environment:
  597. DATABASE_URL: postgresql://dataops_app:${DATAOPS_RUNTIME_PASSWORD:-dataops-app-test-password}@postgres:5432/dataops
  598. KNOWLEDGE_LIGHTRAG_BASE_URL: http://lightrag:9621
  599. KNOWLEDGE_LIGHTRAG_API_KEY: ${LIGHTRAG_API_KEY:-local-shadow-only-key}
  600. KNOWLEDGE_LIGHTRAG_TIMEOUT_SECONDS: 15
  601. LIGHTRAG_SHADOW_WORKSPACE: ${LIGHTRAG_SHADOW_WORKSPACE:-dataops-global-shadow-g1}
  602. depends_on:
  603. postgres:
  604. condition: service_healthy
  605. db-migrate:
  606. condition: service_completed_successfully
  607. lightrag:
  608. condition: service_healthy
  609. restart: unless-stopped
  610. networks:
  611. - dataops-test-net
  612. frontend:
  613. image: ${DATAOPS_FRONTEND_IMAGE:-dataops-platform-frontend:local}
  614. build:
  615. context: ../..
  616. dockerfile: deploy/docker/frontend.Dockerfile
  617. args:
  618. VUE_APP_N8N_URL: http://localhost:15678
  619. VUE_APP_N8N_CHAT_URL: ""
  620. VUE_APP_MINIO_PUBLIC_URL: http://localhost:19000/dataops-bucket
  621. VUE_APP_PREVIEW_URL: ""
  622. ports:
  623. - "${FRONTEND_PORT:-18183}:80"
  624. depends_on:
  625. backend:
  626. condition: service_healthy
  627. healthcheck:
  628. test: ["CMD-SHELL", "wget --spider -q http://127.0.0.1/"]
  629. interval: 10s
  630. timeout: 5s
  631. retries: 20
  632. networks:
  633. - dataops-test-net
  634. networks:
  635. dataops-test-net:
  636. name: ${DATAOPS_NETWORK_NAME:-dataops-test-net}
  637. edge-control-net:
  638. name: ${DATAOPS_EDGE_NETWORK_NAME:-dataops-edge-control-net}
  639. internal: true
  640. ipam:
  641. config:
  642. - subnet: 172.31.0.0/24
  643. secrets:
  644. edge_gateway_signing_private_key:
  645. file: ${EDGE_GATEWAY_SIGNING_PRIVATE_KEY_FILE:-./edge-secrets/edge-gateway-signing.key}
  646. volumes:
  647. dataops-test-postgres:
  648. dataops-test-source-postgres:
  649. dataops-test-source-mysql:
  650. dataops-test-neo4j:
  651. dataops-test-minio:
  652. dataops-test-n8n:
  653. dataops-test-kestra:
  654. dataops-test-backend-logs:
  655. dataops-test-upload:
  656. dataops-test-archive:
  657. dataops-test-lightrag-neo4j: