Skip to content

Latest commit

 

History

History
206 lines (144 loc) · 6.77 KB

File metadata and controls

206 lines (144 loc) · 6.77 KB

我想创建一个镜像库 模块,如下的字段

名字 必填 地址 必填 描述 来源
是否上架 必填 bool,默认上架 备注

我想创建一个算力节点 模块,如下的字段

名字 必填 区域 CPU 内存 系统盘容量 数据盘容量 ip地址公网 必填 ip地址内网 必填 ssh端口 必填,默认22 用户名
密码
显卡名称
显卡数量 docker连接地址
使用TLS bool 默认启用 CA证书 text 前端强制用 普通text输入框进行输入,不要用富文本框 客户端证书 text 前端强制用 普通text输入框进行输入,不要用富文本框 客户端私钥 text 前端强制用 普通text输入框进行输入,不要用富文本框 是否上架 必填 bool 默认上架 备注

我想创建一个产品规格 模块,如下的字段

名称 必填 显卡型号 必填 显卡数量 CPU核心数 内存(GB) 系统盘容量(GB) 数据盘容器(GB) 价格/小时 是否上架 必填 bool 默认上架 备注

我想创建一个实例管理 模块,如下的字段

镜像 1对1 镜像表 必填 模版 1对1 产品规格 必填
用户 前端不显示, 提交的时候后端自动填写。 节点 1对1 算力节点表 必填 Docker容器 后端创建后自动回填 实例名称 必填 字符 容器状态 字符格式 前端不显示, 每次状态变更后由后端自动填写。 备注 操作 关闭/删除/重启


核心业务流程逻辑

新增加一个 新增实例 按钮。 点击按钮后, 实现分步选择流程 选择镜像 从镜像库中选择 上架状态
选择显卡规格 从产品规格中选择 上架状态 前端 显示 显卡规格的名字+显卡型号+数量+CPU/硬盘/系统盘/数据盘容量 (只修改弹窗) 显卡规格选择之后,才能选择节点,默认节点为空。

新增一个查询接口,生成对应 API 权限记录 根据选择的产品规格,去 算力节点 中 匹配 满足要求的 算力节点。 例如: 选择了产品规格 中的 4090显卡 2块 CPU 要求 2核心 内存要求4G 系统盘要求50G,容量盘要求50G。 根据这些去匹配 算力节点 中 已上架 节点的 CPU 内存 系统盘 数据盘 显卡型号 数量。 需要用 已上架 的算力节点,减掉 实例管理 中 已经创建的配置情况后,再去匹配。自动更新容器状态。

提交创建后,去对应的 算力节点 获取docker连接信息,然后 创建对应的容器 通过docker api 创建。 并在实例创建成功后回填 containerId 与状态。

需要根据创建实例的模板,去配置容器 对应的参数 CPU --cpus=2 内存 --memory=4g 系统盘 --storage-opt overlay2.size=20G 容量盘 命名卷映射到 "/data" 显卡数量 --gpus 1 如果不支持 --storage-opt overlay2.size=20G ,就跳过这个参数,重试。 必须确保这些配置参数能准确转换为 Docker API 的对应参数。 删除容器的时候,会自动把挂载的数据卷 一起删除。

普通用户 可以创建, 只能看到自己创建的实例,删除自己的实例。 列表接口必须根据当前登录用户的 userId 进行数据过滤。 管理员 admin 可以创建 。 可以看到所有用户创建的实例,删除所有的实例。

实例管理 中增加操作 启动 重启 关闭容器,查看日志,终端xterm.js 等功能,通过对接docker api。 终端需要在 vite.config.js 为代理添加了 ws: true

当前用户只能操作自己创建的实例, 管理员可以操作所有。自动更新容器状态。前端增加对应的按钮 和 对应 API 权限记录。

删除实例时,同时删除容器。必须容器删除掉,才能删除实例。否则报错。

SSH跳板机功能开发计划

功能需求

  1. SSH服务器监听2026端口
  2. 用户通过账号密码认证
  3. 认证成功后展示用户创建的所有容器列表(格式:序号 实例名称-容器ID-算力节点)
  4. 用户输入序号后,自动连接到对应的容器

技术实现方案

1. 依赖包添加

  • go.mod 中添加 golang.org/x/crypto/ssh 用于SSH服务器实现

2. 创建SSH跳板机服务模块

文件:server/service/jumpbox/jumpbox.go

  • 实现SSH服务器监听(端口2026)
  • 实现用户认证逻辑(对接系统用户表)
  • 实现交互式容器列表展示
  • 实现容器连接逻辑(通过Docker Exec或SSH)

文件:server/service/jumpbox/auth.go

  • 实现SSH密码认证
  • 验证用户名和密码(对接sys_users表)

文件:server/service/jumpbox/session.go

  • 处理SSH会话
  • 展示容器列表
  • 处理用户输入选择
  • 建立到容器的连接

3. 容器连接方式

基于现有的 terminal.go 实现,使用Docker Exec方式连接到容器:

  • 通过算力节点信息获取Docker客户端
  • 使用 docker exec 进入容器
  • 转发SSH会话到容器内部

4. 启动SSH服务器

文件:server/initialize/jumpbox.go

  • 在系统初始化时启动SSH跳板机服务
  • server/initialize/router.go 中调用初始化

5. 配置管理

文件:server/config/jumpbox.go

  • 添加SSH跳板机配置(端口、密钥等)
  • config.yaml 中添加配置项

关键实现点

用户认证

  • 从SSH连接获取用户名和密码
  • 查询 sys_users 表验证用户
  • 使用系统现有的密码加密方式验证

容器列表获取

  • 根据认证成功的用户ID查询实例
  • 使用 GetInstanceInfoList 方法获取用户创建的实例
  • 关联查询算力节点名称
  • 格式化显示:序号 实例名称-容器ID-算力节点名称

容器连接

  • 根据选择的实例ID获取实例信息
  • 获取算力节点信息(包含Docker连接信息)
  • 使用Docker Exec建立交互式shell连接
  • 转发SSH会话的输入输出到容器

文件清单

新增文件

  • server/service/jumpbox/jumpbox.go - SSH服务器主逻辑
  • server/service/jumpbox/auth.go - 认证逻辑
  • server/service/jumpbox/session.go - 会话处理
  • server/initialize/jumpbox.go - 初始化SSH服务
  • server/config/jumpbox.go - 配置管理

修改文件

  • server/go.mod - 添加SSH依赖
  • server/config/config.go - 添加跳板机配置结构
  • server/config.yaml - 添加跳板机配置项
  • server/initialize/router.go - 调用跳板机初始化

注意事项

  1. SSH服务器需要独立goroutine运行,不阻塞主服务
  2. 需要处理SSH密钥生成和管理
  3. 容器连接失败时的错误处理
  4. 会话超时和断开连接的处理
  5. 日志记录SSH连接和操作
  6. 管理员 admin 登录 可以看到所有节点。