增加公网ip变量,traefik优先使用内网ip
This commit is contained in:
parent
7f26f9f1dd
commit
630e7430d2
308
install_jsite.sh
308
install_jsite.sh
@ -1,15 +1,110 @@
|
||||
#!/bin/bash
|
||||
|
||||
# ========================================
|
||||
# jsite前端自动化部署脚本
|
||||
# ========================================
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 默认参数
|
||||
SITE_NAME="jingrow"
|
||||
GIT_REPO="http://git.jingrow.com:3000/jsite/jingrow"
|
||||
NODE_VERSION="22"
|
||||
SKIP_DOCKER=false
|
||||
SKIP_TRAEFIK=false
|
||||
SKIP_DEPENDENCIES=false
|
||||
SKIP_PM2=false
|
||||
FORCE_UPDATE=false
|
||||
START_PORT=3001
|
||||
PUBLIC_IP="" # 新增:公网IP参数
|
||||
|
||||
# 解析命令行参数
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
--site-name)
|
||||
SITE_NAME="$2"
|
||||
shift 2
|
||||
;;
|
||||
--git-repo)
|
||||
GIT_REPO="$2"
|
||||
shift 2
|
||||
;;
|
||||
--node-version)
|
||||
NODE_VERSION="$2"
|
||||
shift 2
|
||||
;;
|
||||
--skip-docker)
|
||||
SKIP_DOCKER=true
|
||||
shift
|
||||
;;
|
||||
--skip-traefik)
|
||||
SKIP_TRAEFIK=true
|
||||
shift
|
||||
;;
|
||||
--skip-dependencies)
|
||||
SKIP_DEPENDENCIES=true
|
||||
shift
|
||||
;;
|
||||
--skip-pm2)
|
||||
SKIP_PM2=true
|
||||
shift
|
||||
;;
|
||||
--force-update)
|
||||
FORCE_UPDATE=true
|
||||
shift
|
||||
;;
|
||||
--start-port)
|
||||
START_PORT="$2"
|
||||
shift 2
|
||||
;;
|
||||
--public-ip) # 新增:公网IP参数
|
||||
PUBLIC_IP="$2"
|
||||
shift 2
|
||||
;;
|
||||
-h|--help)
|
||||
echo "用法: $0 [选项]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " --site-name NAME 项目名称 (默认: jingrow)"
|
||||
echo " --git-repo URL Git仓库地址"
|
||||
echo " --node-version VER Node.js版本 (默认: 22)"
|
||||
echo " --skip-docker 跳过Docker安装"
|
||||
echo " --skip-traefik 跳过Traefik安装"
|
||||
echo " --skip-dependencies 跳过依赖安装"
|
||||
echo " --skip-pm2 跳过PM2安装"
|
||||
echo " --force-update 强制更新所有文件"
|
||||
echo " --start-port PORT 起始端口 (默认: 3001)"
|
||||
echo " --public-ip IP 公网IP地址 (用于内网IP不可用时)"
|
||||
echo " -h, --help 显示此帮助信息"
|
||||
echo ""
|
||||
echo "示例:"
|
||||
echo " $0 --site-name myproject --public-ip 8.217.167.199"
|
||||
echo " $0 --force-update --public-ip 203.0.113.1"
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo "未知选项: $1"
|
||||
echo "使用 --help 查看帮助信息"
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# jsite前端自动化部署脚本
|
||||
# 基于next.js + traefik开发
|
||||
#
|
||||
# 后端调用示例:
|
||||
# 1. 基本部署: ./install_jsite.sh
|
||||
# 2. 指定项目: ./install_jsite.sh --site-name myproject -r http://git.example.com/myproject
|
||||
# 2. 指定项目: ./install_jsite.sh --site-name myproject --git-repo 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 --site-name myproject -r http://git.example.com/myproject -n 18 --skip-docker --force-update
|
||||
# 6. 完整参数: ./install_jsite.sh --site-name myproject --git-repo http://git.example.com/myproject --node-version 18 --skip-docker --force-update
|
||||
#
|
||||
# 返回码:
|
||||
# 0 - 成功
|
||||
@ -25,146 +120,16 @@ export DEBCONF_NONINTERACTIVE_SEEN=true
|
||||
export UCF_FORCE_CONFNEW=1
|
||||
export UCF_FORCE_CONFOLD=1
|
||||
|
||||
# 颜色定义
|
||||
RED='\033[0;31m'
|
||||
GREEN='\033[0;32m'
|
||||
YELLOW='\033[1;33m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# 默认参数
|
||||
GIT_REPO="http://git.jingrow.com:3000/jsite/jingrow"
|
||||
NODE_VERSION="22"
|
||||
SKIP_DOCKER=false
|
||||
SKIP_TRAEFIK=false
|
||||
SKIP_DEPENDENCIES=false
|
||||
FORCE_UPDATE=false
|
||||
SKIP_PM2=false
|
||||
|
||||
# 端口管理参数
|
||||
START_PORT=3001
|
||||
PORT_INCREMENT=1
|
||||
|
||||
# .env文件参数
|
||||
SITE_URL="starrbud.com"
|
||||
REVALIDATE_TOKEN="535bc122f3e364c"
|
||||
SITE_NAME="jingrow"
|
||||
SERVER_URL="https://admin.jingrow.com"
|
||||
API_KEY="535bc122f3e364c"
|
||||
API_SECRET="8629a3b12fc1cc2"
|
||||
|
||||
# 显示帮助信息
|
||||
show_help() {
|
||||
echo "用法: $0 [选项]"
|
||||
echo ""
|
||||
echo "选项:"
|
||||
echo " -r, --repo URL Git仓库地址"
|
||||
echo " -n, --node-version VERSION Node.js版本 (默认: 22)"
|
||||
echo " --skip-docker 跳过Docker安装"
|
||||
echo " --skip-traefik 跳过Traefik安装和启动"
|
||||
echo " --skip-dependencies 跳过项目依赖安装"
|
||||
echo " --skip-pm2 跳过PM2安装和启动"
|
||||
echo " --force-update 强制更新项目(如果已存在)"
|
||||
echo ""
|
||||
echo "端口配置:"
|
||||
echo " --start-port PORT 起始端口 (默认: 3001)"
|
||||
echo " --port-increment INCREMENT 端口增量 (默认: 1)"
|
||||
echo ""
|
||||
echo ".env文件配置:"
|
||||
echo " --site-url URL 网站URL (默认: http://192.168.2.200:3001)"
|
||||
echo " --revalidate-token TOKEN 重新验证令牌 (默认: 535bc122f3e364c)"
|
||||
echo " --site-name NAME 站点名称 (默认: jingrow)"
|
||||
echo " --server-url URL 服务器URL (默认: https://admin.jingrow.com)"
|
||||
echo " --api-key KEY API密钥 (默认: 535bc122f3e364c)"
|
||||
echo " --api-secret SECRET API密钥 (默认: 8629a3b12fc1cc2)"
|
||||
echo ""
|
||||
echo " -h, --help 显示此帮助信息"
|
||||
echo ""
|
||||
echo "示例:"
|
||||
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"
|
||||
echo " $0 --start-port 3005 --port-increment 10"
|
||||
}
|
||||
|
||||
# 解析命令行参数
|
||||
parse_arguments() {
|
||||
while [[ $# -gt 0 ]]; do
|
||||
case $1 in
|
||||
-r|--repo)
|
||||
GIT_REPO="$2"
|
||||
shift 2
|
||||
;;
|
||||
-n|--node-version)
|
||||
NODE_VERSION="$2"
|
||||
shift 2
|
||||
;;
|
||||
--skip-docker)
|
||||
SKIP_DOCKER=true
|
||||
shift
|
||||
;;
|
||||
--skip-traefik)
|
||||
SKIP_TRAEFIK=true
|
||||
shift
|
||||
;;
|
||||
--skip-dependencies)
|
||||
SKIP_DEPENDENCIES=true
|
||||
shift
|
||||
;;
|
||||
--skip-pm2)
|
||||
SKIP_PM2=true
|
||||
shift
|
||||
;;
|
||||
--force-update)
|
||||
FORCE_UPDATE=true
|
||||
shift
|
||||
;;
|
||||
--start-port)
|
||||
START_PORT="$2"
|
||||
shift 2
|
||||
;;
|
||||
--port-increment)
|
||||
PORT_INCREMENT="$2"
|
||||
shift 2
|
||||
;;
|
||||
--site-url)
|
||||
SITE_URL="$2"
|
||||
shift 2
|
||||
;;
|
||||
--revalidate-token)
|
||||
REVALIDATE_TOKEN="$2"
|
||||
shift 2
|
||||
;;
|
||||
--site-name)
|
||||
SITE_NAME="$2"
|
||||
shift 2
|
||||
;;
|
||||
--server-url)
|
||||
SERVER_URL="$2"
|
||||
shift 2
|
||||
;;
|
||||
--api-key)
|
||||
API_KEY="$2"
|
||||
shift 2
|
||||
;;
|
||||
--api-secret)
|
||||
API_SECRET="$2"
|
||||
shift 2
|
||||
;;
|
||||
-h|--help)
|
||||
show_help
|
||||
exit 0
|
||||
;;
|
||||
*)
|
||||
echo -e "${RED}[ERROR]${NC} 未知参数: $1"
|
||||
show_help
|
||||
exit 1
|
||||
;;
|
||||
esac
|
||||
done
|
||||
}
|
||||
|
||||
# 日志函数
|
||||
log_info() {
|
||||
echo -e "${BLUE}[INFO]${NC} $1"
|
||||
@ -886,6 +851,40 @@ 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
|
||||
|
||||
# 生成Host规则
|
||||
local host_rule=$(generate_host_rule "$SITE_URL")
|
||||
|
||||
@ -912,7 +911,6 @@ create_traefik_website_config() {
|
||||
|
||||
# 创建网站配置文件
|
||||
cat > "$config_file" << EOF
|
||||
# $SITE_NAME 网站配置
|
||||
http:
|
||||
routers:
|
||||
main-https:
|
||||
@ -935,7 +933,7 @@ http:
|
||||
main-service:
|
||||
loadBalancer:
|
||||
servers:
|
||||
- url: "http://localhost:$project_port"
|
||||
- url: "http://$host_ip:$project_port"
|
||||
noop:
|
||||
loadBalancer:
|
||||
servers:
|
||||
@ -952,7 +950,7 @@ EOF
|
||||
chown jingrow:jingrow "$config_file"
|
||||
chmod 644 "$config_file"
|
||||
|
||||
log_success "traefik网站配置文件创建完成: $config_file (端口: $project_port)"
|
||||
log_success "traefik网站配置文件创建完成: $config_file (端口: $project_port, 后端IP: $host_ip)"
|
||||
log_info "Host规则: $host_rule"
|
||||
|
||||
# 重启traefik以加载新配置
|
||||
@ -1021,7 +1019,7 @@ install_project_dependencies() {
|
||||
# 9. 显示部署信息
|
||||
show_deployment_info() {
|
||||
log_success "=== 部署完成 ==="
|
||||
echo ""
|
||||
|
||||
log_info "部署信息:"
|
||||
echo " - 用户: jingrow"
|
||||
echo " - jsite目录: /home/jingrow/jsite"
|
||||
@ -1032,15 +1030,23 @@ show_deployment_info() {
|
||||
echo " - Traefik网站配置: /home/jingrow/traefik-docker/conf.d/website/$SITE_NAME.yml"
|
||||
echo " - PM2配置文件: /home/jingrow/jsite/$SITE_NAME/ecosystem.config.cjs"
|
||||
echo " - PM2日志目录: /home/jingrow/jsite/$SITE_NAME/logs"
|
||||
echo ""
|
||||
|
||||
if [ -n "$PUBLIC_IP" ]; then
|
||||
echo " - 指定公网IP: $PUBLIC_IP"
|
||||
fi
|
||||
|
||||
log_info ".env文件配置:"
|
||||
echo " - PUBLIC_SITE_URL: $SITE_URL"
|
||||
echo " - JINGROW_SITE_NAME: $SITE_NAME"
|
||||
echo " - JINGROW_SERVER_URL: $SERVER_URL"
|
||||
echo " - REVALIDATE_TOKEN: $REVALIDATE_TOKEN"
|
||||
echo " - JINGROW_API_KEY: $API_KEY"
|
||||
echo " - JINGROW_API_SECRET: $API_SECRET"
|
||||
echo ""
|
||||
if [ -f "/home/jingrow/jsite/$SITE_NAME/.env" ]; then
|
||||
echo " - PUBLIC_SITE_URL: $(grep '^PUBLIC_SITE_URL=' "/home/jingrow/jsite/$SITE_NAME/.env" | cut -d'=' -f2-)"
|
||||
echo " - JINGROW_SITE_NAME: $(grep '^JINGROW_SITE_NAME=' "/home/jingrow/jsite/$SITE_NAME/.env" | cut -d'=' -f2-)"
|
||||
echo " - JINGROW_SERVER_URL: $(grep '^JINGROW_SERVER_URL=' "/home/jingrow/jsite/$SITE_NAME/.env" | cut -d'=' -f2-)"
|
||||
echo " - REVALIDATE_TOKEN: $(grep '^REVALIDATE_TOKEN=' "/home/jingrow/jsite/$SITE_NAME/.env" | cut -d'=' -f2-)"
|
||||
echo " - JINGROW_API_KEY: $(grep '^JINGROW_API_KEY=' "/home/jingrow/jsite/$SITE_NAME/.env" | cut -d'=' -f2-)"
|
||||
echo " - JINGROW_API_SECRET: $(grep '^JINGROW_API_SECRET=' "/home/jingrow/jsite/$SITE_NAME/.env" | cut -d'=' -f2-)"
|
||||
else
|
||||
echo " - .env文件不存在"
|
||||
fi
|
||||
|
||||
log_info "PM2管理命令:"
|
||||
echo " - 查看状态: pm2 list"
|
||||
echo " - 查看日志: pm2 logs $SITE_NAME"
|
||||
@ -1048,15 +1054,15 @@ show_deployment_info() {
|
||||
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 " - 访问域名: $SITE_URL"
|
||||
echo " - 后端端口: $(get_or_assign_port "$SITE_NAME")"
|
||||
echo ""
|
||||
# 显示端口分配情况
|
||||
|
||||
# 显示当前端口分配情况
|
||||
show_port_assignments
|
||||
echo ""
|
||||
|
||||
log_info "下一步操作:"
|
||||
echo " 1. 进入项目目录: cd /home/jingrow/jsite/$SITE_NAME"
|
||||
echo " 2. 查看PM2状态: pm2 list"
|
||||
@ -1065,8 +1071,9 @@ show_deployment_info() {
|
||||
echo " 5. 访问项目: $SITE_URL"
|
||||
echo " 6. 检查traefik配置: cat /home/jingrow/traefik-docker/conf.d/website/$SITE_NAME.yml"
|
||||
echo " 7. 查看端口分配: cat /home/jingrow/jsite/site_port.json"
|
||||
echo ""
|
||||
|
||||
log_warning "注意:请确保防火墙允许80、443、8080端口访问"
|
||||
log_success "部署脚本执行完成!"
|
||||
}
|
||||
|
||||
# 主函数
|
||||
@ -1158,5 +1165,4 @@ main() {
|
||||
}
|
||||
|
||||
# 执行主函数
|
||||
parse_arguments "$@"
|
||||
main "$@"
|
||||
Loading…
x
Reference in New Issue
Block a user