重命名前端项目目录:web-flowith -> web

- 将前端项目目录从 web-flowith 重命名为 web,使目录结构更简洁
- 保持所有前端代码和配置文件不变
- 统一项目目录命名规范
This commit is contained in:
2025-07-24 22:20:19 +08:00
parent ca42a7d9a4
commit bbe8fcd776
57 changed files with 0 additions and 0 deletions
+344
View File
@@ -0,0 +1,344 @@
#!/bin/bash
# 情感博物馆前端部署脚本
# 作者: emotion-museum
# 日期: 2025-07-18
# 支持Jenkins CI/CD部署
set -e
# 配置变量 - 支持Jenkins环境变量覆盖
REMOTE_HOST="${DEPLOY_HOST:-'root@47.111.10.27'}"
REMOTE_WEB_DIR="${REMOTE_WEB_DIR:-/data/www/emotion-museum}"
FRONTEND_DIR="web-flowith"
PROJECT_NAME="emotion-museum-frontend"
# Jenkins构建信息
BUILD_NUMBER="${BUILD_NUMBER:-manual}"
JOB_NAME="${JOB_NAME:-local-deploy}"
BUILD_URL="${BUILD_URL:-}"
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
# 日志函数
log_info() {
echo -e "${BLUE}[INFO]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_success() {
echo -e "${GREEN}[SUCCESS]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_warning() {
echo -e "${YELLOW}[WARNING]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
log_error() {
echo -e "${RED}[ERROR]${NC} $(date '+%Y-%m-%d %H:%M:%S') - $1"
}
# 检查远程服务器连接
check_remote_connection() {
log_info "检查远程服务器连接..."
if ssh -o ConnectTimeout=10 'root@47.111.10.27' "echo 'Connection successful'" > /dev/null 2>&1; then
log_success "远程服务器连接正常"
return 0
else
log_error "无法连接到远程服务器 'root@47.111.10.27'"
return 1
fi
}
# 检查本地环境
check_local_environment() {
log_info "检查本地构建环境..."
# 检查Node.js
if ! command -v node &> /dev/null; then
log_error "Node.js 未安装"
return 1
fi
# 检查npm
if ! command -v npm &> /dev/null; then
log_error "npm 未安装"
return 1
fi
log_info "Node.js 版本: $(node --version)"
log_info "npm 版本: $(npm --version)"
log_success "本地环境检查通过"
return 0
}
# 安装依赖
install_dependencies() {
log_info "安装前端依赖..."
if [ -f "package-lock.json" ]; then
npm ci --silent
else
npm install --silent
fi
log_success "依赖安装完成"
}
# 构建前端项目
build_frontend() {
log_info "构建前端项目..."
# 设置生产环境变量
export NODE_ENV=production
export VITE_API_BASE_URL=http://47.111.10.27:19000
# 执行构建
if npm run build; then
log_success "前端项目构建成功"
# 检查构建产物
if [ -d "dist" ]; then
local dist_size=$(du -sh dist | cut -f1)
log_info "构建产物大小: $dist_size"
log_info "构建产物文件:"
ls -la dist/ | head -10
else
log_error "构建产物目录不存在"
return 1
fi
else
log_error "前端项目构建失败"
return 1
fi
}
# 创建远程目录
create_remote_directories() {
log_info "创建远程目录结构..."
ssh 'root@47.111.10.27' "
mkdir -p $REMOTE_WEB_DIR
mkdir -p $REMOTE_WEB_DIR/backup
mkdir -p /data/logs/nginx
"
log_success "远程目录创建完成"
}
# 备份旧版本
backup_old_version() {
log_info "备份旧版本..."
local backup_name="backup_$(date +%Y%m%d_%H%M%S)"
ssh 'root@47.111.10.27' "
if [ -d '$REMOTE_WEB_DIR/$FRONTEND_DIR' ]; then
mv '$REMOTE_WEB_DIR/$FRONTEND_DIR' '$REMOTE_WEB_DIR/backup/$backup_name'
echo '旧版本已备份到: $REMOTE_WEB_DIR/backup/$backup_name'
# 只保留最近5个备份
cd '$REMOTE_WEB_DIR/backup'
ls -t | tail -n +6 | xargs -r rm -rf
else
echo '没有发现旧版本,跳过备份'
fi
"
log_success "备份完成"
}
# 部署前端文件
deploy_frontend() {
log_info "部署前端文件到远程服务器..."
# 上传构建产物
if scp -r dist/ 'root@47.111.10.27':$REMOTE_WEB_DIR/$FRONTEND_DIR/; then
log_success "前端文件上传成功"
else
log_error "前端文件上传失败"
return 1
fi
# 设置文件权限
ssh 'root@47.111.10.27' "
chown -R www-data:www-data '$REMOTE_WEB_DIR/$FRONTEND_DIR' 2>/dev/null || true
chmod -R 755 '$REMOTE_WEB_DIR/$FRONTEND_DIR'
"
log_success "文件权限设置完成"
}
# 配置Nginx
configure_nginx() {
log_info "配置Nginx..."
# 创建Nginx配置
ssh 'root@47.111.10.27' "cat > /etc/nginx/sites-available/emotion-museum << 'EOF'
server {
listen 80;
server_name 47.111.10.27;
# 前端静态文件
location /emotion-museum {
alias $REMOTE_WEB_DIR/$FRONTEND_DIR;
index index.html;
try_files \$uri \$uri/ /emotion-museum/index.html;
# 静态资源缓存
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
expires 1y;
add_header Cache-Control \"public, immutable\";
}
# HTML文件不缓存
location ~* \.html$ {
expires -1;
add_header Cache-Control \"no-cache, no-store, must-revalidate\";
}
}
# API代理到后端网关
location /api/ {
proxy_pass http://127.0.0.1:19000/;
proxy_set_header Host \$host;
proxy_set_header X-Real-IP \$remote_addr;
proxy_set_header X-Forwarded-For \$proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto \$scheme;
# WebSocket支持
proxy_http_version 1.1;
proxy_set_header Upgrade \$http_upgrade;
proxy_set_header Connection \"upgrade\";
}
# 日志配置
access_log /data/logs/nginx/emotion-museum-access.log;
error_log /data/logs/nginx/emotion-museum-error.log;
}
EOF"
# 启用站点
ssh 'root@47.111.10.27' "
ln -sf /etc/nginx/sites-available/emotion-museum /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
" 2>/dev/null || log_warning "Nginx配置可能需要手动检查"
log_success "Nginx配置完成"
}
# 健康检查
health_check() {
log_info "执行健康检查..."
sleep 3
# 检查前端页面
if curl -f -s "http://47.111.10.27/emotion-museum/" > /dev/null 2>&1; then
log_success "前端页面访问正常"
else
log_warning "前端页面访问异常,请检查Nginx配置"
fi
# 检查API代理
if curl -f -s "http://47.111.10.27/api/user/health" > /dev/null 2>&1; then
log_success "API代理正常"
else
log_warning "API代理异常,请检查后端服务状态"
fi
}
# 显示部署报告
show_deployment_report() {
local total_time=$1
echo ""
echo "========================================"
echo " 前端部署完成报告"
echo "========================================"
echo "项目名称: $PROJECT_NAME"
echo "目标服务器: $REMOTE_HOST"
echo "部署路径: $REMOTE_WEB_DIR/$FRONTEND_DIR"
echo "部署时间: $(date '+%Y-%m-%d %H:%M:%S')"
echo "总耗时: ${total_time}s"
if [ "$BUILD_NUMBER" != "manual" ]; then
echo "Jenkins构建: #$BUILD_NUMBER"
echo "Jenkins任务: $JOB_NAME"
[ -n "$BUILD_URL" ] && echo "构建链接: $BUILD_URL"
fi
echo "========================================"
echo ""
echo "🌐 访问地址:"
echo " 前端页面: http://47.111.10.27/emotion-museum/"
echo " API接口: http://47.111.10.27/api/"
echo ""
echo "📁 远程文件信息:"
ssh 'root@47.111.10.27' "
echo '部署目录大小:'
du -sh '$REMOTE_WEB_DIR/$FRONTEND_DIR' 2>/dev/null || echo '无法获取目录大小'
echo ''
echo '主要文件:'
ls -la '$REMOTE_WEB_DIR/$FRONTEND_DIR' 2>/dev/null | head -10 || echo '无法列出文件'
"
echo ""
echo "========================================"
echo "🎉 前端部署完成!"
}
# 主函数
main() {
local start_time=$(date +%s)
log_info "🚀 开始前端部署..."
log_info "目标服务器: $REMOTE_HOST"
log_info "部署路径: $REMOTE_WEB_DIR/$FRONTEND_DIR"
# 检查环境
if ! check_local_environment; then
log_error "本地环境检查失败"
exit 1
fi
if ! check_remote_connection; then
log_error "远程服务器连接失败"
exit 1
fi
# 安装依赖
install_dependencies
# 构建项目
build_frontend
# 创建远程目录
create_remote_directories
# 备份旧版本
backup_old_version
# 部署文件
deploy_frontend
# 配置Nginx
configure_nginx
# 健康检查
health_check
# 计算总耗时
local end_time=$(date +%s)
local total_time=$((end_time - start_time))
# 显示报告
show_deployment_report $total_time
log_success "🎉 前端部署完成!"
}
# 执行主函数
main "$@"