From 018555a40118c9904ef8fa541993261d7b60d32d Mon Sep 17 00:00:00 2001 From: jingrow Date: Sun, 10 Aug 2025 00:06:59 +0800 Subject: [PATCH] =?UTF-8?q?jsite.sh=E5=8F=82=E6=95=B0=E6=94=B9=E6=88=90?= =?UTF-8?q?=E4=B8=8Einstall=5Fjsite.sh=E4=B8=80=E8=87=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- jsite.sh | 191 +++++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 149 insertions(+), 42 deletions(-) diff --git a/jsite.sh b/jsite.sh index eafc4b3..867a7a7 100644 --- a/jsite.sh +++ b/jsite.sh @@ -19,17 +19,23 @@ NC='\033[0m' # No Color # 基础配置 DEFAULT_GIT_REPO="http://git.jingrow.com:3000/jsite/jingrow" JSITE_BASE_DIR="/home/jingrow/jsite" -USER_NAME="jingrow" TRAEFIK_CONFIG_DIR="/home/jingrow/traefik-docker/conf.d/website" # 默认配置参数 -DEFAULT_SITE_URL="example.com" +SITE_NAME="jingrow" START_PORT=3001 PORT_INCREMENT=1 # 网络配置 PUBLIC_IP="" # 公网IP地址 (用于内网IP不可用时) +# .env文件参数 +SITE_URL="starrbud.com" +REVALIDATE_TOKEN="535bc122f3e364c" +SERVER_URL="https://admin.jingrow.com" +API_KEY="535bc122f3e364c" +API_SECRET="8629a3b12fc1cc2" + # ======================================== # 日志函数 # ======================================== @@ -56,8 +62,8 @@ log_error() { # 检查用户是否存在 check_user() { - if ! id "$USER_NAME" &>/dev/null; then - log_error "用户 $USER_NAME 不存在,请先创建用户" + if ! id "jingrow" &>/dev/null; then + log_error "用户 jingrow 不存在,请先创建用户" exit 1 fi } @@ -67,7 +73,7 @@ check_base_dir() { if [ ! -d "$JSITE_BASE_DIR" ]; then log_info "创建jsite基础目录: $JSITE_BASE_DIR" mkdir -p "$JSITE_BASE_DIR" - chown "$USER_NAME:$USER_NAME" "$JSITE_BASE_DIR" + chown "jingrow:jingrow" "$JSITE_BASE_DIR" fi } @@ -87,7 +93,7 @@ get_site_status() { fi # 检查PM2进程状态 - local pm2_status=$(su - "$USER_NAME" -c " + local pm2_status=$(su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" pm2 list 2>/dev/null | grep -w '$site_name' | grep -c 'online' || echo '0' @@ -141,10 +147,10 @@ get_optimal_host_ip() { # 显示帮助信息 show_help() { - echo "用法: $0 <命令> <网站名称> [选项]" + echo "用法: $0 <命令> [选项]" echo "" echo "命令:" - echo " create [git-repo] [domain] 新建网站" + echo " create 新建网站" echo " delete 删除网站" echo " build 构建网站" echo " start 启动网站" @@ -154,13 +160,19 @@ show_help() { echo " list 列出所有网站" echo " logs 查看网站日志" echo "" - echo "选项:" + echo "create命令选项:" + echo " --site-name NAME 网站名称 (必需)" + echo " --git-repo URL Git仓库地址 (可选)" + echo " --site-url URL 网站URL (可选)" + echo "" + echo "全局选项:" echo " -h, --help 显示此帮助信息" echo "" echo "示例:" - echo " $0 create mysite" - echo " $0 create mysite http://git.example.com/myproject" - echo " $0 create mysite http://git.example.com/myproject mysite.com" + echo " $0 create --site-name mysite" + echo " $0 create --site-name mysite --git-repo http://git.example.com/project" + echo " $0 create --site-name mysite --site-url mysite.com" + echo " $0 create --site-name mysite --git-repo http://git.example.com/project --site-url mysite.com" echo " $0 start mysite" echo " $0 stop mysite" echo " $0 restart mysite" @@ -223,7 +235,7 @@ save_port_assignment() { fi fi - chown "$USER_NAME:$USER_NAME" "$port_file" 2>/dev/null || true + chown "jingrow:jingrow" "$port_file" 2>/dev/null || true } # 生成Host规则 @@ -243,6 +255,58 @@ generate_host_rule() { fi } +# 创建.env文件 +create_env_file() { + local site_name="$1" + local port="$2" + + log_info "创建.env文件..." + + cd "$JSITE_BASE_DIR/$site_name" + + # 智能IP选择:优先使用内网IP,没有内网IP时使用公网IP(与traefik配置保持一致) + local host_ip=$(get_optimal_host_ip) + + # 输出IP选择结果 + if [[ "$host_ip" =~ ^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$ ]]; then + log_success "使用IP地址: $host_ip" + else + log_warning "IP地址格式异常: $host_ip" + return 1 + fi + + # 构建PUBLIC_SITE_URL(优先使用内网IP,没有内网IP时使用公网IP) + local public_site_url="http://$host_ip:$port" + + # 检查.env文件是否已存在 + if [ -f "$JSITE_BASE_DIR/$site_name/.env" ]; then + log_warning ".env文件已存在,将会覆盖..." + fi + + # 创建.env文件 + cat > "$JSITE_BASE_DIR/$site_name/.env" << EOF +# 网站配置 +PUBLIC_SITE_URL=$public_site_url + +# 重新验证令牌 +REVALIDATE_TOKEN=$REVALIDATE_TOKEN + +# 项目配置 +JINGROW_SITE_NAME=$site_name + +# 服务器配置 +JINGROW_SERVER_URL=$SERVER_URL +JINGROW_API_KEY=$API_KEY +JINGROW_API_SECRET=$API_SECRET +EOF + + # 设置文件权限 + chown "jingrow:jingrow" "$JSITE_BASE_DIR/$site_name/.env" + chmod 600 "$JSITE_BASE_DIR/$site_name/.env" + + log_success ".env文件创建完成 (端口: $port, PUBLIC_SITE_URL: $public_site_url)" +} + # 创建traefik网站配置文件 create_traefik_config() { local site_name="$1" @@ -299,7 +363,7 @@ http: permanent: true EOF - chown "$USER_NAME:$USER_NAME" "$config_file" 2>/dev/null || true + chown "jingrow:jingrow" "$config_file" 2>/dev/null || true chmod 644 "$config_file" log_success "Traefik配置文件已创建: $config_file" @@ -323,7 +387,7 @@ restart_traefik() { if [ -d "$traefik_dir" ] && [ -f "$traefik_dir/docker-compose.yml" ]; then log_info "重启Traefik服务以加载新配置..." - su - "$USER_NAME" -c "cd '$traefik_dir' && docker compose restart" 2>/dev/null || { + su - "jingrow" -c "cd '$traefik_dir' && docker compose restart" 2>/dev/null || { log_warning "无法重启Traefik服务,请手动重启" } fi @@ -333,18 +397,57 @@ restart_traefik() { # 核心功能函数 # ======================================== +# 解析create命令的参数 +parse_create_args() { + # 重置变量 + CREATE_SITE_NAME="" + CREATE_GIT_REPO="$DEFAULT_GIT_REPO" + CREATE_DOMAIN="$SITE_URL" + + # 解析参数 + while [[ $# -gt 0 ]]; do + case $1 in + --site-name) + CREATE_SITE_NAME="$2" + shift 2 + ;; + --git-repo) + CREATE_GIT_REPO="$2" + shift 2 + ;; + --site-url) + CREATE_DOMAIN="$2" + shift 2 + ;; + -h|--help) + show_help + exit 0 + ;; + *) + log_error "未知参数: $1" + echo "使用 $0 create --help 查看帮助" + exit 1 + ;; + esac + done + + # 验证必需参数 + if [ -z "$CREATE_SITE_NAME" ]; then + log_error "必需参数: --site-name" + echo "使用: $0 create --site-name <网站名称>" + exit 1 + fi +} + # 新建网站 create_site() { - local site_name="$1" - local git_repo="${2:-$DEFAULT_GIT_REPO}" - local domain="${3:-$DEFAULT_SITE_URL}" - - if [ -z "$site_name" ]; then - log_error "请指定网站名称" - return 1 - fi + local site_name="$CREATE_SITE_NAME" + local git_repo="$CREATE_GIT_REPO" + local domain="$CREATE_DOMAIN" log_info "开始创建网站: $site_name" + log_info "Git仓库: $git_repo" + log_info "域名: $domain" # 检查网站是否已存在 if check_site_exists "$site_name"; then @@ -357,7 +460,7 @@ create_site() { # 克隆项目 log_info "克隆项目: $git_repo" - if ! su - "$USER_NAME" -c "cd '$JSITE_BASE_DIR' && git clone '$git_repo' '$site_name'"; then + if ! su - "jingrow" -c "cd '$JSITE_BASE_DIR' && git clone '$git_repo' '$site_name'"; then log_error "项目克隆失败" return 1 fi @@ -372,6 +475,9 @@ create_site() { # 保存端口分配 save_port_assignment "$site_name" "$port" + # 创建.env文件 + create_env_file "$site_name" "$port" + # 创建traefik配置文件 if create_traefik_config "$site_name" "$domain" "$port"; then restart_traefik @@ -418,7 +524,7 @@ delete_site() { fi # 删除PM2配置 - su - "$USER_NAME" -c " + su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" pm2 delete '$site_name' 2>/dev/null || true @@ -431,7 +537,7 @@ delete_site() { local port_file="$JSITE_BASE_DIR/site_ports.json" if [ -f "$port_file" ] && command -v jq &> /dev/null; then jq "del(.$site_name)" "$port_file" > "${port_file}.tmp" && mv "${port_file}.tmp" "$port_file" - chown "$USER_NAME:$USER_NAME" "$port_file" 2>/dev/null || true + chown "jingrow:jingrow" "$port_file" 2>/dev/null || true fi # 删除项目目录 @@ -462,7 +568,7 @@ build_site() { # 安装依赖 log_info "安装依赖..." - if ! su - "$USER_NAME" -c " + if ! su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" cd '$JSITE_BASE_DIR/$site_name' @@ -474,7 +580,7 @@ build_site() { # 构建项目 log_info "构建项目..." - if ! su - "$USER_NAME" -c " + if ! su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" cd '$JSITE_BASE_DIR/$site_name' @@ -518,7 +624,7 @@ start_site() { fi # 使用PM2启动,设置端口环境变量 - if ! su - "$USER_NAME" -c " + if ! su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" cd '$JSITE_BASE_DIR/$site_name' @@ -562,7 +668,7 @@ stop_site() { log_info "停止网站: $site_name" - if ! su - "$USER_NAME" -c " + if ! su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" pm2 stop '$site_name' @@ -592,7 +698,7 @@ restart_site() { log_info "重启网站: $site_name" if [ "$status" = "running" ]; then - if ! su - "$USER_NAME" -c " + if ! su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" pm2 restart '$site_name' @@ -636,7 +742,7 @@ show_site_status() { # 显示PM2详细状态 if [ "$status" != "not_exists" ]; then log_info "PM2状态:" - su - "$USER_NAME" -c " + su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" pm2 list | grep -E '(App name|$site_name)' || echo '未找到PM2进程' @@ -689,7 +795,7 @@ show_site_logs() { fi log_info "网站 $site_name 的日志:" - su - "$USER_NAME" -c " + su - "jingrow" -c " export NVM_DIR=\"\$HOME/.nvm\" [ -s \"\$NVM_DIR/nvm.sh\" ] && \. \"\$NVM_DIR/nvm.sh\" pm2 logs '$site_name' @@ -721,41 +827,42 @@ main() { # 解析命令 local command="$1" - local site_name="$2" - local extra_param="$3" - local fourth_param="$4" + shift # 移除命令,剩下的都是参数 case "$command" in create) - # create命令支持第三个参数作为域名 - if [ -n "$fourth_param" ]; then - create_site "$site_name" "$extra_param" "$fourth_param" - else - create_site "$site_name" "$extra_param" - fi + parse_create_args "$@" + create_site ;; delete) + local site_name="$1" delete_site "$site_name" ;; build) + local site_name="$1" build_site "$site_name" ;; start) + local site_name="$1" start_site "$site_name" ;; stop) + local site_name="$1" stop_site "$site_name" ;; restart) + local site_name="$1" restart_site "$site_name" ;; status) + local site_name="$1" show_site_status "$site_name" ;; list) list_sites ;; logs) + local site_name="$1" show_site_logs "$site_name" ;; *)