存储¶
管理员在管理 → 存储中添加开发环境可使用的存储:Docker 主机上的目录、NFS 导出或 SMB/CIFS 共享。每个存储有一个用途,规定谁可以使用,并会定期检查。
不添加任何存储时一切照旧:/workspace 和保留目录保存在 Docker 命名卷中(或旧的存储目录设置下,见开发环境)。
类型¶
| 类型 | 需要填写 | 容器如何使用 |
|---|---|---|
| 主机目录 | 运行 Docker 的机器上的绝对路径,例如 /srv/data |
绑定挂载 |
| NFS | 服务器(主机名或 IP)、导出路径(/export/data)、可选的挂载选项(默认 nfsvers=4) |
local 驱动、type=nfs 的 Docker 命名卷 |
| SMB / CIFS | 服务器、共享(share 或 share/目录;也可以直接粘贴 //server/share/目录)、用户名和密码、可选的挂载选项(默认 vers=3.0) |
local 驱动、type=cifs 的 Docker 命名卷 |
NFS 和 SMB 在容器启动时由 Docker 自己挂载,不需要写 /etc/fstab,以后也可以在其他机器上使用同一个存储。Docker 主机只需要安装常用的挂载工具:
- NFS:
nfs-common(Debian、Ubuntu)或nfs-utils(RHEL、Fedora、openSUSE); - SMB:
cifs-utils。
Docker Desktop、rootless Docker 和 Podman 可能无法挂载 NFS 或 SMB 卷,这时请改用主机目录(用其他方式挂载到主机上)。
SMB 密码用 SLOTSERVE_SECRET_KEY 加密保存,之后不会再显示(留空即保持不变)。Docker 需要把它写进卷的选项,所以能在主机上执行 docker volume inspect 的人都能读到它——请为 SlotServe 单独建一个共享账号。挂载选项是一个用逗号分隔的列表,因此密码不能包含逗号。挂载选项中不能出现 addr、username 或 password,这些由 SlotServe 自己设置。
用途¶
| 用途 | 在环境中 | 在存储上 |
|---|---|---|
| 共享数据 | 挂载在其挂载路径(例如 /data/team),勾选后只读 |
整个存储 |
| 个人空间 | 每个人的目录就是自己的 /workspace,代替 Docker 卷 |
users/u<用户 ID> |
| 项目数据 | 保留的环境和模板的保留目录 | projects/p<项目 ID>/<路径>、templates/u<用户 ID>-t<模板 ID>/<路径> |
| 模型库 | 设置了挂载路径时挂载在那里(例如 /mnt/models/team),通常只读 |
模型文件 |
- 个人目录(以及每个保留目录)在第一次需要时创建,并像新的 Docker 卷一样填入镜像中的内容。这由一个使用
SLOTSERVE_STORAGE_HELPER_IMAGE、用完即删的辅助容器完成(从不使用环境自己的镜像;镜像中的内容通过 Docker 的归档 API 复制出来),因此 SlotServe 本身不需要访问存储。对于宿主机目录,辅助容器只挂载它要处理的目录的上一级;NFS 导出和 SMB 共享只能从根目录挂载,因为还不存在的子目录无法挂载。 - 空闲时的共享环境(见开发环境)会挂载所有面向所有人的存储,并把个人空间整体挂载在
/workspaces:每个人的目录/workspaces/u<用户 ID>属于他在那里的账号,只对他开放。在预约的环境中以root写入的文件,可能需要chown后才能在共享环境中修改。 - 项目数据取代存储目录设置来存放保留目录;两者都没有时使用 Docker 卷。共享环境的主目录仍由该设置决定。
- 模型库:SlotServe 会扫描其中的 GGUF 文件(模型 → 扫描目录),下载时也可以选它作为目标(
POST /api/downloads和POST /api/downloads/hf的storage_id)。SlotServe 通过SlotServe 读取它的路径来读写模型库:主机目录默认就是该目录(SlotServe 运行在主机上时)。NFS 或 SMB 需要先挂载到 SlotServe 所在机器(或 SlotServe 容器)上,再填写那个路径。SLOTSERVE_MODELS_DIR仍是默认模型库,并照旧挂载在/models。 - 同一用途有多个存储时:个人空间和项目数据使用此人有权使用的第一个(最早添加的),共享数据和模型库则全部挂载。
谁可以使用¶
所有人、指定的人或仅管理员。无权使用的人不会挂载该存储;个人空间和项目数据会依次退回到下一个存储或 Docker 卷。每个人都能在开发环境页面看到自己的环境会挂载哪些存储、挂载在哪里以及自己的用量。
挂载路径必须是绝对路径,不能是系统目录、/workspace、/workspaces、/models,也不能与其他存储的挂载路径重叠。
检查、用量和软上限¶
检查会在一个 SLOTSERVE_STORAGE_HELPER_IMAGE(默认 busybox:1.37,缺少时自动拉取)的临时容器中挂载存储,显示是否可访问、失败时的错误、可用和总空间(df)以及是否可写。个人空间还会统计每个人的目录大小(du);用量按从大到小列出。
开发环境开启时,SlotServe 每隔 SLOTSERVE_STORAGE_CHECK_MINUTES(默认 30;0 表示只在管理员点击检查时)自动检查所有存储。原本正常的存储无法使用时会通知管理员。
个人空间可以设置每人软上限:超出的人会收到通知(管理员也会收到),在回到上限以下之前只通知一次。不会阻止写入。
修改或移除存储¶
修改对之后启动的容器生效。保留的环境会比较创建时的存储:下次预约时如果不同,容器会先做快照,再用新的挂载重新创建(已安装的软件会保留)。修改 NFS/SMB 存储的挂载方式会创建新的 Docker 卷;旧卷在没有容器使用后删除。
移除存储只是把它从 SlotServe 中移除,其中的数据不会被删除。连同数据删除保留的环境时,也会删除它在项目存储上的目录。
示例¶
NFS 服务器(Linux),把 /srv/nfs/homes 导出给 Docker 主机 10.0.0.20:
sudo apt install nfs-kernel-server
sudo mkdir -p /srv/nfs/homes
echo '/srv/nfs/homes 10.0.0.20(rw,sync,no_subtree_check,no_root_squash)' | sudo tee -a /etc/exports
sudo exportfs -ra
no_root_squash 让辅助容器可以创建目录并设置属主。在 SlotServe 中:类型 NFS,服务器 10.0.0.15,导出路径 /srv/nfs/homes,用途个人空间。NFSv3 请使用选项 nfsvers=3,nolock。
NAS 或 Samba 服务器上的 SMB 共享([team],path = /srv/samba/team,用 smbpasswd -a slotserve 创建的用户 slotserve):类型 SMB / CIFS,服务器 nas.local,共享 team(或 team/datasets),用户 slotserve 及其密码,用途共享数据,挂载路径 /data/team,勾选只读。CIFS 没有 Unix 属主:除非添加例如 uid=0,gid=0,file_mode=0660,dir_mode=0770(共享环境中的账号不是 root,可用 0777),容器中的文件都属于 root。其他常用选项:旧服务器用 vers=2.1,以及 domain=STUDIO。
在 Docker 主机上手动试一下存储: