fix: correct the one-click deployment script

This commit is contained in:
2025-06-28 12:56:30 +08:00
parent f6e4159889
commit 1cfa0b6e4c
+153 -112
View File
@@ -1,15 +1,16 @@
#!/bin/bash #!/bin/bash
# 前端一键部署脚本 # 前端远程部署脚本 - 本地构建版本
# 本地构建,远程部署,避免服务器环境依赖
# 服务器配置 # 服务器配置
SERVER_HOST="39.108.66.84" SERVER_HOST="120.79.214.48"
SERVER_USER="root" SERVER_USER="root"
SERVER_PASSWORD='Kola123!@#' SERVER_PASSWORD='Kola123!@#'
SERVER="$SERVER_USER@$SERVER_HOST" SERVER="$SERVER_USER@$SERVER_HOST"
SERVER_PATH="/www/wwwroot/leaser_front" SERVER_PATH="/www/wwwroot/leaser_front"
DIST_DIR="dist" DIST_DIR="dist"
FRONTEND_PORT="9501" # 默认端口,宝塔面板站点推荐使用9501 FRONTEND_PORT="9501"
# 检测是否安装了sshpass # 检测是否安装了sshpass
if command -v sshpass >/dev/null 2>&1; then if command -v sshpass >/dev/null 2>&1; then
@@ -29,10 +30,10 @@ RED='\033[0;31m'
YELLOW='\033[1;33m' YELLOW='\033[1;33m'
NC='\033[0m' NC='\033[0m'
log() { echo -e "${BLUE}[信息]${NC} $1"; } log() { echo -e "${BLUE}[INFO]${NC} $1"; }
success() { echo -e "${GREEN}[成功]${NC} $1"; } success() { echo -e "${GREEN}[SUCCESS]${NC} $1"; }
error() { echo -e "${RED}[错误]${NC} $1"; } error() { echo -e "${RED}[ERROR]${NC} $1"; }
warn() { echo -e "${YELLOW}[警告]${NC} $1"; } warn() { echo -e "${YELLOW}[WARNING]${NC} $1"; }
# SSH执行函数 # SSH执行函数
run_ssh() { run_ssh() {
@@ -70,120 +71,146 @@ show_password_hint() {
fi fi
} }
# 检查前端的端口配置 # 本地构建
check_frontend_port() { local_build() {
log "检查宝塔面板前端站点端口配置..." log "本地构建项目..."
# 第一种方法:直接查找站点配置
local port_info=$(run_ssh "grep -r 'leaser_front' /www/server/panel/vhost/nginx/ 2>/dev/null | grep -i listen | head -1 || echo 'No port info found'")
# 第二种方法:如果宝塔面板有站点配置表 # 检查本地环境
if [ "$port_info" = "No port info found" ]; then if ! command -v node >/dev/null 2>&1; then
port_info=$(run_ssh "if [ -f /www/server/panel/data/site.json ]; then cat /www/server/panel/data/site.json | grep -E '\"name\":\"leaser_front|\"port\":' | head -2; else echo 'No site config found'; fi") error "本地未安装 Node.js,请先安装"
return 1
fi fi
if [[ $port_info =~ listen[[:space:]]+([0-9]+) ]] || [[ $port_info =~ \"port\":\"?([0-9]+)\"? ]]; then if ! command -v pnpm >/dev/null 2>&1; then
FRONTEND_PORT=${BASH_REMATCH[1]} warn "本地未安装 pnpm,尝试安装..."
success "宝塔面板检测到前端站点端口: $FRONTEND_PORT" npm install -g pnpm || {
else error "pnpm 安装失败"
warn "未在宝塔面板中找到前端站点配置,将使用默认端口: $FRONTEND_PORT" return 1
warn "建议在宝塔面板创建一个新站点,站点目录为: $SERVER_PATH" }
fi fi
}
echo "========================================" log "Node版本: $(node -v)"
log "前端项目远程部署工具" log "pnpm版本: $(pnpm -v)"
echo "服务器: $SERVER"
echo "项目路径: $SERVER_PATH"
echo "========================================"
show_password_hint
echo ""
# 远程构建函数 # 清理本地构建目录
remote_build() { if [ -d "$DIST_DIR" ]; then
log "在服务器上进行构建..." log "清理本地构建目录..."
run_ssh "cd $SERVER_PATH && \ rm -rf "$DIST_DIR"
echo '检查Node环境和依赖...' && \ fi
node -v && npm -v && \
echo '检查并安装 pnpm...' && \
if ! command -v pnpm &>/dev/null; then \
echo '安装 pnpm...' && \
npm install -g pnpm; \
else \
echo 'pnpm已安装: ' && pnpm -v; \
fi && \
echo '安装项目依赖...' && \
pnpm install && \
echo '开始构建项目...' && \
NODE_ENV=production pnpm build && \
if [ -d '$DIST_DIR' ]; then \
echo '✅ 远程构建成功'; \
if [ -d 'backup_dist' ]; then rm -rf backup_dist; fi && \
mkdir -p backup_dist && \
find . -maxdepth 1 -not -path './node_modules*' -not -path './.git*' -not -path './$DIST_DIR*' -not -path './backup_dist*' -not -path '.' | xargs -I{} mv {} backup_dist/ 2>/dev/null || true && \
mv $DIST_DIR/* . && \
rmdir $DIST_DIR && \
echo '✅ 部署文件就位完成'; \
else \
echo '❌ 远程构建失败'; \
exit 1; \
fi"
if [ $? -eq 0 ]; then # 安装依赖
success "远程构建并部署成功" log "安装项目依赖..."
pnpm install || {
error "依赖安装失败"
return 1
}
# 构建项目
log "开始构建..."
NODE_ENV=production pnpm build || {
error "构建失败"
return 1
}
# 检查构建结果
if [ -d "$DIST_DIR" ] && [ "$(ls -A $DIST_DIR 2>/dev/null)" ]; then
success "✅ 本地构建成功"
log "构建文件数量: $(find $DIST_DIR -type f | wc -l)"
return 0 return 0
else else
error "远程构建失败" error "构建目录为空或不存在"
return 1 return 1
fi fi
} }
# 上传构建文件
upload_files() {
log "上传构建文件到服务器..."
if [ ! -d "$DIST_DIR" ]; then
error "本地构建目录不存在,请先执行构建"
return 1
fi
# 确保服务器dist目录存在并清理
run_ssh "mkdir -p $SERVER_PATH/$DIST_DIR && rm -rf $SERVER_PATH/$DIST_DIR/* 2>/dev/null || true"
# 上传到目标目录
run_scp "$DIST_DIR/" "$SERVER_PATH/$DIST_DIR/"
if [ $? -eq 0 ]; then
success "✅ 文件上传成功"
return 0
else
error "文件上传失败"
return 1
fi
}
# 检查部署结果
verify_deployment() {
log "检查部署结果..."
run_ssh "cd $SERVER_PATH/$DIST_DIR && if [ -f index.html ]; then echo '✅ index.html 部署成功'; file_count=\$(find . -type f -not -path '*/\.*' | wc -l); echo \"✅ 共部署 \$file_count 个文件\"; else echo '❌ 部署验证失败'; exit 1; fi"
}
# 检查前端端口配置
check_frontend_port() {
log "检查前端站点配置..."
local port_info=$(run_ssh "grep -r 'leaser_front' /www/server/panel/vhost/nginx/ 2>/dev/null | grep -i listen | head -1" 2>/dev/null || echo "")
if [[ $port_info =~ listen[[:space:]]+([0-9]+) ]]; then
FRONTEND_PORT=${BASH_REMATCH[1]}
success "检测到前端站点端口: $FRONTEND_PORT"
else
warn "未找到宝塔面板站点配置,使用默认端口: $FRONTEND_PORT"
warn "请在宝塔面板创建站点,目录指向: $SERVER_PATH/$DIST_DIR"
fi
}
echo "========================================"
log "前端远程部署工具 - 本地构建版本"
echo "服务器: $SERVER"
echo "项目路径: $SERVER_PATH"
echo "本地目录: $(pwd)"
echo "========================================"
show_password_hint
echo ""
case "${1:-deploy}" in case "${1:-deploy}" in
"test"|"t") "test"|"t")
log "测试服务器连接..." log "测试服务器连接..."
run_ssh "echo '✅ 连接成功'" run_ssh "echo '✅ 连接成功' && echo '服务器信息:' && uname -a"
;; ;;
"status"|"s") "status"|"s")
log "查看前端项目状态..." log "查看前端项目状态..."
run_ssh "cd $SERVER_PATH && echo '=== 文件统计 ===' && find . -type f -not -path '*/\.*' | grep -v 'node_modules' | wc -l && echo '=== 最新文件 ===' && find . -type f -not -path '*/\.*' | grep -v 'node_modules' | xargs ls -lt | head -5 && echo '=== Nginx状态 ===' && systemctl status nginx | grep Active || echo 'Nginx可能未安装'" run_ssh "cd $SERVER_PATH/$DIST_DIR && echo '=== 目录信息 ===' && pwd && ls -la | head -10 && echo '=== 文件统计 ===' && find . -type f -not -path '*/\.*' -not -path '*/node_modules*' | wc -l && echo '个文件' && echo '=== 最新文件 ===' && find . -maxdepth 1 -type f -not -path '*/\.*' | head -5 | xargs ls -la 2>/dev/null || echo '无文件'"
;; ;;
"logs"|"l") "logs"|"l")
log "查看Nginx访问日志..." log "查看Nginx访问日志..."
run_ssh "tail -f /var/log/nginx/access.log 2>/dev/null || echo '无法访问Nginx日志'" run_ssh "tail -20 /var/log/nginx/access.log 2>/dev/null || tail -20 /www/wwwlogs/access.log 2>/dev/null || echo '找不到Nginx访问日志'"
;; ;;
"check"|"c") "check"|"c")
log "检查前端部署情况..." log "检查前端部署情况..."
run_ssh "cd $SERVER_PATH && echo '=== 目录内容 ===' && ls -la | grep -v node_modules && echo '=== 文件大小 ===' && du -sh && echo '=== index.html检查 ===' && cat index.html 2>/dev/null | grep -i title | head -1 || echo '找不到index.html文件'" run_ssh "cd $SERVER_PATH/$DIST_DIR && echo '=== 关键文件检查 ===' && [ -f index.html ] && echo '✅ index.html 存在' || echo '❌ index.html 不存在' && echo '=== 静态资源检查 ===' && ls -la *.js *.css 2>/dev/null | head -3 || echo '无JS/CSS文件' && echo '=== 目录大小 ===' && du -sh . 2>/dev/null || echo '无法获取大小'"
;; ;;
"nginx") "nginx")
log "检查Nginx配置..." log "检查Nginx配置..."
run_ssh "cat /etc/nginx/sites-enabled/* 2>/dev/null || cat /etc/nginx/conf.d/* 2>/dev/null || cat /www/server/nginx/conf/nginx.conf 2>/dev/null || echo '找不到Nginx配置'" run_ssh "nginx -t 2>/dev/null && echo '✅ Nginx配置正确' || echo '❌ Nginx配置有误'"
check_frontend_port
;; ;;
"portconfig") "portconfig")
log "查询宝塔面板前端站点配置..."
run_ssh "echo '=== 宝塔站点配置文件 ===' && \
find /www/server/panel/vhost/nginx/ -name '*.conf' -exec ls -la {} \; 2>/dev/null && \
echo '=== 宝塔站点配置查询 ===' && \
grep -r 'leaser_front' /www/server/panel/vhost/nginx/ 2>/dev/null || echo '未在Nginx配置中找到前端站点配置' && \
echo '=== 宝塔站点列表 ===' && \
if [ -f /www/server/panel/data/site.json ]; then grep -E '\"name|\"path|\"port' /www/server/panel/data/site.json | head -15; else echo '未找到宝塔站点数据'; fi"
check_frontend_port check_frontend_port
;; ;;
"build"|"b") "build"|"b")
clean_local_build
local_build local_build
;; ;;
"pull"|"p")
log "拉取最新代码..."
run_ssh "cd $SERVER_PATH && (git pull 2>/dev/null || git pull https://kola:Cyne2012@\$(git config --get remote.origin.url | sed 's|https://||'))"
;;
"upload"|"u") "upload"|"u")
if [ -d "$DIST_DIR" ]; then if [ -d "$DIST_DIR" ]; then
upload_files upload_files
@@ -192,58 +219,72 @@ case "${1:-deploy}" in
fi fi
;; ;;
"pull"|"p")
log "拉取最新代码到服务器..."
run_ssh "cd $SERVER_PATH && (git pull 2>/dev/null || git pull https://kola:Cyne2012@\$(git config --get remote.origin.url | sed 's|https://||'))"
;;
"deploy"|"d"|"") "deploy"|"d"|"")
log "开始前端远程部署流程..." log "开始前端部署流程..."
echo "" echo ""
log "步骤 1/3: 拉取最新代码" log "步骤 1/3: 本地构建"
run_ssh "cd $SERVER_PATH && git pull || echo '拉取代码失败,请检查服务器Git配置'" if ! local_build; then
error "本地构建失败,部署终止"
log "步骤 2/3: 备份现有文件"
run_ssh "cd $SERVER_PATH && mkdir -p backup_$(date +%Y%m%d) && find . -maxdepth 1 -type f -not -path '*/\.git*' -not -path '*/node_modules*' -exec cp {} backup_$(date +%Y%m%d)/ \; 2>/dev/null || echo '没有需要备份的文件'"
log "步骤 3/3: 远程构建部署"
if remote_build; then
# 检查端口配置
check_frontend_port
success "🎉 部署流程完成!"
if [ "$FRONTEND_PORT" = "80" ]; then
echo "🌐 网站地址: http://$SERVER_HOST"
else
echo "🌐 网站地址: http://$SERVER_HOST:$FRONTEND_PORT"
fi
echo "📡 如果还没有在宝塔面板创建站点,请在宝塔面板中创建一个新站点,指向路径 $SERVER_PATH"
echo ""
log "执行状态检查..."
run_ssh "cd $SERVER_PATH && echo '=== 文件检查 ===' && ls -la | grep -v node_modules | head -10 && echo '=== index.html存在检查 ===' && [ -f index.html ] && echo '✅ index.html 存在' || echo '❌ index.html 不存在'"
else
error "部署失败"
exit 1 exit 1
fi fi
log "步骤 2/3: 上传文件"
if ! upload_files; then
error "文件上传失败,部署终止"
exit 1
fi
log "步骤 3/3: 检查部署结果"
verify_deployment
# 检查端口配置
check_frontend_port
# 清理本地构建文件
log "清理本地构建文件..."
rm -rf "$DIST_DIR"
success "🎉 部署完成!"
if [ "$FRONTEND_PORT" = "80" ]; then
echo "🌐 访问地址: http://$SERVER_HOST"
else
echo "🌐 访问地址: http://$SERVER_HOST:$FRONTEND_PORT"
fi
echo ""
warn "如果网站无法访问,请检查:"
echo " 1. 在宝塔面板中创建站点,目录指向: $SERVER_PATH"
echo " 2. 确保防火墙开放端口: $FRONTEND_PORT"
echo " 3. 检查域名解析是否正确"
;; ;;
"help"|"h"|"--help") "help"|"h"|"--help")
echo "前端项目远程部署工具" echo "前端远程部署工具 - 本地构建版本"
echo "" echo ""
echo "用法: $0 [命令]" echo "用法: $0 [命令]"
echo "" echo ""
echo "命令:" echo "命令:"
echo " deploy/d 完整部署流程(默认)" echo " deploy/d 完整部署流程(默认)"
echo " test/t 测试连接" echo " test/t 测试服务器连接"
echo " status/s 查看前端项目状态" echo " status/s 查看项目状态"
echo " check/c 检查前端部署情况" echo " check/c 检查部署情况"
echo " logs/l 查看Nginx访问日志" echo " logs/l 查看Nginx日志"
echo " nginx 查看Nginx配置" echo " nginx 检查Nginx配置"
echo " portconfig 检查宝塔面板站点配置" echo " portconfig 检查端口配置"
echo " build/b 仅本地构建项目" echo " build/b 仅本地构建"
echo " pull/p 仅拉取远程代码"
echo " upload/u 仅上传构建文件" echo " upload/u 仅上传构建文件"
echo " pull/p 拉取代码到服务器"
echo " help/h 显示帮助" echo " help/h 显示帮助"
;; ;;
*) *)
error "未知命令: $1" error "未知命令: $1"
echo "使用 'help' 查看可用命令" echo "使用 '$0 help' 查看可用命令"
exit 1 exit 1
;; ;;
esac esac