fix(storage): presigned URL 改用对外可达 host,修复客户端直传断链
SeaweedFS 换存储后 MINIO_ENDPOINT 变为 seaweedfs:8333(容器名), PhotoService 生成的 presigned URL 把该 host 直接下发给客户端, 客户端不在 docker 网络内无法解析 → 直传/直链全断。 - S3Config:新增 amazonS3Signer Bean,指向 object-storage.public-endpoint (缺省回退内网 endpoint,向后兼容)。独立签名端是因为 SigV4 签名覆盖 host 头,事后改 URL 字符串会让签名失效返 403;独立客户端让签名 host 与客户端实际命中的 host 天然一致。 - PhotoService:去掉 @RequiredArgsConstructor,改显式 @Qualifier 构造器; getUploadToken / getSignedUrl / getSignedUrlForAuthorizedReview 三处 presigned 生成改用 amazonS3Signer;putObject 服务端上传仍走内网 amazonS3。 - application-docker.yml / application-dev.yml:public-endpoint 读 MINIO_PUBLIC_ENDPOINT(缺省回退 MINIO_ENDPOINT)。 - 三套 compose:注入 MINIO_PUBLIC_ENDPOINT (dev localhost:8333 / staging localhost:8334 / prod 留作单一旋钮)。 - 测试:PhotoServiceTest 新增嵌套 PresignedUrlPublicHostTest,用真实 AmazonS3 客户端(仅本地签名不联网)断言下发 URL host 为对外地址、 不含 seaweedfs 容器名;同步补齐两处 5→6 参构造调用。 验证:本机 65 E2E 全绿 + storage_link_probe path-style 全通 + PhotoServiceTest/PhotoUploadValidationTest/PhotoLimitGuardTest 19 例单测全绿。 顺带:backend/maven-settings.xml 的 Central 兜底由投毒的 repo1.maven.org 改为可达的 repo.maven.apache.org,使本机镜像构建可走 aliyun 主源。
This commit is contained in:
@@ -126,6 +126,11 @@ services:
|
||||
REDIS_PASSWORD: ${REDIS_PASSWORD:?请设置REDIS_PASSWORD}
|
||||
# 变量名仍为 MINIO_*(服务端配置键未改),实际指向 SeaweedFS 的 S3 网关。
|
||||
MINIO_ENDPOINT: http://seaweedfs:8333
|
||||
# 客户端直传 presigned URL 用的「对外可达」地址。
|
||||
# 生产 S3 网关当前未 host-publish(客户端经 nginx/ingress 访问),故缺省仍是容器名
|
||||
# —— 即「presigned host 对外可达」缺陷在生产仍待配置 ingress 后才彻底解决。
|
||||
# 一旦生产 S3 网关暴露了对外地址,把该变量设成那个地址即可,无需再改代码。
|
||||
MINIO_PUBLIC_ENDPOINT: ${MINIO_PUBLIC_ENDPOINT:http://seaweedfs:8333}
|
||||
MINIO_ACCESS_KEY: ${MINIO_ACCESS_KEY:?请设置MINIO_ACCESS_KEY}
|
||||
MINIO_SECRET_KEY: ${MINIO_SECRET_KEY:?请设置MINIO_SECRET_KEY}
|
||||
JWT_ACCESS_SECRET: ${JWT_ACCESS_SECRET:?请设置JWT_ACCESS_SECRET}
|
||||
|
||||
Reference in New Issue
Block a user