compose.full_with_replicas.yaml 15 KB

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