Compare commits

..

2 Commits

View File

@ -447,9 +447,9 @@ get_or_assign_port() {
fi
fi
# 如果没有保存过,则保存端口分配
# 如果没有保存过,则保存端口分配(重定向日志输出)
if [ "$already_saved" = false ]; then
save_port_assignment "$site_name" "$port"
save_port_assignment "$site_name" "$port" >/dev/null 2>&1
fi
echo "$port"
@ -542,8 +542,8 @@ create_env_file() {
# 获取项目端口
local project_port=$(get_or_assign_port "$SITE_NAME")
# 更新SITE_URL以使用分配的端口
local site_url_with_port=$(echo "$SITE_URL" | sed "s|:[0-9]*|:$project_port|")
# 构建本地地址URL用于PUBLIC_SITE_URL
local public_site_url="http://127.0.0.1:$project_port"
# 检查.env文件是否已存在
if [ -f "/home/jingrow/jsite/$SITE_NAME/.env" ]; then
@ -557,7 +557,7 @@ create_env_file() {
# 创建.env文件
cat > "/home/jingrow/jsite/$SITE_NAME/.env" << EOF
PUBLIC_SITE_URL=$site_url_with_port
PUBLIC_SITE_URL=$public_site_url
REVALIDATE_TOKEN=$REVALIDATE_TOKEN
@ -566,16 +566,13 @@ JINGROW_SITE_NAME=$SITE_NAME
JINGROW_SERVER_URL=$SERVER_URL
JINGROW_API_KEY=$API_KEY
JINGROW_API_SECRET=$API_SECRET
# 项目端口配置
PORT=$project_port
EOF
# 设置文件权限
chown jingrow:jingrow "/home/jingrow/jsite/$SITE_NAME/.env"
chmod 600 "/home/jingrow/jsite/$SITE_NAME/.env"
log_success ".env文件创建完成 (端口: $project_port)"
log_success ".env文件创建完成 (端口: $project_port, PUBLIC_SITE_URL: $public_site_url)"
}
# 4.5. 创建PM2配置文件
@ -602,8 +599,16 @@ create_pm2_config() {
fi
fi
# 创建ecosystem.config.js文件
cat > "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.js" << EOF
# 检查项目是否使用ES模块
local is_es_module=false
if [ -f "/home/jingrow/jsite/$SITE_NAME/package.json" ]; then
if grep -q '"type": "module"' "/home/jingrow/jsite/$SITE_NAME/package.json"; then
is_es_module=true
fi
fi
# 使用.cjs扩展名来避免ES模块问题
cat > "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.cjs" << EOF
module.exports = {
apps: [{
name: '$SITE_NAME',
@ -632,10 +637,10 @@ module.exports = {
EOF
# 设置文件权限
chown -R jingrow:jingrow "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.js"
chown -R jingrow:jingrow "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.cjs"
chown -R jingrow:jingrow "/home/jingrow/jsite/$SITE_NAME/logs"
log_success "PM2配置文件创建完成 (端口: $project_port, 启动脚本: $start_script)"
log_success "PM2配置文件创建完成 (端口: $project_port, 启动脚本: $start_script, 模块类型: $([ "$is_es_module" = true ] && echo "ES模块" || echo "CommonJS"))"
}
# 4.6. 用PM2启动项目
@ -656,9 +661,9 @@ start_project_with_pm2() {
return 1
fi
# 检查ecosystem.config.js是否存在
if [ ! -f "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.js" ]; then
log_error "ecosystem.config.js文件不存在请检查PM2配置是否正确创建"
# 检查ecosystem.config.cjs是否存在
if [ ! -f "/home/jingrow/jsite/$SITE_NAME/ecosystem.config.cjs" ]; then
log_error "ecosystem.config.cjs文件不存在请检查PM2配置是否正确创建"
return 1
fi
@ -666,10 +671,10 @@ start_project_with_pm2() {
PM2_STATUS=$(su - jingrow -c "
export NVM_DIR=\"\$HOME/.nvm\"
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
pm2 list | grep -c '$SITE_NAME' || echo '0'
pm2 list | grep -w '$SITE_NAME' | wc -l
")
if [ "$PM2_STATUS" != "0" ]; then
if [ "$PM2_STATUS" != "0" ] && [ -n "$PM2_STATUS" ]; then
if [ "$FORCE_UPDATE" = true ]; then
log_warning "项目已在PM2中运行重新启动..."
su - jingrow -c "
@ -677,7 +682,7 @@ start_project_with_pm2() {
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
cd /home/jingrow/jsite/$SITE_NAME
pm2 delete $SITE_NAME 2>/dev/null || true
pm2 start ecosystem.config.js
pm2 start ecosystem.config.cjs
"
if [ $? -ne 0 ]; then
log_error "PM2启动失败请检查项目配置和依赖"
@ -699,7 +704,7 @@ start_project_with_pm2() {
export NVM_DIR=\"\$HOME/.nvm\"
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
cd /home/jingrow/jsite/$SITE_NAME
pm2 start ecosystem.config.js
pm2 start ecosystem.config.cjs
"
if [ $? -ne 0 ]; then
log_error "PM2启动失败请检查项目配置和依赖"
@ -720,7 +725,7 @@ start_project_with_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'
pm2 list | grep -w '$SITE_NAME' | grep -c 'online' || echo '0'
")
if [ "$PM2_RUNNING" = "0" ]; then
@ -782,6 +787,15 @@ install_traefik() {
# 设置目录权限
chown -R jingrow:jingrow /home/jingrow/traefik-docker
log_success "设置traefik目录权限"
# 设置 acme.json 文件权限Let's Encrypt 要求 600 权限)
if [ -f "/home/jingrow/traefik-docker/acme.json" ]; then
chmod 600 /home/jingrow/traefik-docker/acme.json
chown jingrow:jingrow /home/jingrow/traefik-docker/acme.json
log_success "设置 acme.json 文件权限为 600"
else
log_warning "acme.json 文件不存在,请检查 Traefik 配置"
fi
}
# 6. 安装Docker如果未安装
@ -972,6 +986,36 @@ install_project_dependencies() {
fi
log_success "项目依赖安装完成"
# 构建项目
log_info "构建jsite/$SITE_NAME项目..."
# 获取当前内存大小MB并减去200MB作为构建内存限制
local total_memory_mb=$(free -m | awk 'NR==2{print $2}')
local build_memory_mb=$((total_memory_mb - 300))
# 确保内存限制至少为512MB
if [ "$build_memory_mb" -lt 512 ]; then
build_memory_mb=512
log_warning "可用内存不足设置构建内存限制为512MB"
fi
log_info "设置构建内存限制为 ${build_memory_mb}MB (总内存: ${total_memory_mb}MB)"
su - jingrow -c "
export NVM_DIR=\"\$HOME/.nvm\"
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
export NODE_OPTIONS=\"--max-old-space-size=$build_memory_mb\"
cd /home/jingrow/jsite/$SITE_NAME
npm run build
"
if [ $? -ne 0 ]; then
log_error "项目构建失败"
return 1
fi
log_success "项目构建完成 (内存限制: ${build_memory_mb}MB)"
}
# 9. 显示部署信息
@ -986,7 +1030,7 @@ show_deployment_info() {
echo " - Traefik目录: /home/jingrow/traefik-docker"
echo " - Traefik管理界面: http://localhost:8080"
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/ecosystem.config.cjs"
echo " - PM2日志目录: /home/jingrow/jsite/$SITE_NAME/logs"
echo ""
log_info ".env文件配置"