create-openclaw-bot 5.6.3 → 5.6.5
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 +137 -85
- 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,49 +824,64 @@ 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
|
-
function startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath }) {
|
|
846
|
-
const routerAppName = `${appName}-9router`;
|
|
847
|
-
const routerLaunch = resolveNative9RouterDesktopLaunch();
|
|
848
|
-
const normalizedProjectDir = projectDir.replace(/\\/g, '/');
|
|
849
|
-
const normalizedSyncScriptPath = syncScriptPath ? syncScriptPath.replace(/\\/g, '/') : '';
|
|
850
|
-
|
|
851
|
-
|
|
852
|
-
|
|
868
|
+
function startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath }) {
|
|
869
|
+
const routerAppName = `${appName}-9router`;
|
|
870
|
+
const routerLaunch = resolveNative9RouterDesktopLaunch();
|
|
871
|
+
const normalizedProjectDir = projectDir.replace(/\\/g, '/');
|
|
872
|
+
const normalizedSyncScriptPath = syncScriptPath ? syncScriptPath.replace(/\\/g, '/') : '';
|
|
873
|
+
try {
|
|
874
|
+
execSync(`pm2 delete ${routerAppName}`, {
|
|
875
|
+
cwd: projectDir,
|
|
876
|
+
stdio: 'ignore',
|
|
877
|
+
shell: true
|
|
878
|
+
});
|
|
879
|
+
} catch {
|
|
880
|
+
// ignore missing app
|
|
881
|
+
}
|
|
882
|
+
execFileSync('pm2', [
|
|
883
|
+
'start',
|
|
884
|
+
routerLaunch.command,
|
|
853
885
|
'--name',
|
|
854
886
|
routerAppName,
|
|
855
887
|
'--cwd',
|
|
@@ -863,22 +895,30 @@ function startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath }) {
|
|
|
863
895
|
stdio: 'inherit',
|
|
864
896
|
env: { ...process.env, ...routerLaunch.env }
|
|
865
897
|
});
|
|
866
|
-
if (syncScriptPath) {
|
|
867
|
-
const syncAppName = `${appName}-9router-sync`;
|
|
868
|
-
|
|
869
|
-
|
|
870
|
-
|
|
871
|
-
|
|
872
|
-
|
|
873
|
-
|
|
874
|
-
|
|
875
|
-
|
|
876
|
-
|
|
877
|
-
|
|
878
|
-
|
|
879
|
-
|
|
880
|
-
|
|
881
|
-
|
|
898
|
+
if (syncScriptPath) {
|
|
899
|
+
const syncAppName = `${appName}-9router-sync`;
|
|
900
|
+
try {
|
|
901
|
+
execSync(`pm2 delete ${syncAppName}`, {
|
|
902
|
+
cwd: projectDir,
|
|
903
|
+
stdio: 'ignore',
|
|
904
|
+
shell: true
|
|
905
|
+
});
|
|
906
|
+
} catch {
|
|
907
|
+
// ignore missing app
|
|
908
|
+
}
|
|
909
|
+
execFileSync('pm2', [
|
|
910
|
+
'start',
|
|
911
|
+
normalizedSyncScriptPath,
|
|
912
|
+
'--name',
|
|
913
|
+
syncAppName,
|
|
914
|
+
'--cwd',
|
|
915
|
+
normalizedProjectDir,
|
|
916
|
+
'--interpreter',
|
|
917
|
+
process.execPath
|
|
918
|
+
], {
|
|
919
|
+
cwd: projectDir,
|
|
920
|
+
stdio: 'inherit',
|
|
921
|
+
env: process.env
|
|
882
922
|
});
|
|
883
923
|
}
|
|
884
924
|
runPm2Save({ projectDir, isVi });
|
|
@@ -2237,7 +2277,7 @@ async function main() {
|
|
|
2237
2277
|
if (deployMode === 'native') {
|
|
2238
2278
|
const pm2Apps = [
|
|
2239
2279
|
' {',
|
|
2240
|
-
` name: '
|
|
2280
|
+
` name: 'openclaw-multibot',`,
|
|
2241
2281
|
` script: 'openclaw',`,
|
|
2242
2282
|
` args: 'gateway run',`,
|
|
2243
2283
|
` cwd: '${projectDir.replace(/\\/g, '/')}',`,
|
|
@@ -2485,9 +2525,14 @@ async function main() {
|
|
|
2485
2525
|
await writeGeneratedArtifacts(projectDir, buildCliChromeDebugArtifacts());
|
|
2486
2526
|
|
|
2487
2527
|
// ── Uninstall scripts ───────────────────────────────────────────────────────
|
|
2488
|
-
await writeGeneratedArtifacts(projectDir, buildCliUninstallArtifacts({
|
|
2489
|
-
deployMode,
|
|
2490
|
-
|
|
2528
|
+
await writeGeneratedArtifacts(projectDir, buildCliUninstallArtifacts({
|
|
2529
|
+
deployMode,
|
|
2530
|
+
osChoice: detectedOS,
|
|
2531
|
+
projectDir,
|
|
2532
|
+
botName: (deployMode !== 'docker' && detectedOS === 'vps')
|
|
2533
|
+
? getNativePm2AppName(isMultiBot)
|
|
2534
|
+
: botName,
|
|
2535
|
+
}));
|
|
2491
2536
|
|
|
2492
2537
|
// ── Upgrade scripts ─────────────────────────────────────────────────────────
|
|
2493
2538
|
await writeGeneratedArtifacts(projectDir, buildCliUpgradeArtifacts());
|
|
@@ -2495,19 +2540,26 @@ async function main() {
|
|
|
2495
2540
|
// ── start-bot.bat / start-bot.sh — one-click restart scripts ─────────────
|
|
2496
2541
|
// Generated for native deployments only (docker has docker compose up)
|
|
2497
2542
|
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
|
-
|
|
2543
|
+
await writeGeneratedArtifacts(projectDir, buildCliStartBotArtifacts({
|
|
2544
|
+
projectDir,
|
|
2545
|
+
openclawHome: path.join(projectDir, '.openclaw'),
|
|
2546
|
+
is9Router: providerKey === '9router',
|
|
2547
|
+
osChoice,
|
|
2548
|
+
isMultiBot,
|
|
2549
|
+
appName: getNativePm2AppName(isMultiBot),
|
|
2550
|
+
isVi,
|
|
2551
|
+
}));
|
|
2552
|
+
|
|
2553
|
+
console.log(chalk.cyan(
|
|
2554
|
+
process.platform === 'win32'
|
|
2555
|
+
? (isVi
|
|
2556
|
+
? `\n🚀 start-bot.bat / start-bot.sh đã tạo — double-click để restart bot.`
|
|
2557
|
+
: `\n🚀 start-bot.bat / start-bot.sh created — double-click to restart the bot.`)
|
|
2558
|
+
: (isVi
|
|
2559
|
+
? `\n🚀 start-bot.sh đã tạo — chạy ./start-bot.sh để restart bot.`
|
|
2560
|
+
: `\n🚀 start-bot.sh created — run ./start-bot.sh to restart the bot.`)
|
|
2561
|
+
));
|
|
2562
|
+
}
|
|
2511
2563
|
|
|
2512
2564
|
console.log(chalk.green(`✅ ${isVi ? 'Tạo cấu hình thành công!' : 'Configs created successfully!'}`));
|
|
2513
2565
|
|
|
@@ -2661,26 +2713,26 @@ async function main() {
|
|
|
2661
2713
|
}
|
|
2662
2714
|
}
|
|
2663
2715
|
|
|
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
|
-
}
|
|
2716
|
+
if (isMultiBot && channelKey === 'telegram') {
|
|
2717
|
+
if (providerKey === '9router') {
|
|
2718
|
+
startNative9RouterPm2({ isVi, projectDir, appName: getNativePm2AppName(true), syncScriptPath: native9RouterSyncScriptPath });
|
|
2719
|
+
}
|
|
2720
|
+
execSync('pm2 start ecosystem.config.js && pm2 save', {
|
|
2721
|
+
cwd: projectDir,
|
|
2722
|
+
stdio: 'inherit',
|
|
2723
|
+
shell: true
|
|
2724
|
+
});
|
|
2725
|
+
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.'}`));
|
|
2726
|
+
console.log(chalk.gray(isVi ? ` Xem log: pm2 logs ${getNativePm2AppName(true)}` : ` View logs: pm2 logs ${getNativePm2AppName(true)}`));
|
|
2727
|
+
printNativeDashboardAccessInfo({ isVi, providerKey, projectDir });
|
|
2728
|
+
if (channelKey === 'zalo-personal') {
|
|
2729
|
+
printZaloPersonalLoginInfo({ isVi, deployMode: 'native', projectDir });
|
|
2730
|
+
}
|
|
2731
|
+
} else {
|
|
2732
|
+
const appName = getNativePm2AppName(false);
|
|
2733
|
+
if (providerKey === '9router') {
|
|
2734
|
+
startNative9RouterPm2({ isVi, projectDir, appName, syncScriptPath: native9RouterSyncScriptPath });
|
|
2735
|
+
}
|
|
2684
2736
|
if (channelKey === 'zalo-personal') {
|
|
2685
2737
|
await runNativeZaloPersonalLoginFlow({ isVi, projectDir });
|
|
2686
2738
|
}
|
|
@@ -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');
|