221 lines
6.6 KiB
Bash
Executable File
221 lines
6.6 KiB
Bash
Executable File
#!/bin/bash
|
||
# ============================================================
|
||
# U-Claw - Linux 启动盘 OpenClaw 安装脚本
|
||
# 在 Linux Mint 启动盘环境中运行此脚本安装 OpenClaw
|
||
#
|
||
# 使用方法:
|
||
# 1. 用 Rufus 制作 Linux Mint 启动盘(开启 Persistent Storage)
|
||
# 2. 从 USB 启动进入 Linux Mint
|
||
# 3. 连接网络
|
||
# 4. 打开终端,运行: bash setup-linux-usb.sh
|
||
# ============================================================
|
||
|
||
set -e
|
||
|
||
GREEN='\033[0;32m'
|
||
CYAN='\033[0;36m'
|
||
RED='\033[0;31m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m'
|
||
BOLD='\033[1m'
|
||
|
||
NODE_VER="v22.14.0"
|
||
MIRROR="https://registry.npmmirror.com"
|
||
NODE_MIRROR="https://npmmirror.com/mirrors/node"
|
||
|
||
INSTALL_DIR="$HOME/U-Claw"
|
||
|
||
clear
|
||
echo ""
|
||
echo -e "${CYAN}${BOLD}"
|
||
echo " ╔══════════════════════════════════════╗"
|
||
echo " ║ U-Claw Linux 启动盘安装 ║"
|
||
echo " ║ 在 Live Linux 环境中安装 OpenClaw ║"
|
||
echo " ╚══════════════════════════════════════╝"
|
||
echo -e "${NC}"
|
||
echo ""
|
||
|
||
# ---- Check network ----
|
||
echo -e " ${BOLD}[0/4] 检查网络连接...${NC}"
|
||
if ! ping -c 1 -W 3 npmmirror.com >/dev/null 2>&1; then
|
||
echo -e " ${RED}无法连接到网络!${NC}"
|
||
echo -e " ${YELLOW}请先连接 WiFi 或插入网线,然后重新运行此脚本。${NC}"
|
||
echo ""
|
||
read -p " 按回车退出..."
|
||
exit 1
|
||
fi
|
||
echo -e " ${GREEN}网络正常 ✓${NC}"
|
||
echo ""
|
||
|
||
# ---- Check CPU ----
|
||
ARCH=$(uname -m)
|
||
if [ "$ARCH" = "x86_64" ]; then
|
||
NODE_PLATFORM="linux-x64"
|
||
NODE_DIR_NAME="node-linux-x64"
|
||
echo -e " ${GREEN}架构: x86_64 ✓${NC}"
|
||
elif [ "$ARCH" = "aarch64" ]; then
|
||
NODE_PLATFORM="linux-arm64"
|
||
NODE_DIR_NAME="node-linux-arm64"
|
||
echo -e " ${GREEN}架构: ARM64 ✓${NC}"
|
||
else
|
||
echo -e " ${RED}不支持的架构: $ARCH${NC}"
|
||
exit 1
|
||
fi
|
||
echo ""
|
||
|
||
# ---- Step 1: Install Node.js ----
|
||
echo -e " ${BOLD}[1/4] 安装 Node.js $NODE_VER...${NC}"
|
||
|
||
NODE_INSTALL_DIR="$INSTALL_DIR/runtime/$NODE_DIR_NAME"
|
||
|
||
if [ -f "$NODE_INSTALL_DIR/bin/node" ]; then
|
||
echo -e " ${GREEN}Node.js 已存在,跳过${NC}"
|
||
else
|
||
TARBALL="node-${NODE_VER}-${NODE_PLATFORM}.tar.gz"
|
||
URL="${NODE_MIRROR}/${NODE_VER}/${TARBALL}"
|
||
|
||
echo -e " ${CYAN}下载: $URL${NC}"
|
||
mkdir -p "$NODE_INSTALL_DIR"
|
||
curl -# -L "$URL" -o "/tmp/$TARBALL"
|
||
tar -xzf "/tmp/$TARBALL" -C "$NODE_INSTALL_DIR" --strip-components=1
|
||
rm -f "/tmp/$TARBALL"
|
||
chmod +x "$NODE_INSTALL_DIR/bin/node"
|
||
echo -e " ${GREEN}Node.js 安装完成 ✓${NC}"
|
||
fi
|
||
|
||
NODE_BIN="$NODE_INSTALL_DIR/bin/node"
|
||
NPM_BIN="$NODE_INSTALL_DIR/bin/npm"
|
||
export PATH="$NODE_INSTALL_DIR/bin:$PATH"
|
||
|
||
echo -e " 版本: $("$NODE_BIN" --version)"
|
||
echo ""
|
||
|
||
# ---- Step 2: Install OpenClaw ----
|
||
echo -e " ${BOLD}[2/4] 安装 OpenClaw...${NC}"
|
||
|
||
CORE_DIR="$INSTALL_DIR/core"
|
||
mkdir -p "$CORE_DIR"
|
||
|
||
cat > "$CORE_DIR/package.json" << 'PKGEOF'
|
||
{
|
||
"name": "u-claw-core",
|
||
"version": "1.0.0",
|
||
"private": true,
|
||
"dependencies": {
|
||
"openclaw": "latest"
|
||
}
|
||
}
|
||
PKGEOF
|
||
|
||
cd "$CORE_DIR"
|
||
echo -e " ${CYAN}从国内镜像下载 OpenClaw...${NC}"
|
||
"$NODE_BIN" "$NPM_BIN" install --registry="$MIRROR" 2>&1 | tail -5
|
||
echo -e " ${CYAN}安装 QQ 插件...${NC}"
|
||
"$NODE_BIN" "$NPM_BIN" install @sliverp/qqbot@latest --registry="$MIRROR" 2>&1 | tail -2
|
||
echo -e " ${GREEN}OpenClaw 安装完成 ✓${NC}"
|
||
echo ""
|
||
|
||
# ---- Step 3: Create config & launch script ----
|
||
echo -e " ${BOLD}[3/4] 创建配置和启动脚本...${NC}"
|
||
|
||
# Default config
|
||
mkdir -p "$INSTALL_DIR/data/.openclaw"
|
||
mkdir -p "$INSTALL_DIR/data/memory"
|
||
mkdir -p "$INSTALL_DIR/data/backups"
|
||
|
||
CONFIG_PATH="$INSTALL_DIR/data/.openclaw/openclaw.json"
|
||
if [ ! -f "$CONFIG_PATH" ]; then
|
||
cat > "$CONFIG_PATH" << 'CFGEOF'
|
||
{
|
||
"gateway": {
|
||
"mode": "local",
|
||
"auth": { "token": "uclaw" }
|
||
}
|
||
}
|
||
CFGEOF
|
||
fi
|
||
|
||
# Launch script
|
||
cat > "$INSTALL_DIR/start.sh" << STARTEOF
|
||
#!/bin/bash
|
||
DIR="$INSTALL_DIR"
|
||
NODE_BIN="$NODE_BIN"
|
||
CORE_DIR="\$DIR/core"
|
||
OPENCLAW_MJS="\$CORE_DIR/node_modules/openclaw/openclaw.mjs"
|
||
|
||
export OPENCLAW_HOME="\$DIR/data"
|
||
export OPENCLAW_STATE_DIR="\$DIR/data/.openclaw"
|
||
export OPENCLAW_CONFIG_PATH="\$DIR/data/.openclaw/openclaw.json"
|
||
|
||
PORT=18789
|
||
while ss -tlnp 2>/dev/null | grep -q ":\$PORT " || netstat -tlnp 2>/dev/null | grep -q ":\$PORT "; do
|
||
PORT=\$((PORT + 1))
|
||
[ \$PORT -gt 18799 ] && echo "No available port" && exit 1
|
||
done
|
||
|
||
echo "Starting OpenClaw on port \$PORT..."
|
||
cd "\$CORE_DIR"
|
||
"\$NODE_BIN" "\$OPENCLAW_MJS" gateway run --allow-unconfigured --force --port \$PORT &
|
||
PID=\$!
|
||
|
||
for i in \$(seq 1 30); do
|
||
sleep 0.5
|
||
if curl -s -o /dev/null "http://127.0.0.1:\$PORT/" 2>/dev/null; then
|
||
xdg-open "http://127.0.0.1:\$PORT/#token=uclaw" 2>/dev/null || echo "Open: http://127.0.0.1:\$PORT/#token=uclaw"
|
||
break
|
||
fi
|
||
done
|
||
|
||
wait \$PID
|
||
STARTEOF
|
||
chmod +x "$INSTALL_DIR/start.sh"
|
||
|
||
echo -e " ${GREEN}启动脚本已创建 ✓${NC}"
|
||
echo ""
|
||
|
||
# ---- Step 4: Create desktop shortcut ----
|
||
echo -e " ${BOLD}[4/4] 创建桌面快捷方式...${NC}"
|
||
|
||
DESKTOP_FILE="$HOME/Desktop/U-Claw.desktop"
|
||
cat > "$DESKTOP_FILE" << DESKEOF
|
||
[Desktop Entry]
|
||
Name=U-Claw AI 助手
|
||
Comment=Portable AI Agent powered by OpenClaw
|
||
Exec=bash $INSTALL_DIR/start.sh
|
||
Terminal=true
|
||
Type=Application
|
||
Categories=Utility;
|
||
DESKEOF
|
||
chmod +x "$DESKTOP_FILE"
|
||
|
||
# Also add to applications menu
|
||
mkdir -p "$HOME/.local/share/applications"
|
||
cp "$DESKTOP_FILE" "$HOME/.local/share/applications/u-claw.desktop"
|
||
|
||
echo -e " ${GREEN}桌面快捷方式已创建 ✓${NC}"
|
||
echo ""
|
||
|
||
# ---- Summary ----
|
||
INSTALL_SIZE=$(du -sh "$INSTALL_DIR" | cut -f1)
|
||
|
||
echo -e " ${GREEN}${BOLD}╔══════════════════════════════════════╗"
|
||
echo -e " ║ ✅ 安装成功! ║"
|
||
echo -e " ╚══════════════════════════════════════╝${NC}"
|
||
echo ""
|
||
echo -e " ${BOLD}安装位置:${NC} $INSTALL_DIR"
|
||
echo -e " ${BOLD}大小:${NC} $INSTALL_SIZE"
|
||
echo ""
|
||
echo -e " ${BOLD}启动方式:${NC}"
|
||
echo -e " 双击桌面的 ${CYAN}U-Claw AI 助手${NC} 图标"
|
||
echo -e " 或终端运行: ${CYAN}bash ~/U-Claw/start.sh${NC}"
|
||
echo ""
|
||
echo -e " ${BOLD}首次使用:${NC}"
|
||
echo -e " 启动后浏览器自动打开 → 选择 AI 模型 → 填写 API Key"
|
||
echo ""
|
||
echo -e " ${YELLOW}${BOLD}⚠️ 持久化提醒:${NC}"
|
||
echo -e " ${YELLOW}如果你用 Rufus 制作启动盘时开启了 Persistent Storage,${NC}"
|
||
echo -e " ${YELLOW}上述安装和配置在重启后仍然保留。${NC}"
|
||
echo -e " ${YELLOW}如果没有开启持久化,重启后需要重新运行此脚本。${NC}"
|
||
echo ""
|
||
read -p " 按回车关闭..."
|