近些年来各路网盘纷纷退市,只有为数不多的网盘还在死死坚持,例如百度网盘。

NextCloud逐渐进入了人们的视野。

搭建好的NextCloud-客户端页面
搭建好的NextCloud-客户端页面

这几天搭建网盘的过程,遇到了许多问题,最后总算是解决掉,结束折磨辽,为了方便大家能够顺利完成自己的网盘搭建,所以我写下了这篇博客。
阅读完本文你可以自己亲手搭建一个256T的个人云盘,如果有不懂的地方,可以通过网站联系方式联系我。

Nextcloud community.jpg
Nextcloud community.jpg

  • Nextcloud是德国Nextcloud公司的一套开源的自托管文件同步和共享的通信应用平台。而NextCloud的创始人是ownCloud联合创始人Frank Karlitschek,16年他离开了原公司,成立了NextCloud。
    左侧为OwnCloud,右侧为NextCloud
    左侧为OwnCloud,右侧为NextCloud
  • 可以看出NextCloud与ownCloud两者十分相像。
  • 两者最大的区别涉及用户界面和企业许可协议。
  • NextCloud有更强大的社区支持,且开源;为所有用户提供企业级安全。

安装

NextCloud需要在Nginx(或Apache),MySQL,PHP环境下运行,建议使用Linux系统

一、选购服务器

建议选购香港服务器,离大陆近,而且也不需要备案,阿里云香港轻量型服务器在我看来最为合适,因为轻量型服务器外网带宽大于同价位ESC(轻量型服务器每个月有流量限制,但很充足),实测网盘搭建好后下载速度在6MB/s以上甚至更快。
选购这一部分就不多加赘述了,十分简单,注意选择Linux系统(Centos,ubuntu)就行了

二、安装宝塔面板(对后续安装配置很方便)

Centos安装指令

yum install -y wget && wget -O install.sh http://download.bt.cn/install/install_6.0.sh && sh install.sh

ubuntu安装指令

curl -sSO http://download.bt.cn/install/install_panel.sh && bash install_panel.sh

安装完成后,会显示外网登录地址,账号密码。
接着不要急着登录宝塔面板,需要先在服务器控制台的防火墙页面打开8888端口,否则无法打开宝塔面板。
进入后台,安装LNMP环境(或者LAMP环境),本文使用的是LNMP环境。

三、挂载阿里云OSS

为什么要在nextcloud安装之前挂载OSS?

  • 如果在nextcloud安装完成后再移动数据库非常麻烦,这也是我踩的坑之一。
  • 用过nextcloud的人可能会说nextcloud有一个内置应用可以添加外部存储,叫External storage support,可以在拥有服务器存储的条件下,直接添加一个外部存储空间。但是,这也是我踩的一个坑。当你的云盘有多个用户的时候,用这个添加的外部存储,所有人上传的文件其他人都能看到,相当于你将阿里云OSS变成了一个256T的共享文件夹,也不能对用户设置配额(除非你自己一个人用)。
  • 提前挂载阿里云OSS,再nextcloud安装时就能直接选择OSS作为数据盘,非常方便。

创建bucket

在阿里云OSS管理控制台页面,点击创建Bucket

Inked20211004211605_LI.jpg
Inked20211004211605_LI.jpg

最好选择与你服务器相同地域的Bucket,这样服务器到OSS的数据传输只需要使用内网,内网流量完全免费,而外网流量需要收费,0:00-8:00为0.25元/GB,8:00-24:00为0.5元/GB
具体配置可参考下图
20211004211712.jpg
20211004211712.jpg

四、创建AccessKey

image-20220923155011701
image-20220923155011701

云账号 AccessKey 是您访问阿里云 API 的密钥,具有账户的完全权限,请您务必妥善保管!不要以任何方式公开 AccessKey 到外部渠道(例如 Github),避免被他人利用造成 安全威胁。强烈建议您遵循 阿里云安全最佳实践,使用 RAM 用户(而不是云账号)的 AccessKey 进行 API 调用。
一定要妥善保存自己AccessKey

五、将OSS挂载到服务器

这一步我踩的坑最多,下面的内容都是我本人总结出来的,如果有问题大家可以参照网络上的教程多多测试或者向我提问。

1.获取Bucket 域名

点击刚刚创建的Bucket,按下图所示

image-20220923155039297
image-20220923155039297

2.在宝塔控制面板新建网站,在网站根目录创建cloud/ossfs
3.安装ossfs

需要先选取所需插件的版本
使用命令下载即可
GITHUB地址

以下载CentOS 7.0 (x64)版本为例:

wget http://gosspublic.alicdn.com/ossfs/ossfs_1.80.6_centos7.0_x86_64.rpm

安装命令
Ubuntu系统
以Ubuntu 16.04 (x64)版本为例,安装命令如下:

sudo apt-get update
    sudo apt-get install gdebi-core
    sudo gdebi ossfs_1.80.6_ubuntu16.04_amd64.deb
CentOS系统
以CentOS 7.0(x64)版本为例,安装命令如下:
sudo yum install ossfs_1.80.6_centos7.0_x86_64.rpm

然后使用SSH远程连接服务器,依次输入以下命令
对于Ubuntu系统,安装命令是:

sudo apt-get update
sudo apt-get install gdebi-core
sudo gdebi your_ossfs_package

对于CentOS6.5或更高版本,安装命令是:

sudo yum localinstall your_ossfs_package

对于CentOS 5,安装命令是:

sudo yum localinstall your_ossfs_package --nogpgcheck

这个your_ossfs_package就是你选择的插件版本
例如我的命令为:sudo yum localinstall ossfs_1.80.5_centos7.0_x86_64.rpm

4.将自己的AccessKey保存到服务器
echo my-bucket:my-access-key-id:my-access-key-secret > /etc/passwd-ossfs
chmod 640 /etc/passwd-ossfs
  • my-bucket:创建的bucket的名称
5.挂载OSS

我将oss挂载到了网站根目录,所以在网站根目录下创建cloud/ossfs,当然你也可以挂载到其他盘中。
接下来是关键步骤
使用ssh连接到服务器,输入如下指令

id www

image-20220923155126162
image-20220923155126162

可以看出我这里的www用户id为1001

例如bucket名称为cunchu,挂载地址为/www/wwwroot/example.com/ossfs,bucket的Endpoint(地域节点)为oss-cn-hongkong-internal.aliyuncs.com(因为我的服务器跟oss在一个地区,所以我直接填内网地址就可以了)
具体命令为

ossfs cunchu /www/wwwroot/example.com/ossfs -o url=oss-cn-hongkong-internal.aliyuncs.com -o nonempty  -ouid=1001 -ogid=1001  -oumask=007 -o allow_other

若挂载后提示
InvalidBucketName
原因是在挂载时,错误的使用了Buket域名,而不是Endpoint(地域节点),更换一下重新执行命令即可。

解除挂载命令
不想挂载在此位置再使用

fusermount -u /挂载的目录

tips:如果不设置ouid和ogid,nextcloud将无法访问oss。
挂载完成后,在宝塔页面可以看到挂载的OSS

image-20220923155144981
image-20220923155144981

挂载完成后,最好将挂载命令加入到服务器启动项中,避免每次重启都需要手动挂载。

6.安装Nextcloud

在官网上下载Nextcloud安装包,上传到网站根目录,解压,通过浏览器输入你的网站域名进入安装。
在安装页面的数据目录位置填入OSS的挂载位置
若提示您的数据目录可被其他用户读取 请更改权限为 0770 以避免其他用户查看目录
请在example/config/config.php中添加以下代码(不用担心下一步会解决访问权限问题)

'check_data_directory_permissions' => false
7.安装完成后还需要通过网站配置文件设置禁止访问目录(本条仅限于将OSS挂载到根目录的用户)

在宝塔页面点击网站,点击设置,在配置文件中添加如下代码。

image-20220923155210120
image-20220923155210120

data是多余的(我的nextcloud存储位置不为data,所以其实我可以删掉这个。)

location ~ ^/(?:build|tests|config|lib|3rdparty|templates|cloud)/ {
    deny all;
}

代码中的“build|tests|config|lib|3rdparty|templates|data”就是禁止访问的目录,data是nextcloud默认的存储数据的位置,如果你直接将OSS作为nextcloud存储数据的位置,在上方将data更换为根目录(非下一级目录)中挂载OSS的位置,如果你最开始跟我的步骤一致,直接复制粘贴上方代码即可,无需更改。

六、大功告成

Nextcloud更多的使用技巧可能我以后会再发布,敬请期待。

七、NextCloud常见问题解决(慢慢添加)

无法删除文件,提示文件被锁定:

{"reqId":"0DijSqEkfOg2iyh9VD8J","remoteAddr":"xx.xx.xx.xx","app":"webdav","message":"Exception: {\"Message\":\"HTTP\\\/1.1 423 \\\"path\\\/file.extension\\\" is locked\",\"Exception\":\"OCA\\\\DAV\\\\Connector\\\\Sabre\\\\Exception\\\\FileLocked\",\"Code\":0,\"Trace\":\"#0

手动禁用锁定状态:

永久解决(如果经常发生)

然而,禁用不是一个好的解决方案。当几个进程试图写入文件时(特别是web界面中的在线编辑器),您可能会遇到问题。在单用户和单客户环境中,这可能不是什么问题。
NextCloud原文链接