refactor(storage): 对象存储从 MinIO 换成 SeaweedFS(钉 4.47)
动机:MinIO 的 GitHub 仓库已于 2026-02 归档,不再产出安全补丁,已累积多个 CVE 且不修;本项目存身份证 / 实名材料 / 用户照片,无人修 CVE 才是真正驱动因素 (Docker Hub 下架只是表象,quay.io 仍在提供)。 变更: - 三套 compose(dev / staging / prod)的 minio 服务替换为 seaweedfs 4.47: 覆盖 entrypoint 渲染 -s3.config 注入 identity(S3 网关默认不鉴权,必须显式开启), -volume.max=100 解除第二个 bucket 写入时的 InternalError。 - 新增一次性 storage-init 容器,经 filer 接口预建 public / private 桶 (SeaweedFS PutObject 到不存在的 bucket 直接失败;全仓库原无任何 createBucket)。 - S3Config 显式开启 path-style:AWS SDK v1 默认 virtual-host 会把 bucket 拼进 主机名,容器名在 DNS 中不存在必然失败(本机有 http_proxy 时易误判为 502 拒绝)。 - ci.yml:镜像校验与起栈步骤改为 seaweedfs + storage-init。 - 运维脚本 health-check.sh / run-uat.sh 的 MinIO 探针改为 SeaweedFS (S3 网关开启鉴权后匿名根请求返回 403,200/403 均算存活)。 注:path-style 与建桶属换存储的必要项;presigned URL 的 host 须对外可达这一 既有缺陷(原 minio:9000 直发客户端不可达)留待下一轮「改缺陷」处理。
This commit is contained in:
+13
-10
@@ -249,15 +249,15 @@ jobs:
|
||||
working-directory: infrastructure
|
||||
run: docker compose config --quiet
|
||||
|
||||
# 2026-09-22:compose 里的 minio 已从 Docker Hub 迁到 quay.io 并钉版
|
||||
# (RELEASE.2025-09-07T16-13-09Z,版本由本步骤上一轮的实测输出确认)。
|
||||
# 2026-09-22:compose 的对象存储已换成 chrislusf/seaweedfs:4.47 并钉版。
|
||||
# 单独保留这一步的理由:镜像拉取失败在 compose up 里会埋进几十行输出,
|
||||
# 这里能在起栈前秒级暴露「上游镜像下架」这类外部依赖失效 ——
|
||||
# 上一轮正是靠日志里的 pull access denied 才定位到 MinIO 已移除 Docker Hub 仓库。
|
||||
- name: 校验 minio 钉版镜像可拉取并打印版本
|
||||
# 上一轮正是靠日志里的 pull access denied 才定位到 MinIO 已移除 Docker Hub 仓库
|
||||
# (minio/minio 现返回 404;教训是「第三方镜像」本身就是外部依赖风险点)。
|
||||
- name: 校验 seaweedfs 钉版镜像可拉取并打印版本
|
||||
run: |
|
||||
docker pull quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z
|
||||
docker run --rm quay.io/minio/minio:RELEASE.2025-09-07T16-13-09Z --version
|
||||
docker pull chrislusf/seaweedfs:4.47
|
||||
docker run --rm chrislusf/seaweedfs:4.47 version
|
||||
|
||||
# 保证库为全新:seed 用 `ON CONFLICT (username) DO NOTHING`,若卷是上一轮残留,
|
||||
# 账号密码会停留在上一轮的 `E2E_OPERATOR_PASSWORD` 上 → 本轮登录 401(表现为各种业务失败)。
|
||||
@@ -270,11 +270,14 @@ jobs:
|
||||
working-directory: infrastructure
|
||||
run: docker compose build backend
|
||||
|
||||
- name: 起真实栈(postgres + redis + minio + backend)
|
||||
# 显式列出 minio:backend 的 depends_on 虽会隐式拉起它,但隐式依赖不利于阅读,
|
||||
# 且 minio 的 healthcheck(`mc ready local`)是 backend 能否启动的前置条件。
|
||||
- name: 起真实栈(postgres + redis + seaweedfs + 建桶 + backend)
|
||||
# 显式列出 seaweedfs 与 storage-init:backend 的 depends_on 虽会隐式拉起它们,
|
||||
# 但隐式依赖不利于阅读,且 seaweedfs 的 healthcheck 是 backend 启动的前置条件。
|
||||
# storage-init 是**一次性**建桶容器 —— SeaweedFS 不会自动建桶,
|
||||
# PutObject 到不存在的 bucket 会直接失败,少了它照片链路就是断的
|
||||
# (E2E 对存储零覆盖,不会替你发现)。
|
||||
working-directory: infrastructure
|
||||
run: docker compose up -d postgres redis minio backend
|
||||
run: docker compose up -d postgres redis seaweedfs storage-init backend
|
||||
|
||||
- name: 等待 backend 就绪(超时即失败,不静默跳过)
|
||||
# 窗口 90×5s=7.5min:首次构建后还需 Spring 启动 + Flyway 46 个迁移,5min 偏紧。
|
||||
|
||||
Reference in New Issue
Block a user