feat: 平台预设字典+凭证加密+分库备份+Agent采集+移动端优先前端重做
This commit is contained in:
@@ -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
@@ -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
|
||||
|
||||
@@ -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
|
||||
Reference in New Issue
Block a user