Files
Henry_Du 4ce4649aaf
Build VoiceHub FPK / build-fpk (push) Failing after 56m5s
Build and Push Docker Image / build-and-push (push) Canceled after 1h9m35s
初次提交
2026-09-06 08:19:02 +08:00

239 lines
6.1 KiB
Bash

#!/bin/bash
# 确保以 bash 运行
if [ -z "$BASH_VERSION" ]; then
exec bash "$0" "$@"
fi
# VoiceHub 更新脚本
# 用于更新已部署的 VoiceHub 项目
set -e
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color
# 默认安装目录
PROJECT_DIR="/opt/voicehub"
ensure_pnpm() {
export PNPM_HOME="${PNPM_HOME:-$HOME/.local/share/pnpm}"
export COREPACK_ENABLE_DOWNLOAD_PROMPT=0
mkdir -p "$PNPM_HOME"
export PATH="$PNPM_HOME:$PATH"
if ! command -v corepack &> /dev/null; then
npm install -g corepack
hash -r
fi
corepack enable
local package_manager=""
if [[ -f "$PROJECT_DIR/package.json" ]]; then
package_manager=$(node -p "try { JSON.parse(require('fs').readFileSync('$PROJECT_DIR/package.json', 'utf8')).packageManager || '' } catch { '' }")
fi
if [[ -n "$package_manager" ]]; then
corepack prepare "$package_manager" --activate
fi
hash -r
if ! command -v pnpm &> /dev/null; then
echo -e "${RED}错误: pnpm 不可用${NC}"
exit 1
fi
}
has_working_pm2() {
local pm2_root
local pm2_bin
pm2_root=$(pnpm root -g 2>/dev/null || true)
pm2_bin="$pm2_root/pm2/bin/pm2"
if [[ -f "$pm2_bin" ]]; then
node "$pm2_bin" -v > /dev/null 2>&1
return $?
fi
if command -v pm2 &> /dev/null; then
pm2 -v > /dev/null 2>&1
return $?
fi
return 1
}
run_pm2() {
local pm2_root
local pm2_bin
pm2_root=$(pnpm root -g 2>/dev/null || true)
pm2_bin="$pm2_root/pm2/bin/pm2"
if [[ -f "$pm2_bin" ]]; then
node "$pm2_bin" "$@"
return $?
fi
if command -v pm2 &> /dev/null; then
pm2 "$@"
return $?
fi
echo -e "${RED}错误: PM2 不可用,请重新运行部署脚本修复 PM2${NC}"
return 1
}
# 检测服务管理器类型
detect_service_manager() {
if [[ -f "$PROJECT_DIR/ecosystem.config.cjs" || -f "$PROJECT_DIR/ecosystem.config.js" ]]; then
echo "pm2"
elif [[ -f "/etc/systemd/system/voicehub.service" ]]; then
echo "systemd"
else
echo "none"
fi
}
echo -e "${BLUE}========================================${NC}"
echo -e "${BLUE} VoiceHub 更新脚本${NC}"
echo -e "${BLUE}========================================${NC}"
echo ""
# ============================================
# 步骤 1: 检查项目目录
# ============================================
echo -e "${YELLOW}[1/6] 检查项目目录...${NC}"
if [[ -d "$PROJECT_DIR" ]]; then
echo -e "${GREEN}✓ 项目目录存在: $PROJECT_DIR${NC}"
else
echo -e "${RED}错误: 项目目录不存在: $PROJECT_DIR${NC}"
echo -e "${RED}请先运行部署脚本安装 VoiceHub${NC}"
exit 1
fi
cd "$PROJECT_DIR"
echo ""
# ============================================
# 步骤 2: Git Pull 更新代码
# ============================================
echo -e "${YELLOW}[2/6] 更新代码...${NC}"
echo -e "执行: git fetch && git reset --hard origin/main"
echo ""
git stash
git pull origin main
# 恢复脚本执行权限
if [[ -f "$PROJECT_DIR/sh/main.sh" ]]; then
chmod +x "$PROJECT_DIR/sh/main.sh"
fi
if [[ -f "$PROJECT_DIR/sh/update.sh" ]]; then
chmod +x "$PROJECT_DIR/sh/update.sh"
fi
echo -e "${GREEN}✓ 代码更新完成${NC}"
echo ""
ensure_pnpm
# ============================================
# 步骤 3: pnpm install 更新依赖
# ============================================
echo -e "${YELLOW}[3/6] 更新依赖...${NC}"
echo -e "执行: pnpm install --frozen-lockfile"
echo ""
pnpm install --frozen-lockfile || pnpm install
echo -e "${GREEN}✓ 依赖更新完成${NC}"
echo ""
# ============================================
# 步骤 4: 重新部署
# ============================================
echo -e "${YELLOW}[4/6] 重新部署项目...${NC}"
echo -e "执行: pnpm run deploy"
echo ""
# 尝试执行 pnpm run deploy (包含数据库迁移、管理员创建、构建)
if pnpm run deploy; then
echo -e "${GREEN}✓ 部署更新脚本执行成功${NC}"
else
echo -e "${RED}部署更新脚本执行失败,尝试仅执行构建...${NC}"
echo -e "${YELLOW}注意: 数据库迁移可能未完成,请检查日志${NC}"
pnpm run build
fi
echo -e "${GREEN}✓ 项目更新构建完成${NC}"
echo ""
# ============================================
# 步骤 5: 重启服务
# ============================================
echo -e "${YELLOW}[5/6] 重启服务...${NC}"
echo ""
service_type=$(detect_service_manager)
if [[ "$service_type" == "pm2" ]]; then
echo -e "${BLUE}检测到 PM2 服务,正在重启...${NC}"
run_pm2 restart voicehub
echo -e "${GREEN}✓ PM2 服务已重启${NC}"
elif [[ "$service_type" == "systemd" ]]; then
echo -e "${BLUE}检测到 systemctl 服务,正在重启...${NC}"
sudo systemctl restart voicehub
echo -e "${GREEN}✓ systemctl 服务已重启${NC}"
else
echo -e "${YELLOW}⚠ 未检测到服务配置${NC}"
echo -e "${YELLOW}请先运行部署脚本配置服务${NC}"
fi
echo ""
# ============================================
# 步骤 6: 显示状态
# ============================================
echo -e "${YELLOW}[6/6] 服务状态...${NC}"
echo ""
if [[ "$service_type" == "pm2" ]]; then
if has_working_pm2; then
run_pm2 list | grep voicehub
else
echo -e "${YELLOW}PM2 命令异常,请重新运行部署脚本修复 PM2${NC}"
fi
elif [[ "$service_type" == "systemd" ]]; then
sudo systemctl status voicehub
else
echo -e "${YELLOW}未检测到服务配置${NC}"
fi
echo ""
# ============================================
# 更新完成
# ============================================
echo -e "${GREEN}========================================${NC}"
echo -e "${GREEN} 更新完成!${NC}"
echo -e "${GREEN}========================================${NC}"
echo ""
echo -e "${BLUE}项目目录: $PROJECT_DIR${NC}"
echo ""
echo -e "${YELLOW}提示: 如需查看日志,请运行:${NC}"
if has_working_pm2; then
echo -e "${YELLOW} pm2 logs voicehub${NC}"
else
echo -e "${YELLOW} sudo journalctl -u voicehub -f${NC}"
fi
echo ""