From 2be062900e8d2f8cb8c994bc581469b2aed958a1 Mon Sep 17 00:00:00 2001 From: jingrow Date: Fri, 8 Aug 2025 02:06:39 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=8C=E5=96=84traefik=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- install_jsite.sh | 403 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 330 insertions(+), 73 deletions(-) diff --git a/install_jsite.sh b/install_jsite.sh index 5f998ad..6bdf5bf 100755 --- a/install_jsite.sh +++ b/install_jsite.sh @@ -5,11 +5,11 @@ # # 后端调用示例: # 1. 基本部署: ./install_jsite.sh -# 2. 指定项目: ./install_jsite.sh -p myproject -r http://git.example.com/myproject +# 2. 指定项目: ./install_jsite.sh --site-name myproject -r http://git.example.com/myproject # 3. 跳过Docker: ./install_jsite.sh --skip-docker # 4. 跳过Traefik: ./install_jsite.sh --skip-traefik # 5. 强制更新: ./install_jsite.sh --force-update -# 6. 完整参数: ./install_jsite.sh -p myproject -r http://git.example.com/myproject -n 18 --skip-docker --force-update +# 6. 完整参数: ./install_jsite.sh --site-name myproject -r http://git.example.com/myproject -n 18 --skip-docker --force-update # # 返回码: # 0 - 成功 @@ -19,6 +19,12 @@ set -e # 遇到错误时退出 +# 设置非交互式环境变量,避免交互式配置 +export DEBIAN_FRONTEND=noninteractive +export DEBCONF_NONINTERACTIVE_SEEN=true +export UCF_FORCE_CONFNEW=1 +export UCF_FORCE_CONFOLD=1 + # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' @@ -27,7 +33,6 @@ BLUE='\033[0;34m' NC='\033[0m' # No Color # 默认参数 -PROJECT_NAME="jingrow" GIT_REPO="http://git.jingrow.com:3000/jsite/jingrow" NODE_VERSION="22" SKIP_DOCKER=false @@ -41,7 +46,7 @@ START_PORT=3001 PORT_INCREMENT=1 # .env文件参数 -SITE_URL="http://192.168.2.200:3001" +SITE_URL="starrbud.com" REVALIDATE_TOKEN="535bc122f3e364c" SITE_NAME="jingrow" SERVER_URL="https://admin.jingrow.com" @@ -53,7 +58,6 @@ show_help() { echo "用法: $0 [选项]" echo "" echo "选项:" - echo " -p, --project-name NAME 项目名称 (默认: jingrow)" echo " -r, --repo URL Git仓库地址" echo " -n, --node-version VERSION Node.js版本 (默认: 22)" echo " --skip-docker 跳过Docker安装" @@ -77,7 +81,7 @@ show_help() { echo " -h, --help 显示此帮助信息" echo "" echo "示例:" - echo " $0 -p myproject -r http://git.example.com/myproject" + echo " $0 --site-name myproject -r http://git.example.com/myproject" echo " $0 --skip-docker --skip-traefik" echo " $0 --force-update" echo " $0 --site-url http://example.com --site-name myproject" @@ -88,10 +92,6 @@ show_help() { parse_arguments() { while [[ $# -gt 0 ]]; do case $1 in - -p|--project-name) - PROJECT_NAME="$2" - shift 2 - ;; -r|--repo) GIT_REPO="$2" shift 2 @@ -264,27 +264,35 @@ install_pm2() { log_success "PM2安装完成" fi - # 设置PM2开机自启 + # 设置PM2开机自启(避免交互式输出) + log_info "配置PM2开机自启..." su - jingrow -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - pm2 startup + pm2 startup 2>/dev/null || true " log_success "PM2开机自启配置完成" } # 2.6. 端口管理函数 get_available_port() { - local project_name="$1" + local site_name="$1" local base_port="$START_PORT" local increment="$PORT_INCREMENT" + # 检查jq是否可用 + if ! command -v jq &> /dev/null; then + log_warning "jq命令不可用,使用默认端口 $base_port" + echo "$base_port" + return 0 + fi + # 检查项目是否已有分配的端口 local port_file="/home/jingrow/jsite/port_assignments.json" if [ -f "$port_file" ]; then # 如果项目已存在,返回已分配的端口 - local existing_port=$(jq -r ".$project_name // empty" "$port_file" 2>/dev/null || echo "") + local existing_port=$(jq -r ".$site_name // empty" "$port_file" 2>/dev/null || echo "") if [ -n "$existing_port" ] && [ "$existing_port" != "null" ] && [ "$existing_port" != "empty" ]; then echo "$existing_port" return 0 @@ -321,30 +329,36 @@ get_available_port() { # 2.7. 保存端口分配 save_port_assignment() { - local project_name="$1" + local site_name="$1" local port="$2" local port_file="/home/jingrow/jsite/port_assignments.json" + # 检查jq是否可用 + if ! command -v jq &> /dev/null; then + log_warning "jq命令不可用,跳过端口分配保存" + return 0 + fi + # 创建或更新端口分配文件 if [ -f "$port_file" ]; then # 更新现有文件 - jq ". + {\"$project_name\": $port}" "$port_file" > "${port_file}.tmp" && mv "${port_file}.tmp" "$port_file" + jq ". + {\"$site_name\": $port}" "$port_file" > "${port_file}.tmp" && mv "${port_file}.tmp" "$port_file" else # 创建新文件 - echo "{\"$project_name\": $port}" > "$port_file" + echo "{\"$site_name\": $port}" > "$port_file" fi # 设置文件权限 chown jingrow:jingrow "$port_file" chmod 644 "$port_file" - log_success "端口 $port 已分配给项目 $project_name" + log_success "端口 $port 已分配给项目 $site_name" } # 3. 克隆jsite项目 clone_jsite_project() { - log_info "开始克隆jsite项目: $PROJECT_NAME..." + log_info "开始克隆jsite项目: $SITE_NAME..." cd /home/jingrow @@ -356,38 +370,61 @@ clone_jsite_project() { fi # 检查项目子目录是否已存在 - if [ -d "/home/jingrow/jsite/$PROJECT_NAME" ]; then + if [ -d "/home/jingrow/jsite/$SITE_NAME" ]; then if [ "$FORCE_UPDATE" = true ]; then log_warning "项目目录已存在,强制更新..." - rm -rf "/home/jingrow/jsite/$PROJECT_NAME" + rm -rf "/home/jingrow/jsite/$SITE_NAME" cd /home/jingrow/jsite - su - jingrow -c "cd /home/jingrow/jsite && git clone $GIT_REPO $PROJECT_NAME" - log_success "jsite/$PROJECT_NAME项目更新完成" + su - jingrow -c "cd /home/jingrow/jsite && git clone $GIT_REPO $SITE_NAME" + if [ $? -ne 0 ]; then + log_error "项目克隆失败: $GIT_REPO" + return 1 + fi + log_success "jsite/$SITE_NAME项目更新完成" else - log_warning "jsite/$PROJECT_NAME目录已存在,跳过克隆" + log_warning "jsite/$SITE_NAME目录已存在,跳过克隆" fi else cd /home/jingrow/jsite - su - jingrow -c "cd /home/jingrow/jsite && git clone $GIT_REPO $PROJECT_NAME" - log_success "jsite/$PROJECT_NAME项目克隆完成" + log_info "克隆项目: $GIT_REPO" + su - jingrow -c "cd /home/jingrow/jsite && git clone $GIT_REPO $SITE_NAME" + if [ $? -ne 0 ]; then + log_error "项目克隆失败: $GIT_REPO" + return 1 + fi + log_success "jsite/$SITE_NAME项目克隆完成" fi + + # 检查项目是否成功克隆 + if [ ! -d "/home/jingrow/jsite/$SITE_NAME" ]; then + log_error "项目目录不存在,克隆可能失败" + return 1 + fi + + # 检查package.json是否存在 + if [ ! -f "/home/jingrow/jsite/$SITE_NAME/package.json" ]; then + log_error "package.json文件不存在,请检查项目是否正确克隆" + return 1 + fi + + log_success "项目克隆和验证完成" } # 4. 创建.env文件 create_env_file() { log_info "创建.env文件..." - cd /home/jingrow/jsite/$PROJECT_NAME + cd /home/jingrow/jsite/$SITE_NAME # 获取项目端口 - local project_port=$(get_available_port "$PROJECT_NAME") - save_port_assignment "$PROJECT_NAME" "$project_port" + local project_port=$(get_available_port "$SITE_NAME") + save_port_assignment "$SITE_NAME" "$project_port" # 更新SITE_URL以使用分配的端口 local site_url_with_port=$(echo "$SITE_URL" | sed "s|:[0-9]*|:$project_port|") # 检查.env文件是否已存在 - if [ -f "/home/jingrow/jsite/$PROJECT_NAME/.env" ]; then + if [ -f "/home/jingrow/jsite/$SITE_NAME/.env" ]; then if [ "$FORCE_UPDATE" = true ]; then log_warning ".env文件已存在,强制更新..." else @@ -397,7 +434,7 @@ create_env_file() { fi # 创建.env文件 - cat > "/home/jingrow/jsite/$PROJECT_NAME/.env" << EOF + cat > "/home/jingrow/jsite/$SITE_NAME/.env" << EOF PUBLIC_SITE_URL=$site_url_with_port REVALIDATE_TOKEN=$REVALIDATE_TOKEN @@ -413,8 +450,8 @@ PORT=$project_port EOF # 设置文件权限 - chown jingrow:jingrow "/home/jingrow/jsite/$PROJECT_NAME/.env" - chmod 600 "/home/jingrow/jsite/$PROJECT_NAME/.env" + chown jingrow:jingrow "/home/jingrow/jsite/$SITE_NAME/.env" + chmod 600 "/home/jingrow/jsite/$SITE_NAME/.env" log_success ".env文件创建完成 (端口: $project_port)" } @@ -423,22 +460,34 @@ EOF create_pm2_config() { log_info "创建PM2配置文件..." - cd /home/jingrow/jsite/$PROJECT_NAME + cd /home/jingrow/jsite/$SITE_NAME # 获取项目端口 - local project_port=$(get_available_port "$PROJECT_NAME") + local project_port=$(get_available_port "$SITE_NAME") # 创建logs目录 - mkdir -p "/home/jingrow/jsite/$PROJECT_NAME/logs" + mkdir -p "/home/jingrow/jsite/$SITE_NAME/logs" + + # 检查package.json中的scripts + local start_script="npm start" + if [ -f "/home/jingrow/jsite/$SITE_NAME/package.json" ]; then + if grep -q '"start"' "/home/jingrow/jsite/$SITE_NAME/package.json"; then + start_script="npm start" + elif grep -q '"dev"' "/home/jingrow/jsite/$SITE_NAME/package.json"; then + start_script="npm run dev" + else + log_warning "未找到start或dev脚本,使用默认npm start" + fi + fi # 创建ecosystem.config.js文件 - cat > "/home/jingrow/jsite/$PROJECT_NAME/ecosystem.config.js" << EOF + cat > "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.js" << EOF module.exports = { apps: [{ - name: '$PROJECT_NAME', + name: '$SITE_NAME', script: 'npm', args: 'start', - cwd: '/home/jingrow/jsite/$PROJECT_NAME', + cwd: '/home/jingrow/jsite/$SITE_NAME', instances: 1, autorestart: true, watch: false, @@ -453,29 +502,49 @@ module.exports = { error_file: './logs/error.log', log_date_format: 'YYYY-MM-DD HH:mm:ss Z', merge_logs: true, - time: true + time: true, + min_uptime: '10s', + max_restarts: 5 }] }; EOF # 设置文件权限 - chown -R jingrow:jingrow "/home/jingrow/jsite/$PROJECT_NAME/ecosystem.config.js" - chown -R jingrow:jingrow "/home/jingrow/jsite/$PROJECT_NAME/logs" + chown -R jingrow:jingrow "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.js" + chown -R jingrow:jingrow "/home/jingrow/jsite/$SITE_NAME/logs" - log_success "PM2配置文件创建完成 (端口: $project_port)" + log_success "PM2配置文件创建完成 (端口: $project_port, 启动脚本: $start_script)" } # 4.6. 用PM2启动项目 start_project_with_pm2() { - log_info "使用PM2启动项目: $PROJECT_NAME..." + log_info "使用PM2启动项目: $SITE_NAME..." - cd /home/jingrow/jsite/$PROJECT_NAME + cd /home/jingrow/jsite/$SITE_NAME + + # 检查项目目录是否存在 + if [ ! -d "/home/jingrow/jsite/$SITE_NAME" ]; then + log_error "项目目录不存在: /home/jingrow/jsite/$SITE_NAME" + return 1 + fi + + # 检查package.json是否存在 + if [ ! -f "/home/jingrow/jsite/$SITE_NAME/package.json" ]; then + log_error "package.json文件不存在,请检查项目是否正确克隆" + return 1 + fi + + # 检查ecosystem.config.js是否存在 + if [ ! -f "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.js" ]; then + log_error "ecosystem.config.js文件不存在,请检查PM2配置是否正确创建" + return 1 + fi # 检查项目是否已经在PM2中运行 PM2_STATUS=$(su - jingrow -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - pm2 list | grep -c '$PROJECT_NAME' || echo '0' + pm2 list | grep -c '$SITE_NAME' || echo '0' ") if [ "$PM2_STATUS" != "0" ]; then @@ -484,21 +553,69 @@ start_project_with_pm2() { su - jingrow -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - cd /home/jingrow/jsite/$PROJECT_NAME - pm2 delete $PROJECT_NAME 2>/dev/null || true + cd /home/jingrow/jsite/$SITE_NAME + pm2 delete $SITE_NAME 2>/dev/null || true pm2 start ecosystem.config.js " + if [ $? -ne 0 ]; then + log_error "PM2启动失败,请检查项目配置和依赖" + log_info "检查PM2日志:" + su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + pm2 logs $SITE_NAME --lines 10 + " + return 1 + fi else log_warning "项目已在PM2中运行,跳过启动" - return + return 0 fi else + log_info "启动新项目..." su - jingrow -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - cd /home/jingrow/jsite/$PROJECT_NAME + cd /home/jingrow/jsite/$SITE_NAME pm2 start ecosystem.config.js " + if [ $? -ne 0 ]; then + log_error "PM2启动失败,请检查项目配置和依赖" + log_info "检查PM2日志:" + su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + pm2 logs $SITE_NAME --lines 10 + " + return 1 + fi + fi + + # 等待一下让PM2启动完成 + sleep 5 + + # 检查PM2进程是否真的启动了 + PM2_RUNNING=$(su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + pm2 list | grep -c '$SITE_NAME.*online' || echo '0' + ") + + if [ "$PM2_RUNNING" = "0" ]; then + log_error "PM2启动失败,项目未正常运行" + log_info "检查PM2状态:" + su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + pm2 list + " + log_info "检查PM2日志:" + su - jingrow -c " + export NVM_DIR=\"\$HOME/.nvm\" + [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" + pm2 logs $SITE_NAME --lines 20 + " + return 1 fi # 保存PM2配置 @@ -554,14 +671,18 @@ install_docker() { else log_info "开始安装Docker..." + # 设置非交互式环境 + export DEBIAN_FRONTEND=noninteractive + export DEBCONF_NONINTERACTIVE_SEEN=true + # 更新包索引 apt-get update - # 安装必要的包 - apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release + # 安装必要的包(避免交互式配置) + apt-get install -y --force-yes apt-transport-https ca-certificates curl gnupg lsb-release - # 添加Docker官方GPG密钥 - curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg + # 添加Docker官方GPG密钥(非交互式) + curl -fsSL https://download.docker.com/linux/ubuntu/gpg | gpg --batch --yes --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo "deb [arch=amd64 signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null @@ -569,8 +690,8 @@ install_docker() { # 更新包索引 apt-get update - # 安装Docker Engine - apt-get install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin + # 安装Docker Engine(避免交互式配置) + apt-get install -y --force-yes docker-ce docker-ce-cli containerd.io docker-compose-plugin # 启动Docker服务 systemctl start docker @@ -602,19 +723,132 @@ start_traefik() { log_success "traefik服务启动完成" } +# 7.4. 解析SITE_URL并生成Host规则 +generate_host_rule() { + local site_url="$1" + + # 移除协议前缀(如果存在) + local domain=$(echo "$site_url" | sed -E 's|^https?://||') + + # 移除端口号(如果存在) + domain=$(echo "$domain" | sed -E 's|:[0-9]+$||') + + # 检查是否为一级域名(不包含子域名) + if [[ "$domain" =~ ^[^.]+\.[^.]+$ ]]; then + # 一级域名,添加 www 前缀 + echo "Host(\`$domain\`) || Host(\`www.$domain\`)" + else + # 二级或更多级域名,只使用原域名 + echo "Host(\`$domain\`)" + fi +} + +# 7.5. 创建traefik网站配置文件 +create_traefik_website_config() { + log_info "创建traefik网站配置文件..." + + # 获取项目端口 + local project_port=$(get_available_port "$SITE_NAME") + + # 生成Host规则 + local host_rule=$(generate_host_rule "$SITE_URL") + + # 创建conf.d/website目录(如果不存在) + local website_dir="/home/jingrow/traefik-docker/conf.d/website" + if [ ! -d "$website_dir" ]; then + mkdir -p "$website_dir" + chown jingrow:jingrow "$website_dir" + log_success "创建traefik website配置目录" + fi + + # 创建网站配置文件 + local config_file="$website_dir/$SITE_NAME.yml" + + # 检查配置文件是否已存在 + if [ -f "$config_file" ]; then + if [ "$FORCE_UPDATE" = true ]; then + log_warning "traefik网站配置文件已存在,强制更新..." + else + log_warning "traefik网站配置文件已存在,跳过创建" + return + fi + fi + + # 创建网站配置文件 + cat > "$config_file" << EOF +# $SITE_NAME 网站配置 +http: + routers: + main-https: + rule: &host_rule $host_rule + entryPoints: + - websecure + service: main-service + tls: + certResolver: myresolver + + main-http-redirect: + rule: *host_rule + entryPoints: + - web + middlewares: + - redirect-to-https + service: noop + + services: + main-service: + loadBalancer: + servers: + - url: "http://localhost:$project_port" + noop: + loadBalancer: + servers: + - url: "http://127.0.0.1:65535" # 占位用,无实际后端,仅用于HTTP跳转 + + middlewares: + redirect-to-https: + redirectScheme: + scheme: https + permanent: true +EOF + + # 设置文件权限 + chown jingrow:jingrow "$config_file" + chmod 644 "$config_file" + + log_success "traefik网站配置文件创建完成: $config_file (端口: $project_port)" + log_info "Host规则: $host_rule" + + # 重启traefik以加载新配置 + log_info "重启traefik以加载新配置..." + su - jingrow -c "cd /home/jingrow/traefik-docker && docker compose restart" + log_success "traefik重启完成" +} + # 8. 安装项目依赖 install_project_dependencies() { - log_info "安装jsite/$PROJECT_NAME项目依赖..." + log_info "安装jsite/$SITE_NAME项目依赖..." - cd /home/jingrow/jsite/$PROJECT_NAME + cd /home/jingrow/jsite/$SITE_NAME + + # 检查package.json是否存在 + if [ ! -f "/home/jingrow/jsite/$SITE_NAME/package.json" ]; then + log_error "package.json文件不存在,请检查项目是否正确克隆" + return 1 + fi su - jingrow -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" - cd /home/jingrow/jsite/$PROJECT_NAME + cd /home/jingrow/jsite/$SITE_NAME npm install " + if [ $? -ne 0 ]; then + log_error "项目依赖安装失败" + return 1 + fi + log_success "项目依赖安装完成" } @@ -625,12 +859,13 @@ show_deployment_info() { log_info "部署信息:" echo " - 用户: jingrow" echo " - jsite目录: /home/jingrow/jsite" - echo " - 项目目录: /home/jingrow/jsite/$PROJECT_NAME" - echo " - 项目端口: $(get_available_port "$PROJECT_NAME")" + echo " - 项目目录: /home/jingrow/jsite/$SITE_NAME" + echo " - 项目端口: $(get_available_port "$SITE_NAME")" echo " - Traefik目录: /home/jingrow/traefik-docker" echo " - Traefik管理界面: http://localhost:8080" - echo " - PM2配置文件: /home/jingrow/jsite/$PROJECT_NAME/ecosystem.config.js" - echo " - PM2日志目录: /home/jingrow/jsite/$PROJECT_NAME/logs" + echo " - Traefik网站配置: /home/jingrow/traefik-docker/conf.d/website/$SITE_NAME.yml" + echo " - PM2配置文件: /home/jingrow/jsite/$SITE_NAME/ecosystem.config.js" + echo " - PM2日志目录: /home/jingrow/jsite/$SITE_NAME/logs" echo "" log_info ".env文件配置:" echo " - PUBLIC_SITE_URL: $SITE_URL" @@ -642,18 +877,24 @@ show_deployment_info() { echo "" log_info "PM2管理命令:" echo " - 查看状态: pm2 list" - echo " - 查看日志: pm2 logs $PROJECT_NAME" - echo " - 重启项目: pm2 restart $PROJECT_NAME" - echo " - 停止项目: pm2 stop $PROJECT_NAME" - echo " - 删除项目: pm2 delete $PROJECT_NAME" + echo " - 查看日志: pm2 logs $SITE_NAME" + echo " - 重启项目: pm2 restart $SITE_NAME" + echo " - 停止项目: pm2 stop $SITE_NAME" + echo " - 删除项目: pm2 delete $SITE_NAME" echo " - 监控界面: pm2 monit" echo "" + log_info "Traefik配置信息:" + echo " - 网站配置文件: /home/jingrow/traefik-docker/conf.d/website/$SITE_NAME.yml" + echo " - 访问域名: $(generate_host_rule "$SITE_URL" | sed 's/Host(`//g' | sed 's/`)//g' | sed 's/ || / 或 /g')" + echo " - 后端端口: $(get_available_port "$SITE_NAME")" + echo "" log_info "下一步操作:" - echo " 1. 进入项目目录: cd /home/jingrow/jsite/$PROJECT_NAME" + echo " 1. 进入项目目录: cd /home/jingrow/jsite/$SITE_NAME" echo " 2. 查看PM2状态: pm2 list" - echo " 3. 查看项目日志: pm2 logs $PROJECT_NAME" + echo " 3. 查看项目日志: pm2 logs $SITE_NAME" echo " 4. 访问Traefik管理界面: http://localhost:8080" echo " 5. 访问项目: $SITE_URL" + echo " 6. 检查traefik配置: cat /home/jingrow/traefik-docker/conf.d/website/$SITE_NAME.yml" echo "" log_warning "注意:请确保防火墙允许80、443、8080端口访问" } @@ -663,7 +904,7 @@ main() { log_info "开始jsite前端自动化部署..." echo "" log_info "部署参数:" - echo " - 项目名称: $PROJECT_NAME" + echo " - 项目名称: $SITE_NAME" echo " - Git仓库: $GIT_REPO" echo " - Node.js版本: $NODE_VERSION" echo " - 跳过Docker: $SKIP_DOCKER" @@ -702,18 +943,33 @@ main() { log_warning "跳过PM2安装" fi - clone_jsite_project + if ! clone_jsite_project; then + log_error "项目克隆失败,部署终止" + exit 1 + fi + create_env_file if [ "$SKIP_DEPENDENCIES" = false ]; then - install_project_dependencies + if ! install_project_dependencies; then + log_error "项目依赖安装失败,部署终止" + exit 1 + fi else log_warning "跳过项目依赖安装" fi if [ "$SKIP_PM2" = false ]; then create_pm2_config - start_project_with_pm2 + if ! start_project_with_pm2; then + log_error "PM2启动失败,部署终止" + log_info "请检查以下内容:" + log_info "1. 项目依赖是否正确安装" + log_info "2. package.json中是否有start脚本" + log_info "3. 项目端口是否被占用" + log_info "4. 查看PM2日志: pm2 logs $SITE_NAME" + exit 1 + fi else log_warning "跳过PM2配置和启动" fi @@ -721,6 +977,7 @@ main() { if [ "$SKIP_TRAEFIK" = false ]; then install_traefik start_traefik + create_traefik_website_config else log_warning "跳过Traefik安装和启动" fi