Syncthing 配合 Nextcloud 搭建私有云

写在前面

首先感谢 youlun 大佬介绍了 Syncthing 这个好用的文件同步工具,一次性解决了 Nextcloud 同步残废的问题。

有人可能会问,Nextcloud 不就已经可以搭建私有云平台了吗,为什么还要借助 Syncthing 这样一个同步工具呢?如果文件量不大的话,可能这并不是什么大问题,但是由于 Nextcloud 即使是使用它的客户端,也只能通过网页方式上传,在遇到较大的文件的时候,就会遇到各种各样的限制,比如上传超时或者是文件过大不能上传等等。但是 Syncthing 就不存在这样的问题,可以顺畅地进行文件同步。那么,有没有办法让二者配合工作,即 Syncthing 负责文件同步,Nextcloud 负责网页端的界面和移动端访问的功能呢?答案是有的,而且非常可行,考虑到没有现成的教程,因此在这里记录一下。

LNMP 环境部署

WebServer 环境依然使用了 LinuxEye 的 LNMP 一键包,需要注意的问题是 PHP 选择 7.1 版本(Nextcloud 13.0.1 的依赖),以及需要通过 addon.sh 安装 fileinfo 这个 PHP 模块。

Nextcloud 安装

在部署完成环境之后,添加一个 nginx vhost,现在最新版的一键包中已经加入了 Nextcloud 的 Rewrite Rule,这个给我们的安装带来了极大的方便,再也不用去折腾那些重写规则了。

然后需要调整一下 Zend OPcache 的设置,不然在下载源码之后无法进入配置。具体步骤为在 /usr/local/php/etc/php.d/ 文件夹中找到 opcache 的 .ini 配置文件,将里面的数值按照如下的错误信息调整:

之后在官网下载 tar.bz2 的安装包,解压之后拷贝进 wwwroot,注意这里需要将所有的文件权限改为 www:www,默认一般是登录的用户,会造成无法访问,之后在 MariaDB 中创建一个数据库,在初始化的时候填进 Nextcloud 中,这一步还是比较方便的。

然后更改一下 Nextcloud 的配置,消除缓存的警告。在 <site root>/config/config.php 中添加如下字段即可:

'memcache.local' => '\OC\Memcache\Redis',
'memcache.locking' => '\OC\Memcache\Redis',
'redis' => array(
   'host' => 'localhost',
   'port' => 6379,
),

至此 Nextcloud 应该就可以正常使用了。

Syncthing 的配置

首先需要安装 Syncthing,官方文档中给出了 Ubuntu .deb 的链接,按照它配置即可。

这时候就会遇到一个问题,Syncthing 需要以 www 用户启动才能在和 Nextcloud 一同工作时避免一些权限的问题,但是 www 用户默认是 nologin 配置的,如何登陆进这个用户完成一些初始的设置是一个比较麻烦的问题。由于 www 用户无法登录,所以不能使用一般的 su <user> 来进行用户切换,以该用户的权限启动一个 bash 又不能完成完整的用户环境切换操作。在搜索之后,以一种比较 Tricky 的方法登录了进去:

su -s /bin/bash www

这条命令的意思是 override www 默认的 shell,再登录,然后就会发现你已经切换到 www 用户下了。运行 syncthing,该做什么做什么。

Nginx 反代

Syncthing 默认监听 localhost:8384 端口,那么在远端 VPS 上,如何进行配置呢?有两个方案,一个是修改监听端口,让程序监听 0.0.0.0:8384,另外一个是通过 nginx 配置一个反代。显然,第二个方案无论是在安全性,还是便利性(不用在域名后面输入端口号)上都优于第一个,所以我们就采用第二个方案。

Nginx 配置文件的关键部分如下:

server {
  listen 80;
  listen 443 ssl http2;

  if ($ssl_protocol = "") { return 301 https://$host$request_uri; }

  location / {
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
          proxy_set_header Host localhost;
          proxy_set_header X-NginX-Proxy true;
          proxy_pass http://localhost:8384;
  }
}

需要注意的一点就是 proxy header 中的 Host 字段必须改为 localhost,否则 Syncthing 发现你的访问地址不是它的监听地址,就会拒绝访问,返回“Host check error“。

之后就是正常的 Syncthing 使用,这个不难,看官方文档就可以了。

Syncthing 和 Nextcloud 配合工作

一开始我以为,把 Syncthing 的同步文件夹设置为我的 Nextcloud 的数据目录就可以完成同步,实际上 Nextcloud 的文件列表并不是实时的,需要运行 OCC 重新进行扫描,但是这样的扫描并不能保证数据完全无损,而且在使用时也不可能频繁 SSH 上去进行重扫,因此必须采取其他的方法。

关于这个问题,官方给出的答案是 External Storage,在 Nextcloud 中启用 External Storage 这个组件以后,在设置中挂载外部的文件夹,这个可以是本地,也可以是 SFTP/FTP/Amazon S3/WebDAV 等等,在这个情况下,我们选择本地,然后添加对应的文件夹就可以在 Nextcloud 文件列表中看到我们的文件了,无论是网页版还是手机都可以。

Syncthing 自动启动

在 Ubuntu 上,我们通过 systemd 服务来完成:

[Unit]
Description=syncthing
After=network-online.target

[Service]
ExecStart=/usr/bin/syncthing -no-browser -home="/home/www/.config/syncthing"
ExecStop=/bin/kill -9 $(/bin/cat /run/syncthing.pid)
Restart=always
PIDFile=/run/syncthing.pid
TimeoutStopSec=300
User=www

[Install]
WantedBy=multi-user.target

在 Windows 上,我们可以通过这样一个 .bat 完成启动:

start "Syncthing" syncthing.exe -no-console -no-browser

参考资料

https://docs.syncthing.net/
https://docs.nextcloud.com/server/13/admin_manual/
https://serverfault.com/questions/333321/executing-a-command-as-a-nologin-user
https://www.jianshu.com/p/4235cc85c32d

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注