create-openclaw-bot 5.6.3 → 5.6.4
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/dist/cli.js +111 -77
- package/dist/setup/shared/install-gen.js +57 -0
- package/dist/setup.js +57 -0
- package/package.json +1 -1
package/dist/cli.js
CHANGED
|
@@ -784,7 +784,7 @@ function detectProjectBotName(projectDir) {
|
|
|
784
784
|
return path.basename(projectDir);
|
|
785
785
|
}
|
|
786
786
|
|
|
787
|
-
function detectProjectUses9Router(projectDir) {
|
|
787
|
+
function detectProjectUses9Router(projectDir) {
|
|
788
788
|
try {
|
|
789
789
|
const configPath = path.join(projectDir, '.openclaw', 'openclaw.json');
|
|
790
790
|
if (fs.existsSync(configPath)) {
|
|
@@ -796,8 +796,25 @@ function detectProjectUses9Router(projectDir) {
|
|
|
796
796
|
} catch {
|
|
797
797
|
// fallback below
|
|
798
798
|
}
|
|
799
|
-
return fs.existsSync(path.join(projectDir, '.9router'));
|
|
800
|
-
}
|
|
799
|
+
return fs.existsSync(path.join(projectDir, '.9router'));
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
function detectProjectIsMultiBot(projectDir) {
|
|
803
|
+
try {
|
|
804
|
+
const configPath = path.join(projectDir, '.openclaw', 'openclaw.json');
|
|
805
|
+
if (fs.existsSync(configPath)) {
|
|
806
|
+
const config = fs.readJsonSync(configPath);
|
|
807
|
+
return (config?.agents?.list?.length || 0) > 1;
|
|
808
|
+
}
|
|
809
|
+
} catch {
|
|
810
|
+
// fallback below
|
|
811
|
+
}
|
|
812
|
+
return false;
|
|
813
|
+
}
|
|
814
|
+
|
|
815
|
+
function getNativePm2AppName(isMultiBot = false) {
|
|
816
|
+
return isMultiBot ? 'openclaw-multibot' : 'openclaw';
|
|
817
|
+
}
|
|
801
818
|
|
|
802
819
|
async function runUpgradeCommand() {
|
|
803
820
|
const projectDir = findProjectDir();
|
|
@@ -807,40 +824,46 @@ async function runUpgradeCommand() {
|
|
|
807
824
|
process.exit(1);
|
|
808
825
|
}
|
|
809
826
|
|
|
810
|
-
const deployMode = detectProjectDeployMode(projectDir);
|
|
811
|
-
const osChoice = getDetectedOsChoice();
|
|
812
|
-
const botName = detectProjectBotName(projectDir);
|
|
813
|
-
const is9Router = detectProjectUses9Router(projectDir);
|
|
827
|
+
const deployMode = detectProjectDeployMode(projectDir);
|
|
828
|
+
const osChoice = getDetectedOsChoice();
|
|
829
|
+
const botName = detectProjectBotName(projectDir);
|
|
830
|
+
const is9Router = detectProjectUses9Router(projectDir);
|
|
831
|
+
const isMultiBot = detectProjectIsMultiBot(projectDir);
|
|
814
832
|
|
|
815
833
|
console.log(chalk.cyan('\nRefreshing generated OpenClaw project artifacts...'));
|
|
816
834
|
console.log(chalk.gray(` Project: ${projectDir}`));
|
|
817
835
|
console.log(chalk.gray(` Mode: ${deployMode}`));
|
|
818
836
|
|
|
819
837
|
await writeGeneratedArtifacts(projectDir, buildCliChromeDebugArtifacts());
|
|
820
|
-
await writeGeneratedArtifacts(projectDir, buildCliUninstallArtifacts({
|
|
821
|
-
deployMode,
|
|
822
|
-
osChoice,
|
|
823
|
-
projectDir,
|
|
824
|
-
botName
|
|
825
|
-
|
|
838
|
+
await writeGeneratedArtifacts(projectDir, buildCliUninstallArtifacts({
|
|
839
|
+
deployMode,
|
|
840
|
+
osChoice,
|
|
841
|
+
projectDir,
|
|
842
|
+
botName: (deployMode !== 'docker' && osChoice === 'vps')
|
|
843
|
+
? getNativePm2AppName(isMultiBot)
|
|
844
|
+
: botName,
|
|
845
|
+
}));
|
|
826
846
|
await writeGeneratedArtifacts(projectDir, buildCliUpgradeArtifacts());
|
|
827
847
|
|
|
828
|
-
if (deployMode !== 'docker') {
|
|
829
|
-
await writeGeneratedArtifacts(projectDir, buildCliStartBotArtifacts({
|
|
830
|
-
projectDir,
|
|
831
|
-
openclawHome: path.join(projectDir, '.openclaw'),
|
|
832
|
-
is9Router,
|
|
833
|
-
|
|
834
|
-
|
|
835
|
-
|
|
848
|
+
if (deployMode !== 'docker') {
|
|
849
|
+
await writeGeneratedArtifacts(projectDir, buildCliStartBotArtifacts({
|
|
850
|
+
projectDir,
|
|
851
|
+
openclawHome: path.join(projectDir, '.openclaw'),
|
|
852
|
+
is9Router,
|
|
853
|
+
osChoice,
|
|
854
|
+
isMultiBot,
|
|
855
|
+
appName: getNativePm2AppName(isMultiBot),
|
|
856
|
+
isVi: false,
|
|
857
|
+
}));
|
|
858
|
+
}
|
|
836
859
|
|
|
837
860
|
console.log(chalk.green('\nUpgrade artifacts refreshed successfully.'));
|
|
838
861
|
if (deployMode === 'docker') {
|
|
839
862
|
console.log(chalk.white(` Next: cd ${path.join(projectDir, 'docker', 'openclaw')} && docker compose up -d --build`));
|
|
840
863
|
} else {
|
|
841
|
-
console.log(chalk.white(` Next: run ${process.platform === 'win32' ? '.\\start-bot.bat' : './start-bot.sh'} from ${projectDir}`));
|
|
842
|
-
}
|
|
843
|
-
}
|
|
864
|
+
console.log(chalk.white(` Next: run ${process.platform === 'win32' ? '.\\start-bot.bat' : './start-bot.sh'} from ${projectDir}`));
|
|
865
|
+
}
|
|
866
|
+
}
|
|
844
867
|
|
|
845
868
|
function startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath }) {
|
|
846
869
|
const routerAppName = `${appName}-9router`;
|
|
@@ -863,22 +886,21 @@ function startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath }) {
|
|
|
863
886
|
stdio: 'inherit',
|
|
864
887
|
env: { ...process.env, ...routerLaunch.env }
|
|
865
888
|
});
|
|
866
|
-
if (syncScriptPath) {
|
|
867
|
-
const syncAppName = `${appName}-9router-sync`;
|
|
868
|
-
execFileSync('pm2', [
|
|
869
|
-
'start',
|
|
870
|
-
|
|
871
|
-
'--name',
|
|
872
|
-
syncAppName,
|
|
873
|
-
'--cwd',
|
|
874
|
-
normalizedProjectDir,
|
|
875
|
-
'--',
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
env: process.env
|
|
889
|
+
if (syncScriptPath) {
|
|
890
|
+
const syncAppName = `${appName}-9router-sync`;
|
|
891
|
+
execFileSync('pm2', [
|
|
892
|
+
'start',
|
|
893
|
+
process.execPath,
|
|
894
|
+
'--name',
|
|
895
|
+
syncAppName,
|
|
896
|
+
'--cwd',
|
|
897
|
+
normalizedProjectDir,
|
|
898
|
+
'--',
|
|
899
|
+
normalizedSyncScriptPath
|
|
900
|
+
], {
|
|
901
|
+
cwd: projectDir,
|
|
902
|
+
stdio: 'inherit',
|
|
903
|
+
env: process.env
|
|
882
904
|
});
|
|
883
905
|
}
|
|
884
906
|
runPm2Save({ projectDir, isVi });
|
|
@@ -2237,7 +2259,7 @@ async function main() {
|
|
|
2237
2259
|
if (deployMode === 'native') {
|
|
2238
2260
|
const pm2Apps = [
|
|
2239
2261
|
' {',
|
|
2240
|
-
` name: '
|
|
2262
|
+
` name: 'openclaw-multibot',`,
|
|
2241
2263
|
` script: 'openclaw',`,
|
|
2242
2264
|
` args: 'gateway run',`,
|
|
2243
2265
|
` cwd: '${projectDir.replace(/\\/g, '/')}',`,
|
|
@@ -2485,9 +2507,14 @@ async function main() {
|
|
|
2485
2507
|
await writeGeneratedArtifacts(projectDir, buildCliChromeDebugArtifacts());
|
|
2486
2508
|
|
|
2487
2509
|
// ── Uninstall scripts ───────────────────────────────────────────────────────
|
|
2488
|
-
await writeGeneratedArtifacts(projectDir, buildCliUninstallArtifacts({
|
|
2489
|
-
deployMode,
|
|
2490
|
-
|
|
2510
|
+
await writeGeneratedArtifacts(projectDir, buildCliUninstallArtifacts({
|
|
2511
|
+
deployMode,
|
|
2512
|
+
osChoice: detectedOS,
|
|
2513
|
+
projectDir,
|
|
2514
|
+
botName: (deployMode !== 'docker' && detectedOS === 'vps')
|
|
2515
|
+
? getNativePm2AppName(isMultiBot)
|
|
2516
|
+
: botName,
|
|
2517
|
+
}));
|
|
2491
2518
|
|
|
2492
2519
|
// ── Upgrade scripts ─────────────────────────────────────────────────────────
|
|
2493
2520
|
await writeGeneratedArtifacts(projectDir, buildCliUpgradeArtifacts());
|
|
@@ -2495,19 +2522,26 @@ async function main() {
|
|
|
2495
2522
|
// ── start-bot.bat / start-bot.sh — one-click restart scripts ─────────────
|
|
2496
2523
|
// Generated for native deployments only (docker has docker compose up)
|
|
2497
2524
|
if (deployMode !== 'docker') {
|
|
2498
|
-
await writeGeneratedArtifacts(projectDir, buildCliStartBotArtifacts({
|
|
2499
|
-
projectDir,
|
|
2500
|
-
openclawHome: path.join(projectDir, '.openclaw'),
|
|
2501
|
-
is9Router: providerKey === '9router',
|
|
2502
|
-
|
|
2503
|
-
|
|
2504
|
-
|
|
2505
|
-
|
|
2506
|
-
|
|
2507
|
-
|
|
2508
|
-
|
|
2509
|
-
|
|
2510
|
-
|
|
2525
|
+
await writeGeneratedArtifacts(projectDir, buildCliStartBotArtifacts({
|
|
2526
|
+
projectDir,
|
|
2527
|
+
openclawHome: path.join(projectDir, '.openclaw'),
|
|
2528
|
+
is9Router: providerKey === '9router',
|
|
2529
|
+
osChoice,
|
|
2530
|
+
isMultiBot,
|
|
2531
|
+
appName: getNativePm2AppName(isMultiBot),
|
|
2532
|
+
isVi,
|
|
2533
|
+
}));
|
|
2534
|
+
|
|
2535
|
+
console.log(chalk.cyan(
|
|
2536
|
+
process.platform === 'win32'
|
|
2537
|
+
? (isVi
|
|
2538
|
+
? `\n🚀 start-bot.bat / start-bot.sh đã tạo — double-click để restart bot.`
|
|
2539
|
+
: `\n🚀 start-bot.bat / start-bot.sh created — double-click to restart the bot.`)
|
|
2540
|
+
: (isVi
|
|
2541
|
+
? `\n🚀 start-bot.sh đã tạo — chạy ./start-bot.sh để restart bot.`
|
|
2542
|
+
: `\n🚀 start-bot.sh created — run ./start-bot.sh to restart the bot.`)
|
|
2543
|
+
));
|
|
2544
|
+
}
|
|
2511
2545
|
|
|
2512
2546
|
console.log(chalk.green(`✅ ${isVi ? 'Tạo cấu hình thành công!' : 'Configs created successfully!'}`));
|
|
2513
2547
|
|
|
@@ -2661,26 +2695,26 @@ async function main() {
|
|
|
2661
2695
|
}
|
|
2662
2696
|
}
|
|
2663
2697
|
|
|
2664
|
-
if (isMultiBot && channelKey === 'telegram') {
|
|
2665
|
-
if (providerKey === '9router') {
|
|
2666
|
-
startNative9RouterPm2({ isVi, projectDir, appName:
|
|
2667
|
-
}
|
|
2668
|
-
execSync('pm2 start ecosystem.config.js && pm2 save', {
|
|
2669
|
-
cwd: projectDir,
|
|
2670
|
-
stdio: 'inherit',
|
|
2671
|
-
shell: true
|
|
2672
|
-
});
|
|
2673
|
-
console.log(chalk.green(`\n🎉 ${isVi ? 'Setup hoan tat! Multi-bot native dang chay qua PM2.' : 'Setup complete! Native multi-bot is running via PM2.'}`));
|
|
2674
|
-
console.log(chalk.gray(isVi ? ` Xem log: pm2 logs ${
|
|
2675
|
-
printNativeDashboardAccessInfo({ isVi, providerKey, projectDir });
|
|
2676
|
-
if (channelKey === 'zalo-personal') {
|
|
2677
|
-
printZaloPersonalLoginInfo({ isVi, deployMode: 'native', projectDir });
|
|
2678
|
-
}
|
|
2679
|
-
} else {
|
|
2680
|
-
const appName =
|
|
2681
|
-
if (providerKey === '9router') {
|
|
2682
|
-
startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath: native9RouterSyncScriptPath });
|
|
2683
|
-
}
|
|
2698
|
+
if (isMultiBot && channelKey === 'telegram') {
|
|
2699
|
+
if (providerKey === '9router') {
|
|
2700
|
+
startNative9RouterPm2({ isVi, projectDir, appName: getNativePm2AppName(true), syncScriptPath: native9RouterSyncScriptPath });
|
|
2701
|
+
}
|
|
2702
|
+
execSync('pm2 start ecosystem.config.js && pm2 save', {
|
|
2703
|
+
cwd: projectDir,
|
|
2704
|
+
stdio: 'inherit',
|
|
2705
|
+
shell: true
|
|
2706
|
+
});
|
|
2707
|
+
console.log(chalk.green(`\n🎉 ${isVi ? 'Setup hoan tat! Multi-bot native dang chay qua PM2.' : 'Setup complete! Native multi-bot is running via PM2.'}`));
|
|
2708
|
+
console.log(chalk.gray(isVi ? ` Xem log: pm2 logs ${getNativePm2AppName(true)}` : ` View logs: pm2 logs ${getNativePm2AppName(true)}`));
|
|
2709
|
+
printNativeDashboardAccessInfo({ isVi, providerKey, projectDir });
|
|
2710
|
+
if (channelKey === 'zalo-personal') {
|
|
2711
|
+
printZaloPersonalLoginInfo({ isVi, deployMode: 'native', projectDir });
|
|
2712
|
+
}
|
|
2713
|
+
} else {
|
|
2714
|
+
const appName = getNativePm2AppName(false);
|
|
2715
|
+
if (providerKey === '9router') {
|
|
2716
|
+
startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath: native9RouterSyncScriptPath });
|
|
2717
|
+
}
|
|
2684
2718
|
if (channelKey === 'zalo-personal') {
|
|
2685
2719
|
await runNativeZaloPersonalLoginFlow({ isVi, projectDir });
|
|
2686
2720
|
}
|
|
@@ -222,9 +222,66 @@ fi
|
|
|
222
222
|
projectDir = '.',
|
|
223
223
|
is9Router = false,
|
|
224
224
|
isVi = true,
|
|
225
|
+
osChoice = 'linux',
|
|
226
|
+
isMultiBot = false,
|
|
227
|
+
appName = 'openclaw',
|
|
225
228
|
logFile9r = '/tmp/9router.log',
|
|
226
229
|
logFileGw = '/tmp/openclaw-gw.log',
|
|
227
230
|
} = opts;
|
|
231
|
+
if (osChoice === 'vps') {
|
|
232
|
+
const L = [];
|
|
233
|
+
L.push('#!/bin/bash');
|
|
234
|
+
L.push('set -euo pipefail');
|
|
235
|
+
L.push(`PROJECT_DIR="${projectDir}"`);
|
|
236
|
+
L.push('cd "$PROJECT_DIR"');
|
|
237
|
+
L.push('export OPENCLAW_HOME="$PROJECT_DIR/.openclaw"');
|
|
238
|
+
L.push('export OPENCLAW_STATE_DIR="$PROJECT_DIR/.openclaw"');
|
|
239
|
+
L.push('export DATA_DIR="$PROJECT_DIR/.9router"');
|
|
240
|
+
L.push('if [ -f ".env" ]; then set -a; . ./.env; set +a; fi');
|
|
241
|
+
L.push(`APP_NAME="${appName}"`);
|
|
242
|
+
L.push('');
|
|
243
|
+
L.push('if ! command -v pm2 >/dev/null 2>&1; then');
|
|
244
|
+
L.push(isVi ? ' echo "ERROR: Khong tim thay PM2. Chay: npm install -g pm2"' : ' echo "ERROR: PM2 not found. Run: npm install -g pm2"');
|
|
245
|
+
L.push(' exit 1');
|
|
246
|
+
L.push('fi');
|
|
247
|
+
L.push('');
|
|
248
|
+
L.push(isVi ? 'echo "====== OpenClaw — Khoi dong lai bot qua PM2 ======"' : 'echo "====== OpenClaw — Restart Bot via PM2 ======"');
|
|
249
|
+
L.push('echo ""');
|
|
250
|
+
if (is9Router) {
|
|
251
|
+
L.push(isVi ? 'echo "[1] Khoi dong lai 9Router qua PM2..."' : 'echo "[1] Restarting 9Router via PM2..."');
|
|
252
|
+
L.push('NINE_ROUTER_BIN="$(command -v 9router 2>/dev/null || true)"');
|
|
253
|
+
L.push('NODE_BIN="$(command -v node 2>/dev/null || true)"');
|
|
254
|
+
L.push('if [ -z "$NINE_ROUTER_BIN" ] || [ -z "$NODE_BIN" ]; then');
|
|
255
|
+
L.push(isVi ? ' echo "ERROR: Thieu node hoac 9router. Chay: npm install -g 9router"' : ' echo "ERROR: Missing node or 9router. Run: npm install -g 9router"');
|
|
256
|
+
L.push(' exit 1');
|
|
257
|
+
L.push('fi');
|
|
258
|
+
L.push('pm2 delete "$APP_NAME-9router" "$APP_NAME-9router-sync" >/dev/null 2>&1 || true');
|
|
259
|
+
L.push('PORT=20128 HOSTNAME=0.0.0.0 DATA_DIR="$DATA_DIR" pm2 start "$NINE_ROUTER_BIN" --name "$APP_NAME-9router" --interpreter "$NODE_BIN" -- -n -H 0.0.0.0 -p 20128 --skip-update');
|
|
260
|
+
L.push('if [ -f "$PROJECT_DIR/.openclaw/9router-smart-route-sync.js" ]; then');
|
|
261
|
+
L.push(' pm2 start "$NODE_BIN" --name "$APP_NAME-9router-sync" -- "$PROJECT_DIR/.openclaw/9router-smart-route-sync.js"');
|
|
262
|
+
L.push('fi');
|
|
263
|
+
} else {
|
|
264
|
+
L.push(isVi ? 'echo "[1] Khong dung 9Router cho project nay."' : 'echo "[1] This project does not use 9Router."');
|
|
265
|
+
}
|
|
266
|
+
L.push('');
|
|
267
|
+
if (isMultiBot) {
|
|
268
|
+
L.push(isVi ? 'echo "[2] Khoi dong lai multi-bot gateway qua PM2..."' : 'echo "[2] Restarting multi-bot gateway via PM2..."');
|
|
269
|
+
L.push('pm2 delete "$APP_NAME" >/dev/null 2>&1 || true');
|
|
270
|
+
L.push('pm2 start ecosystem.config.js');
|
|
271
|
+
} else {
|
|
272
|
+
L.push(isVi ? 'echo "[2] Khoi dong lai OpenClaw gateway qua PM2..."' : 'echo "[2] Restarting OpenClaw gateway via PM2..."');
|
|
273
|
+
L.push('pm2 delete "$APP_NAME" >/dev/null 2>&1 || true');
|
|
274
|
+
L.push('pm2 start openclaw --name "$APP_NAME" --cwd "$PROJECT_DIR" -- gateway run');
|
|
275
|
+
}
|
|
276
|
+
L.push('pm2 save >/dev/null 2>&1 || true');
|
|
277
|
+
L.push('echo ""');
|
|
278
|
+
L.push('echo "OpenClaw Dashboard: http://127.0.0.1:18791"');
|
|
279
|
+
if (is9Router) L.push('echo "9Router Dashboard: http://127.0.0.1:20128/dashboard"');
|
|
280
|
+
L.push('echo ""');
|
|
281
|
+
L.push(isVi ? 'echo "Log gateway: pm2 logs $APP_NAME"' : 'echo "Gateway logs: pm2 logs $APP_NAME"');
|
|
282
|
+
if (is9Router) L.push(isVi ? 'echo "Log 9Router: pm2 logs $APP_NAME-9router"' : 'echo "9Router logs: pm2 logs $APP_NAME-9router"');
|
|
283
|
+
return L.join('\n');
|
|
284
|
+
}
|
|
228
285
|
const L = [];
|
|
229
286
|
L.push('#!/bin/bash');
|
|
230
287
|
L.push('set -euo pipefail');
|
package/dist/setup.js
CHANGED
|
@@ -1429,9 +1429,66 @@
|
|
|
1429
1429
|
projectDir = '.',
|
|
1430
1430
|
is9Router = false,
|
|
1431
1431
|
isVi = true,
|
|
1432
|
+
osChoice = 'linux',
|
|
1433
|
+
isMultiBot = false,
|
|
1434
|
+
appName = 'openclaw',
|
|
1432
1435
|
logFile9r = '/tmp/9router.log',
|
|
1433
1436
|
logFileGw = '/tmp/openclaw-gw.log',
|
|
1434
1437
|
} = opts;
|
|
1438
|
+
if (osChoice === 'vps') {
|
|
1439
|
+
const L = [];
|
|
1440
|
+
L.push('#!/bin/bash');
|
|
1441
|
+
L.push('set -euo pipefail');
|
|
1442
|
+
L.push(`PROJECT_DIR="${projectDir}"`);
|
|
1443
|
+
L.push('cd "$PROJECT_DIR"');
|
|
1444
|
+
L.push('export OPENCLAW_HOME="$PROJECT_DIR/.openclaw"');
|
|
1445
|
+
L.push('export OPENCLAW_STATE_DIR="$PROJECT_DIR/.openclaw"');
|
|
1446
|
+
L.push('export DATA_DIR="$PROJECT_DIR/.9router"');
|
|
1447
|
+
L.push('if [ -f ".env" ]; then set -a; . ./.env; set +a; fi');
|
|
1448
|
+
L.push(`APP_NAME="${appName}"`);
|
|
1449
|
+
L.push('');
|
|
1450
|
+
L.push('if ! command -v pm2 >/dev/null 2>&1; then');
|
|
1451
|
+
L.push(isVi ? ' echo "ERROR: Khong tim thay PM2. Chay: npm install -g pm2"' : ' echo "ERROR: PM2 not found. Run: npm install -g pm2"');
|
|
1452
|
+
L.push(' exit 1');
|
|
1453
|
+
L.push('fi');
|
|
1454
|
+
L.push('');
|
|
1455
|
+
L.push(isVi ? 'echo "====== OpenClaw — Khoi dong lai bot qua PM2 ======"' : 'echo "====== OpenClaw — Restart Bot via PM2 ======"');
|
|
1456
|
+
L.push('echo ""');
|
|
1457
|
+
if (is9Router) {
|
|
1458
|
+
L.push(isVi ? 'echo "[1] Khoi dong lai 9Router qua PM2..."' : 'echo "[1] Restarting 9Router via PM2..."');
|
|
1459
|
+
L.push('NINE_ROUTER_BIN="$(command -v 9router 2>/dev/null || true)"');
|
|
1460
|
+
L.push('NODE_BIN="$(command -v node 2>/dev/null || true)"');
|
|
1461
|
+
L.push('if [ -z "$NINE_ROUTER_BIN" ] || [ -z "$NODE_BIN" ]; then');
|
|
1462
|
+
L.push(isVi ? ' echo "ERROR: Thieu node hoac 9router. Chay: npm install -g 9router"' : ' echo "ERROR: Missing node or 9router. Run: npm install -g 9router"');
|
|
1463
|
+
L.push(' exit 1');
|
|
1464
|
+
L.push('fi');
|
|
1465
|
+
L.push('pm2 delete "$APP_NAME-9router" "$APP_NAME-9router-sync" >/dev/null 2>&1 || true');
|
|
1466
|
+
L.push('PORT=20128 HOSTNAME=0.0.0.0 DATA_DIR="$DATA_DIR" pm2 start "$NINE_ROUTER_BIN" --name "$APP_NAME-9router" --interpreter "$NODE_BIN" -- -n -H 0.0.0.0 -p 20128 --skip-update');
|
|
1467
|
+
L.push('if [ -f "$PROJECT_DIR/.openclaw/9router-smart-route-sync.js" ]; then');
|
|
1468
|
+
L.push(' pm2 start "$NODE_BIN" --name "$APP_NAME-9router-sync" -- "$PROJECT_DIR/.openclaw/9router-smart-route-sync.js"');
|
|
1469
|
+
L.push('fi');
|
|
1470
|
+
} else {
|
|
1471
|
+
L.push(isVi ? 'echo "[1] Khong dung 9Router cho project nay."' : 'echo "[1] This project does not use 9Router."');
|
|
1472
|
+
}
|
|
1473
|
+
L.push('');
|
|
1474
|
+
if (isMultiBot) {
|
|
1475
|
+
L.push(isVi ? 'echo "[2] Khoi dong lai multi-bot gateway qua PM2..."' : 'echo "[2] Restarting multi-bot gateway via PM2..."');
|
|
1476
|
+
L.push('pm2 delete "$APP_NAME" >/dev/null 2>&1 || true');
|
|
1477
|
+
L.push('pm2 start ecosystem.config.js');
|
|
1478
|
+
} else {
|
|
1479
|
+
L.push(isVi ? 'echo "[2] Khoi dong lai OpenClaw gateway qua PM2..."' : 'echo "[2] Restarting OpenClaw gateway via PM2..."');
|
|
1480
|
+
L.push('pm2 delete "$APP_NAME" >/dev/null 2>&1 || true');
|
|
1481
|
+
L.push('pm2 start openclaw --name "$APP_NAME" --cwd "$PROJECT_DIR" -- gateway run');
|
|
1482
|
+
}
|
|
1483
|
+
L.push('pm2 save >/dev/null 2>&1 || true');
|
|
1484
|
+
L.push('echo ""');
|
|
1485
|
+
L.push('echo "OpenClaw Dashboard: http://127.0.0.1:18791"');
|
|
1486
|
+
if (is9Router) L.push('echo "9Router Dashboard: http://127.0.0.1:20128/dashboard"');
|
|
1487
|
+
L.push('echo ""');
|
|
1488
|
+
L.push(isVi ? 'echo "Log gateway: pm2 logs $APP_NAME"' : 'echo "Gateway logs: pm2 logs $APP_NAME"');
|
|
1489
|
+
if (is9Router) L.push(isVi ? 'echo "Log 9Router: pm2 logs $APP_NAME-9router"' : 'echo "9Router logs: pm2 logs $APP_NAME-9router"');
|
|
1490
|
+
return L.join('\n');
|
|
1491
|
+
}
|
|
1435
1492
|
const L = [];
|
|
1436
1493
|
L.push('#!/bin/bash');
|
|
1437
1494
|
L.push('set -euo pipefail');
|