docker-compose.yaml 15 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. networks:
  2. r2r-network:
  3. driver: bridge
  4. attachable: true
  5. labels:
  6. - "com.docker.compose.recreate=always"
  7. volumes:
  8. hatchet_certs:
  9. name: ${VOLUME_HATCHET_CERTS:-hatchet_certs}
  10. hatchet_config:
  11. name: ${VOLUME_HATCHET_CONFIG:-hatchet_config}
  12. hatchet_api_key:
  13. name: ${VOLUME_HATCHET_API_KEY:-hatchet_api_key}
  14. postgres_data:
  15. name: ${VOLUME_POSTGRES_DATA:-postgres_data}
  16. hatchet_rabbitmq_data:
  17. name: ${VOLUME_HATCHET_RABBITMQ_DATA:-hatchet_rabbitmq_data}
  18. hatchet_rabbitmq_conf:
  19. name: ${VOLUME_HATCHET_RABBITMQ_CONF:-hatchet_rabbitmq_conf}
  20. hatchet_postgres_data:
  21. name: ${VOLUME_HATCHET_POSTGRES_DATA:-hatchet_postgres_data}
  22. services:
  23. postgres:
  24. image: pgvector/pgvector:pg17
  25. profiles: [ postgres ]
  26. environment:
  27. - POSTGRES_USER=${R2R_POSTGRES_USER:-${POSTGRES_USER:-postgres}} # Eventually get rid of POSTGRES_USER, but for now keep it for backwards compatibility
  28. - POSTGRES_PASSWORD=${R2R_POSTGRES_PASSWORD:-${POSTGRES_PASSWORD:-cocorobo-123}} # Eventually get rid of POSTGRES_PASSWORD, but for now keep it for backwards compatibility
  29. - POSTGRES_HOST=${R2R_POSTGRES_HOST:-${POSTGRES_HOST:-postgres}} # Eventually get rid of POSTGRES_HOST, but for now keep it for backwards compatibility
  30. - POSTGRES_PORT=${R2R_POSTGRES_PORT:-${POSTGRES_PORT:-5432}} # Eventually get rid of POSTGRES_PORT, but for now keep it for backwards compatibility
  31. - POSTGRES_MAX_CONNECTIONS=${R2R_POSTGRES_MAX_CONNECTIONS:-${POSTGRES_MAX_CONNECTIONS:-102400}} # Eventually get rid of POSTGRES_MAX_CONNECTIONS, but for now keep it for backwards compatibility
  32. - PGPORT=${R2R_POSTGRES_PORT:-5432}
  33. volumes:
  34. - ./postgres_data:/var/lib/postgresql/data
  35. networks:
  36. - r2r-network
  37. ports:
  38. - "${R2R_POSTGRES_PORT:-5432}:${R2R_POSTGRES_PORT:-5432}"
  39. healthcheck:
  40. test: [ "CMD-SHELL", "pg_isready -U ${R2R_POSTGRES_USER:-postgres}" ]
  41. interval: 10s
  42. timeout: 5s
  43. retries: 5
  44. restart: on-failure
  45. command: >
  46. postgres -c max_connections=${R2R_POSTGRES_MAX_CONNECTIONS:-1024}
  47. hatchet-postgres:
  48. image: postgres:latest
  49. environment:
  50. POSTGRES_DB: ${HATCHET_POSTGRES_DBNAME:-hatchet}
  51. POSTGRES_USER: ${HATCHET_POSTGRES_USER:-hatchet_user}
  52. POSTGRES_PASSWORD: ${HATCHET_POSTGRES_PASSWORD:-hatchet_password}
  53. volumes:
  54. - hatchet_postgres_data:/var/lib/postgresql/data
  55. networks:
  56. - r2r-network
  57. healthcheck:
  58. test: [ "CMD-SHELL", "pg_isready -U ${HATCHET_POSTGRES_USER:-hatchet_user} -d ${HATCHET_POSTGRES_DBNAME:-hatchet}" ]
  59. interval: 10s
  60. timeout: 5s
  61. retries: 5
  62. hatchet-rabbitmq:
  63. image: "rabbitmq:3-management"
  64. hostname: "hatchet-rabbitmq"
  65. ports:
  66. - "${R2R_RABBITMQ_PORT:-5673}:5672"
  67. - "${R2R_RABBITMQ_MGMT_PORT:-15673}:15672"
  68. environment:
  69. RABBITMQ_DEFAULT_USER: "user"
  70. RABBITMQ_DEFAULT_PASS: "password"
  71. volumes:
  72. - hatchet_rabbitmq_data:/var/lib/rabbitmq
  73. - hatchet_rabbitmq_conf:/etc/rabbitmq/rabbitmq.conf
  74. healthcheck:
  75. test: [ "CMD", "rabbitmqctl", "status" ]
  76. interval: 10s
  77. timeout: 10s
  78. retries: 5
  79. networks:
  80. - r2r-network
  81. hatchet-create-db:
  82. image: postgres:latest
  83. command: >
  84. sh -c "
  85. set -e
  86. echo 'Waiting for PostgreSQL to be ready...'
  87. while ! pg_isready -h hatchet-postgres -p 5432 -U ${HATCHET_POSTGRES_USER:-hatchet_user}; do
  88. sleep 1
  89. done
  90. echo 'PostgreSQL is ready, checking if database exists...'
  91. if ! PGPASSWORD=${HATCHET_POSTGRES_PASSWORD:-hatchet_password} psql -h hatchet-postgres -p 5432 -U ${HATCHET_POSTGRES_USER:-hatchet_user} -lqt | grep -qw ${HATCHET_POSTGRES_DBNAME:-hatchet}; then
  92. echo 'Database does not exist, creating it...'
  93. PGPASSWORD=${HATCHET_POSTGRES_PASSWORD:-hatchet_password} createdb -h hatchet-postgres -p 5432 -U ${HATCHET_POSTGRES_USER:-hatchet_user} -w ${HATCHET_POSTGRES_DBNAME:-hatchet}
  94. else
  95. echo 'Database already exists, skipping creation.'
  96. fi
  97. "
  98. environment:
  99. DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
  100. networks:
  101. - r2r-network
  102. hatchet-migration:
  103. image: ghcr.io/hatchet-dev/hatchet/hatchet-migrate:latest
  104. environment:
  105. DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
  106. depends_on:
  107. hatchet-create-db:
  108. condition: service_completed_successfully
  109. networks:
  110. - r2r-network
  111. hatchet-setup-config:
  112. image: ghcr.io/hatchet-dev/hatchet/hatchet-admin:latest
  113. command: /hatchet/hatchet-admin quickstart --skip certs --generated-config-dir /hatchet/config --overwrite=false
  114. environment:
  115. DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
  116. HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH: "${HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH:-134217728}"
  117. HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH: "${HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH:-134217728}"
  118. DATABASE_POSTGRES_PORT: "5432"
  119. DATABASE_POSTGRES_HOST: hatchet-postgres
  120. DATABASE_POSTGRES_USERNAME: "${HATCHET_POSTGRES_USER:-hatchet_user}"
  121. DATABASE_POSTGRES_PASSWORD: "${HATCHET_POSTGRES_PASSWORD:-hatchet_password}"
  122. HATCHET_DATABASE_POSTGRES_DB_NAME: "${HATCHET_POSTGRES_DBNAME:-hatchet}"
  123. SERVER_TASKQUEUE_RABBITMQ_URL: amqp://user:password@hatchet-rabbitmq:5672/
  124. SERVER_AUTH_COOKIE_DOMAIN: "http://host.docker.internal:${R2R_HATCHET_DASHBOARD_PORT:-7274}"
  125. SERVER_URL: "http://host.docker.internal:${R2R_HATCHET_DASHBOARD_PORT:-7274}"
  126. SERVER_AUTH_COOKIE_INSECURE: "t"
  127. SERVER_GRPC_BIND_ADDRESS: "0.0.0.0"
  128. SERVER_GRPC_INSECURE: "t"
  129. SERVER_GRPC_BROADCAST_ADDRESS: "hatchet-engine:7077"
  130. SERVER_GRPC_MAX_MSG_SIZE: 134217728
  131. volumes:
  132. - hatchet_certs:/hatchet/certs
  133. - hatchet_config:/hatchet/config
  134. depends_on:
  135. hatchet-migration:
  136. condition: service_completed_successfully
  137. hatchet-rabbitmq:
  138. condition: service_healthy
  139. networks:
  140. - r2r-network
  141. hatchet-engine:
  142. image: ghcr.io/hatchet-dev/hatchet/hatchet-engine:latest
  143. command: /hatchet/hatchet-engine --config /hatchet/config
  144. restart: on-failure
  145. depends_on:
  146. hatchet-setup-config:
  147. condition: service_completed_successfully
  148. ports:
  149. - "${R2R_HATCHET_ENGINE_PORT:-7077}:7077"
  150. environment:
  151. DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
  152. SERVER_GRPC_BROADCAST_ADDRESS: "hatchet-engine:7077"
  153. SERVER_GRPC_BIND_ADDRESS: "0.0.0.0"
  154. SERVER_GRPC_PORT: "7077"
  155. SERVER_GRPC_INSECURE: "t"
  156. SERVER_GRPC_MAX_MSG_SIZE: 134217728
  157. volumes:
  158. - hatchet_certs:/hatchet/certs
  159. - hatchet_config:/hatchet/config
  160. networks:
  161. - r2r-network
  162. healthcheck:
  163. test: [ "CMD", "wget", "-q", "-O", "-", "http://localhost:8733/live" ]
  164. interval: 10s
  165. timeout: 5s
  166. retries: 5
  167. hatchet-dashboard:
  168. image: ghcr.io/hatchet-dev/hatchet/hatchet-dashboard:latest
  169. command: sh ./entrypoint.sh --config /hatchet/config
  170. restart: on-failure
  171. depends_on:
  172. hatchet-setup-config:
  173. condition: service_completed_successfully
  174. environment:
  175. DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
  176. volumes:
  177. - hatchet_certs:/hatchet/certs
  178. - hatchet_config:/hatchet/config
  179. networks:
  180. - r2r-network
  181. ports:
  182. - "${R2R_HATCHET_DASHBOARD_PORT:-7274}:80"
  183. setup-token:
  184. image: ghcr.io/hatchet-dev/hatchet/hatchet-admin:latest
  185. command: >
  186. sh -c "
  187. set -e
  188. echo 'Starting token creation process...'
  189. # Attempt to create token and capture both stdout and stderr
  190. TOKEN_OUTPUT=$$(/hatchet/hatchet-admin token create --config /hatchet/config --tenant-id 707d0855-80ab-4e1f-a156-f1c4546cbf52 2>&1)
  191. # Extract the token (assuming it's the only part that looks like a JWT)
  192. TOKEN=$$(echo \"$$TOKEN_OUTPUT\" | grep -Eo 'eyJ[A-Za-z0-9_-]*\.eyJ[A-Za-z0-9_-]*\.[A-Za-z0-9_-]*')
  193. if [ -z \"$$TOKEN\" ]; then
  194. echo 'Error: Failed to extract token. Full command output:' >&2
  195. echo \"$$TOKEN_OUTPUT\" >&2
  196. exit 1
  197. fi
  198. echo \"$$TOKEN\" > /tmp/hatchet_api_key
  199. echo 'Token created and saved to /tmp/hatchet_api_key'
  200. # Copy token to final destination
  201. echo -n \"$$TOKEN\" > /hatchet_api_key/api_key.txt
  202. echo 'Token copied to /hatchet_api_key/api_key.txt'
  203. # Verify token was copied correctly
  204. if [ \"$$(cat /tmp/hatchet_api_key)\" != \"$(cat /hatchet_api_key/api_key.txt)\" ]; then
  205. echo 'Error: Token copy failed, files do not match' >&2
  206. echo 'Content of /tmp/hatchet_api_key:'
  207. cat /tmp/hatchet_api_key
  208. echo 'Content of /hatchet_api_key/api_key.txt:'
  209. cat /hatchet_api_key/api_key.txt
  210. exit 1
  211. fi
  212. echo 'Hatchet API key has been saved successfully'
  213. echo 'Token length:' $${#TOKEN}
  214. echo 'Token (first 20 chars):' $${TOKEN:0:20}
  215. echo 'Token structure:' $$(echo $$TOKEN | awk -F. '{print NF-1}') 'parts'
  216. # Check each part of the token
  217. for i in 1 2 3; do
  218. PART=$$(echo $$TOKEN | cut -d. -f$$i)
  219. echo 'Part' $$i 'length:' $${#PART}
  220. echo 'Part' $$i 'base64 check:' $$(echo $$PART | base64 -d >/dev/null 2>&1 && echo 'Valid' || echo 'Invalid')
  221. done
  222. # Final validation attempt
  223. if ! echo $$TOKEN | awk -F. '{print $$2}' | base64 -d 2>/dev/null | jq . >/dev/null 2>&1; then
  224. echo 'Warning: Token payload is not valid JSON when base64 decoded' >&2
  225. else
  226. echo 'Token payload appears to be valid JSON'
  227. fi
  228. "
  229. networks:
  230. - r2r-network
  231. volumes:
  232. - hatchet_certs:/hatchet/certs
  233. - hatchet_config:/hatchet/config
  234. - hatchet_api_key:/hatchet_api_key
  235. depends_on:
  236. hatchet-setup-config:
  237. condition: service_completed_successfully
  238. unstructured:
  239. image: ${UNSTRUCTURED_IMAGE:-ragtoriches/unst-prod}
  240. networks:
  241. - r2r-network
  242. healthcheck:
  243. test: [ "CMD", "curl", "-f", "http://localhost:7275/health" ]
  244. interval: 10s
  245. timeout: 5s
  246. retries: 5
  247. graph_clustering:
  248. image: ${GRAPH_CLUSTERING_IMAGE:-ragtoriches/cluster-prod}
  249. ports:
  250. - "${R2R_GRAPH_CLUSTERING_PORT:-7276}:7276"
  251. networks:
  252. - r2r-network
  253. healthcheck:
  254. test: [ "CMD", "curl", "-f", "http://localhost:7276/health" ]
  255. interval: 10s
  256. timeout: 5s
  257. retries: 5
  258. r2r:
  259. image: ${R2R_IMAGE:-ragtoriches/prod:latest}
  260. build:
  261. context: .
  262. args:
  263. PORT: ${R2R_PORT:-7272}
  264. R2R_PORT: ${R2R_PORT:-7272}
  265. HOST: ${R2R_HOST:-0.0.0.0}
  266. R2R_HOST: ${R2R_HOST:-0.0.0.0}
  267. ports:
  268. - "${R2R_PORT:-7272}:${R2R_PORT:-7272}"
  269. environment:
  270. - PYTHONUNBUFFERED=1
  271. - R2R_PORT=${R2R_PORT:-7272}
  272. - R2R_HOST=${R2R_HOST:-0.0.0.0}
  273. # R2R
  274. - R2R_CONFIG_NAME=${R2R_CONFIG_NAME:-}
  275. - R2R_CONFIG_PATH=${R2R_CONFIG_PATH:-}
  276. - R2R_PROJECT_NAME=${R2R_PROJECT_NAME:-r2r_default}
  277. # Postgres
  278. - R2R_POSTGRES_USER=${R2R_POSTGRES_USER:-postgres}
  279. - R2R_POSTGRES_PASSWORD=${R2R_POSTGRES_PASSWORD:-cocorobo-123}
  280. - R2R_POSTGRES_HOST=${R2R_POSTGRES_HOST:-postgres}
  281. - R2R_POSTGRES_PORT=${R2R_POSTGRES_PORT:-5432}
  282. - R2R_POSTGRES_DBNAME=${R2R_POSTGRES_DBNAME:-cocorobo-file2}
  283. - R2R_POSTGRES_MAX_CONNECTIONS=${R2R_POSTGRES_MAX_CONNECTIONS:-102400}
  284. - R2R_POSTGRES_PROJECT_NAME=${R2R_POSTGRES_PROJECT_NAME:-cocorobo-knowledge}
  285. - R2R_POSTGRES_STATEMENT_CACHE_SIZE=${R2R_POSTGRES_STATEMENT_CACHE_SIZE:-100}
  286. # OpenAI
  287. - OPENAI_API_KEY=${OPENAI_API_KEY:-sk-vTqeBKDC2j6osbGt89A2202dAd1c4fE8B1D294388b569e54}
  288. - OPENAI_API_BASE=${OPENAI_API_BASE:-https://onehub.cocorobo.cn/v1}
  289. # Anthropic
  290. - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
  291. # Azure
  292. - AZURE_API_KEY=${AZURE_API_KEY:-}
  293. - AZURE_API_BASE=${AZURE_API_BASE:-}
  294. - AZURE_API_VERSION=${AZURE_API_VERSION:-}
  295. # Google Vertex AI
  296. - GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS:-}
  297. - VERTEX_PROJECT=${VERTEX_PROJECT:-}
  298. - VERTEX_LOCATION=${VERTEX_LOCATION:-}
  299. # AWS Bedrock
  300. - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-AKIATLPEDU37QV5CHLMH}
  301. - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-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}
  302. - AWS_REGION_NAME=${AWS_REGION_NAME:-cn-northwest-1}
  303. # Groq
  304. - GROQ_API_KEY=${GROQ_API_KEY:-}
  305. # Cohere
  306. - COHERE_API_KEY=${COHERE_API_KEY:-}
  307. # Anyscale
  308. - ANYSCALE_API_KEY=${ANYSCALE_API_KEY:-}
  309. # Ollama
  310. - OLLAMA_API_BASE=${OLLAMA_API_BASE:-http://host.docker.internal:11434}
  311. # Huggingface
  312. - HUGGINGFACE_API_BASE=${HUGGINGFACE_API_BASE:-http://host.docker.internal:8080}
  313. - HUGGINGFACE_API_KEY=${HUGGINGFACE_API_KEY}
  314. # Unstructured
  315. - UNSTRUCTURED_API_KEY=${UNSTRUCTURED_API_KEY:-}
  316. - UNSTRUCTURED_API_URL=${UNSTRUCTURED_API_URL:-https://api.unstructured.io/general/v0/general}
  317. - UNSTRUCTURED_SERVICE_URL=${UNSTRUCTURED_SERVICE_URL:-http://unstructured:7275}
  318. - UNSTRUCTURED_NUM_WORKERS=${UNSTRUCTURED_NUM_WORKERS:-10}
  319. # Hatchet
  320. - HATCHET_CLIENT_TLS_STRATEGY=none
  321. - HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH=${HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH:-134217728}
  322. - HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH=${HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH:-134217728}
  323. # Graphologic
  324. - CLUSTERING_SERVICE_URL=http://graph_clustering:7276
  325. command: >
  326. sh -c '
  327. if [ -z "$${HATCHET_CLIENT_TOKEN}" ]; then
  328. export HATCHET_CLIENT_TOKEN=$$(cat /hatchet_api_key/api_key.txt)
  329. fi
  330. exec uvicorn core.main.app_entry:app --host $${R2R_HOST} --port $${R2R_PORT}
  331. '
  332. networks:
  333. - r2r-network
  334. healthcheck:
  335. test: [ "CMD", "curl", "-f", "http://localhost:${R2R_PORT:-7272}/v3/health" ]
  336. interval: 6s
  337. timeout: 5s
  338. retries: 5
  339. restart: on-failure
  340. volumes:
  341. - ${R2R_CONFIG_PATH:-/}:${R2R_CONFIG_PATH:-/app/config}
  342. - hatchet_api_key:/hatchet_api_key:ro
  343. extra_hosts:
  344. - host.docker.internal:host-gateway
  345. depends_on:
  346. setup-token:
  347. condition: service_completed_successfully
  348. unstructured:
  349. condition: service_healthy
  350. r2r-dashboard:
  351. image: emrgntcmplxty/r2r-dashboard:latest
  352. environment:
  353. - NEXT_PUBLIC_R2R_DEPLOYMENT_URL=${R2R_DEPLOYMENT_URL:-http://localhost:7272}
  354. - NEXT_PUBLIC_HATCHET_DASHBOARD_URL=${HATCHET_DASHBOARD_URL:-http://localhost:${R2R_HATCHET_DASHBOARD_PORT:-7274}}
  355. networks:
  356. - r2r-network
  357. ports:
  358. - "${R2R_DASHBOARD_PORT:-7273}:3000"