refactor: remove Docker from Linux install.sh; fix log file path; add confirm prompt

This commit is contained in:
i
2026-06-02 00:36:08 +08:00
parent e5c70a7d8b
commit 512c03dfab
+38 -167
View File
@@ -1,7 +1,7 @@
#!/bin/bash
#
# HAPI 管理脚本 (Linux)
# 功能:状态查看、安装/升级/卸载 HAPI CLI、部署 Hub Docker、配置开机自启
# 功能:状态查看、安装/升级/卸载 HAPI CLI、配置 Hub、配置开机自启
# 支持:版本检测、多途径升级、GitHub Release 自动匹配架构
#
# 用法:
@@ -11,7 +11,7 @@
# bash install.sh --source github-official # 指定官方 GitHub Release
# bash install.sh --force # 强制重新安装
# bash install.sh --upgrade # 仅升级模式
# bash install.sh --skip-hub # 跳过 Hub Docker 配置
# bash install.sh --skip-hub # 跳过 Hub 配置(仅安装/升级 CLI)
# bash install.sh --npm-registry https://registry.npmmirror.com
# bash install.sh --github-mirror https://ghproxy.com
# bash install.sh --help # 显示帮助
@@ -24,7 +24,7 @@ set -e
INSTALL_DIR=""
HAPI_BIN_DIR=""
HAPI_DATA=""
LOG_FILE="/tmp/hapi-install.log"
LOG_FILE=""
VERSION_FILE=""
SOURCE_FILE=""
NODE_MIN_VERSION=22
@@ -68,7 +68,6 @@ INSTALLED_SOURCE=""
REMOTE_VERSION=""
SELECTED_SOURCE=""
IS_ROOT=false
HAS_DOCKER=false
# 系统状态
STATUS_CLI_INSTALLED=false
@@ -76,7 +75,6 @@ STATUS_CLI_VERSION=""
STATUS_CLI_SOURCE=""
STATUS_CLI_PATH=""
STATUS_REMOTE_VERSION=""
STATUS_HUB_RUNNING=false
STATUS_HUB_CONFIGURED=false
STATUS_AUTOSTART_HUB_ENABLED=""
STATUS_AUTOSTART_HUB_ACTIVE=""
@@ -88,7 +86,7 @@ CLI_TOKEN=""
# ─────────────────────────────────────────
# 日志输出
# ─────────────────────────────────────────
log() { echo -e "$1" | tee -a "$LOG_FILE"; }
log() { echo -e "$1"; [[ -n "$LOG_FILE" ]] && echo -e "$1" >> "$LOG_FILE"; }
info() { log "${CYAN}[INFO]${NC} $1"; }
ok() { log "${GREEN}[OK]${NC} $1"; }
warn() { log "${YELLOW}[WARN]${NC} $1"; }
@@ -112,7 +110,7 @@ HAPI 管理脚本 (Linux)
github-fork - arkylin/Hapi-Docker GitHub Release
--force 强制重新安装(即使版本相同)
--upgrade 仅升级模式(已是最新则退出)
--skip-hub 跳过 Hub Docker 配置(仅安装/升级 CLI)
--skip-hub 跳过 Hub 配置(仅安装/升级 CLI)
--npm-registry URL 自定义 npm registry
--github-mirror URL 自定义 GitHub 镜像前缀
--help, -h 显示此帮助
@@ -732,18 +730,6 @@ install_nodejs() {
}
# ─────────────────────────────────────────
# 检查 Docker 权限
# ─────────────────────────────────────────
check_docker() {
if command -v docker &>/dev/null; then
if docker info &>/dev/null; then
HAS_DOCKER=true
return 0
fi
fi
HAS_DOCKER=false
}
# ─────────────────────────────────────────
# 选择安装来源
# ─────────────────────────────────────────
@@ -795,15 +781,6 @@ select_source() {
# 配置 HAPI Hub
# ─────────────────────────────────────────
setup_hub() {
if [[ "$HAS_DOCKER" != true ]]; then
err "Docker 不可用,无法配置 Hub"
if [[ "$IS_ROOT" != true ]]; then
warn "提示: 将当前用户加入 docker 组,然后重新登录:"
warn " sudo usermod -aG docker \$USER"
fi
return 1
fi
step "配置 HAPI Hub"
mkdir -p "$INSTALL_DIR" "$HAPI_DATA"
@@ -839,67 +816,7 @@ EOF
ok "已生成配置文件"
fi
cat > "$INSTALL_DIR/docker-compose.yml" <<'EOF'
services:
hapi-hub:
image: ghcr.io/arkylin/hapi-docker:latest
container_name: hapi-hub
restart: unless-stopped
ports:
- "3006:3006"
volumes:
- ./hapi-data:/root/.hapi
env_file:
- .env
environment:
- HAPI_LISTEN_HOST=0.0.0.0
- HAPI_LISTEN_PORT=3006
EOF
(cd "$INSTALL_DIR" && docker compose pull >>"$LOG_FILE" 2>&1)
(cd "$INSTALL_DIR" && docker compose up -d >>"$LOG_FILE" 2>&1)
info "等待 Hub 启动..."
for i in {1..30}; do
curl -s http://localhost:3006 &>/dev/null && break
sleep 1
done
ok "HAPI Hub 已启动"
}
# ─────────────────────────────────────────
# 停止 HAPI Hub
# ─────────────────────────────────────────
stop_hub() {
if [[ ! -f "$INSTALL_DIR/docker-compose.yml" ]]; then
warn "未找到 Hub 配置,无需停止"
return 0
fi
if [[ "$HAS_DOCKER" != true ]]; then
err "Docker 不可用"
return 1
fi
step "停止 HAPI Hub"
(cd "$INSTALL_DIR" && docker compose down >>"$LOG_FILE" 2>&1)
ok "HAPI Hub 已停止"
}
# ─────────────────────────────────────────
# 启动 HAPI Hub
# ─────────────────────────────────────────
start_hub_only() {
if [[ "$HAS_DOCKER" != true ]]; then
err "Docker 不可用"
return 1
fi
if [[ -f "$INSTALL_DIR/docker-compose.yml" ]]; then
(cd "$INSTALL_DIR" && docker compose up -d >>"$LOG_FILE" 2>&1)
ok "HAPI Hub 已启动"
fi
ok "HAPI Hub 配置完成,请手动启动 Hub"
}
# ─────────────────────────────────────────
@@ -916,17 +833,15 @@ setup_systemd() {
cat > /etc/systemd/system/hapi-hub.service <<EOF
[Unit]
Description=HAPI Hub (Docker Compose)
After=docker.service network-online.target
Wants=docker.service
Description=HAPI Hub
After=network-online.target
[Service]
Type=oneshot
RemainAfterExit=yes
WorkingDirectory=$INSTALL_DIR
ExecStartPre=-/usr/bin/docker compose pull
ExecStart=/usr/bin/docker compose up -d
ExecStop=/usr/bin/docker compose down
ExecStart=$hapi_bin hub start
ExecStop=$hapi_bin hub stop
TimeoutStartSec=0
[Install]
@@ -1059,7 +974,6 @@ collect_status() {
STATUS_CLI_SOURCE=""
STATUS_CLI_PATH=""
STATUS_REMOTE_VERSION=""
STATUS_HUB_RUNNING=false
STATUS_HUB_CONFIGURED=false
STATUS_AUTOSTART_HUB_ENABLED=""
STATUS_AUTOSTART_HUB_ACTIVE=""
@@ -1076,13 +990,8 @@ collect_status() {
fi
# Hub 状态
if [[ -f "$INSTALL_DIR/docker-compose.yml" ]]; then
if [[ -f "$INSTALL_DIR/.env" ]]; then
STATUS_HUB_CONFIGURED=true
if [[ "$HAS_DOCKER" == true ]]; then
if docker ps --format '{{.Names}}' 2>/dev/null | grep -q '^hapi-hub$'; then
STATUS_HUB_RUNNING=true
fi
fi
fi
# 自启动状态
@@ -1114,18 +1023,6 @@ print_status() {
cli_color=$GREEN
fi
local hub_status="未配置"
local hub_color=$RED
if [[ "$STATUS_HUB_CONFIGURED" == true ]]; then
if [[ "$STATUS_HUB_RUNNING" == true ]]; then
hub_status="运行中"
hub_color=$GREEN
else
hub_status="已配置 (未运行)"
hub_color=$YELLOW
fi
fi
local autostart_hub="未设置"
local autostart_runner="未设置"
if [[ -n "$STATUS_AUTOSTART_HUB_ENABLED" ]]; then
@@ -1161,12 +1058,6 @@ print_status() {
echo -e "${BOLD}║${NC} 路径: ${STATUS_CLI_PATH} ${BOLD}║${NC}"
fi
echo -e "${BOLD}║${NC} ${BOLD}║${NC}"
echo -e "${BOLD}║${NC} ${BOLD}HAPI Hub${NC} ${BOLD}║${NC}"
echo -e "${BOLD}║${NC} 状态: ${hub_color}${hub_status}${NC} ${BOLD}║${NC}"
if [[ "$STATUS_HUB_CONFIGURED" == true ]]; then
echo -e "${BOLD}║${NC} 配置: $INSTALL_DIR ${BOLD}║${NC}"
fi
echo -e "${BOLD}║${NC} ${BOLD}║${NC}"
echo -e "${BOLD}║${NC} ${BOLD}开机自启${NC} ${BOLD}║${NC}"
echo -e "${BOLD}║${NC} Hub: ${autostart_hub} ${BOLD}║${NC}"
echo -e "${BOLD}║${NC} Runner: ${autostart_runner} ${BOLD}║${NC}"
@@ -1208,27 +1099,6 @@ main_menu() {
echo ""
if [[ "$HAS_DOCKER" == true ]]; then
if [[ "$STATUS_HUB_CONFIGURED" == false ]]; then
echo " $i) 配置并启动 HAPI Hub"
options+=("hub")
((i++))
else
if [[ "$STATUS_HUB_RUNNING" == true ]]; then
echo " $i) 停止 HAPI Hub"
options+=("stop_hub")
else
echo " $i) 启动 HAPI Hub"
options+=("start_hub")
fi
((i++))
fi
else
echo -e " ${DIM}Hub 管理 (Docker 不可用)${NC}"
fi
echo ""
if [[ "$IS_ROOT" == true ]]; then
if [[ -n "$STATUS_AUTOSTART_HUB_ENABLED" || -n "$STATUS_AUTOSTART_RUNNER_ENABLED" ]]; then
if [[ "$STATUS_AUTOSTART_HUB_ENABLED" == "enabled" || "$STATUS_AUTOSTART_RUNNER_ENABLED" == "enabled" ]]; then
@@ -1366,21 +1236,9 @@ main_menu() {
read -rp "按 Enter 继续..."
;;
start_hub)
start_hub_only
collect_status
read -rp "按 Enter 继续..."
;;
stop_hub)
stop_hub
collect_status
read -rp "按 Enter 继续..."
;;
setup_autostart|enable_autostart)
if [[ "$STATUS_HUB_CONFIGURED" == false ]]; then
warn "Hub 未配置,先执行配置并启动 HAPI Hub"
warn "Hub 未配置,先执行配置"
setup_hub || true
fi
setup_systemd
@@ -1417,17 +1275,6 @@ check_prerequisites() {
fi
done
ok "基础工具检查通过"
check_docker
if [[ "$HAS_DOCKER" == true ]]; then
ok "Docker 可用"
else
warn "Docker 不可用"
if [[ "$IS_ROOT" != true ]]; then
warn "提示: 将当前用户加入 docker 组,然后重新登录:"
warn " sudo usermod -aG docker \$USER"
fi
fi
}
# ─────────────────────────────────────────
@@ -1477,6 +1324,29 @@ run_quick_mode() {
fi
fi
if [[ "$FORCE" != true && "$UPGRADE_ONLY" != true ]]; then
local action="安装"
[[ -n "$INSTALLED_VERSION" ]] && action="覆盖安装"
local src_label=""
case "$SELECTED_SOURCE" in
npm) src_label="npm registry" ;;
github-official) src_label="GitHub (tiann/hapi)" ;;
github-fork) src_label="GitHub (arkylin/Hapi-Docker)" ;;
esac
echo ""
echo -e "${BOLD}即将${action} HAPI CLI:${NC}"
echo -e " 版本: ${CYAN}v$REMOTE_VERSION${NC}"
echo -e " 来源: ${CYAN}$src_label${NC}"
echo -e " 目录: ${CYAN}$INSTALL_DIR${NC}"
echo ""
read -rp "确认${action}? [Y/n]: " confirm
if [[ "$confirm" =~ ^[Nn] ]]; then
info "已取消"
exit 0
fi
echo ""
fi
if [[ "$SELECTED_SOURCE" == "npm" ]]; then
install_nodejs || true
fi
@@ -1487,7 +1357,7 @@ run_quick_mode() {
github-fork) install_from_github "$GITHUB_FORK_REPO" ;;
esac
if [[ "$HAS_DOCKER" == true && "$SKIP_HUB" != true ]]; then
if [[ "$SKIP_HUB" != true ]]; then
setup_hub
if [[ "$IS_ROOT" == true ]]; then
setup_systemd
@@ -1501,7 +1371,8 @@ run_quick_mode() {
main() {
parse_args "$@"
: > "$LOG_FILE"
LOG_FILE="${XDG_CACHE_HOME:-$HOME/.cache}/hapi-install.log"
mkdir -p "$(dirname "$LOG_FILE")" 2>/dev/null || true
# 如果带有旧版参数,或是管道执行(curl | bash),进入快速模式
if [[ "$UPGRADE_ONLY" == true || "$FORCE" == true || -n "$SOURCE" || "$SKIP_HUB" == true || -n "$INSTALL_DIR_ARG" || ! -t 0 ]]; then