10 部署自己的网盘Nextcloud

一、概述

表面上看,我们有微信、QQ可以实时发送文件,有百度网盘、阿里云盘……等一众网盘工具可以保存和分享文件,似乎已经解决了一切文件传递问题。

事实并非如此。实际上,我们经常遇到图片、视频在微信中发不出来的现象,也常常碰到网盘中的文件“无故”消失或无法分享的情形。有时候为了在网盘里分享一些特殊文件,不得不加密压缩一层又一层,文件名改的面目全非,即使如此,有时候仍然难逃审查。此外,动辄就VIP、SVIP,不充值就限速到无语的吃相,也让人敬而远之。

除了审查问题之外,文件分享、使用的便利性也是需要考虑的。传统的ftp虽然在Windows中还勉强支持,但出于安全原因,主流浏览器已经全部停止了对ftp的支持。smb协议(文件共享服务)只能用于内网,并不适用于公网环境。WebDAV虽然仍然是Windows自带的IIS的组件之一,但它过于简陋,只支持文件的浏览,无法上传和修改。

所以,为了解决以上问题,最好的办法是自建web文件服务器。网上有不少web文件服务器主要用于网站文件的更新,而我们想要的是一个专用的文件服务器。经过一番比选,Nextcloud是一个很好的选择。

二、安装与配置

对于Ubuntu系统而言,采用snap方式安装Nextcloud是最方便的,只需要一行命令:

sudo snap install nextcloud

命令执行完之后,Nextcloud已经默认运行在主机的80端口。为了避免它与nginx等网站服务相冲突,强烈建议修改它的默认http服务端口,顺便也修改它的https服务端口。

sudo snap set nextcloud ports.http=81
sudo snap set nextcloud ports.https=444

这里用81和444,就与默认的网站服务80、443做到了井水不犯河水。之后,我们可以在nginx中设置反向代理来连接它:

location / {
proxy_pass http://127.0.0.1:81;
}

同时,我们在nginx中配置好域名和https访问。此时,由于前置了一个反向代理,Nextcloud本身并不“知道”它的域名是什么,这可能导致各种各样奇怪的问题。因此,我们需要对Nextcloud的配置文件进行一番调整。

打开Nextcloud的配置文件存储目录:/var/snap/nextcloud/<current>/nextcloud/config。其中config.sample.php相当于配置教程,里面详细讲解了所有可能的配置。config.php则是实际发挥作用的配置文件。

一般来说,在设置反向代理的前提下,需要修改以下几项:

trusted_domains:

  'trusted_domains' => 
   [
    'domain.sample.com',
    'domain_ipv4',
  ],

这些相当于“告诉”Nextcloud,我是用domain.sample.com来访问你的!是用domain_ipv4来访问你的!请你相信来自这两个地方的请求!

overwrite.cli.url以及overwritehost:

 'overwrite.cli.url' => 'https://domain.sample.com',
 'overwritehost' => 'domain.sample.com',

这两句话的意思是,让系统中所有自动生成的本地地址,变成实际使用的域名地址。overwrite.cli.url影响不大,但overwritehost的影响就比较大了,务必设置正确。

告诉系统使用https访问:

'overwriteprotocol' => 'https',

实操证明,这一条不设置,会导致登录界面的跳转出问题。

最后,根据官网提示,我们在服务器的终端运行一个设置,将snap中的php使用的内存上限提一提:

sudo snap set nextcloud php.memory-limit=512M

Nextcloud这头的设置就差不多了。nginx的域名配置过程这里省略。现在,可以通过域名:https://domain.sample.com来访问Nextcloud了。

第一次访问会提示直接设置管理员帐号和密码。

三、nginx的附加设置

作为一个文件服务器,适当放开文件上传大小限制是必须的。在nginx server块中添加:

client_max_body_size 2G;

这表示最大限制上传文件大小是2G。

为了确保安全(消除Nextcloud得管理员设置界面的安全提示),在nginx server块中再添加:

add_header Strict-Transport-Security "max-age=15552000; includeSubDomains" always;

配置 HTTP Strict Transport Security (HSTS) 并设置其持续时间至少为 15552000 秒(即 180 天)。

修改完成后,记得执行nginx -s reload。

四、Nextcloud的使用Tips

在用户的欢迎页(也就是所谓的仪表盘),建议关闭“推荐文件”、“最近状态”,留下一个“最近动态”即可。天气插件随意。

切换到文件操作,需要点一下顶部的文件夹图标。

右上角用户头像->设置->个人信息中,可以设置界面语言。

预置的测试文件和模板文件可以删除。

在默认文件夹的界面上,左下角文件夹设置中,可以关闭“富文本编辑器”和“显示推荐”,让界面更清爽。

所有用户的文件数据,默认存储在这个路径:/var/snap/nextcloud/common/nextcloud/data。这个路径如果想要修改非常麻烦,需要手动修改数据库中文件指针,不推荐操作。

Nextcloud支持各平台下基于客户端的WebDAV,可以实现云端文件与本地文件夹的同步。

五、关于snap

今天还了解到,snap模式安装的程序,与docker有类似之处,与docker相同的是它是完全封装的环境,与docker的区别在于它直接使用宿主机的端口,而不像docker连端口都封装在容器内,需要建立宿主机与容器的端口映射。

所以,当Nextcloud提示说php缺少imagick插件时,在宿主机上sudo apt install php-imagick是无效的,因为在snap中的Nextcloud使用的完全是封装的php、mysql。简单查了一下,想要调整snap中的php配置,非常困难,因为snap的封装包是只读的。暂不研究。