diff --git a/jcloud/api/aliyun_server_light.py b/jcloud/api/aliyun_server_light.py index 3227635..3f20458 100644 --- a/jcloud/api/aliyun_server_light.py +++ b/jcloud/api/aliyun_server_light.py @@ -1886,8 +1886,46 @@ def get_jingrow_firewall_rules(**data): return {"success": False, "message": f"防火墙规则查询失败: {str(e)}"} @jingrow.whitelist() -def execute_jsite_task(instance_id, site_name, git_repo, site_url, revalidate_token, jingrow_server_url, jingrow_api_key, jingrow_api_secret, region_id='cn-shanghai'): - """在实例上安装Jsite前端""" +def execute_jsite_task(instance_id, region_id, mode='deploy', **kwargs): + """在实例上执行Jsite任务 + + Args: + instance_id: 实例ID + region_id: 地域ID + mode: 任务模式,默认为'deploy' + **kwargs: 包含以下参数: + 必需参数: + - site_name: 项目名称 + + 可选参数: + - git_repo: Git仓库地址 + - site_url: 网站URL + - revalidate_token: 重新验证令牌 + - backend_server_url: 后端服务器URL + - backend_api_key: 后端API密钥 + - backend_api_secret: 后端API密钥 + - node_version: Node.js版本 + - start_port: 起始端口 + - port_increment: 端口增量 + - skip_docker: 跳过Docker安装 + - skip_traefik: 跳过Traefik安装 + - skip_dependencies: 跳过依赖安装 + - skip_pm2: 跳过PM2安装 + - force_update: 强制更新所有文件 + - public_ip: 公网IP地址 + + 任务模式 (mode参数): + - deploy: 完整部署模式 (默认) + - create: 创建新网站 + - delete: 删除网站 + - build: 构建网站 + - start: 启动网站 + - stop: 停止网站 + - restart: 重启网站 + - status: 查看网站状态 + - list: 列出所有网站 + - logs: 查看网站日志 + """ try: # 验证实例ID是否存在 server = jingrow.get_pg("Jsite Server", {"instance_id": instance_id}) @@ -1898,25 +1936,96 @@ def execute_jsite_task(instance_id, site_name, git_repo, site_url, revalidate_to if not region_id: region_id = server.region - # 构建命令内容 - command_content = 'curl -s -o /tmp/execute_jsite_task.sh https://cloud.jingrow.com//files/execute_jsite_task.sh && chmod +x /tmp/execute_jsite_task.sh && /tmp/execute_jsite_task.sh --site-name {{site_name}} --git-repo {{git_repo}} --site-url {{site_url}} --revalidate-token {{revalidate_token}} --server-url {{jingrow_server_url}} --api-key {{jingrow_api_key}} --api-secret {{jingrow_api_secret}}' + # 构建基础命令内容 + command_content = 'curl -s -o /tmp/jsite.sh http://git.jingrow.com:3000/shell/jshells/raw/branch/main/jsite.sh && chmod +x /tmp/jsite.sh && /tmp/jsite.sh' - # 构建参数 - parameters = { - 'site_name': site_name, - 'git_repo': git_repo, - 'site_url': site_url, - 'revalidate_token': revalidate_token, - 'jingrow_server_url': jingrow_server_url, - 'jingrow_api_key': jingrow_api_key, - 'jingrow_api_secret': jingrow_api_secret - } + # 从kwargs中获取参数 + site_name = kwargs.get('site_name') + git_repo = kwargs.get('git_repo') + site_url = kwargs.get('site_url') + revalidate_token = kwargs.get('revalidate_token') + backend_server_url = kwargs.get('backend_server_url') + backend_api_key = kwargs.get('backend_api_key') + backend_api_secret = kwargs.get('backend_api_secret') + + # 验证必要参数(只有site_name是必须的) + if not site_name: + return {"success": False, "message": "缺少必要的参数: site_name"} + + # 构建基础参数(只包含存在的参数) + parameters = {'site_name': site_name, 'mode': mode} + + # 只有当参数存在且不为空时才添加到parameters和命令中 + if git_repo: + parameters['git_repo'] = git_repo + command_content += ' --git-repo {{git_repo}}' + + if site_url: + parameters['site_url'] = site_url + command_content += ' --site-url {{site_url}}' + + if revalidate_token: + parameters['revalidate_token'] = revalidate_token + command_content += ' --revalidate-token {{revalidate_token}}' + + if backend_server_url: + parameters['backend_server_url'] = backend_server_url + command_content += ' --backend-server-url {{backend_server_url}}' + + if backend_api_key: + parameters['backend_api_key'] = backend_api_key + command_content += ' --backend-api-key {{backend_api_key}}' + + if backend_api_secret: + parameters['backend_api_secret'] = backend_api_secret + command_content += ' --backend-api-secret {{backend_api_secret}}' + + # 添加可选参数 + if 'node_version' in kwargs: + parameters['node_version'] = kwargs['node_version'] + command_content += ' --node-version {{node_version}}' + + if 'start_port' in kwargs: + parameters['start_port'] = kwargs['start_port'] + command_content += ' --start-port {{start_port}}' + + if 'port_increment' in kwargs: + parameters['port_increment'] = kwargs['port_increment'] + command_content += ' --port-increment {{port_increment}}' + + if kwargs.get('skip_docker', False): + command_content += ' --skip-docker' + + if kwargs.get('skip_traefik', False): + command_content += ' --skip-traefik' + + if kwargs.get('skip_dependencies', False): + command_content += ' --skip-dependencies' + + if kwargs.get('skip_pm2', False): + command_content += ' --skip-pm2' + + if kwargs.get('force_update', False): + command_content += ' --force-update' + + if 'public_ip' in kwargs: + parameters['public_ip'] = kwargs['public_ip'] + command_content += ' --public-ip {{public_ip}}' + + # 添加site-name和mode到命令(这些是基础参数) + command_content += ' --site-name {{site_name}} --mode {{mode}}' + + # 统一超时时间 + timeout = 3600 + + # 命令名称直接使用mode值 + command_name = mode manager = _get_manager() - result = manager.run_command(instance_id, command_content, parameters, 'installJsite', region_id, 3600) + result = manager.run_command(instance_id, command_content, parameters, command_name, region_id, timeout) return result except Exception as e: - jingrow.log_error("安装Jsite失败", f"在实例 {instance_id} 上安装Jsite时发生错误: {str(e)}") - return {"success": False, "error": str(e), "message": "安装Jsite失败"} + jingrow.log_error("执行Jsite任务失败", f"在实例 {instance_id} 上执行Jsite任务 {mode} 时发生错误: {str(e)}") + return {"success": False, "error": str(e), "message": f"执行Jsite任务 {mode} 失败"}