feat: 综合平台services多服务支持+SW网络优先缓存修复+适配层/定时任务完善
This commit is contained in:
+8
-3
@@ -11,8 +11,11 @@ from datetime import date, datetime
|
||||
from enum import Enum
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import Index
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
from app.core.timeutils import utcnow
|
||||
|
||||
|
||||
class AssetType(str, Enum):
|
||||
"""资产类型"""
|
||||
@@ -38,6 +41,8 @@ class Asset(SQLModel, table=True):
|
||||
"""资产主表:所有资产在此统一登记,用于续费提醒与状态总览"""
|
||||
|
||||
__tablename__ = "assets"
|
||||
# SDK 同步去重查询:provider_id + external_id + asset_type
|
||||
__table_args__ = (Index("ix_assets_provider_ext_type", "provider_id", "external_id", "asset_type"),)
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
name: str = Field(index=True, description="资产名称,如:博客主站 VPS")
|
||||
@@ -72,10 +77,10 @@ class Asset(SQLModel, table=True):
|
||||
default=False, description="已归档:不再使用但可能仍在续费,需重点排查"
|
||||
)
|
||||
remark: Optional[str] = Field(default=None, description="备注")
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow, description="创建时间")
|
||||
created_at: datetime = Field(default_factory=utcnow, description="创建时间")
|
||||
updated_at: datetime = Field(
|
||||
default_factory=datetime.utcnow,
|
||||
sa_column_kwargs={"onupdate": datetime.utcnow},
|
||||
default_factory=utcnow,
|
||||
sa_column_kwargs={"onupdate": utcnow},
|
||||
description="更新时间",
|
||||
)
|
||||
|
||||
|
||||
@@ -9,17 +9,21 @@
|
||||
from datetime import datetime
|
||||
from typing import Optional
|
||||
|
||||
from sqlalchemy import Index
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
from app.core.timeutils import utcnow
|
||||
|
||||
|
||||
class MetricPoint(SQLModel, table=True):
|
||||
"""资源监控时序数据"""
|
||||
|
||||
__tablename__ = "metric_points"
|
||||
__table_args__ = (Index("ix_metric_points_asset_ts", "asset_id", "ts"),)
|
||||
|
||||
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="采集时间")
|
||||
ts: datetime = Field(default_factory=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="磁盘使用率 %")
|
||||
@@ -46,17 +50,18 @@ class ServerInfo(SQLModel, table=True):
|
||||
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="最近上报时间")
|
||||
last_seen: datetime = Field(default_factory=utcnow, description="最近上报时间")
|
||||
|
||||
|
||||
class SecurityCheck(SQLModel, table=True):
|
||||
"""安全检查项结果"""
|
||||
|
||||
__tablename__ = "security_checks"
|
||||
__table_args__ = (Index("ix_security_checks_asset_ts", "asset_id", "ts"),)
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
asset_id: int = Field(index=True)
|
||||
ts: datetime = Field(default_factory=datetime.utcnow, index=True)
|
||||
ts: datetime = Field(default_factory=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="检查详情")
|
||||
@@ -69,7 +74,7 @@ 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)
|
||||
ts: datetime = Field(default_factory=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)
|
||||
|
||||
@@ -10,6 +10,8 @@ from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
from app.core.timeutils import utcnow
|
||||
|
||||
|
||||
class ProviderCategory(str, Enum):
|
||||
"""平台分类"""
|
||||
@@ -31,6 +33,9 @@ class Provider(SQLModel, table=True):
|
||||
name: str = Field(index=True, description="显示名,如 阿里云")
|
||||
name_en: Optional[str] = Field(default=None, description="英文名")
|
||||
category: ProviderCategory = Field(index=True, description="平台分类")
|
||||
services: str = Field(
|
||||
default="", description="提供的服务列表(逗号分隔):vps/domain/ai_agent/cloudflare/ssl_cert/cdn/dns/other,综合平台可多项"
|
||||
)
|
||||
website: Optional[str] = Field(default=None, description="官网")
|
||||
console_url: Optional[str] = Field(default=None, description="管理面板 URL")
|
||||
sdk_type: Optional[str] = Field(
|
||||
@@ -44,4 +49,4 @@ class Provider(SQLModel, table=True):
|
||||
last_synced_at: Optional[datetime] = Field(
|
||||
default=None, description="最近一次 SDK 同步时间"
|
||||
)
|
||||
created_at: datetime = Field(default_factory=datetime.utcnow, description="创建时间")
|
||||
created_at: datetime = Field(default_factory=utcnow, description="创建时间")
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
"""SSL 相关数据库模型
|
||||
|
||||
- Subdomain: 域名资产下的子域名记录(关联域名资产 Asset)
|
||||
- SiteCert: 站点证书监控记录(探测 https 站点证书的到期情况)
|
||||
"""
|
||||
|
||||
from datetime import date, datetime
|
||||
from typing import Optional
|
||||
|
||||
from sqlmodel import Field, SQLModel
|
||||
|
||||
from app.core.timeutils import utcnow
|
||||
|
||||
|
||||
class Subdomain(SQLModel, table=True):
|
||||
"""子域名记录(挂在域名资产下)"""
|
||||
|
||||
__tablename__ = "subdomains"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
asset_id: int = Field(
|
||||
foreign_key="assets.id", index=True, description="所属域名资产 ID"
|
||||
)
|
||||
host: str = Field(index=True, description="子域名主机名,如 www / api / blog(@ 表示根域名)")
|
||||
record_type: Optional[str] = Field(
|
||||
default=None, description="DNS 记录类型:A/CNAME/AAAA/MX/TXT"
|
||||
)
|
||||
record_value: Optional[str] = Field(
|
||||
default=None, description="DNS 记录值(IP 或目标域名)"
|
||||
)
|
||||
is_active: bool = Field(default=True, description="是否启用/解析中")
|
||||
note: Optional[str] = Field(default=None, description="备注(用途)")
|
||||
created_at: datetime = Field(default_factory=utcnow, description="创建时间")
|
||||
updated_at: datetime = Field(
|
||||
default_factory=utcnow,
|
||||
sa_column_kwargs={"onupdate": utcnow},
|
||||
description="更新时间",
|
||||
)
|
||||
|
||||
|
||||
class SiteCert(SQLModel, table=True):
|
||||
"""站点证书监控记录(探测 https 站点证书到期情况)"""
|
||||
|
||||
__tablename__ = "site_certs"
|
||||
|
||||
id: Optional[int] = Field(default=None, primary_key=True)
|
||||
hostname: str = Field(index=True, description="探测目标主机名,如 www.example.com")
|
||||
port: int = Field(default=443, description="探测端口")
|
||||
asset_id: Optional[int] = Field(
|
||||
default=None, foreign_key="assets.id", index=True, description="关联资产 ID(可选)"
|
||||
)
|
||||
issuer: Optional[str] = Field(default=None, description="签发机构 CN")
|
||||
subject_cn: Optional[str] = Field(default=None, description="证书主体 CN")
|
||||
valid_from: Optional[date] = Field(default=None, description="证书生效日期")
|
||||
valid_to: Optional[date] = Field(default=None, description="证书到期日期")
|
||||
fingerprint: Optional[str] = Field(default=None, description="证书指纹 SHA-256")
|
||||
status: str = Field(
|
||||
default="unknown",
|
||||
index=True,
|
||||
description="状态:valid/expiring/expired/error/unknown",
|
||||
)
|
||||
error: Optional[str] = Field(default=None, description="探测失败原因")
|
||||
last_checked_at: Optional[datetime] = Field(default=None, description="最近探测时间")
|
||||
created_at: datetime = Field(default_factory=utcnow, description="创建时间")
|
||||
updated_at: datetime = Field(
|
||||
default_factory=utcnow,
|
||||
sa_column_kwargs={"onupdate": utcnow},
|
||||
description="更新时间",
|
||||
)
|
||||
Reference in New Issue
Block a user