# app/schemas/docker_remote.py from typing import Optional, Dict, Any, List from pydantic import BaseModel, Field class RemoteServerConfig(BaseModel): """远程服务器连接配置""" host: str = Field(..., description="服务器地址") port: int = Field(22, description="SSH端口") username: str = Field("root", description="SSH用户名") password: Optional[str] = Field(None, description="SSH密码") key_file: Optional[str] = Field(None, description="SSH私钥文件路径") project_path: str = Field("/root/troov-asyncio", description="项目路径") class DockerContainerStatus(BaseModel): """Docker容器状态""" name: str status: str image: str class DockerStatusOut(BaseModel): """Docker状态输出""" containers: Dict[str, DockerContainerStatus] class DockerActionRequest(RemoteServerConfig): """Docker容器操作请求""" container_name: str class DockerLogsRequest(RemoteServerConfig): """查看Docker日志请求""" container_name: str lines: int = Field(100, description="显示行数") follow: bool = Field(False, description="是否实时跟踪") class DockerLogsOut(BaseModel): """Docker日志输出""" logs: str class ConfigReadOut(BaseModel): """配置文件读取输出""" config: Dict[str, Any] class ConfigReadRequest(RemoteServerConfig): """配置文件读取请求""" config_file: str = Field(..., description="配置文件路径(相对于项目根目录)") class ConfigUpdateRequest(RemoteServerConfig): """配置文件更新请求""" config_file: str = Field(..., description="配置文件路径") key_path: str = Field(..., description="键路径,如 lockV1.sessionLimit") value: Any = Field(..., description="新值") class LogReadRequest(RemoteServerConfig): """日志读取请求""" log_file: str = Field(..., description="日志文件名或路径") lines: int = Field(100, description="行数") from_head: bool = Field(False, description="从开头读取") full: bool = Field(False, description="读取整个文件") class LogReadOut(BaseModel): """日志读取输出""" content: str class LogListOut(BaseModel): """日志列表输出""" log_files: List[str] class ServerConfigItem(BaseModel): """预配置服务器项""" id: str name: str host: str class ServerListOut(BaseModel): """预配置服务器列表输出""" servers: List[ServerConfigItem] class RemoteActionRequest(BaseModel): """基于服务器ID的远程操作请求""" server_id: str container_name: Optional[str] = None services: Optional[List[str]] = None config_file: Optional[str] = None key_path: Optional[str] = None value: Any = None log_file: Optional[str] = None lines: int = 100 from_head: bool = False full: bool = False