@better-openclaw/core 1.0.19 → 1.0.21

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (61) hide show
  1. package/.github/dependabot.yml +32 -0
  2. package/.github/workflows/ci.yml +8 -8
  3. package/.github/workflows/publish-core.yml +4 -4
  4. package/SECURITY.md +62 -0
  5. package/dist/deployers/coolify.cjs +61 -50
  6. package/dist/deployers/coolify.cjs.map +1 -1
  7. package/dist/deployers/coolify.d.cts +4 -11
  8. package/dist/deployers/coolify.d.cts.map +1 -1
  9. package/dist/deployers/coolify.d.mts +4 -11
  10. package/dist/deployers/coolify.d.mts.map +1 -1
  11. package/dist/deployers/coolify.mjs +62 -50
  12. package/dist/deployers/coolify.mjs.map +1 -1
  13. package/dist/deployers/dokploy.cjs +106 -29
  14. package/dist/deployers/dokploy.cjs.map +1 -1
  15. package/dist/deployers/dokploy.d.cts +2 -1
  16. package/dist/deployers/dokploy.d.cts.map +1 -1
  17. package/dist/deployers/dokploy.d.mts +2 -1
  18. package/dist/deployers/dokploy.d.mts.map +1 -1
  19. package/dist/deployers/dokploy.mjs +107 -29
  20. package/dist/deployers/dokploy.mjs.map +1 -1
  21. package/dist/deployers/index.cjs.map +1 -1
  22. package/dist/deployers/index.d.cts +2 -2
  23. package/dist/deployers/index.d.cts.map +1 -1
  24. package/dist/deployers/index.d.mts +2 -2
  25. package/dist/deployers/index.d.mts.map +1 -1
  26. package/dist/deployers/index.mjs.map +1 -1
  27. package/dist/deployers/strip-host-ports.cjs +138 -0
  28. package/dist/deployers/strip-host-ports.cjs.map +1 -0
  29. package/dist/deployers/strip-host-ports.d.cts +62 -0
  30. package/dist/deployers/strip-host-ports.d.cts.map +1 -0
  31. package/dist/deployers/strip-host-ports.d.mts +62 -0
  32. package/dist/deployers/strip-host-ports.d.mts.map +1 -0
  33. package/dist/deployers/strip-host-ports.mjs +133 -0
  34. package/dist/deployers/strip-host-ports.mjs.map +1 -0
  35. package/dist/deployers/strip-host-ports.test.cjs +89 -0
  36. package/dist/deployers/strip-host-ports.test.cjs.map +1 -0
  37. package/dist/deployers/strip-host-ports.test.d.cts +1 -0
  38. package/dist/deployers/strip-host-ports.test.d.mts +1 -0
  39. package/dist/deployers/strip-host-ports.test.mjs +90 -0
  40. package/dist/deployers/strip-host-ports.test.mjs.map +1 -0
  41. package/dist/deployers/types.d.cts +173 -2
  42. package/dist/deployers/types.d.cts.map +1 -1
  43. package/dist/deployers/types.d.mts +173 -2
  44. package/dist/deployers/types.d.mts.map +1 -1
  45. package/dist/index.d.cts +2 -2
  46. package/dist/index.d.mts +2 -2
  47. package/dist/services/definitions/usesend.cjs +4 -4
  48. package/dist/services/definitions/usesend.cjs.map +1 -1
  49. package/dist/services/definitions/usesend.mjs +4 -4
  50. package/dist/services/definitions/usesend.mjs.map +1 -1
  51. package/package.json +4 -4
  52. package/src/__snapshots__/composer.snapshot.test.ts.snap +248 -38
  53. package/src/deployers/coolify.ts +198 -103
  54. package/src/deployers/dokploy.ts +209 -55
  55. package/src/deployers/index.ts +1 -0
  56. package/src/deployers/strip-host-ports.test.ts +100 -0
  57. package/src/deployers/strip-host-ports.ts +187 -0
  58. package/src/deployers/types.ts +185 -1
  59. package/src/index.ts +19 -4
  60. package/src/services/definitions/usesend.ts +4 -4
  61. package/tsconfig.tsbuildinfo +1 -0
@@ -11,6 +11,16 @@ exports[`compose snapshot tests > creator preset (ffmpeg + remotion + minio + re
11
11
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
12
12
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
13
13
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
14
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
15
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
16
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
17
+ XAI_API_KEY: \${XAI_API_KEY}
18
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
19
+ GROQ_API_KEY: \${GROQ_API_KEY}
20
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
21
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
22
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
23
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
14
24
  FFMPEG_SHARED_DIR: /home/node/.openclaw/workspace/media
15
25
  MINIO_HOST: minio
16
26
  MINIO_PORT: "9000"
@@ -51,8 +61,8 @@ exports[`compose snapshot tests > creator preset (ffmpeg + remotion + minio + re
51
61
  MINIO_ROOT_USER: minioadmin
52
62
  MINIO_ROOT_PASSWORD: \${MINIO_ROOT_PASSWORD}
53
63
  ports:
54
- - \${MINIO_PORT_0:-9000}:9000
55
- - \${MINIO_PORT_1:-9001}:9001
64
+ - \${MINIO_EXTERNAL_PORT_0:-9000}:9000
65
+ - \${MINIO_EXTERNAL_PORT_1:-9001}:9001
56
66
  volumes:
57
67
  - minio-data:/data
58
68
  healthcheck:
@@ -72,7 +82,7 @@ exports[`compose snapshot tests > creator preset (ffmpeg + remotion + minio + re
72
82
  environment:
73
83
  REDIS_PASSWORD: \${REDIS_PASSWORD}
74
84
  ports:
75
- - \${REDIS_PORT:-6379}:6379
85
+ - \${REDIS_EXTERNAL_PORT:-6379}:6379
76
86
  volumes:
77
87
  - redis-data:/data
78
88
  healthcheck:
@@ -91,10 +101,22 @@ exports[`compose snapshot tests > creator preset (ffmpeg + remotion + minio + re
91
101
  HOME: /home/node
92
102
  TERM: xterm-256color
93
103
  OPENCLAW_GATEWAY_TOKEN: \${OPENCLAW_GATEWAY_TOKEN}
104
+ OPENCLAW_GATEWAY_HOST: openclaw-gateway
105
+ OPENCLAW_GATEWAY_PORT: "18789"
94
106
  BROWSER: echo
95
107
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
96
108
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
97
109
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
110
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
111
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
112
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
113
+ XAI_API_KEY: \${XAI_API_KEY}
114
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
115
+ GROQ_API_KEY: \${GROQ_API_KEY}
116
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
117
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
118
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
119
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
98
120
  volumes:
99
121
  - \${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw
100
122
  - \${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace
@@ -106,6 +128,10 @@ exports[`compose snapshot tests > creator preset (ffmpeg + remotion + minio + re
106
128
  entrypoint:
107
129
  - node
108
130
  - dist/index.js
131
+ restart: no
132
+ depends_on:
133
+ openclaw-gateway:
134
+ condition: service_started
109
135
  volumes:
110
136
  ffmpeg-shared:
111
137
  minio-data:
@@ -128,13 +154,13 @@ exports[`compose snapshot tests > creator preset (ffmpeg + remotion + minio + re
128
154
  restart: unless-stopped
129
155
  networks:
130
156
  - openclaw-network
131
- command: tail -f /dev/null
157
+ entrypoint: tail -f /dev/null
132
158
  profiles:
133
159
  - media
134
160
  remotion:
135
161
  image: remotion-dev/studio:4
136
162
  ports:
137
- - \${REMOTION_PORT:-3020}:3000
163
+ - \${REMOTION_EXTERNAL_PORT:-3020}:3000
138
164
  restart: unless-stopped
139
165
  networks:
140
166
  - openclaw-network
@@ -156,6 +182,16 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
156
182
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
157
183
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
158
184
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
185
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
186
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
187
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
188
+ XAI_API_KEY: \${XAI_API_KEY}
189
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
190
+ GROQ_API_KEY: \${GROQ_API_KEY}
191
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
192
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
193
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
194
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
159
195
  POSTGRES_HOST: postgresql
160
196
  POSTGRES_PORT: "5432"
161
197
  REDIS_HOST: redis
@@ -197,8 +233,9 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
197
233
  POSTGRES_USER: openclaw
198
234
  POSTGRES_PASSWORD: \${POSTGRES_PASSWORD}
199
235
  POSTGRES_DB: openclaw
236
+ N8N_DB_PASSWORD: \${N8N_DB_PASSWORD}
200
237
  ports:
201
- - \${POSTGRESQL_PORT:-5432}:5432
238
+ - \${POSTGRESQL_EXTERNAL_PORT:-5432}:5432
202
239
  volumes:
203
240
  - postgres-data:/var/lib/postgresql/data
204
241
  - ./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro
@@ -218,7 +255,7 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
218
255
  environment:
219
256
  REDIS_PASSWORD: \${REDIS_PASSWORD}
220
257
  ports:
221
- - \${REDIS_PORT:-6379}:6379
258
+ - \${REDIS_EXTERNAL_PORT:-6379}:6379
222
259
  volumes:
223
260
  - redis-data:/data
224
261
  healthcheck:
@@ -246,7 +283,7 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
246
283
  N8N_PORT: "5678"
247
284
  WEBHOOK_URL: http://n8n:5678/
248
285
  ports:
249
- - \${N8N_PORT:-5678}:5678
286
+ - \${N8N_EXTERNAL_PORT:-5678}:5678
250
287
  volumes:
251
288
  - n8n-data:/home/node/.n8n
252
289
  healthcheck:
@@ -260,19 +297,70 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
260
297
  restart: unless-stopped
261
298
  networks:
262
299
  - openclaw-network
300
+ depends_on:
301
+ postgres-setup:
302
+ condition: service_completed_successfully
303
+ postgres-setup:
304
+ image: postgres:17-alpine
263
305
  depends_on:
264
306
  postgresql:
265
307
  condition: service_healthy
308
+ environment:
309
+ PGHOST: postgresql
310
+ PGUSER: \${POSTGRES_USER:-openclaw}
311
+ PGDATABASE: \${POSTGRES_DB:-openclaw}
312
+ PGPASSWORD: \${POSTGRES_PASSWORD}
313
+ N8N_DB_PASSWORD: \${N8N_DB_PASSWORD}
314
+ entrypoint:
315
+ - /bin/sh
316
+ - -c
317
+ command:
318
+ - >-
319
+ echo '=== PostgreSQL database setup ==='
320
+
321
+ FAILED=0
322
+
323
+ echo "Setting up database 'n8n' with user 'n8n'..."
324
+
325
+ psql -c "SELECT 1 FROM pg_roles WHERE rolname='n8n'" | grep -q 1 || psql -c "CREATE ROLE n8n WITH LOGIN PASSWORD
326
+ '$$N8N_DB_PASSWORD'"
327
+
328
+ psql -c "ALTER ROLE n8n WITH LOGIN PASSWORD '$$N8N_DB_PASSWORD'"
329
+
330
+ psql -tc "SELECT 1 FROM pg_database WHERE datname='n8n'" | grep -q 1 || psql -c "CREATE DATABASE n8n OWNER n8n"
331
+
332
+ psql -c "GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n" || FAILED=1
333
+
334
+ echo " Done: n8n"
335
+
336
+ echo '=== All databases ready ==='
337
+
338
+ exit $$FAILED
339
+ restart: "no"
340
+ networks:
341
+ - openclaw-network
266
342
  openclaw-cli:
267
343
  image: \${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:latest}
268
344
  environment:
269
345
  HOME: /home/node
270
346
  TERM: xterm-256color
271
347
  OPENCLAW_GATEWAY_TOKEN: \${OPENCLAW_GATEWAY_TOKEN}
348
+ OPENCLAW_GATEWAY_HOST: openclaw-gateway
349
+ OPENCLAW_GATEWAY_PORT: "18789"
272
350
  BROWSER: echo
273
351
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
274
352
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
275
353
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
354
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
355
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
356
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
357
+ XAI_API_KEY: \${XAI_API_KEY}
358
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
359
+ GROQ_API_KEY: \${GROQ_API_KEY}
360
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
361
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
362
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
363
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
276
364
  volumes:
277
365
  - \${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw
278
366
  - \${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace
@@ -284,6 +372,10 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
284
372
  entrypoint:
285
373
  - node
286
374
  - dist/index.js
375
+ restart: no
376
+ depends_on:
377
+ openclaw-gateway:
378
+ condition: service_started
287
379
  volumes:
288
380
  grafana-data:
289
381
  n8n-data:
@@ -302,7 +394,7 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
302
394
  prometheus:
303
395
  image: prom/prometheus:v3.9.1
304
396
  ports:
305
- - \${PROMETHEUS_PORT:-9090}:9090
397
+ - \${PROMETHEUS_EXTERNAL_PORT:-9090}:9090
306
398
  volumes:
307
399
  - prometheus-data:/prometheus
308
400
  healthcheck:
@@ -322,13 +414,13 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
322
414
  uptime-kuma:
323
415
  image: louislam/uptime-kuma:2
324
416
  ports:
325
- - \${UPTIME_KUMA_PORT:-3001}:3001
417
+ - \${UPTIME_KUMA_EXTERNAL_PORT:-3001}:3001
326
418
  volumes:
327
419
  - uptime-kuma-data:/app/data
328
420
  healthcheck:
329
421
  test:
330
422
  - CMD-SHELL
331
- - wget -q --spider http://localhost:3001 || exit 1
423
+ - curl -sf http://localhost:3001 || exit 1
332
424
  interval: 30s
333
425
  timeout: 10s
334
426
  retries: 3
@@ -344,13 +436,13 @@ exports[`compose snapshot tests > devops preset (n8n + postgresql + redis + moni
344
436
  GF_SECURITY_ADMIN_USER: admin
345
437
  GF_SECURITY_ADMIN_PASSWORD: \${GF_SECURITY_ADMIN_PASSWORD}
346
438
  ports:
347
- - \${GRAFANA_PORT:-3150}:3000
439
+ - \${GRAFANA_EXTERNAL_PORT:-3150}:3000
348
440
  volumes:
349
441
  - grafana-data:/var/lib/grafana
350
442
  healthcheck:
351
443
  test:
352
444
  - CMD-SHELL
353
- - wget -q --spider http://localhost:3000/api/health || exit 1
445
+ - curl -sf http://localhost:3000/api/health || exit 1
354
446
  interval: 30s
355
447
  timeout: 10s
356
448
  retries: 3
@@ -381,6 +473,16 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
381
473
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
382
474
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
383
475
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
476
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
477
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
478
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
479
+ XAI_API_KEY: \${XAI_API_KEY}
480
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
481
+ GROQ_API_KEY: \${GROQ_API_KEY}
482
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
483
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
484
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
485
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
384
486
  BROWSERLESS_HOST: browserless
385
487
  BROWSERLESS_PORT: "3000"
386
488
  BROWSERLESS_TOKEN: \${BROWSERLESS_TOKEN}
@@ -388,7 +490,7 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
388
490
  CADDY_HTTP_PORT: "80"
389
491
  FFMPEG_SHARED_DIR: /home/node/.openclaw/workspace/media
390
492
  GOTIFY_HOST: gotify
391
- GOTIFY_PORT: "8080"
493
+ GOTIFY_PORT: "80"
392
494
  MEILISEARCH_HOST: meilisearch
393
495
  MEILISEARCH_PORT: "7700"
394
496
  MEILISEARCH_MASTER_KEY: \${MEILISEARCH_MASTER_KEY}
@@ -460,11 +562,11 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
460
562
  TOKEN: \${TOKEN}
461
563
  MAX_CONCURRENT_SESSIONS: "5"
462
564
  ports:
463
- - \${BROWSERLESS_PORT:-3010}:3000
565
+ - \${BROWSERLESS_EXTERNAL_PORT:-3010}:3000
464
566
  healthcheck:
465
567
  test:
466
568
  - CMD-SHELL
467
- - wget -q --spider http://localhost:3000/ || exit 1
569
+ - curl -sf http://localhost:3000/?token=$TOKEN || exit 1
468
570
  interval: 30s
469
571
  timeout: 10s
470
572
  retries: 3
@@ -475,15 +577,15 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
475
577
  caddy:
476
578
  image: caddy:2.11.1
477
579
  ports:
478
- - \${CADDY_PORT_0:-80}:80
479
- - \${CADDY_PORT_1:-443}:443
580
+ - \${CADDY_EXTERNAL_PORT_0:-80}:80
581
+ - \${CADDY_EXTERNAL_PORT_1:-443}:443
480
582
  volumes:
481
583
  - caddy-data:/data
482
584
  - caddy-config:/config
483
585
  healthcheck:
484
586
  test:
485
587
  - CMD-SHELL
486
- - wget -q --spider http://localhost:80 || exit 1
588
+ - curl -sf http://localhost:80 || exit 1
487
589
  interval: 30s
488
590
  timeout: 10s
489
591
  retries: 3
@@ -496,17 +598,17 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
496
598
  environment:
497
599
  MEILI_MASTER_KEY: \${MEILI_MASTER_KEY}
498
600
  ports:
499
- - \${MEILISEARCH_PORT:-7700}:7700
601
+ - \${MEILISEARCH_EXTERNAL_PORT:-7700}:7700
500
602
  volumes:
501
603
  - meilisearch-data:/meili_data
502
604
  healthcheck:
503
605
  test:
504
606
  - CMD-SHELL
505
- - wget -q --spider http://localhost:7700/health || exit 1
607
+ - curl -sf http://localhost:7700/health || exit 1
506
608
  interval: 30s
507
609
  timeout: 10s
508
- retries: 3
509
- start_period: 10s
610
+ retries: 5
611
+ start_period: 15s
510
612
  restart: unless-stopped
511
613
  networks:
512
614
  - openclaw-network
@@ -516,8 +618,8 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
516
618
  MINIO_ROOT_USER: minioadmin
517
619
  MINIO_ROOT_PASSWORD: \${MINIO_ROOT_PASSWORD}
518
620
  ports:
519
- - \${MINIO_PORT_0:-9000}:9000
520
- - \${MINIO_PORT_1:-9001}:9001
621
+ - \${MINIO_EXTERNAL_PORT_0:-9000}:9000
622
+ - \${MINIO_EXTERNAL_PORT_1:-9001}:9001
521
623
  volumes:
522
624
  - minio-data:/data
523
625
  healthcheck:
@@ -538,8 +640,9 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
538
640
  POSTGRES_USER: openclaw
539
641
  POSTGRES_PASSWORD: \${POSTGRES_PASSWORD}
540
642
  POSTGRES_DB: openclaw
643
+ N8N_DB_PASSWORD: \${N8N_DB_PASSWORD}
541
644
  ports:
542
- - \${POSTGRESQL_PORT:-5432}:5432
645
+ - \${POSTGRESQL_EXTERNAL_PORT:-5432}:5432
543
646
  volumes:
544
647
  - postgres-data:/var/lib/postgresql/data
545
648
  - ./postgres/init-databases.sh:/docker-entrypoint-initdb.d/init-databases.sh:ro
@@ -559,13 +662,13 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
559
662
  environment:
560
663
  QDRANT__SERVICE__GRPC_PORT: "6334"
561
664
  ports:
562
- - \${QDRANT_PORT:-6333}:6333
665
+ - \${QDRANT_EXTERNAL_PORT:-6333}:6333
563
666
  volumes:
564
667
  - qdrant-data:/qdrant/storage
565
668
  healthcheck:
566
669
  test:
567
670
  - CMD-SHELL
568
- - wget -q --spider http://localhost:6333/healthz || exit 1
671
+ - bash -c 'echo > /dev/tcp/localhost/6333' || exit 1
569
672
  interval: 30s
570
673
  timeout: 10s
571
674
  retries: 3
@@ -578,7 +681,7 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
578
681
  environment:
579
682
  REDIS_PASSWORD: \${REDIS_PASSWORD}
580
683
  ports:
581
- - \${REDIS_PORT:-6379}:6379
684
+ - \${REDIS_EXTERNAL_PORT:-6379}:6379
582
685
  volumes:
583
686
  - redis-data:/data
584
687
  healthcheck:
@@ -594,7 +697,7 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
594
697
  searxng:
595
698
  image: searxng/searxng:2026.2.23-4964d664f
596
699
  ports:
597
- - \${SEARXNG_PORT:-8080}:8080
700
+ - \${SEARXNG_EXTERNAL_PORT:-8080}:8080
598
701
  volumes:
599
702
  - searxng-data:/etc/searxng
600
703
  healthcheck:
@@ -623,7 +726,7 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
623
726
  N8N_PORT: "5678"
624
727
  WEBHOOK_URL: http://n8n:5678/
625
728
  ports:
626
- - \${N8N_PORT:-5678}:5678
729
+ - \${N8N_EXTERNAL_PORT:-5678}:5678
627
730
  volumes:
628
731
  - n8n-data:/home/node/.n8n
629
732
  healthcheck:
@@ -637,19 +740,70 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
637
740
  restart: unless-stopped
638
741
  networks:
639
742
  - openclaw-network
743
+ depends_on:
744
+ postgres-setup:
745
+ condition: service_completed_successfully
746
+ postgres-setup:
747
+ image: postgres:17-alpine
640
748
  depends_on:
641
749
  postgresql:
642
750
  condition: service_healthy
751
+ environment:
752
+ PGHOST: postgresql
753
+ PGUSER: \${POSTGRES_USER:-openclaw}
754
+ PGDATABASE: \${POSTGRES_DB:-openclaw}
755
+ PGPASSWORD: \${POSTGRES_PASSWORD}
756
+ N8N_DB_PASSWORD: \${N8N_DB_PASSWORD}
757
+ entrypoint:
758
+ - /bin/sh
759
+ - -c
760
+ command:
761
+ - >-
762
+ echo '=== PostgreSQL database setup ==='
763
+
764
+ FAILED=0
765
+
766
+ echo "Setting up database 'n8n' with user 'n8n'..."
767
+
768
+ psql -c "SELECT 1 FROM pg_roles WHERE rolname='n8n'" | grep -q 1 || psql -c "CREATE ROLE n8n WITH LOGIN PASSWORD
769
+ '$$N8N_DB_PASSWORD'"
770
+
771
+ psql -c "ALTER ROLE n8n WITH LOGIN PASSWORD '$$N8N_DB_PASSWORD'"
772
+
773
+ psql -tc "SELECT 1 FROM pg_database WHERE datname='n8n'" | grep -q 1 || psql -c "CREATE DATABASE n8n OWNER n8n"
774
+
775
+ psql -c "GRANT ALL PRIVILEGES ON DATABASE n8n TO n8n" || FAILED=1
776
+
777
+ echo " Done: n8n"
778
+
779
+ echo '=== All databases ready ==='
780
+
781
+ exit $$FAILED
782
+ restart: "no"
783
+ networks:
784
+ - openclaw-network
643
785
  openclaw-cli:
644
786
  image: \${OPENCLAW_IMAGE:-ghcr.io/openclaw/openclaw:latest}
645
787
  environment:
646
788
  HOME: /home/node
647
789
  TERM: xterm-256color
648
790
  OPENCLAW_GATEWAY_TOKEN: \${OPENCLAW_GATEWAY_TOKEN}
791
+ OPENCLAW_GATEWAY_HOST: openclaw-gateway
792
+ OPENCLAW_GATEWAY_PORT: "18789"
649
793
  BROWSER: echo
650
794
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
651
795
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
652
796
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
797
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
798
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
799
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
800
+ XAI_API_KEY: \${XAI_API_KEY}
801
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
802
+ GROQ_API_KEY: \${GROQ_API_KEY}
803
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
804
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
805
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
806
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
653
807
  volumes:
654
808
  - \${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw
655
809
  - \${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace
@@ -661,6 +815,10 @@ exports[`compose snapshot tests > full preset (many services) 1`] = `
661
815
  entrypoint:
662
816
  - node
663
817
  - dist/index.js
818
+ restart: no
819
+ depends_on:
820
+ openclaw-gateway:
821
+ condition: service_started
664
822
  volumes:
665
823
  caddy-config:
666
824
  caddy-data:
@@ -694,6 +852,16 @@ exports[`compose snapshot tests > minimal preset (redis only) 1`] = `
694
852
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
695
853
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
696
854
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
855
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
856
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
857
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
858
+ XAI_API_KEY: \${XAI_API_KEY}
859
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
860
+ GROQ_API_KEY: \${GROQ_API_KEY}
861
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
862
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
863
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
864
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
697
865
  REDIS_HOST: redis
698
866
  REDIS_PORT: "6379"
699
867
  REDIS_PASSWORD: \${REDIS_PASSWORD}
@@ -723,7 +891,7 @@ exports[`compose snapshot tests > minimal preset (redis only) 1`] = `
723
891
  environment:
724
892
  REDIS_PASSWORD: \${REDIS_PASSWORD}
725
893
  ports:
726
- - \${REDIS_PORT:-6379}:6379
894
+ - \${REDIS_EXTERNAL_PORT:-6379}:6379
727
895
  volumes:
728
896
  - redis-data:/data
729
897
  healthcheck:
@@ -742,10 +910,22 @@ exports[`compose snapshot tests > minimal preset (redis only) 1`] = `
742
910
  HOME: /home/node
743
911
  TERM: xterm-256color
744
912
  OPENCLAW_GATEWAY_TOKEN: \${OPENCLAW_GATEWAY_TOKEN}
913
+ OPENCLAW_GATEWAY_HOST: openclaw-gateway
914
+ OPENCLAW_GATEWAY_PORT: "18789"
745
915
  BROWSER: echo
746
916
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
747
917
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
748
918
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
919
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
920
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
921
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
922
+ XAI_API_KEY: \${XAI_API_KEY}
923
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
924
+ GROQ_API_KEY: \${GROQ_API_KEY}
925
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
926
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
927
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
928
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
749
929
  volumes:
750
930
  - \${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw
751
931
  - \${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace
@@ -757,6 +937,10 @@ exports[`compose snapshot tests > minimal preset (redis only) 1`] = `
757
937
  entrypoint:
758
938
  - node
759
939
  - dist/index.js
940
+ restart: no
941
+ depends_on:
942
+ openclaw-gateway:
943
+ condition: service_started
760
944
  volumes:
761
945
  redis-data:
762
946
  networks:
@@ -776,6 +960,16 @@ exports[`compose snapshot tests > researcher preset (qdrant + searxng + browserl
776
960
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
777
961
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
778
962
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
963
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
964
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
965
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
966
+ XAI_API_KEY: \${XAI_API_KEY}
967
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
968
+ GROQ_API_KEY: \${GROQ_API_KEY}
969
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
970
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
971
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
972
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
779
973
  BROWSERLESS_HOST: browserless
780
974
  BROWSERLESS_PORT: "3000"
781
975
  BROWSERLESS_TOKEN: \${BROWSERLESS_TOKEN}
@@ -819,11 +1013,11 @@ exports[`compose snapshot tests > researcher preset (qdrant + searxng + browserl
819
1013
  TOKEN: \${TOKEN}
820
1014
  MAX_CONCURRENT_SESSIONS: "5"
821
1015
  ports:
822
- - \${BROWSERLESS_PORT:-3010}:3000
1016
+ - \${BROWSERLESS_EXTERNAL_PORT:-3010}:3000
823
1017
  healthcheck:
824
1018
  test:
825
1019
  - CMD-SHELL
826
- - wget -q --spider http://localhost:3000/ || exit 1
1020
+ - curl -sf http://localhost:3000/?token=$TOKEN || exit 1
827
1021
  interval: 30s
828
1022
  timeout: 10s
829
1023
  retries: 3
@@ -836,13 +1030,13 @@ exports[`compose snapshot tests > researcher preset (qdrant + searxng + browserl
836
1030
  environment:
837
1031
  QDRANT__SERVICE__GRPC_PORT: "6334"
838
1032
  ports:
839
- - \${QDRANT_PORT:-6333}:6333
1033
+ - \${QDRANT_EXTERNAL_PORT:-6333}:6333
840
1034
  volumes:
841
1035
  - qdrant-data:/qdrant/storage
842
1036
  healthcheck:
843
1037
  test:
844
1038
  - CMD-SHELL
845
- - wget -q --spider http://localhost:6333/healthz || exit 1
1039
+ - bash -c 'echo > /dev/tcp/localhost/6333' || exit 1
846
1040
  interval: 30s
847
1041
  timeout: 10s
848
1042
  retries: 3
@@ -855,7 +1049,7 @@ exports[`compose snapshot tests > researcher preset (qdrant + searxng + browserl
855
1049
  environment:
856
1050
  REDIS_PASSWORD: \${REDIS_PASSWORD}
857
1051
  ports:
858
- - \${REDIS_PORT:-6379}:6379
1052
+ - \${REDIS_EXTERNAL_PORT:-6379}:6379
859
1053
  volumes:
860
1054
  - redis-data:/data
861
1055
  healthcheck:
@@ -871,7 +1065,7 @@ exports[`compose snapshot tests > researcher preset (qdrant + searxng + browserl
871
1065
  searxng:
872
1066
  image: searxng/searxng:2026.2.23-4964d664f
873
1067
  ports:
874
- - \${SEARXNG_PORT:-8080}:8080
1068
+ - \${SEARXNG_EXTERNAL_PORT:-8080}:8080
875
1069
  volumes:
876
1070
  - searxng-data:/etc/searxng
877
1071
  healthcheck:
@@ -891,10 +1085,22 @@ exports[`compose snapshot tests > researcher preset (qdrant + searxng + browserl
891
1085
  HOME: /home/node
892
1086
  TERM: xterm-256color
893
1087
  OPENCLAW_GATEWAY_TOKEN: \${OPENCLAW_GATEWAY_TOKEN}
1088
+ OPENCLAW_GATEWAY_HOST: openclaw-gateway
1089
+ OPENCLAW_GATEWAY_PORT: "18789"
894
1090
  BROWSER: echo
895
1091
  CLAUDE_AI_SESSION_KEY: \${CLAUDE_AI_SESSION_KEY}
896
1092
  CLAUDE_WEB_SESSION_KEY: \${CLAUDE_WEB_SESSION_KEY}
897
1093
  CLAUDE_WEB_COOKIE: \${CLAUDE_WEB_COOKIE}
1094
+ OPENAI_API_KEY: \${OPENAI_API_KEY}
1095
+ ANTHROPIC_API_KEY: \${ANTHROPIC_API_KEY}
1096
+ GOOGLE_API_KEY: \${GOOGLE_API_KEY}
1097
+ XAI_API_KEY: \${XAI_API_KEY}
1098
+ DEEPSEEK_API_KEY: \${DEEPSEEK_API_KEY}
1099
+ GROQ_API_KEY: \${GROQ_API_KEY}
1100
+ OPENROUTER_API_KEY: \${OPENROUTER_API_KEY}
1101
+ MISTRAL_API_KEY: \${MISTRAL_API_KEY}
1102
+ TOGETHER_API_KEY: \${TOGETHER_API_KEY}
1103
+ OLLAMA_API_KEY: \${OLLAMA_API_KEY}
898
1104
  volumes:
899
1105
  - \${OPENCLAW_CONFIG_DIR:-./openclaw/config}:/home/node/.openclaw
900
1106
  - \${OPENCLAW_WORKSPACE_DIR:-./openclaw/workspace}:/home/node/.openclaw/workspace
@@ -906,6 +1112,10 @@ exports[`compose snapshot tests > researcher preset (qdrant + searxng + browserl
906
1112
  entrypoint:
907
1113
  - node
908
1114
  - dist/index.js
1115
+ restart: no
1116
+ depends_on:
1117
+ openclaw-gateway:
1118
+ condition: service_started
909
1119
  volumes:
910
1120
  qdrant-data:
911
1121
  redis-data: