diff --git a/install_jsite.sh b/install_jsite.sh index b2652c1..830a69c 100755 --- a/install_jsite.sh +++ b/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 "$@" \ No newline at end of file