完善traefik设置
This commit is contained in:
parent
fb8aa13195
commit
2be062900e
403
install_jsite.sh
403
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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user