MinIO 是多服务共用实例(sundynix-agent / sundynix-plant 等)。原先 ensureBucket 每次启动都无条件 SetBucketPolicy 设为公开只读,一旦 MINIO_BUCKET 配错成别的服务的桶,启动一次就会把人家的桶悄悄改成 全网可读且无任何报错。 改为:桶已存在则只连接、绝不修改策略并打日志说明;仅对本服务新建的 桶设公开只读(小程序需要图片直链)。.env.example 补充共用实例注意事项, 并建议改用仅授权 sundynix-pet 的独立账号替代 root 凭据。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import (
|
||||
"context"
|
||||
"fmt"
|
||||
"io"
|
||||
"log"
|
||||
"strings"
|
||||
"time"
|
||||
|
||||
@@ -49,12 +50,18 @@ func (s *Storage) ensureBucket() error {
|
||||
if err != nil {
|
||||
return fmt.Errorf("bucket exists: %w", err)
|
||||
}
|
||||
if !exists {
|
||||
if err := s.client.MakeBucket(ctx, s.bucket, minio.MakeBucketOptions{}); err != nil {
|
||||
return fmt.Errorf("make bucket: %w", err)
|
||||
}
|
||||
if exists {
|
||||
// 桶已存在:绝不碰它的策略。MinIO 可能是多个服务共用的,
|
||||
// 万一 bucket 配错(填成别的服务的桶),无条件改策略会把人家的桶
|
||||
// 悄悄变成全网可读。已存在的桶由运维一次性配好读权限。
|
||||
log.Printf("minio: 复用已存在的 bucket %q(不修改其访问策略)", s.bucket)
|
||||
return nil
|
||||
}
|
||||
// dev:设置公开只读策略,便于直接以 URL 访问对象
|
||||
|
||||
if err := s.client.MakeBucket(ctx, s.bucket, minio.MakeBucketOptions{}); err != nil {
|
||||
return fmt.Errorf("make bucket: %w", err)
|
||||
}
|
||||
// 仅对「本服务刚创建」的桶设公开只读:小程序要用 URL 直接加载图片。
|
||||
policy := fmt.Sprintf(`{
|
||||
"Version": "2012-10-17",
|
||||
"Statement": [{
|
||||
@@ -67,6 +74,7 @@ func (s *Storage) ensureBucket() error {
|
||||
if err := s.client.SetBucketPolicy(ctx, s.bucket, policy); err != nil {
|
||||
return fmt.Errorf("set bucket policy: %w", err)
|
||||
}
|
||||
log.Printf("minio: 已创建 bucket %q 并设为公开只读(图片需可直链访问)", s.bucket)
|
||||
return nil
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user