From a2cd7c8007d4e1ca7c7c6e582b6de4d7d2aed87a Mon Sep 17 00:00:00 2001 From: wangchuxiao Date: Sat, 19 Feb 2022 18:48:15 +0800 Subject: [PATCH] add minio --- config/config.yaml | 9 +++- go.sum | 4 ++ internal/api/third/minio_init.go | 48 +++++++++++++++++ .../api/third/minio_storage_credential.go | 54 ++++++++++++++----- pkg/base_info/minio_api_struct.go | 11 ++-- pkg/common/config/config.go | 7 +++ pkg/common/constant/constant.go | 3 ++ 7 files changed, 117 insertions(+), 19 deletions(-) create mode 100644 internal/api/third/minio_init.go diff --git a/config/config.yaml b/config/config.yaml index 9b73552..c9b800b 100644 --- a/config/config.yaml +++ b/config/config.yaml @@ -19,7 +19,7 @@ mysql: dbMaxLifeTime: 120 mongo: - dbAddress: [ 127.0.0.1:37017 ] + dbAddress: [ 127.0.0.1:37017 ] dbDirect: false dbTimeout: 10 dbDatabase: openIM @@ -86,7 +86,12 @@ credential: bucket: echat-1302656840 secretID: AKIDGNYVChzIQinu7QEgtNp0hnNgqcV8vZTC secretKey: kz15vW83qM6dBUWIq681eBZA0c0vlIbe - + minio: + bucket: openim + location: us-east-1 + endpoint: http://127.0.0.1:9000 + accessKeyID: minioadmin + secretAccessKey: minioadmin rpcport: openImUserPort: [ 10100 ] diff --git a/go.sum b/go.sum index 8a47f8d..acc8bf9 100644 --- a/go.sum +++ b/go.sum @@ -311,8 +311,10 @@ github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7V github.com/kisielk/errcheck v1.1.0/go.mod h1:EZBBE59ingxPouuu3KfxchcWSUPOHkagtvWXihfKN4Q= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.5 h1:9O69jUPDcsT9fEm74W92rZL9FQY7rCdaXVneq+yyzl4= github.com/klauspost/compress v1.13.5/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/cpuid v1.2.3/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid v1.3.1 h1:5JNjFYYQrZeKRJ0734q51WCEEn2huer72Dc7K+R/b6s= github.com/klauspost/cpuid v1.3.1/go.mod h1:bYW4mA6ZgKPob1/Dlai2LviZJO7KGI3uoWLd42rAQw4= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0/go.mod h1:FFnZGqtBN9Gxj7eW1uZ42v5BccTP0vu6NEaFoC2HwRg= @@ -358,6 +360,7 @@ github.com/matttproud/golang_protobuf_extensions v1.0.1 h1:4hp9jkHxhMHkqkrB3Ix0j github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= +github.com/minio/md5-simd v1.1.0 h1:QPfiOqlZH+Cj9teu0t9b1nTBfPbyTl16Of5MeuShdK4= github.com/minio/md5-simd v1.1.0/go.mod h1:XpBqgZULrMYD3R+M28PcmP0CkI7PEMzB3U77ZrKZ0Gw= github.com/minio/minio-go/v7 v7.0.22 h1:iXhsiRyYh1ozm/+jN2qGgEIahYjEkvcpuu6NcdpSxcA= github.com/minio/minio-go/v7 v7.0.22/go.mod h1:ei5JjmxwHaMrgsMrn4U/+Nmg+d8MKS1U2DAn1ou4+Do= @@ -421,6 +424,7 @@ github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6L github.com/rogpeppe/go-internal v1.3.0/go.mod h1:M8bDsm7K2OlrFYOpmOWEs/qY81heoFRclV5y23lUDJ4= github.com/rogpeppe/go-internal v1.6.1 h1:/FiVV8dS/e+YqF2JvO3yXRFbBLTIuSDkuC7aBOAvL+k= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rs/xid v1.2.1 h1:mhH9Nq+C1fY2l1XIpgxIiUOfNpRBYH1kKcr+qfKgjRc= github.com/rs/xid v1.2.1/go.mod h1:+uKXf+4Djp6Md1KODXJxgGQPKngRmWyn10oCKFzNHOQ= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.1.0/go.mod h1:B/mN0msZuINBtQ1zZLEQcegFJJf9vnYIR88KRMEuODE= diff --git a/internal/api/third/minio_init.go b/internal/api/third/minio_init.go new file mode 100644 index 0000000..eb087c4 --- /dev/null +++ b/internal/api/third/minio_init.go @@ -0,0 +1,48 @@ +package apiThird + +import ( + "Open_IM/pkg/common/config" + "Open_IM/pkg/common/log" + "Open_IM/pkg/utils" + "context" + "github.com/minio/minio-go/v7" + "github.com/minio/minio-go/v7/pkg/credentials" + "github.com/minio/minio-go/v7/pkg/policy" + url2 "net/url" +) + +func init() { + minioUrl, err := url2.Parse(config.Config.Credential.Minio.Endpoint) + if err != nil { + log.NewError("", utils.GetSelfFuncName(), "parse failed, please check config/config.yaml", err.Error()) + return + } + minioClient, err := minio.New(minioUrl.Host, &minio.Options{ + Creds: credentials.NewStaticV4(config.Config.Credential.Minio.AccessKeyID, config.Config.Credential.Minio.SecretAccessKey, ""), + Secure: false, + }) + if err != nil { + log.NewError("", utils.GetSelfFuncName(), "init minio client failed", err.Error()) + return + } + opt := minio.MakeBucketOptions{ + Region: config.Config.Credential.Minio.Location, + ObjectLocking: false, + } + err = minioClient.MakeBucket(context.Background(), config.Config.Credential.Minio.Bucket, opt) + if err != nil { + exists, err := minioClient.BucketExists(context.Background(), config.Config.Credential.Minio.Bucket) + if err == nil && exists { + log.NewInfo("", utils.GetSelfFuncName(), "We already own %s\n", config.Config.Credential.Minio.Bucket) + } else { + log.NewError("", utils.GetSelfFuncName(), "create bucket failed and bucket not exists", err.Error()) + return + } + } + err = minioClient.SetBucketPolicy(context.Background(), config.Config.Credential.Minio.Bucket, policy.BucketPolicyReadWrite) + if err != nil { + log.NewError("", utils.GetSelfFuncName(), "SetBucketPolicy failed please set in ", err.Error()) + return + } + log.NewInfo("", utils.GetSelfFuncName(), "minio create and set policy success") +} diff --git a/internal/api/third/minio_storage_credential.go b/internal/api/third/minio_storage_credential.go index c66682b..4d5800e 100644 --- a/internal/api/third/minio_storage_credential.go +++ b/internal/api/third/minio_storage_credential.go @@ -2,12 +2,15 @@ package apiThird import ( apiStruct "Open_IM/pkg/base_info" + "Open_IM/pkg/common/config" "Open_IM/pkg/common/constant" - http "Open_IM/pkg/common/http" "Open_IM/pkg/common/log" - "Open_IM/pkg/common/token_verify" + _ "Open_IM/pkg/common/token_verify" + "Open_IM/pkg/utils" "github.com/gin-gonic/gin" - _ cr "github.com/minio/minio-go/v7/pkg/credentials" + _ "github.com/minio/minio-go/v7" + cr "github.com/minio/minio-go/v7/pkg/credentials" + "net/http" ) func MinioStorageCredential(c *gin.Context) { @@ -15,15 +18,42 @@ func MinioStorageCredential(c *gin.Context) { req apiStruct.MinioStorageCredentialReq resp apiStruct.MiniostorageCredentialResp ) - ok, _ := token_verify.GetUserIDFromToken(c.Request.Header.Get("token")) - if !ok { - log.NewError("", "GetUserIDFromToken false ", c.Request.Header.Get("token")) - http.RespHttp200(c, constant.ErrAccess, nil) + if err := c.BindJSON(&req); err != nil { + log.NewError("0", utils.GetSelfFuncName(), "BindJSON failed ", err.Error()) + c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) return } - //var stsOpts cr.STSAssumeRoleOptions - //stsOpts.AccessKey = minioUsername - //stsOpts.SecretKey = minioPassword - log.NewInfo("0", req, resp) - http.RespHttp200(c, constant.OK, nil) + //ok, _ := token_verify.GetUserIDFromToken(c.Request.Header.Get("token")) + //if !ok { + // log.NewError("", utils.GetSelfFuncName(), "GetUserIDFromToken false ", c.Request.Header.Get("token")) + // c.JSON(http.StatusInternalServerError, gin.H{"errCode": 500, "errMsg": "GetUserIDFromToken failed"}) + // return + //} + var stsOpts cr.STSAssumeRoleOptions + stsOpts.AccessKey = config.Config.Credential.Minio.AccessKeyID + stsOpts.SecretKey = config.Config.Credential.Minio.SecretAccessKey + stsOpts.DurationSeconds = constant.MinioDurationTimes + li, err := cr.NewSTSAssumeRole(config.Config.Credential.Minio.Endpoint, stsOpts) + if err != nil { + log.NewError("", utils.GetSelfFuncName(), "NewSTSAssumeRole failed", err.Error(), stsOpts, config.Config.Credential.Minio.Endpoint) + c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) + return + } + v, err := li.Get() + if err != nil { + log.NewError("0", utils.GetSelfFuncName(), "li.Get error", err.Error()) + c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) + return + } + if err != nil { + log.NewError("0", utils.GetSelfFuncName(), err.Error()) + c.JSON(http.StatusBadRequest, gin.H{"errCode": 400, "errMsg": err.Error()}) + return + } + resp.SessionToken = v.SessionToken + resp.SecretAccessKey = v.SecretAccessKey + resp.AccessKeyID = v.AccessKeyID + resp.BucketName = config.Config.Credential.Minio.Bucket + resp.StsEndpointURL = config.Config.Credential.Minio.Endpoint + c.JSON(http.StatusOK, gin.H{"errCode": 0, "errMsg": "", "data":resp}) } diff --git a/pkg/base_info/minio_api_struct.go b/pkg/base_info/minio_api_struct.go index 228789b..f159970 100644 --- a/pkg/base_info/minio_api_struct.go +++ b/pkg/base_info/minio_api_struct.go @@ -1,12 +1,13 @@ package base_info type MinioStorageCredentialReq struct { - Action string `form:"Action";binding:"required"` - DurationSeconds int `form:"DurationSeconds"` - Version string `form:"Version"` - Policy string + OperationID string `json:"operationID"` } type MiniostorageCredentialResp struct { - + SecretAccessKey string `json:"secretAccessKey"` + AccessKeyID string `json:"accessKeyID"` + SessionToken string `json:"sessionToken"` + BucketName string `json:"bucketName"` + StsEndpointURL string `json:"stsEndpointURL"` } diff --git a/pkg/common/config/config.go b/pkg/common/config/config.go index f604900..8f89376 100644 --- a/pkg/common/config/config.go +++ b/pkg/common/config/config.go @@ -36,6 +36,13 @@ type config struct { SecretID string `yaml:"secretID"` SecretKey string `yaml:"secretKey"` } + Minio struct { + Bucket string `yaml:"bucket"` + Location string `yaml:"location"` + Endpoint string `yaml:"endpoint"` + AccessKeyID string `yaml:"accessKeyID"` + SecretAccessKey string `yaml:"secretAccessKey"` + } `yaml:"minio"` } Mysql struct { diff --git a/pkg/common/constant/constant.go b/pkg/common/constant/constant.go index f3db29b..34c075a 100644 --- a/pkg/common/constant/constant.go +++ b/pkg/common/constant/constant.go @@ -121,6 +121,9 @@ const ( //UserJoinGroupSource JoinByAdmin = 1 + + //Minio + MinioDurationTimes = 3600 ) var ContentType2PushContent = map[int64]string{ -- GitLab