1 Star 0 Fork 17

LordLaoZi / WF-minio

forked from 野火IM / WF-minio 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
克隆/下载
贡献代码
同步代码
取消
提示: 由于 Git 不支持空文件夾,创建文件夹后会生成空的 .keep 文件
Loading...
README
MIT

野火Minio

野火Minio是基于最流行的开源对象存储服务Minio进行二次开发的,二次开发的内容仅涉及到与野火IM的对接。因此野火Minio可以按照原生Minio的使用和运维。但也有一些细微细节不同。首次部署需要进行配置,以后可以正常启动就行。野火Minio依赖于专业版,适合对安全性能要求很高的私有化部署,社区版不支持。

运行方式

  1. 上传:客户端需要上传时,先调用IM服务获取上传的token,IM服务根据配置里的信息计算出一个token(不需要与OSS进行调用)返回给客户端,客户端用自己的私钥把数据加密后用IM服务返回的token上传。OSS收到请求后验证token,验证通过后,在去通过IM服务的API获取用户的私钥进行解密保存文件。
  2. 下载:客户端直接请求OSS服务。如果bucket禁止非授权访问,客户端可以调用getAuthorizedMediaUrl方法来获取经过授权的URI进行访问,这个如上传一样,由服务器端计算出授权。一般建议头像和动态表情运行非授权访问,其它重要文件可以配置成授权访问。

综上OSS服务需要能够获取到用户的密钥,用来解密客户端加密的信息。获取用户密钥是通过server api进行,也可以选择直接读取IM服务数据库。

环境要求

OSS服务需要独立的公网IP。客户端上传下载都是与OSS服务进行直接连接,不经过IM服务器,如果想要好的体验,需要保证一定的带宽。OSS服务如果通过server api与im服务交互,需要确保服务的连通性,如果通过访问IM数据库的方式,需要确保能够读取IM数据库,可以限制除了需要的端口以外的所有出访。OSS服务需要限制除80以外的所有入访。

升级方法

如果已经部署需要按照升级步骤进行。升级方法:

  1. 停掉minio服务。
  2. 备份~/.minio${minio_data_path}/.minio.sys目录。备份旧的程序文件。
  3. 然后删除上述两个目录。注意minio数据目录其它文件夹一定要保留,防止丢失数据。
  4. 按照下面首次部署方法进行部署。注意部署成功后需要再次设置Policy。
  5. 如果部署失败,恢复旧的程序文件和步骤2的两个文件夹。

首次部署

1.启动野火IM服务

启动野火IM服务,创建数据库,后面Minio需要用到野火IM的数据库

2.启动野火Minio服务

## minio-data 为数据目录,需要运行前创建好,且具有读写权限。
minio  server /minio-data

运行成功后会有如下的提示

Endpoint:  http://10.255.20.59  http://127.0.0.1

Browser Access:
   http://10.255.20.59  http://127.0.0.1

Object API (Amazon S3 compatible):
   Go:         https://docs.min.io/docs/golang-client-quickstart-guide
   Java:       https://docs.min.io/docs/java-client-quickstart-guide
   Python:     https://docs.min.io/docs/python-client-quickstart-guide
   JavaScript: https://docs.min.io/docs/javascript-client-quickstart-guide
   .NET:       https://docs.min.io/docs/dotnet-client-quickstart-guide

如果没有可执行权限,使用chmod a+x minio来添加可执行权限。由于需要用到80端口,在linux机器上使用root权限,使用root用户或者sudo命令来运行。可能会提醒密码简单需要修改初始密码。

3. 解压mc目录下的mc工具。增加可执行权限,然后执行下面语句为Minio服务设置别名

./mc config host add myminio http://47.52.118.96 minioadmin minioadmin

不需要在Minio服务所在的机器上运行,可以远程。另外myminio是服务的别名,可以任意起名,后面需要用到,如果在一台电脑操作多个minio服务,注意别名不要重复

最后两个参数为AK/SK,需要使用正确的值,第二步启动的控制台日志中会有。

4. 更新Minio的野火IM配置

OSS服务有两种方法获取用户的密钥用来加密,一种是通过server api,在2020.7.29号之后的专业版本都支持,建议用这种方法:

./mc admin config set myminio WFChat IMAdminUrl=http://${im_server_address}:18080/admin/minio/sk IMAdminSecret=${im_server_admin_secret}

IMAdminUrl是server api地址,需要确保minio服务与IM服务管理端口的连通性。18080是默认的管理端口,如果修改过这里也需要对于修改。IMAdminSecret为server api的密钥。

如果IM服务是2020.7.29号之前,只能支持读取IM服务的数据库获取用户secret,而且数据库只能用mysql,别的数据库都不支持。请使用下面配置

./mc admin config set myminio WFChat DefaultSecret=00,11,22,33,44,55,66,77,78,79,7A,7B,7C,7D,7E,7F MySQLAddr=192.168.1.100:3306 MySQLDB=wfchat MySQLUserName=root MySQLPassword=123456

DefaultSecret需要配置IM服务参数client.proto.secret_key相同的值,必须保存默认不变。

MySQL的地址正确配置就行。注意与野火IM MySQL配置的格式不通,保持当前这种格式。正确配置mysql的地址,数据库名称,用户名和密码。

如果IM服务使用国密加密,需要执行下面操作开启国密加密。注意只有特殊客户才配置此项,普通客户请忽略此配置。

./mc admin config set myminio WFChat SM4Encrypt=on

如果要关闭,on改成off就可以了

5. 重启野火Minio服务

重启服务,好让设置生效,必须重启才行。使用如下命令重启

./mc admin service restart myminio

6. 新建bucket

用浏览器打开http://47.52.118.96(这里作为示例,实际使用时请换成客户服务的外网IP),如果是升级部署可以看见之前存在的bucket,内部数据都存在,不用再创建bucket,如果是首次部署则为空。点右下角的+,选择创建bucket,创建2个bucket,如下图所示: bucket list

设置权限,点击bucket右侧的菜单按钮,选择Edit policy,弹出如下图界面,选择Add添加如下,注意升级部署也需要再次设置 edit_policy

7. 配置野火IM

野火IM的配置请参考专业版野火IM部署说明,更改完配置后重启。

##存储使用类型,0使用内置文件服务器(仅供用于研发测试),1使用七牛云存储,2使用阿里云对象存储,3野火私有对象存储
##除了内置文件服务器外,其他对象存储服务需要设置上传需要鉴权,下载不需要鉴权模式。下载的安全性在于生成对象的key为uuid,无法被穷举。
media.server.media_type 3 ##这里改成3

## minio服务地址,要求是公网地址
media.server_url  http://47.52.118.96
media.access_key 0M7YVO70QPKBPWBZW5FW
media.secret_key ZrBsSST++1Qjap+Nfs3P2BujHCHDuqrsrYi0zNn8

## bucket名字
media.bucket_general_name media
## domain为minio服务器地址/bucket名字。不是服务器地址/minio/bucket名字,如下所示
media.bucket_general_domain http://47.52.118.96/media
media.bucket_image_name media
media.bucket_image_domain http://47.52.118.96/media
media.bucket_voice_name media
media.bucket_voice_domain http://47.52.118.96/media
media.bucket_video_name media
media.bucket_video_domain http://47.52.118.96/media
media.bucket_file_name media
media.bucket_file_domain http://47.52.118.96/media
media.bucket_sticker_name media
media.bucket_sticker_domain http://47.52.118.96/media
media.bucket_moments_name media
media.bucket_moments_domain http://47.52.118.96/media
media.bucket_portrait_name storage
media.bucket_portrait_domain http://47.52.118.96/storage
media.bucket_favorite_name storage
media.bucket_favorite_domain http://47.52.118.96/storage

上述参数为示例参数,请替换为客户对应的参数。

bucket media/storage为示例,客户实际使用时可以使用不同的名称。但至少要创建2个用来存储长期保存和短期保存的媒体文件,建议为上述7类每类创建一个bucket。

上传必须支持http上传(我们已经加密过了),因此media.server_url必须是http的,media.bucket_XXXX_domain可以增加https的支持。

如果是升级,需要确认AK/SK是否变动,如果改变了,需要同步修改

8. 验证上传下载是否正常。

验证上传下载是否正常。

进阶配置

1. 使用域名

配置域名解析到minio服务器,然后IM服务配置文件中的IP替换成域名。这样如果以后迁移存储服务也不会有问题。

2. 集群部署

只有部署集群后,才可以提供高可用,当少于一半的存储磁盘损坏也不会丢失数据。具体部署方法请自行查找Minio官方文档。

3. 配置https

上传必须是http,http method是put。可以下载配置为https。首先用如下命令启动,更换minio服务的端口为9000

./minio server --address 47.52.118.96:9000 /minio-data

然后配置nginx,反向代理到80端口,配置证书,使其能够同时支持HTTP/HTTPS双栈,注意转发时要把http header都带上。

最后就是修改配置文件media.server_url保持不变,media.bucket_XXXX_domain改为https对应地址。

4. 配置CDN加速

如果客户比较多,且全国甚至全世界分别比较广,使用dns能够提高下载速度,提高用户体验。可以对下载进行dns加速,然后正确配置media.bucket_XXXX_domain

常见问题

1. 使用nginx反向代理后,不能发送大文件

这是因为nginx默认不能发送大文件,请把最大文件限制改为2G,最大超时时间改为60分钟。如下所示:

#上传文件大小限制
client_max_body_size 2048M;

#设置为on表示启动高效传输文件的模式
sendfile on;

#保持连接的时间,默认65s
keepalive_timeout 3600;

2. 上传文件失败,minio服务抛出异常

检查日志异常调用栈中是否有wfchat.getUserSecret字段。如果有则说明是minio调用im服务获取用户密钥失败,检查minio服务是否可以访问im服务的管理端口(默认是18080),管理密钥是否正确等。

3. 使用nginx反向没有转发header

header中带有用户id信息,这样minio可以查找到对应用户id的密钥,用来解密上传的内容。请确保转发时带上所有header,下面为参考配置 :

location / {
        proxy_set_header  Host  $http_host;
        proxy_set_header  X-real-ip $remote_addr;
        proxy_set_header  X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_pass  http://minio_cluster;
}

4. 不要修改minio的region

IM服务内默认使用的region是us-east-1 ,是默认的minio的region,请使用这个默认的region,不能修改为其他值。这个值实际使用上没有其他的意义。

鸣谢

感谢Minio提供如此棒的开源产品

MIT License Copyright (c) 2019 野火IM Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

简介

暂无描述 展开 收起
MIT
取消

发行版

暂无发行版

贡献者

全部

近期动态

加载更多
不能加载更多了
1
https://gitee.com/LordLaoZi/WF-minio.git
git@gitee.com:LordLaoZi/WF-minio.git
LordLaoZi
WF-minio
WF-minio
master

搜索帮助