阿里云的OSS现在兼容亚马逊S3的API了(见帮助文件),而且好像很多云服务商的对象储存都能兼容了(亚马逊战士!)。老方法(见下文过气信息章节)还是能用的,但是有了更优雅的新方法(虽然也是有点局限性的)。

直接把它当成 S3 “挂”到 Nextcloud 上嘛

但是要注意,我这边说的【挂】,目前还不是完全意义上的,目前实践上还不能在只赋予账户只读权限的情况下,将已有的oss bucket挂载到Nextcloud上,强行挂上去会发生`409 Conflict` response的;需要赋予完全权限(听起来就很危险)。当然接下来难点就是如何调整一下阿里云那边访问权限RAM(以后再说)。同时最大的问题就是

>>> Exception: 天国的文件夹 <<<

问题的原因目前猜测可能跟minio那时候的问题相关(详见我的这篇文章)。但具体的情况还是有一点不一样的,虽然bucket里已有的“文件夹”看不见,但通过nextcloud新创建的“文件夹”还是有的(比minio那种完全没法用的,厉害多了)。并且目前这个锅可能要让nextcloud背,详见issue。同样在那篇issue中提到了一个workaround方法(直到14.0.3版本还是能用的):

  1. 在对应位置创建你看不见的那个文件夹
  2. 打开刚创建的文件夹
    1. 或者在nextcloud目录运行 sudo -u www-data php console.php files:scan --path=你刚刚创建的文件夹所对应路径 -v
  3. 等待页面刷新完成

当然要是原来在bucket里的“文件夹”不多的话,这样就没事了;要是有很多的话,可能需要写个小脚本批量创建“文件夹”。

首先在阿里云访问权限RAM创建一个用户,并获得其AccessKeyId和AccessKeySecret,赋予该用户对象储存的完全权限。

然后Nextcloud上挂载外部储存的几个要点

  • 储存类型“Amazon S3”;
  • 主机地址是bucket对应的Endpoint地址,或者说预期地址,因为没有的话会自动创建bucket(可怕的完全权限)
  • 区域和端口不用设置;
  • bucket名称就是bucket的名称;
  • 不要启用Path Style;
  • 不要启用Legacy (v2) authentication;
  • AccessKey和对应Secret填上就行;
  • 至于是否启用SSL,根据各自需求就行。

间章

在这里讨论一下结构和费用的问题,重开一篇讨论,显得有点短。

首先需要明确的是,nextcloud在回传下载地址时用的URL并不是也不可能是OSS的地址,因此数据传输需要跑两趟,那么这里就有个流量费的问题。

其次需要明确的是,作为Primary储存问题不大,但作为外部储存,会有选项【检查修改:从不】和【检查修改:每次访问时】。正如字面意思那样,每次访问时检查修改,会导致每次访问时对“目录”下的每个文件发送一个GET请求。而如果是从不检查修改,那么也如字面意思一样,任何不经过nextcloud传输的文件,都将不会显示在nextcloud中。因此这里也有一个费用的问题。众所周知,GET是要钱的,HTTPS的GET还更贵一点;但便宜就意味着这个bucket无法显示其他途径上传的文件。

另外一个需要明确的是,CDN的问题。nextcloud官方的意见是(详见issue

We will not do this, … for privacy of user data…

https://github.com/nextcloud/server/issues/8226

也就是说并不建议,虽然我也没搞清楚这些javascript都开源了,为什么还会有privacy of user data。但是从官方给的nginx配置文件上看,所有静态内容的获取,都要经过./index.php?$request_uri,那这样也就说明了现在这个结构的nextcloud,基本也就告别了使用CDN的可能性了。能玩出点花样的也就是前端nginx开个缓存,启用HTTP2协议,最大限度地减少请求次数。当然也是有几个热衷于玩出不一样烟火的歪果仁,修改php文件,强制使用CDN(详见这篇)。我打赌他打开管理员设置一定会发现程序完整性检验不通过(摊手.jpg)。因此也就别指望能用CDN流量省钱(而且讲道理,一般网盘类应用的流量大,主要应该是那个“有效荷载”大)和加速页面加载。

Section of outdated information 过气信息章节

目前Nexcloud并没有人开发挂载OSS为外部储存的插件,考虑到OSS方面提供的SDK,只有两个方向可以选择:将OSS映射到本地目录再由Nextcloud挂载本地目录为外部储存区域,或者,将OSS用FTP协议包装再由Nextcloud挂载FTP为外部储存区域。
首先讲结论,在Nextcloud 12.0版本上,只有前一种方法可用。
当然,十分期待能有大佬去开发Nextcloud插件。

以下主要介绍基于ossfs,ubuntu的挂载方法:
0. 新建Bucket,配置RAM,获得具有OSS完整权限的AccessID与AccessKey。
1. 安装ossfs

sudo apt-get install automake autotools-dev g++ git libcurl4-gnutls-dev \
                     libfuse-dev libssl-dev libxml2-dev make pkg-config
git clone https://github.com/aliyun/ossfs.git
cd ossfs
./autogen.sh
./configure
make
sudo make install

2. 配置ossfs
假设my-bucket为Bucket名称;my-access-key-id为AccessID;my-access-key-secret为AccessKey。

echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs

3. 挂载bucket目录
检查Web服务器运行的用户与组,在此假设web(1001),EndPoint为OSS的URL Endpoint。需要通过umask调整目录权限

mkdir /tmp/oss
ossfs my-bucket /tmp/oss -ourl=EndPoint -ouid=1001 -ogid=1001 -oumask=007 -o allow_other

3.5 卸载bucket目录

umount /tmp/ossfs # root user
fusermount -u /tmp/ossfs # non-root user

4. Nextcloud挂载本地到外部储存区域

Discussion:
实际体验中,使用这种方式挂载的外部储存区域,效率相对低下,可能的原因是OSS–HTTP–>Local File System–HTTP–>Client环节过多。如果使用的是ECS,OSS的Endpoint最好选择与ECS同区域,然后Endpoint选用内网,可以一定程度降低流量费。通过外部储存区域下载文件时,特别是在下载大文件时,会有较长的停顿,因此推测Nextcloud的行为是:OSS–>VPS–>Client。如果VPS是按流量计费,且流量单价比OSS高,则建议不要挂载OSS到Nextcloud。使用ossftp包装的OSS API时,虽然Nextcloud正确地链接到了FTP server,但是无法访问、创建文件。

留下评论