create-openclaw-bot 5.10.1 → 5.11.1
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.
- package/README.md +23 -6
- package/README.vi.md +23 -6
- package/dist/server/local-server.js +208 -325
- package/dist/setup/shared/docker-gen.js +22 -12
- package/dist/setup/shared/workspace-gen.js +819 -154
- package/dist/web/app.js +50 -16
- package/dist/web/styles.css +6 -1
- package/package.json +1 -1
|
@@ -231,6 +231,16 @@ if(touched){console.log('[patch-9router] Applied Codex compatibility patch.');}e
|
|
|
231
231
|
const useExtensionsVolume = osChoice === 'win';
|
|
232
232
|
const extVolMount = useExtensionsVolume ? '\n - openclaw-extensions:/home/node/project/.openclaw/extensions' : '';
|
|
233
233
|
const extVolDecl = useExtensionsVolume ? '\n openclaw-extensions:' : '';
|
|
234
|
+
// SQLite state on Docker Desktop (macOS/Windows): the host bind mount goes through a
|
|
235
|
+
// virtualized file share (virtiofs/gRPC-FUSE) whose locking/mmap semantics break SQLite WAL —
|
|
236
|
+
// OpenClaw crashes with `Error: disk I/O error` on write (e.g. when a Zalo message arrives).
|
|
237
|
+
// Keep `.openclaw/state` on a named volume (the Linux VM's native filesystem) instead; the
|
|
238
|
+
// rest of `.openclaw` stays bind-mounted so workspaces/config remain visible on the host.
|
|
239
|
+
// Linux/VPS bind mounts are native ext4 — unchanged there (and state stays host-visible).
|
|
240
|
+
const useStateVolume = osChoice === 'macos' || osChoice === 'win';
|
|
241
|
+
const stateVolMount = useStateVolume ? '\n - openclaw-state:/home/node/project/.openclaw/state' : '';
|
|
242
|
+
const stateVolDecl = useStateVolume ? '\n openclaw-state:' : '';
|
|
243
|
+
const stateVolBlock = useStateVolume ? '\n\nvolumes:\n openclaw-state:' : '';
|
|
234
244
|
const skillLines = dockerfileSkillInstallMode === 'build' && allSkills.length > 0
|
|
235
245
|
? `\n# Install skills (ClawHub)\n${allSkills.map((skill) => `RUN openclaw skills install ${skill} || echo "Warning: Failed to install ${skill} due to rate limits."`).join('\n')}\n`
|
|
236
246
|
: '';
|
|
@@ -395,7 +405,7 @@ services:
|
|
|
395
405
|
env_file:
|
|
396
406
|
- ../../.env
|
|
397
407
|
${appEnvironmentBlock}${dependsOn}${extraHosts} volumes:
|
|
398
|
-
- ${volumeMount}
|
|
408
|
+
- ${volumeMount}${stateVolMount}
|
|
399
409
|
ports:
|
|
400
410
|
- "127.0.0.1:${gatewayPort}:${gatewayPort}"
|
|
401
411
|
|
|
@@ -420,7 +430,7 @@ ${indentBlock(docker9RouterEntrypointScript, 8)}
|
|
|
420
430
|
- "127.0.0.1:${routerPort}:${routerPort}"
|
|
421
431
|
|
|
422
432
|
volumes:
|
|
423
|
-
9router-data
|
|
433
|
+
9router-data:${stateVolDecl}`;
|
|
424
434
|
} else if (isLocal) {
|
|
425
435
|
const ollamaModelTag = String(selectedModel || 'ollama/gemma4:e2b').replace('ollama/', '');
|
|
426
436
|
compose = `name: ${multiComposeName}
|
|
@@ -432,7 +442,7 @@ services:
|
|
|
432
442
|
env_file:
|
|
433
443
|
- ../../.env
|
|
434
444
|
${appEnvironmentBlock}${dependsOn}${extraHosts} volumes:
|
|
435
|
-
- ${volumeMount}
|
|
445
|
+
- ${volumeMount}${stateVolMount}
|
|
436
446
|
ports:
|
|
437
447
|
- "127.0.0.1:${gatewayPort}:${gatewayPort}"
|
|
438
448
|
|
|
@@ -461,7 +471,7 @@ ${appEnvironmentBlock}${dependsOn}${extraHosts} volumes:
|
|
|
461
471
|
start_period: 30s
|
|
462
472
|
|
|
463
473
|
volumes:
|
|
464
|
-
ollama-data
|
|
474
|
+
ollama-data:${stateVolDecl}`;
|
|
465
475
|
} else {
|
|
466
476
|
compose = `name: ${multiComposeName}
|
|
467
477
|
services:
|
|
@@ -472,9 +482,9 @@ services:
|
|
|
472
482
|
env_file:
|
|
473
483
|
- ../../.env
|
|
474
484
|
${appEnvironmentBlock}${extraHosts} volumes:
|
|
475
|
-
- ${volumeMount}
|
|
485
|
+
- ${volumeMount}${stateVolMount}
|
|
476
486
|
ports:
|
|
477
|
-
- "127.0.0.1:${gatewayPort}:${gatewayPort}"`;
|
|
487
|
+
- "127.0.0.1:${gatewayPort}:${gatewayPort}"${stateVolBlock}`;
|
|
478
488
|
}
|
|
479
489
|
} else if (is9Router) {
|
|
480
490
|
compose = `name: ${singleComposeName}
|
|
@@ -488,7 +498,7 @@ services:
|
|
|
488
498
|
depends_on:
|
|
489
499
|
- 9router
|
|
490
500
|
${appEnvironmentBlock}${extraHostsBlock}\n volumes:
|
|
491
|
-
- ${volumeMount}
|
|
501
|
+
- ${volumeMount}${stateVolMount}
|
|
492
502
|
- openclaw-plugins:/home/node/project/.openclaw/npm${extVolMount}
|
|
493
503
|
ports:
|
|
494
504
|
- "127.0.0.1:${gatewayPort}:${gatewayPort}"
|
|
@@ -515,7 +525,7 @@ ${indentBlock(docker9RouterEntrypointScript, 8)}
|
|
|
515
525
|
|
|
516
526
|
volumes:
|
|
517
527
|
9router-data:
|
|
518
|
-
openclaw-plugins:${extVolDecl}`;
|
|
528
|
+
openclaw-plugins:${extVolDecl}${stateVolDecl}`;
|
|
519
529
|
} else if (isLocal) {
|
|
520
530
|
const ollamaModelTag = String(selectedModel || 'ollama/gemma4:e2b').replace('ollama/', '');
|
|
521
531
|
compose = `name: ${singleComposeName}
|
|
@@ -531,7 +541,7 @@ ${appEnvironmentBlock} depends_on:
|
|
|
531
541
|
${extraHostsBlock}\n ports:
|
|
532
542
|
- "127.0.0.1:${gatewayPort}:${gatewayPort}"
|
|
533
543
|
volumes:
|
|
534
|
-
- ${volumeMount}
|
|
544
|
+
- ${volumeMount}${stateVolMount}
|
|
535
545
|
|
|
536
546
|
ollama:
|
|
537
547
|
image: ollama/ollama:latest
|
|
@@ -558,7 +568,7 @@ ${extraHostsBlock}\n ports:
|
|
|
558
568
|
start_period: 30s
|
|
559
569
|
|
|
560
570
|
volumes:
|
|
561
|
-
ollama-data
|
|
571
|
+
ollama-data:${stateVolDecl}`;
|
|
562
572
|
} else {
|
|
563
573
|
compose = `name: ${singleComposeName}
|
|
564
574
|
services:
|
|
@@ -569,9 +579,9 @@ services:
|
|
|
569
579
|
env_file:
|
|
570
580
|
- ../../.env
|
|
571
581
|
${appEnvironmentBlock}${plainSingleExtraHosts ? `${extraHostsBlock}\n` : ''} volumes:
|
|
572
|
-
- ${volumeMount}
|
|
582
|
+
- ${volumeMount}${stateVolMount}
|
|
573
583
|
ports:
|
|
574
|
-
- "127.0.0.1:${gatewayPort}:${gatewayPort}"`;
|
|
584
|
+
- "127.0.0.1:${gatewayPort}:${gatewayPort}"${stateVolBlock}`;
|
|
575
585
|
}
|
|
576
586
|
|
|
577
587
|
return {
|