docker_remote.py 2.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104
  1. # app/schemas/docker_remote.py
  2. from typing import Optional, Dict, Any, List
  3. from pydantic import BaseModel, Field
  4. class RemoteServerConfig(BaseModel):
  5. """远程服务器连接配置"""
  6. host: str = Field(..., description="服务器地址")
  7. port: int = Field(22, description="SSH端口")
  8. username: str = Field("root", description="SSH用户名")
  9. password: Optional[str] = Field(None, description="SSH密码")
  10. key_file: Optional[str] = Field(None, description="SSH私钥文件路径")
  11. project_path: str = Field("/root/troov-asyncio", description="项目路径")
  12. class DockerContainerStatus(BaseModel):
  13. """Docker容器状态"""
  14. name: str
  15. status: str
  16. image: str
  17. class DockerStatusOut(BaseModel):
  18. """Docker状态输出"""
  19. containers: Dict[str, DockerContainerStatus]
  20. class DockerActionRequest(RemoteServerConfig):
  21. """Docker容器操作请求"""
  22. container_name: str
  23. class DockerLogsRequest(RemoteServerConfig):
  24. """查看Docker日志请求"""
  25. container_name: str
  26. lines: int = Field(100, description="显示行数")
  27. follow: bool = Field(False, description="是否实时跟踪")
  28. class DockerLogsOut(BaseModel):
  29. """Docker日志输出"""
  30. logs: str
  31. class ConfigReadOut(BaseModel):
  32. """配置文件读取输出"""
  33. config: Dict[str, Any]
  34. class ConfigReadRequest(RemoteServerConfig):
  35. """配置文件读取请求"""
  36. config_file: str = Field(..., description="配置文件路径(相对于项目根目录)")
  37. class ConfigUpdateRequest(RemoteServerConfig):
  38. """配置文件更新请求"""
  39. config_file: str = Field(..., description="配置文件路径")
  40. key_path: str = Field(..., description="键路径,如 lockV1.sessionLimit")
  41. value: Any = Field(..., description="新值")
  42. class LogReadRequest(RemoteServerConfig):
  43. """日志读取请求"""
  44. log_file: str = Field(..., description="日志文件名或路径")
  45. lines: int = Field(100, description="行数")
  46. from_head: bool = Field(False, description="从开头读取")
  47. full: bool = Field(False, description="读取整个文件")
  48. class LogReadOut(BaseModel):
  49. """日志读取输出"""
  50. content: str
  51. class LogListOut(BaseModel):
  52. """日志列表输出"""
  53. log_files: List[str]
  54. class ServerConfigItem(BaseModel):
  55. """预配置服务器项"""
  56. id: str
  57. name: str
  58. host: str
  59. class ServerListOut(BaseModel):
  60. """预配置服务器列表输出"""
  61. servers: List[ServerConfigItem]
  62. class RemoteActionRequest(BaseModel):
  63. """基于服务器ID的远程操作请求"""
  64. server_id: str
  65. project_path: Optional[str] = Field(None, description="项目路径(如果不传则使用数据库默认路径)")
  66. container_name: Optional[str] = None
  67. services: Optional[List[str]] = None
  68. config_file: Optional[str] = None
  69. key_path: Optional[str] = None
  70. value: Any = None
  71. log_file: Optional[str] = None
  72. lines: int = 100
  73. from_head: bool = False
  74. full: bool = False