NextCloud + H5ai 打造你的专属文件分享存储服务

0.写在前面

很久之前,我就在博客首页放了个视频,因为怕把视频这种大文件扔到对象存储或CDN上会导致昂贵的费用,所以把这些大文件扔到了一台美国的大硬盘服务器上。

最初的方案只是简易的搭建一个LNMP环境直接把这些大文件存储起来。于是在以后每次更换视频的时候,都要登录xftp去手动上传视频。最近感觉这样做太蛋疼了,而且又想放一些东西。一开始打算使用H5ai凑合就算了,但是再想想H5ai并不带管理功能,上传或修改文件仍要使用xftp工具,痛点仍未解决,于是萌生了这个使用自建云盘想法。

1.云盘选型

自建云盘首先想到的就是OwnCloud,NextCloud,Seafile这几个方案。网上都说NextCloud是OwnCloud的继任者(OwnCloud元老离开并创立NextCloud项目),我也没深入研究,就不多说了。但是前两年使用OwnCloud的蛋疼经历至今我仍感觉历历在目,所以就OwnCloud好感度-1。

方案
\
项目
OwnCloudNextCloudSeafile
环境依赖LNMP*LNMP要求环境未安装其他环境应用
安装方便性一般,需要下载整个项目然后安装,也可以使用Docker或包管理器进行安装简易,只需要上传一个PHP文件并配置困难,需要一个干净的环境使用包管理器进行安装
存储方式文件存储,加密存储文件存储切片存储
存储可靠性*

*以上表格内的 “存储可靠性” 一项无数据支撑,仅凭使用印象打分。

尽管Seafile的存储可靠性较高,但是由于其对环境的严格要求及存储方式的特别,注定了Seafile更适合于严谨的存储场景,例如企业自建云盘(本人以前就帮当时所在的高中部署了Seafile,用于存放视频、图片等资源,至今稳定运行2年有余)。

加上上文说到,两年前的几乎同一个时间,我又部署过OwnCloud,当时使用的是php5.6,慢的一批,而且LNMP服务经常宕机,加上OwnCloud当时的存储方式貌似是加密的,导致web服务损坏,丢失秘钥后,文件几乎无法恢复,所以当时觉得蛋疼至极,所以好感几乎为0

对比了这三个存储方案后,我选择了NextCloud。

问题又来了,我在使用NextCloud的过程中发现NextCloud更注重于云盘,很多设置是从文件安全性的角度出发。所以即使有文件分享,文件分享后,可以直接使用 “文件分享链接/download” 的形式作为直链,但这个直链如果直接嵌套在网页内容上,例如在video标签直接嵌套这个直链进行视频播放,会导致无限的302跳转。详情请看以下的Issue – Too many redirects for shared image links (direct link).

之后我又发现了NextCloud的一个插件(nextcloud-sharing-path),说是可以把NextCloud当成CDN源站使用,但是也是没解决上述的无限的302跳转的问题。所以就想到了在data的某个目录下安装H5ai的想法。

让普通用户直接访问域名根目录,显示的是H5ai界面,同时管理员访问某个子目录(例如 a.com/_pan )可以进入NextCloud对文件进行管理。

综上所述,我们就需要配置Nginx伪静态规则实现这些想法。

1. 安装NextCloud

NextCloud的安装非常简单,此文不作详细叙述,下面放两个链接以供参考

但值得一提的是,我使用的Web服务器是Nginx,并且请在网站根目录创建_pan文件夹并把NextCloud安装进其中,以方便后续的Nginx配置

  1. 自建云盘系列——NextCloud (OwnCloud继任者) – Senraの小窝
  2. Install – NextCloud

安装完成后,请记住您的用户名,并开始配置Nginx伪静态规则

Nginx伪静态设置

由于我们服务端不是安装在网站根目录,所以需要手动修改Nginx伪静态规则

官方演示的目录是/nextcloud,所以我们要把伪静态规则中的nextcloud改为/_pan

改完后,记得更改配置文件中的root为你的网站根目录,并把fastcgi_pass php-handler指向你的php-fpm

自此,NextCloud部分就安装完毕

2.配置H5ai

首先在你的NextCloud账户中创建任意目录,本文使用public作为目录。

创建public目录后,nextcloud会相对应的在data/{NextCloud用户名}/files下创建public目录

所以我们要把H5ai安装在 data/{NextCloud用户名}/files/public 目录下让H5ai前端能访问到public目录下的所有内容。

请记得把_h5ai目录设置为 0770 权限,文件所有者和用户组要与Nginx和php-fpm保持一致。

为H5ai配置Nginx伪静态规则

我们想在域名根目录访问H5ai,所以要使用 location / 块来处理

记得把配置文件中的 root, NextCloud用户名, php-fpm地址及端口按自己实际情况更改,然后把配置放入Nginx虚拟机设置的Server块中。

自此,所有配置已经完成。

3.遇坑经历

配置这个东西花了我近3天的时间,下面说说我遇到的问题。

  1. NextCloud的data目录的权限一定要为 0770,否则打开NextCloud时会报 “RouteNotFoundException”
  2. Nginx与php-fpm的用户名与用户组应保持一致,否则H5ai会提示403 Forbidden。这是因为NextCloud对data中文件的访问不是直接走Nginx的,而是交由php-fpm处理的,而H5ai是直接交由Nginx处理的。如果php-fpm与Nginx的用户或用户组不一致时,加上上文提到NextCloud的data目录的权限一定要为 0770 ,Nginx就对data目录没有访问权限,所以就会返回403 Forbidden的错误。
  3. Safari浏览器不支持MKV格式的视频或H.265编码的视频。

4.写在最后

我对Nginx了解还不是很多,所以上述的Nginx伪静态设置如果有什么更好的方法或者存在什么漏洞,欢迎在留言里指出!(*^▽^*)

分享到:

0 条评论

昵称

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

与博主谈论人生经验?