feat: 平台预设字典+凭证加密+分库备份+Agent采集+移动端优先前端重做
This commit is contained in:
+17
-1
@@ -42,7 +42,13 @@ class Asset(SQLModel, table=True):
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str = Field(index=True, description="资产名称,如:博客主站 VPS")
|
||||
asset_type: AssetType = Field(index=True, description="资产类型")
|
||||
provider: str = Field(index=True, description="服务商,如 aliyun/vultr/namesilo/openai")
|
||||
provider: str = Field(index=True, description="服务商 slug,如 aliyun/vultr/namesilo/openai")
|
||||
provider_id: Optional[int] = Field(
|
||||
default=None, foreign_key="providers.id", index=True, description="关联平台 ID"
|
||||
)
|
||||
renewal_cycle: Optional[str] = Field(
|
||||
default=None, description="续费周期:monthly/quarterly/yearly"
|
||||
)
|
||||
account: Optional[str] = Field(
|
||||
default=None, description="所属账号标识(如 Cloudflare 账号邮箱)"
|
||||
)
|
||||
@@ -84,6 +90,13 @@ class VPSDetail(SQLModel, table=True):
|
||||
bandwidth_gb: Optional[int] = Field(default=None, description="月流量配额(GB)")
|
||||
ssh_port: int = Field(default=22, description="SSH 端口")
|
||||
panel_url: Optional[str] = Field(default=None, description="服务商管理面板 URL")
|
||||
ssh_user: Optional[str] = Field(default=None, description="SSH 登录用户,如 root")
|
||||
login_method: Optional[str] = Field(
|
||||
default="key", description="登录方式:key/password/other"
|
||||
)
|
||||
ssh_key_encrypted: Optional[str] = Field(default=None, description="加密的 SSH 私钥")
|
||||
password_encrypted: Optional[str] = Field(default=None, description="加密的登录密码")
|
||||
purpose: Optional[str] = Field(default=None, description="用途 / 运行的项目")
|
||||
|
||||
|
||||
class DomainDetail(SQLModel, table=True):
|
||||
@@ -109,6 +122,9 @@ class DomainDetail(SQLModel, table=True):
|
||||
redirect_target: Optional[str] = Field(
|
||||
default=None, description="若为跳转用途域名,填写目标地址"
|
||||
)
|
||||
bind_asset_id: Optional[int] = Field(
|
||||
default=None, index=True, description="绑定的资产 ID(如关联的 VPS/项目)"
|
||||
)
|
||||
|
||||
|
||||
class AIAccount(SQLModel, table=True):
|
||||
|
||||
@@ -0,0 +1,76 @@
|
||||
"""监控与日志模型(存储于 metrics.db)
|
||||
|
||||
- MetricPoint: 资源监控时序数据(Agent 上报)
|
||||
- ServerInfo: 服务器基础信息快照(Agent 上报)
|
||||
- SecurityCheck: 安全检查项结果
|
||||
- EventLog: 系统事件日志
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
|
||||
class MetricPoint(SQLModel, table=True):
|
||||
"""资源监控时序数据"""
|
||||
|
||||
__tablename__ = "metric_points"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
asset_id: int = Field(index=True, description="关联资产 ID")
|
||||
ts: datetime = Field(default_factory=datetime.utcnow, index=True, description="采集时间")
|
||||
cpu_pct: Optional[float] = Field(default=None, description="CPU 使用率 %")
|
||||
mem_pct: Optional[float] = Field(default=None, description="内存使用率 %")
|
||||
disk_pct: Optional[float] = Field(default=None, description="磁盘使用率 %")
|
||||
net_in_mb: Optional[float] = Field(default=None, description="网络入流量 MB(采样间隔)")
|
||||
net_out_mb: Optional[float] = Field(default=None, description="网络出流量 MB(采样间隔)")
|
||||
load_1m: Optional[float] = Field(default=None, description="1 分钟负载")
|
||||
uptime_sec: Optional[int] = Field(default=None, description="运行时长(秒)")
|
||||
|
||||
|
||||
class ServerInfo(SQLModel, table=True):
|
||||
"""服务器基础信息快照(每个资产一条,覆盖更新)"""
|
||||
|
||||
__tablename__ = "server_info"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
# 逻辑关联 assets.id(跨库不设物理外键)
|
||||
asset_id: int = Field(unique=True, index=True)
|
||||
hostname: Optional[str] = Field(default=None)
|
||||
os: Optional[str] = Field(default=None, description="操作系统发行版")
|
||||
kernel: Optional[str] = Field(default=None, description="内核版本")
|
||||
cpu_cores: Optional[int] = Field(default=None)
|
||||
mem_total_gb: Optional[float] = Field(default=None)
|
||||
disk_total_gb: Optional[float] = Field(default=None)
|
||||
public_ip: Optional[str] = Field(default=None)
|
||||
tailscale_ip: Optional[str] = Field(default=None)
|
||||
status: Optional[str] = Field(default="online", description="online/offline")
|
||||
last_seen: datetime = Field(default_factory=datetime.utcnow, description="最近上报时间")
|
||||
|
||||
|
||||
class SecurityCheck(SQLModel, table=True):
|
||||
"""安全检查项结果"""
|
||||
|
||||
__tablename__ = "security_checks"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
asset_id: int = Field(index=True)
|
||||
ts: datetime = Field(default_factory=datetime.utcnow, index=True)
|
||||
check_item: str = Field(description="检查项,如 ssh_config/firewall/updates")
|
||||
status: str = Field(default="unknown", description="pass/warn/fail/unknown")
|
||||
detail: Optional[str] = Field(default=None, description="检查详情")
|
||||
suggestion: Optional[str] = Field(default=None, description="加固建议")
|
||||
|
||||
|
||||
class EventLog(SQLModel, table=True):
|
||||
"""系统事件日志"""
|
||||
|
||||
__tablename__ = "event_logs"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
ts: datetime = Field(default_factory=datetime.utcnow, index=True)
|
||||
level: str = Field(default="info", index=True, description="info/warning/error")
|
||||
source: str = Field(default="system", description="来源,如 agent/api/backup")
|
||||
asset_id: Optional[int] = Field(default=None, index=True)
|
||||
message: str = Field(description="事件内容")
|
||||
@@ -0,0 +1,44 @@
|
||||
"""平台/服务商注册表模型
|
||||
|
||||
Provider 是资产的归属平台预设字典,提供唯一标识(slug),
|
||||
为未来按平台对接 SDK(自动同步 VPS/域名/AI 状态)打基础。
|
||||
"""
|
||||
|
||||
from datetime import datetime
|
||||
from enum import Enum
|
||||
from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
|
||||
class ProviderCategory(str, Enum):
|
||||
"""平台分类"""
|
||||
|
||||
VPS = "vps" # 云服务器
|
||||
DOMAIN = "domain" # 域名注册商
|
||||
AI_AGENT = "ai_agent" # AI 服务商
|
||||
CLOUDFLARE = "cloudflare" # Cloudflare(DNS/Workers/R2/Tunnel/Mail)
|
||||
OTHER = "other" # 其他
|
||||
|
||||
|
||||
class Provider(SQLModel, table=True):
|
||||
"""平台/服务商(预设 + 自定义)"""
|
||||
|
||||
__tablename__ = "providers"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
slug: str = Field(index=True, unique=True, description="唯一标识,如 aliyun/vultr/openai")
|
||||
name: str = Field(index=True, description="显示名,如 阿里云")
|
||||
name_en: Optional[str] = Field(default=None, description="英文名")
|
||||
category: ProviderCategory = Field(index=True, description="平台分类")
|
||||
website: Optional[str] = Field(default=None, description="官网")
|
||||
console_url: Optional[str] = Field(default=None, description="管理面板 URL")
|
||||
sdk_type: Optional[str] = Field(
|
||||
default=None, description="SDK 类型标识,如 aliyun-sdk/vultr-api(供扩展用)"
|
||||
)
|
||||
api_config_encrypted: Optional[str] = Field(
|
||||
default=None, description="加密的 API 配置 JSON(access_key/secret 等)"
|
||||
)
|
||||
enabled: bool = Field(default=True, description="是否启用")
|
||||
remark: Optional[str] = Field(default=None, description="备注")
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow, description="创建时间")
|
||||
Reference in New Issue
Block a user