feat: 平台预设字典+凭证加密+分库备份+Agent采集+移动端优先前端重做

This commit is contained in:
gouki
2026-08-01 23:10:31 +00:00
parent 1dac5d8735
commit e672086b67
31 changed files with 1792 additions and 421 deletions
+43
View File
@@ -0,0 +1,43 @@
"""Agent 上报数据 Schema"""
from typing import List, Optional
from sqlmodel import SQLModel
class MetricsIn(SQLModel):
cpu_pct: Optional[float] = None
mem_pct: Optional[float] = None
disk_pct: Optional[float] = None
net_in_mb: Optional[float] = None
net_out_mb: Optional[float] = None
load_1m: Optional[float] = None
uptime_sec: Optional[int] = None
class ServerInfoIn(SQLModel):
hostname: Optional[str] = None
os: Optional[str] = None
kernel: Optional[str] = None
cpu_cores: Optional[int] = None
mem_total_gb: Optional[float] = None
disk_total_gb: Optional[float] = None
public_ip: Optional[str] = None
tailscale_ip: Optional[str] = None
status: Optional[str] = "online"
class SecurityCheckIn(SQLModel):
check_item: str
status: str = "unknown" # pass/warn/fail/unknown
detail: Optional[str] = None
suggestion: Optional[str] = None
class AgentReport(SQLModel):
"""Agent 单次上报的完整数据包"""
asset_id: int
metrics: Optional[MetricsIn] = None
server_info: Optional[ServerInfoIn] = None
security: Optional[List[SecurityCheckIn]] = None
+29 -1
View File
@@ -30,6 +30,11 @@ class VPSDetailIn(SQLModel):
bandwidth_gb: Optional[int] = None
ssh_port: int = 22
panel_url: Optional[str] = None
ssh_user: Optional[str] = None
login_method: Optional[str] = "key"
ssh_key: Optional[str] = None # 明文输入,服务端加密存储
password: Optional[str] = None # 明文输入,服务端加密存储
purpose: Optional[str] = None
class DomainDetailIn(SQLModel):
@@ -41,6 +46,7 @@ class DomainDetailIn(SQLModel):
cloudflare_account: Optional[str] = None
is_using: bool = True
redirect_target: Optional[str] = None
bind_asset_id: Optional[int] = None
class AIAccountIn(SQLModel):
@@ -64,6 +70,8 @@ class AssetBase(SQLModel):
name: str
asset_type: AssetType
provider: str
provider_id: Optional[int] = None
renewal_cycle: Optional[str] = None
account: Optional[str] = None
expiry_date: Optional[date] = None
auto_renew: bool = False
@@ -88,6 +96,8 @@ class AssetUpdate(SQLModel):
name: Optional[str] = None
asset_type: Optional[AssetType] = None
provider: Optional[str] = None
provider_id: Optional[int] = None
renewal_cycle: Optional[str] = None
account: Optional[str] = None
expiry_date: Optional[date] = None
auto_renew: Optional[bool] = None
@@ -104,9 +114,26 @@ class AssetUpdate(SQLModel):
# --------------------------------------------------------------------------- #
# 输出模型
# --------------------------------------------------------------------------- #
class VPSDetailRead(VPSDetailIn):
class VPSDetailRead(SQLModel):
"""VPS 详情输出(不含敏感明文,仅返回凭证存在标记)"""
id: int
asset_id: int
ip_address: str
tailscale_ip: Optional[str] = None
region: Optional[str] = None
os: Optional[str] = None
cpu_cores: int = 1
memory_gb: float = 1
disk_gb: int = 20
bandwidth_gb: Optional[int] = None
ssh_port: int = 22
panel_url: Optional[str] = None
ssh_user: Optional[str] = None
login_method: Optional[str] = "key"
purpose: Optional[str] = None
has_ssh_key: bool = False
has_password: bool = False
class DomainDetailRead(DomainDetailIn):
@@ -127,6 +154,7 @@ class AssetRead(AssetBase):
created_at: datetime
updated_at: datetime
days_to_expiry: Optional[int] = None
provider_name: Optional[str] = None
vps_detail: Optional[VPSDetailRead] = None
domain_detail: Optional[DomainDetailRead] = None
ai_detail: Optional[AIAccountRead] = None
+45
View File
@@ -0,0 +1,45 @@
"""平台/服务商 Schema"""
from datetime import datetime
from typing import Optional
from sqlmodel import SQLModel
from app.models.provider import ProviderCategory
class ProviderBase(SQLModel):
slug: str
name: str
name_en: Optional[str] = None
category: ProviderCategory
website: Optional[str] = None
console_url: Optional[str] = None
sdk_type: Optional[str] = None
enabled: bool = True
remark: Optional[str] = None
class ProviderCreate(ProviderBase):
"""创建平台;api_config 为明文 JSON 字符串,服务端加密存储"""
api_config: Optional[str] = None
class ProviderUpdate(SQLModel):
slug: Optional[str] = None
name: Optional[str] = None
name_en: Optional[str] = None
category: Optional[ProviderCategory] = None
website: Optional[str] = None
console_url: Optional[str] = None
sdk_type: Optional[str] = None
enabled: Optional[bool] = None
remark: Optional[str] = None
api_config: Optional[str] = None
class ProviderRead(ProviderBase):
id: int
created_at: datetime
has_api_config: bool = False