compose.full.swarm.yaml 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392
  1. volumes:
  2. hatchet_certs:
  3. name: ${VOLUME_HATCHET_CERTS:-hatchet_certs}
  4. hatchet_config:
  5. name: ${VOLUME_HATCHET_CONFIG:-hatchet_config}
  6. hatchet_api_key:
  7. name: ${VOLUME_HATCHET_API_KEY:-hatchet_api_key}
  8. postgres_data:
  9. name: ${VOLUME_POSTGRES_DATA:-postgres_data}
  10. hatchet_rabbitmq_data:
  11. name: ${VOLUME_HATCHET_RABBITMQ_DATA:-hatchet_rabbitmq_data}
  12. hatchet_rabbitmq_conf:
  13. name: ${VOLUME_HATCHET_RABBITMQ_CONF:-hatchet_rabbitmq_conf}
  14. hatchet_postgres_data:
  15. name: ${VOLUME_HATCHET_POSTGRES_DATA:-hatchet_postgres_data}
  16. services:
  17. postgres:
  18. image: pgvector/pgvector:pg16
  19. environment:
  20. - POSTGRES_USER=${R2R_POSTGRES_USER:-postgres}
  21. - POSTGRES_PASSWORD=${R2R_POSTGRES_PASSWORD:-postgres}
  22. - POSTGRES_HOST=${R2R_POSTGRES_HOST:-postgres}
  23. - POSTGRES_PORT=${R2R_POSTGRES_PORT:-5432}
  24. - POSTGRES_MAX_CONNECTIONS=${R2R_POSTGRES_MAX_CONNECTIONS:-1024}
  25. - PGPORT=${R2R_POSTGRES_PORT:-5432}
  26. volumes:
  27. - postgres_data:/var/lib/postgresql/data
  28. ports:
  29. - "${R2R_POSTGRES_PORT:-5432}:${R2R_POSTGRES_PORT:-5432}"
  30. healthcheck:
  31. test: ["CMD-SHELL", "pg_isready -U ${R2R_POSTGRES_USER:-postgres}"]
  32. interval: 10s
  33. timeout: 5s
  34. retries: 5
  35. command: >
  36. postgres
  37. -c max_connections=${R2R_POSTGRES_MAX_CONNECTIONS:-1024}
  38. deploy:
  39. replicas: 1
  40. restart_policy:
  41. condition: on-failure
  42. hatchet-postgres:
  43. image: postgres:latest
  44. environment:
  45. POSTGRES_DB: ${HATCHET_POSTGRES_DBNAME:-hatchet}
  46. POSTGRES_USER: ${HATCHET_POSTGRES_USER:-hatchet_user}
  47. POSTGRES_PASSWORD: ${HATCHET_POSTGRES_PASSWORD:-hatchet_password}
  48. volumes:
  49. - hatchet_postgres_data:/var/lib/postgresql/data
  50. healthcheck:
  51. test: ["CMD-SHELL", "pg_isready -U ${HATCHET_POSTGRES_USER:-hatchet_user} -d ${HATCHET_POSTGRES_DBNAME:-hatchet}"]
  52. interval: 10s
  53. timeout: 5s
  54. retries: 5
  55. deploy:
  56. replicas: 1
  57. restart_policy:
  58. condition: on-failure
  59. hatchet-rabbitmq:
  60. image: "rabbitmq:3-management"
  61. hostname: "hatchet-rabbitmq"
  62. ports:
  63. - "${R2R_RABBITMQ_PORT:-5673}:5672"
  64. - "${R2R_RABBITMQ_MGMT_PORT:-15673}:15672"
  65. environment:
  66. RABBITMQ_DEFAULT_USER: "user"
  67. RABBITMQ_DEFAULT_PASS: "password"
  68. volumes:
  69. - hatchet_rabbitmq_data:/var/lib/rabbitmq
  70. - hatchet_rabbitmq_conf:/etc/rabbitmq/rabbitmq.conf
  71. healthcheck:
  72. test: ["CMD", "rabbitmqctl", "status"]
  73. interval: 10s
  74. timeout: 10s
  75. retries: 5
  76. deploy:
  77. replicas: 1
  78. restart_policy:
  79. condition: on-failure
  80. hatchet-create-db:
  81. image: postgres:latest
  82. command: >
  83. sh -c "
  84. set -e
  85. echo 'Waiting for PostgreSQL to be ready...'
  86. while ! pg_isready -h hatchet-postgres -p 5432 -U ${HATCHET_POSTGRES_USER:-hatchet_user}; do
  87. sleep 1
  88. done
  89. echo 'PostgreSQL is ready, checking if database exists...'
  90. 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
  91. echo 'Database does not exist, creating it...'
  92. PGPASSWORD=${HATCHET_POSTGRES_PASSWORD:-hatchet_password} createdb -h hatchet-postgres -p 5432 -U ${HATCHET_POSTGRES_USER:-hatchet_user} -w ${HATCHET_POSTGRES_DBNAME:-hatchet}
  93. else
  94. echo 'Database already exists, skipping creation.'
  95. fi
  96. "
  97. environment:
  98. DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
  99. deploy:
  100. replicas: 1
  101. restart_policy:
  102. condition: on-failure
  103. hatchet-migration:
  104. image: ghcr.io/hatchet-dev/hatchet/hatchet-migrate:v0.53.15
  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. deploy:
  110. replicas: 1
  111. restart_policy:
  112. condition: on-failure
  113. hatchet-setup-config:
  114. image: ghcr.io/hatchet-dev/hatchet/hatchet-admin:v0.53.15
  115. command: /hatchet/hatchet-admin quickstart --skip certs --generated-config-dir /hatchet/config --overwrite=false
  116. environment:
  117. DATABASE_URL: "postgres://${HATCHET_POSTGRES_USER:-hatchet_user}:${HATCHET_POSTGRES_PASSWORD:-hatchet_password}@hatchet-postgres:5432/${HATCHET_POSTGRES_DBNAME:-hatchet}?sslmode=disable"
  118. HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH: "${HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH:-134217728}"
  119. HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH: "${HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH:-134217728}"
  120. DATABASE_POSTGRES_PORT: "5432"
  121. DATABASE_POSTGRES_HOST: hatchet-postgres
  122. DATABASE_POSTGRES_USERNAME: "${HATCHET_POSTGRES_USER:-hatchet_user}"
  123. DATABASE_POSTGRES_PASSWORD: "${HATCHET_POSTGRES_PASSWORD:-hatchet_password}"
  124. HATCHET_DATABASE_POSTGRES_DB_NAME: "${HATCHET_POSTGRES_DBNAME:-hatchet}"
  125. SERVER_TASKQUEUE_RABBITMQ_URL: amqp://user:password@hatchet-rabbitmq:5672/
  126. SERVER_AUTH_COOKIE_DOMAIN: "http://host.docker.internal:${R2R_HATCHET_DASHBOARD_PORT:-7274}"
  127. SERVER_URL: "http://host.docker.internal:${R2R_HATCHET_DASHBOARD_PORT:-7274}"
  128. SERVER_AUTH_COOKIE_INSECURE: "t"
  129. SERVER_GRPC_BIND_ADDRESS: "0.0.0.0"
  130. SERVER_GRPC_INSECURE: "t"
  131. SERVER_GRPC_BROADCAST_ADDRESS: "hatchet-engine:7077"
  132. SERVER_GRPC_MAX_MSG_SIZE: 134217728
  133. volumes:
  134. - hatchet_certs:/hatchet/certs
  135. - hatchet_config:/hatchet/config
  136. depends_on:
  137. - hatchet-migration
  138. - hatchet-rabbitmq
  139. deploy:
  140. replicas: 1
  141. restart_policy:
  142. condition: on-failure
  143. hatchet-engine:
  144. image: ghcr.io/hatchet-dev/hatchet/hatchet-engine:v0.53.15
  145. command: /hatchet/hatchet-engine --config /hatchet/config
  146. depends_on:
  147. - hatchet-setup-config
  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. healthcheck:
  161. test: ["CMD", "wget", "-q", "-O", "-", "http://localhost:8733/live"]
  162. interval: 10s
  163. timeout: 5s
  164. retries: 5
  165. deploy:
  166. replicas: 1
  167. restart_policy:
  168. condition: on-failure
  169. hatchet-dashboard:
  170. image: ghcr.io/hatchet-dev/hatchet/hatchet-dashboard:v0.53.15
  171. command: sh ./entrypoint.sh --config /hatchet/config
  172. depends_on:
  173. - hatchet-setup-config
  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. ports:
  180. - "${R2R_HATCHET_DASHBOARD_PORT:-7274}:80"
  181. deploy:
  182. replicas: 1
  183. restart_policy:
  184. condition: on-failure
  185. setup-token:
  186. image: ghcr.io/hatchet-dev/hatchet/hatchet-admin:v0.53.15
  187. command: sh /scripts/setup-token.sh
  188. volumes:
  189. - ./scripts:/scripts
  190. - hatchet_certs:/hatchet/certs
  191. - hatchet_config:/hatchet/config
  192. - hatchet_api_key:/hatchet_api_key
  193. depends_on:
  194. - hatchet-setup-config
  195. deploy:
  196. replicas: 1
  197. restart_policy:
  198. condition: on-failure
  199. unstructured:
  200. image: ${UNSTRUCTURED_IMAGE:-ragtoriches/unst-prod}
  201. healthcheck:
  202. test: ["CMD", "curl", "-f", "http://localhost:7275/health"]
  203. interval: 10s
  204. timeout: 5s
  205. retries: 5
  206. deploy:
  207. replicas: 1
  208. restart_policy:
  209. condition: on-failure
  210. graph_clustering:
  211. image: ${GRAPH_CLUSTERING_IMAGE:-ragtoriches/cluster-prod}
  212. ports:
  213. - "${R2R_GRAPH_CLUSTERING_PORT:-7276}:7276"
  214. healthcheck:
  215. test: ["CMD", "curl", "-f", "http://localhost:7276/health"]
  216. interval: 10s
  217. timeout: 5s
  218. retries: 5
  219. deploy:
  220. replicas: 1
  221. restart_policy:
  222. condition: on-failure
  223. r2r:
  224. image: sciphiai/r2r:latest
  225. ports:
  226. - "${R2R_PORT:-7272}:${R2R_PORT:-7272}"
  227. environment:
  228. - PYTHONUNBUFFERED=1
  229. - R2R_PORT=${R2R_PORT:-7272}
  230. - R2R_HOST=${R2R_HOST:-0.0.0.0}
  231. # R2R
  232. - R2R_LOG_LEVEL=${R2R_LOG_LEVEL:-INFO}
  233. - R2R_LOG_CONSOLE_FORMATTER=${R2R_LOG_CONSOLE_FORMATTER:-json}
  234. - R2R_CONFIG_NAME=${R2R_CONFIG_NAME:-}
  235. - R2R_CONFIG_PATH=${R2R_CONFIG_PATH:-}
  236. - R2R_PROJECT_NAME=${R2R_PROJECT_NAME:-r2r_default}
  237. - R2R_SECRET_KEY=${R2R_SECRET_KEY:-}
  238. # Postgres
  239. - R2R_POSTGRES_USER=${R2R_POSTGRES_USER:-postgres}
  240. - R2R_POSTGRES_PASSWORD=${R2R_POSTGRES_PASSWORD:-postgres}
  241. - R2R_POSTGRES_HOST=${R2R_POSTGRES_HOST:-postgres}
  242. - R2R_POSTGRES_PORT=${R2R_POSTGRES_PORT:-5432}
  243. - R2R_POSTGRES_DBNAME=${R2R_POSTGRES_DBNAME:-postgres}
  244. - R2R_POSTGRES_MAX_CONNECTIONS=${R2R_POSTGRES_MAX_CONNECTIONS:-1024}
  245. - R2R_POSTGRES_STATEMENT_CACHE_SIZE=${R2R_POSTGRES_STATEMENT_CACHE_SIZE:-100}
  246. # OpenAI
  247. - OPENAI_API_KEY=${OPENAI_API_KEY:-}
  248. - OPENAI_API_BASE=${OPENAI_API_BASE:-}
  249. # Azure Foundry
  250. - AZURE_FOUNDRY_API_ENDPOINT=${AZURE_FOUNDRY_API_ENDPOINT:-}
  251. - AZURE_FOUNDRY_API_KEY=${AZURE_FOUNDRY_API_KEY:-}
  252. # XAI / GROK
  253. - XAI_API_KEY=${XAI_API_KEY:-}
  254. # Anthropic
  255. - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY:-}
  256. # Azure
  257. - AZURE_API_KEY=${AZURE_API_KEY:-}
  258. - AZURE_API_BASE=${AZURE_API_BASE:-}
  259. - AZURE_API_VERSION=${AZURE_API_VERSION:-}
  260. # Google Vertex AI
  261. - GOOGLE_APPLICATION_CREDENTIALS=${GOOGLE_APPLICATION_CREDENTIALS:-}
  262. - VERTEX_PROJECT=${VERTEX_PROJECT:-}
  263. - VERTEX_LOCATION=${VERTEX_LOCATION:-}
  264. # Google Gemini
  265. - GEMINI_API_KEY=${GEMINI_API_KEY:-}
  266. # AWS Bedrock
  267. - AWS_ACCESS_KEY_ID=${AWS_ACCESS_KEY_ID:-}
  268. - AWS_SECRET_ACCESS_KEY=${AWS_SECRET_ACCESS_KEY:-}
  269. - AWS_REGION_NAME=${AWS_REGION_NAME:-}
  270. # Groq
  271. - GROQ_API_KEY=${GROQ_API_KEY:-}
  272. # Cohere
  273. - COHERE_API_KEY=${COHERE_API_KEY:-}
  274. # Anyscale
  275. - ANYSCALE_API_KEY=${ANYSCALE_API_KEY:-}
  276. # Ollama
  277. - OLLAMA_API_BASE=${OLLAMA_API_BASE:-http://host.docker.internal:11434}
  278. # LM Studio
  279. - LM_STUDIO_API_BASE=${LM_STUDIO_API_BASE:-http://host.docker.internal:1234}
  280. - LM_STUDIO_API_KEY=${LM_STUDIO_API_KEY:-1234}
  281. # Huggingface
  282. - HUGGINGFACE_API_BASE=${HUGGINGFACE_API_BASE:-http://host.docker.internal:8080}
  283. - HUGGINGFACE_API_KEY=${HUGGINGFACE_API_KEY}
  284. # Unstructured
  285. - UNSTRUCTURED_API_KEY=${UNSTRUCTURED_API_KEY:-}
  286. - UNSTRUCTURED_API_URL=${UNSTRUCTURED_API_URL:-https://api.unstructured.io/general/v0/general}
  287. - UNSTRUCTURED_SERVICE_URL=${UNSTRUCTURED_SERVICE_URL:-http://unstructured:7275}
  288. - UNSTRUCTURED_NUM_WORKERS=${UNSTRUCTURED_NUM_WORKERS:-10}
  289. # Hatchet
  290. - HATCHET_CLIENT_TLS_STRATEGY=none
  291. - HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH=${HATCHET_CLIENT_GRPC_MAX_RECV_MESSAGE_LENGTH:-134217728}
  292. - HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH=${HATCHET_CLIENT_GRPC_MAX_SEND_MESSAGE_LENGTH:-134217728}
  293. # Graphologic
  294. - CLUSTERING_SERVICE_URL=http://graph_clustering:7276
  295. # OAuth Credentials
  296. - GOOGLE_CLIENT_ID=${GOOGLE_CLIENT_ID}
  297. - GOOGLE_CLIENT_SECRET=${GOOGLE_CLIENT_SECRET}
  298. - GOOGLE_REDIRECT_URI=${GOOGLE_REDIRECT_URI}
  299. - GITHUB_CLIENT_ID=${GITHUB_CLIENT_ID}
  300. - GITHUB_CLIENT_SECRET=${GITHUB_CLIENT_SECRET}
  301. - GITHUB_REDIRECT_URI=${GITHUB_REDIRECT_URI}
  302. # Other
  303. - FIRECRAWL_API_KEY=${FIRECRAWL_API_KEY}
  304. - SERPER_API_KEY=${SERPER_API_KEY}
  305. - SENDGRID_API_KEY=${SENDGRID_API_KEY}
  306. - R2R_SENTRY_DSN=${R2R_SENTRY_DSN}
  307. - R2R_SENTRY_ENVIRONMENT=${R2R_SENTRY_ENVIRONMENT}
  308. - R2R_SENTRY_TRACES_SAMPLE_RATE=${R2R_SENTRY_TRACES_SAMPLE_RATE}
  309. - R2R_SENTRY_PROFILES_SAMPLE_RATE=${R2R_SENTRY_PROFILES_SAMPLE_RATE}
  310. command: >
  311. sh -c '
  312. if [ -z "$${HATCHET_CLIENT_TOKEN}" ]; then
  313. export HATCHET_CLIENT_TOKEN=$$(cat /hatchet_api_key/api_key.txt)
  314. fi
  315. exec uvicorn core.main.app_entry:app --host $${R2R_HOST} --port $${R2R_PORT}
  316. '
  317. volumes:
  318. - ${R2R_CONFIG_PATH:-/}:${R2R_CONFIG_PATH:-/app/config}
  319. - hatchet_api_key:/hatchet_api_key:ro
  320. extra_hosts:
  321. - host.docker.internal:host-gateway
  322. depends_on:
  323. - setup-token
  324. - unstructured
  325. - graph_clustering
  326. healthcheck:
  327. test: ["CMD", "curl", "-f", "http://localhost:${R2R_PORT:-7272}/v3/health"]
  328. interval: 6s
  329. timeout: 5s
  330. retries: 5
  331. start_period: 30s
  332. deploy:
  333. replicas: ${R2R_REPLICAS:-3}
  334. restart_policy:
  335. condition: on-failure
  336. update_config:
  337. parallelism: 1
  338. delay: 30s
  339. order: start-first
  340. rollback_config:
  341. parallelism: 1
  342. delay: 30s
  343. r2r-dashboard:
  344. image: sciphiai/r2r-dashboard:1.0.3
  345. environment:
  346. - NEXT_PUBLIC_R2R_DEPLOYMENT_URL=${R2R_DEPLOYMENT_URL:-http://localhost:7272}
  347. - NEXT_PUBLIC_HATCHET_DASHBOARD_URL=${HATCHET_DASHBOARD_URL:-http://localhost:${R2R_HATCHET_DASHBOARD_PORT:-7274}}
  348. ports:
  349. - "${R2R_DASHBOARD_PORT:-7273}:3000"
  350. deploy:
  351. replicas: 1
  352. restart_policy:
  353. condition: on-failure