完善traefik设置

This commit is contained in:
jingrow 2025-08-08 02:06:39 +08:00
parent fb8aa13195
commit 2be062900e

View File

@ -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