diff --git a/install.sh b/install.sh index 9fc20aa..b95afa1 100644 --- a/install.sh +++ b/install.sh @@ -110,6 +110,13 @@ systemctl daemon-reload systemctl enable clawd-rfkill info "WiFi rfkill 解锁服务已创建 ✓" +# ── 移除系统自带 ttyd(避免与 clawd 托管的 ttyd 端口冲突)──────────────────── +if command -v dpkg &>/dev/null && dpkg -l ttyd 2>/dev/null | grep -q '^ii'; then + info "移除系统 ttyd 包(避免端口冲突)..." + apt-get remove -y ttyd >/dev/null 2>&1 || true + info "系统 ttyd 已移除 ✓" +fi + # ── 安装 clawd ─────────────────────────────────────────────────────────────── INSTALL_DIR="/opt/clawd" CONFIG_DIR="/etc/clawd" @@ -143,6 +150,32 @@ chmod +x "$INSTALL_DIR/bin/clawd.js" info "clawd 已安装到 /usr/local/bin/clawd ✓" +# ── 下载 ttyd(Web 终端)──────────────────────────────────────────────────── +TTYD_BIN="$CONFIG_DIR/ttyd" +TTYD_VERSION="1.7.7" +if [ ! -f "$TTYD_BIN" ]; then + ARCH=$(uname -m) + case "$ARCH" in + aarch64|arm64) TTYD_ARCH="aarch64" ;; + x86_64) TTYD_ARCH="x86_64" ;; + armv7l|armv6l) TTYD_ARCH="armv7l" ;; + i686) TTYD_ARCH="i686" ;; + *) TTYD_ARCH="x86_64" ;; + esac + TTYD_URL="https://github.com/tsl0922/ttyd/releases/download/${TTYD_VERSION}/ttyd.${TTYD_ARCH}" + info "下载 ttyd ${TTYD_VERSION} (${TTYD_ARCH})..." + if curl -fsSL -o "$TTYD_BIN" "$TTYD_URL" && [ -s "$TTYD_BIN" ]; then + chmod 755 "$TTYD_BIN" + info "ttyd 已安装到 $TTYD_BIN ✓" + else + rm -f "$TTYD_BIN" + warn "ttyd 下载失败(网络问题?),请手动下载并放置到 $TTYD_BIN" + warn " 下载地址: $TTYD_URL" + fi +else + info "ttyd 已存在,跳过下载 ✓" +fi + # ── 创建配置目录 + 环境变量文件 ────────────────────────────────────────────── mkdir -p "$CONFIG_DIR" diff --git a/lib/frpc.js b/lib/frpc.js index b2d98ca..29310df 100644 --- a/lib/frpc.js +++ b/lib/frpc.js @@ -101,22 +101,18 @@ async function downloadTtyd() { } /** - * 启动 ttyd(如未安装先下载)。 + * 启动 ttyd(由 install.sh 预装到 TTYD_BIN)。 * ttyd 绑定 127.0.0.1:7681,供 frpc 代理。 */ async function startTtyd() { if (!fs.existsSync(TTYD_BIN)) { - try { - await downloadTtyd(); - } catch (e) { - log.warn('ttyd', '下载失败:', e.message); - return false; - } + log.warn('ttyd', `未找到 ttyd(${TTYD_BIN}),请重新运行 install.sh`); + return false; } - // 终止旧进程 + // 终止所有 ttyd 进程(包括系统自带的,避免端口冲突) try { - execSync(`pkill -f "${TTYD_BIN}"`, { timeout: 3000 }); + execSync('pkill -x ttyd 2>/dev/null; pkill -x ttyd.aarch64 2>/dev/null; true', { timeout: 3000, shell: true }); await new Promise(r => setTimeout(r, 500)); } catch (_) {}