Compare commits
2 Commits
9db57a3fcb
...
f704f04900
| Author | SHA1 | Date | |
|---|---|---|---|
| f704f04900 | |||
| fa686fe62f |
165
install_jsite.sh
165
install_jsite.sh
@ -39,6 +39,48 @@ SERVER_URL="https://admin.jingrow.com"
|
||||
API_KEY="535bc122f3e364c"
|
||||
API_SECRET="8629a3b12fc1cc2"
|
||||
|
||||
# ========================================
|
||||
# 工具函数
|
||||
# ========================================
|
||||
|
||||
# 智能IP选择:优先使用内网IP,没有内网IP时使用公网IP
|
||||
get_optimal_host_ip() {
|
||||
local host_ip=""
|
||||
|
||||
# 方法1: 尝试获取内网IP
|
||||
local private_ip=$(ip route get 8.8.8.8 2>/dev/null | awk '{print $7}' | head -1)
|
||||
if [ -n "$private_ip" ] && [ "$private_ip" != "8.8.8.8" ]; then
|
||||
# 测试内网IP是否可达
|
||||
if ping -c 2 -W 1 "$private_ip" >/dev/null 2>&1; then
|
||||
host_ip="$private_ip"
|
||||
log_success "使用内网IP: $host_ip"
|
||||
else
|
||||
log_warning "内网IP不可达: $private_ip"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 方法2: 如果没有内网IP或内网IP不可达,使用公网IP
|
||||
if [ -z "$host_ip" ]; then
|
||||
if [ -n "$PUBLIC_IP" ]; then
|
||||
host_ip="$PUBLIC_IP"
|
||||
log_info "使用指定的公网IP: $host_ip"
|
||||
else
|
||||
# 尝试自动获取公网IP
|
||||
local auto_public_ip=$(curl -s --max-time 5 ifconfig.me 2>/dev/null || curl -s --max-time 5 ipinfo.io/ip 2>/dev/null)
|
||||
if [ -n "$auto_public_ip" ]; then
|
||||
host_ip="$auto_public_ip"
|
||||
log_info "自动获取公网IP: $host_ip"
|
||||
else
|
||||
# 最后回退:使用第一个可用IP
|
||||
host_ip=$(hostname -I | awk '{print $1}')
|
||||
log_warning "使用备用IP: $host_ip"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
|
||||
echo "$host_ip"
|
||||
}
|
||||
|
||||
# 解析命令行参数
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
@ -560,8 +602,11 @@ create_env_file() {
|
||||
# 获取项目端口
|
||||
local project_port=$(get_or_assign_port "$SITE_NAME")
|
||||
|
||||
# 构建本地地址URL(用于PUBLIC_SITE_URL)
|
||||
local public_site_url="http://127.0.0.1:$project_port"
|
||||
# 智能IP选择:优先使用内网IP,没有内网IP时使用公网IP(与traefik配置保持一致)
|
||||
local host_ip=$(get_optimal_host_ip)
|
||||
|
||||
# 构建PUBLIC_SITE_URL(优先使用内网IP,没有内网IP时使用公网IP)
|
||||
local public_site_url="http://$host_ip:$project_port"
|
||||
|
||||
# 检查.env文件是否已存在
|
||||
if [ -f "/home/jingrow/jsite/$SITE_NAME/.env" ]; then
|
||||
@ -718,6 +763,17 @@ start_project_with_pm2() {
|
||||
fi
|
||||
else
|
||||
log_warning "项目已在PM2中运行,跳过启动"
|
||||
# 即使跳过启动,也要检查现有进程是否正常运行
|
||||
PM2_RUNNING=$(su - jingrow -c "
|
||||
export NVM_DIR=\"\$HOME/.nvm\"
|
||||
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
|
||||
pm2 list | grep -w '$SITE_NAME' | grep -c 'online' || echo '0'
|
||||
")
|
||||
if [ "$PM2_RUNNING" = "0" ]; then
|
||||
log_error "现有PM2进程未正常运行,需要重新启动"
|
||||
return 1
|
||||
fi
|
||||
log_success "现有PM2进程运行正常"
|
||||
return 0
|
||||
fi
|
||||
else
|
||||
@ -740,18 +796,30 @@ start_project_with_pm2() {
|
||||
fi
|
||||
fi
|
||||
|
||||
# 等待一下让PM2启动完成
|
||||
sleep 5
|
||||
# 等待PM2启动完成,最多等待30秒
|
||||
log_info "等待PM2启动完成..."
|
||||
local wait_time=0
|
||||
local max_wait=30
|
||||
local pm2_running="0"
|
||||
|
||||
while [ $wait_time -lt $max_wait ] && [ "$pm2_running" = "0" ]; do
|
||||
sleep 2
|
||||
wait_time=$((wait_time + 2))
|
||||
|
||||
pm2_running=$(su - jingrow -c "
|
||||
export NVM_DIR=\"\$HOME/.nvm\"
|
||||
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
|
||||
pm2 list | grep -w '$SITE_NAME' | grep -c 'online' || echo '0'
|
||||
")
|
||||
|
||||
if [ "$pm2_running" = "0" ]; then
|
||||
log_info "等待PM2启动... (${wait_time}s/${max_wait}s)"
|
||||
fi
|
||||
done
|
||||
|
||||
# 检查PM2进程是否真的启动了
|
||||
PM2_RUNNING=$(su - jingrow -c "
|
||||
export NVM_DIR=\"\$HOME/.nvm\"
|
||||
[ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\"
|
||||
pm2 list | grep -w '$SITE_NAME' | grep -c 'online' || echo '0'
|
||||
")
|
||||
|
||||
if [ "$PM2_RUNNING" = "0" ]; then
|
||||
log_error "PM2启动失败,项目未正常运行"
|
||||
if [ "$pm2_running" = "0" ]; then
|
||||
log_error "PM2启动失败,项目未正常运行(等待${wait_time}秒后仍未能启动)"
|
||||
log_info "检查PM2状态:"
|
||||
su - jingrow -c "
|
||||
export NVM_DIR=\"\$HOME/.nvm\"
|
||||
@ -767,6 +835,46 @@ start_project_with_pm2() {
|
||||
return 1
|
||||
fi
|
||||
|
||||
# 额外检查:验证项目是否真的在监听端口
|
||||
local project_port=$(get_or_assign_port "$SITE_NAME")
|
||||
log_info "验证项目是否在端口 $project_port 上正常运行..."
|
||||
|
||||
# 等待一下让应用完全启动
|
||||
sleep 3
|
||||
|
||||
# 检查端口是否被监听
|
||||
local port_check=0
|
||||
local max_port_checks=10
|
||||
local port_check_count=0
|
||||
|
||||
while [ $port_check_count -lt $max_port_checks ] && [ $port_check -eq 0 ]; do
|
||||
port_check=$(netstat -tlnp 2>/dev/null | grep ":$project_port " | wc -l || echo "0")
|
||||
if [ $port_check -eq 0 ]; then
|
||||
sleep 1
|
||||
port_check_count=$((port_check_count + 1))
|
||||
log_info "等待端口 $project_port 启动... (${port_check_count}/${max_port_checks})"
|
||||
fi
|
||||
done
|
||||
|
||||
if [ $port_check -eq 0 ]; then
|
||||
log_error "项目启动失败:端口 $project_port 未被监听"
|
||||
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
|
||||
|
||||
log_success "项目已成功启动并监听端口 $project_port"
|
||||
|
||||
# 保存PM2配置
|
||||
su - jingrow -c "
|
||||
export NVM_DIR=\"\$HOME/.nvm\"
|
||||
@ -909,38 +1017,7 @@ create_traefik_website_config() {
|
||||
local project_port=$(get_or_assign_port "$SITE_NAME")
|
||||
|
||||
# 智能IP选择:优先使用内网IP,没有内网IP时使用公网IP
|
||||
local host_ip=""
|
||||
|
||||
# 方法1: 尝试获取内网IP
|
||||
local private_ip=$(ip route get 8.8.8.8 2>/dev/null | awk '{print $7}' | head -1)
|
||||
if [ -n "$private_ip" ] && [ "$private_ip" != "8.8.8.8" ]; then
|
||||
# 测试内网IP是否可达
|
||||
if ping -c 2 -W 1 "$private_ip" >/dev/null 2>&1; then
|
||||
host_ip="$private_ip"
|
||||
log_success "使用内网IP: $host_ip"
|
||||
else
|
||||
log_warning "内网IP不可达: $private_ip"
|
||||
fi
|
||||
fi
|
||||
|
||||
# 方法2: 如果没有内网IP或内网IP不可达,使用公网IP
|
||||
if [ -z "$host_ip" ]; then
|
||||
if [ -n "$PUBLIC_IP" ]; then
|
||||
host_ip="$PUBLIC_IP"
|
||||
log_info "使用指定的公网IP: $host_ip"
|
||||
else
|
||||
# 尝试自动获取公网IP
|
||||
local auto_public_ip=$(curl -s --max-time 5 ifconfig.me 2>/dev/null || curl -s --max-time 5 ipinfo.io/ip 2>/dev/null)
|
||||
if [ -n "$auto_public_ip" ]; then
|
||||
host_ip="$auto_public_ip"
|
||||
log_info "自动获取公网IP: $host_ip"
|
||||
else
|
||||
# 最后回退:使用第一个可用IP
|
||||
host_ip=$(hostname -I | awk '{print $1}')
|
||||
log_warning "使用备用IP: $host_ip"
|
||||
fi
|
||||
fi
|
||||
fi
|
||||
local host_ip=$(get_optimal_host_ip)
|
||||
|
||||
# 生成Host规则
|
||||
local host_rule=$(generate_host_rule "$SITE_URL")
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user