为上传文件添加存储空间 (Pro)
上传的文件存放在主机的 media 目录中,在 Docker Compose 部署中,可供这些文件使用的空间取决于虚拟机磁盘的剩余容量。诸如 SBOM 这类大型上传文件可能会占满该磁盘。本页介绍如何在不更改部署本身的情况下扩展该空间。
为何该方法在操作系统层面有效
Docker Compose 部署会将主机的 media 目录绑定挂载到需要它的容器中,包括应用程序容器以及负责向用户提供已上传文件的 nginx。这些容器读写的是主机上的一个路径,因此挂载在该路径上的任何文件系统都会被它们所使用。在该处挂载更多容量对应用程序而言是透明的。
这就是为什么此处采用的方法是操作系统层面的变更,而非部署层面的变更。保持随发行版附带的 Compose 文件不变,可以使您的安装与其他本地部署保持一致,并避免在升级替换该文件时丢失所做的更改。
块存储,最直接的选择
挂载额外的块设备是在 Linux 上处理磁盘已满问题的常见方式,也是应该首先考虑的选择。NAS 或 SAN 卷可以胜任,云服务提供商的块存储(如 Amazon EBS 卷)同样可以。
将应用程序存储与操作系统磁盘分离通常是一种良好实践,因此您有两个合理的选择。将设备挂载到 media 目录,为上传文件提供专属容量;或者将其挂载到上一级的部署目录,使所有应用程序数据都位于与虚拟机分离的文件系统上。
对象存储及其注意事项
使用对象存储(如 Amazon S3)作为上传文件的后端是可行的,并且能够完全消除容量上限,但它不如块设备那样契合。在选择该方案之前,请考虑以下几点。
对象存储不是文件系统。S3 不支持随机写入、追加写入现有文件或文件锁定。FUSE 层可以掩盖这些差异,但它模拟的是底层存储本身并不具备的语义。
延迟高于块设备。这会影响上传,而且由于 nginx 是从同一目录提供已上传文件的,因此也会影响下载。
它会增加网络依赖性。根据虚拟机在您网络中的位置,访问存储桶可能需要经过额外的网络跳转,而这条路径现在必须保持可用,上传功能才能正常工作。
重启需要格外小心。存储桶必须在启动时挂载,这就在挂载完成和 DefectDojo 启动之间引入了时间上的依赖关系。根据延迟情况,这可能导致重启挂起,或者在挂载尚未就绪时就启动。
权限必须相互匹配。存储桶的 IAM 权限需要与应用程序写入上传文件所需的文件系统权限保持一致。
用于挂载对象存储的工具
在 Linux 上,通常使用三种工具将 S3 挂载为文件系统。
rclone mount 稳定、维护活跃,并提供能够很好地处理读写缓冲的虚拟文件系统缓存模式。在这三种工具中,如果您选择这条路径,这是我们推荐的选项。
goofys 针对速度进行了优化。它通过异步执行文件创建和写入操作,并忽略 S3 原生不支持的操作(如随机写入和文件锁定)来实现这一点。
s3fs-fuse 是三者中 POSIX 兼容性最好的,支持更改所有权和权限等操作,但由于要模拟真实文件系统,其速度比 goofys 慢得多。
将 media 目录迁移到新文件系统
这需要停机操作,因为在复制上传文件的过程中,应用程序不能同时对其进行写入。
- 使用
dojo-compose-cli app stop停止 DefectDojo,以确保在迁移过程中底层数据不会发生变化。 - 重命名现有的 media 目录,将其保留作为回滚点,例如在您的部署目录中将
media移动为old-media。 - 在原 media 路径处创建一个空目录,作为挂载点。
- 挂接新的文件系统。具体做法取决于您上面所选择的方案,但归结起来是三件事:使存储对 Linux 可用(对于对象存储而言,这意味着创建存储桶及其权限);将其挂载到 media 路径;以及确保该挂载在重启后依然有效,通常通过
/etc/fstab条目或您所用工具的等效配置来实现。 - 将旧内容复制过去,并保留所有权和权限。从旧目录到新目录执行
rsync -Pav即可完成此操作,并会报告进度,这在需要迁移大量数据时很有用。 - 确认文件已经到位。对于对象存储,在您服务提供商的控制台中检查存储桶是确认挂载确实写入到预期位置的最快方式。
- 使用
dojo-compose-cli app start启动 DefectDojo,并上传一个测试文件。如果上传失败,容器日志会说明原因,通常是权限问题所致。
在测试上传成功、并确认从旧目录迁移过来的文件在界面中可读之前,请保留旧目录。如果新文件系统出现问题,它就是您的退路。
支持范围
以上均为一般性建议。为虚拟机添加存储属于操作系统层面的任务,而您所选方法的具体细节,尤其是通过 FUSE 挂载的对象存储,不在本地部署支持的范围之内。此方法之所以如此设计,是为了使您的部署与其他所有本地部署保持一致,让我们提供的 Compose 文件保持不变,并在其本应所属的操作系统层面解决容量问题。
如果您正在为自己的环境权衡各种方案,请联系 ,我们可以在您做出最终决定之前,与您一起讨论各方案的利弊。