main #2

Merged
jingrow merged 250 commits from main into v1 2026-01-13 22:45:50 +08:00
3 changed files with 56 additions and 45 deletions
Showing only changes of commit d26bd67dd6 - Show all commits

View File

@ -553,38 +553,7 @@ def create_aliyun_server(order_name):
server.running_status = "运行中"
server.instance_id = instance_id
server.save(ignore_permissions=True)
# 自动创建密钥对
try:
key_pair_name = f"{region_id}-{instance_id[:8]}"
key_pair_result = create_aliyun_instance_key_pair(instance_id, key_pair_name, region_id)
# 打印密钥对创建结果到后台日志
jingrow.log_error("密钥对创建结果", f"实例 {instance_id} 的密钥对创建结果: {key_pair_result}")
if key_pair_result and key_pair_result.get('success'):
jingrow.log_error("密钥对创建成功", f"实例 {instance_id} 自动创建密钥对 {key_pair_name} 成功")
# 获取并保存密钥对信息
key_pair_data = key_pair_result.get('data', {})
private_key = key_pair_data.get('private_key')
if private_key:
# 保存私钥到服务器记录中(阿里云不返回公钥,会自动配置到实例中)
server.key_pair_name = key_pair_name
server.private_key = private_key
# 公钥字段留空,因为阿里云会自动处理
server.public_key = ""
jingrow.log_error("私钥已保存", f"实例 {instance_id} 的私钥已保存到服务器记录中,公钥由阿里云自动配置")
else:
jingrow.log_error("私钥获取失败", f"实例 {instance_id} 创建密钥对成功但未获取到私钥")
server.save(ignore_permissions=True)
else:
jingrow.log_error("密钥对创建失败", f"实例 {instance_id} 自动创建密钥对失败: {key_pair_result.get('message', '未知错误')}")
except Exception as key_error:
jingrow.log_error("密钥对创建异常", f"实例 {instance_id} 自动创建密钥对时发生异常: {str(key_error)}")
# 更新订单状态
order.status = "交易成功"
order.save(ignore_permissions=True)
@ -595,4 +564,45 @@ def create_aliyun_server(order_name):
except Exception as e:
jingrow.log_error("服务器创建失败", f"订单 {order_name}: {str(e)}")
raise e
raise e
@jingrow.whitelist()
def create_server_key_pair(instance_id):
"""为实例创建密钥对并保存私钥"""
try:
# 查找对应的服务器记录获取region_id
server = jingrow.get_pg("Jsite Server", {"instance_id": instance_id})
if not server:
jingrow.log_error("找不到对应的服务器记录")
region_id = server.region
key_pair_name = f"{region_id}-{instance_id[:8]}"
# 调用阿里云API创建密钥对
key_pair_result = create_aliyun_instance_key_pair(instance_id, key_pair_name, region_id)
if not key_pair_result or not key_pair_result.get('success'):
jingrow.log_error(f"密钥对创建失败: {key_pair_result.get('message', '未知错误')}")
# 获取私钥
key_pair_data = key_pair_result.get('data', {})
private_key = key_pair_data.get('private_key')
if private_key:
# 保存私钥到服务器记录
server.key_pair_name = key_pair_name
server.private_key = private_key
server.save(ignore_permissions=True)
return {
"success": True,
"message": "密钥对创建成功",
"key_pair_name": key_pair_name,
"private_key": private_key
}
else:
jingrow.log_error("密钥对创建成功但未获取到私钥")
except Exception as e:
jingrow.log_error("创建密钥对失败", f"实例 {instance_id}: {str(e)}")
return {"success": False, "message": str(e)}

View File

@ -21,7 +21,7 @@
"end_date",
"memory",
"bandwidth",
"ip",
"public_ip",
"running_status",
"period",
"ssh_section",
@ -57,14 +57,6 @@
"label": "团队",
"options": "Team"
},
{
"fetch_from": "virtual_machine.public_ip_address",
"fieldname": "ip",
"fieldtype": "Data",
"in_list_view": 1,
"label": "公网IP",
"read_only": 1
},
{
"collapsible": 1,
"fieldname": "ssh_section",
@ -95,7 +87,8 @@
"fieldname": "instance_id",
"fieldtype": "Data",
"label": "实例ID",
"read_only": 1
"read_only": 1,
"unique": 1
},
{
"fieldname": "end_date",
@ -181,11 +174,19 @@
"fieldname": "private_key",
"fieldtype": "Text",
"label": "Private Key私钥"
},
{
"fetch_from": "virtual_machine.public_ip_address",
"fieldname": "public_ip",
"fieldtype": "Data",
"in_list_view": 1,
"label": "公网IP",
"read_only": 1
}
],
"index_web_pages_for_search": 1,
"links": [],
"modified": "2025-07-28 00:57:19.288916",
"modified": "2025-07-28 13:48:36.022662",
"modified_by": "Administrator",
"module": "Jcloud",
"name": "Jsite Server",

View File

@ -19,12 +19,12 @@ class JsiteServer(Document):
disk_size: DF.Data | None
end_date: DF.Date | None
instance_id: DF.Data | None
ip: DF.Data | None
memory: DF.Data | None
order_id: DF.Data | None
period: DF.Int
planid: DF.Data | None
private_key: DF.Text | None
public_ip: DF.Data | None
region: DF.Data | None
running_status: DF.Literal["", "\u8fd0\u884c\u4e2d", "\u5df2\u505c\u673a"]
ssh_port: DF.Int