优化应用安装,使用jingrow标准方式上传应用包

This commit is contained in:
jingrow 2025-10-26 16:17:47 +08:00
parent c2056e7042
commit 15ec6a54b0

View File

@ -644,11 +644,9 @@ async def get_app_meta():
@router.post("/jingrow/install-extension")
async def install_extension_package_api(request: Request, file: UploadFile = File(...)):
"""安装扩展包到数据库"""
temp_file_path = None
try:
log_info(f"开始处理上传的扩展包: {file.filename}")
# 验证文件类型
if not file.filename:
raise HTTPException(status_code=400, detail="文件名不能为空")
@ -656,87 +654,57 @@ async def install_extension_package_api(request: Request, file: UploadFile = Fil
if not filename_lower.endswith(('.tar.gz', '.tgz', '.gz')):
raise HTTPException(status_code=400, detail=f"只支持TAR.GZ格式的扩展包当前文件: {filename_lower}")
# 保存上传文件到临时目录
temp_file = tempfile.NamedTemporaryFile(delete=False, suffix='.tar.gz')
temp_file_path = temp_file.name
try:
content = await file.read()
if not content:
raise HTTPException(status_code=400, detail="文件内容为空")
temp_file.write(content)
temp_file.close()
log_info(f"文件已保存到临时位置: {temp_file_path}, 大小: {len(content)} 字节")
# 保存文件到 jingrow-bench/sites/test001/public/files/
target_dir = Path('/home/jingrow/jingrow-bench/sites/test001/public/files')
target_dir.mkdir(parents=True, exist_ok=True)
target_path = target_dir / file.filename
# 复制文件
shutil.copy2(temp_file_path, target_path)
# 修复文件权限和所有者
import pwd
try:
jingrow_user = pwd.getpwnam('jingrow')
os.chown(target_path, jingrow_user.pw_uid, jingrow_user.pw_gid)
os.chmod(target_path, 0o644)
log_info(f"文件权限已修复: owner=jingrow, permissions=644")
except Exception as perm_error:
log_error(f"修复文件权限失败: {perm_error}")
log_info(f"文件已保存到: {target_path}")
# 调用 install_package API 安装
from jingrow.utils.jingrow_api import get_jingrow_api_headers
import requests
api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.install_package"
headers = get_jingrow_api_headers()
file_url = f"/files/{file.filename}"
response = requests.post(
api_url,
json={'package_file_url': file_url},
headers=headers,
timeout=60
)
if response.status_code == 200:
result_data = response.json()
if result_data.get('message', {}).get('success'):
log_info(f"扩展包安装成功: {result_data['message'].get('package_name')}")
return {
'success': True,
'package_name': result_data['message']['package_name'],
'file_url': file_url,
'file_count': result_data['message'].get('file_count', 0)
}
else:
error_msg = result_data.get('message', {}).get('error', '未知错误')
log_error(f"安装失败: {error_msg}")
raise HTTPException(status_code=400, detail=error_msg)
content = await file.read()
if not content:
raise HTTPException(status_code=400, detail="文件内容为空")
log_info(f"读取文件完成,大小: {len(content)} 字节")
# 使用标准文件上传接口
from jingrow.utils.jingrow_api import upload_file_to_jingrow, get_jingrow_api_headers
import requests
upload_result = upload_file_to_jingrow(content, file.filename)
if not upload_result.get('success'):
raise HTTPException(status_code=400, detail=upload_result.get('error', '文件上传失败'))
file_url = upload_result['file_url']
log_info(f"文件上传成功: {file_url}")
# 调用 install_package API 安装
api_url = f"{Config.jingrow_server_url}/api/action/jingrow.ai.utils.jlocal.install_package"
headers = get_jingrow_api_headers()
response = requests.post(
api_url,
json={'package_file_url': file_url},
headers=headers,
timeout=60
)
if response.status_code == 200:
result_data = response.json()
if result_data.get('message', {}).get('success'):
log_info(f"扩展包安装成功: {result_data['message'].get('package_name')}")
return {
'success': True,
'package_name': result_data['message']['package_name'],
'file_url': file_url,
'file_count': result_data['message'].get('file_count', 0)
}
else:
log_error(f"API调用失败: HTTP {response.status_code}")
raise HTTPException(status_code=500, detail=f'安装API调用失败: HTTP {response.status_code}')
finally:
# 清理临时文件
if temp_file_path:
try:
os.unlink(temp_file_path)
log_info(f"临时文件已删除: {temp_file_path}")
except Exception as cleanup_error:
log_error(f"清理临时文件失败: {cleanup_error}")
error_msg = result_data.get('message', {}).get('error', '未知错误')
log_error(f"安装失败: {error_msg}")
raise HTTPException(status_code=400, detail=error_msg)
else:
log_error(f"API调用失败: HTTP {response.status_code}")
raise HTTPException(status_code=500, detail=f'安装API调用失败: HTTP {response.status_code}')
except HTTPException:
raise
except Exception as e:
import traceback
error_detail = traceback.format_exc()
log_error(f"安装扩展包失败: {str(e)}\n{error_detail}")
log_error(f"安装扩展包失败: {str(e)}")
raise HTTPException(status_code=500, detail=f"安装扩展包失败: {str(e)}")