跨设备同步一直是我使用 Keepass 的一个巨大痛点。Keepass 本身作为开源软件,数据库有开放标准,流行的各家实现都能通用,但它并没有提供任何云同步服务,也没有提供统一的云同步标准。这就相当痛苦了,等于每次更改都得手动同步,跨设备的时候尤其麻烦。本篇随便谈谈用 SFTPGo 这个工具自建云盘云同步平台,给 Keepass 或者任何类似的软件提供云同步服务。

当然,Onedrive Gdrive 这些服务如果能处理好代理问题、目录挂载问题等等还是很好用的,并且在存储方面显然比自建更可靠。不过本着折腾的精神,咱还是要玩耍一把自建服务。

SFTPGo GitHub 项目地址点此。主流的文件传输、同步协议它几乎都支持了,总有一款适合你的系统,包括并且不限于 FTP,FTPS,SFTP,WebDAV,SCP,Git…… 还支持 S3,GCP,Azure 等服务作为存储后端,保证数据安全。并且还提供了完整的 RESTful API、普鲁米修斯监控指标、灵活的用户鉴权方式、用户各自目录权限配置、容量按需分配按需限制、上传下载速度限制、客户端数限制、登录 IP 限制、文件变更推送通知…… 嗯,简而言之你甚至可以用它开卖云盘了🤣。

部署 SFTPGo

由于特性比较多,本地安装配置起来也比较繁琐,这里咱就用容器部署了。

# 从 GitHub 源拉取镜像
docker pull ghcr.io/drakkan/sftpgo:edge

这里我选择部署 WebDAV、FTP 两种协议,咱们的容器名称叫 sftpgo-server,配置为 --restart always 让它随 docker 服务一同启动:

docker run --name "sftpgo-server" \
-p 127.0.0.1:10125:8080 \
-p 127.0.0.1:10126:8081 \
-p 2022:2022 \
-p 21:21 \
-p 20:20 \
-p 50000-50100:50000-50100 \
-e SFTPGO_FTPD__BIND_PORT=21 \
-e SFTPGO_WEBDAVD__BIND_PORT=8081 \
-e SFTPGO_SFTPD__TLS_MODE=0 \
--mount type=bind,source=/home/ftp,target=/srv/sftpgo \
--mount type=bind,source=/home/ftp,target=/var/lib/sftpgo \
-d --restart always \
ghcr.io/drakkan/sftpgo:edge
  • 8080 为它的管理员 web 配置页面,咱映射到本地 10125
  • 其中 WebDAV 配置为容器中 8081 端口,映射到本地 10126 端口;
  • FTP 配置为容器中 2120 端口,被动模式为容器下 50000-50100 端口,分别映射到本地 212050000-50100 端口;
  • /srv/sftpgo 为容器中存放用户数据的目录,挂载到本地 /home/ftp 目录;
  • /var/lib/sftpgo 为容器中配置数据的目录,挂载到本地 /home/ftp 目录;

如果有碰到 docker 的 root 权限问题绑不上端口,可以试着加上这些选项

--cap-add NET_BIND_SERVICE --sysctl net.ipv4.ip_unprivileged_port_start=0

然后咱把 WebDAV 服务跟管理员 web 配置页面反代到本站对应 URL 上(😂地址咱就不告诉你了。

用户管理

进入 web 管理员页面,添加好用户、密码密钥等,就可以使用了!注意自带的 web 管理员页面并没有鉴权,不要暴露到公网上哦!可以自己 ssh 反代到本地电脑上来访问,按本文的配置就可以像这样

ssh -L 8080:127.0.0.1:10125 <服务器>

然后自己电脑上浏览器 http://localhost:8080 就可以打开管理页了。

使用

Windows 10、macOS 都支持 webdav 挂载,完了把 Keepass 的数据库丢对应目录就行了,只要软件改动保存了数据库就自动同步了。Linux 上选择就更灵活了,随你用啥挂载。移动设备上,Android 的 Keepass2android 本身就支持各种协议,咱刚用 webdav 同步上去的数据库轻松打开;iOS 咱不是用户暂不清楚。

其他

由于是自建服务,所以灵活性很大,配合其他软件可以很轻松实现文件共享。目前咱在本站上有放了 Nginx 公开目录,给同学同事传文件很方便,不需要登录不需要会员,一个地址给到浏览器打开就 ok,用不着辣鸡微信跟百度盘,或者去打印店也不用带 U 盘放文档或者登录啥,从自己的网盘上拿就是了……

当然,受限于自建服务,传输速度可能不太理想,也放不了太大的东西,但是同步文档绝对 ok,以后我甚至还打算替换掉在用的坚果云,自建 webdav 服务本身跨平台兼容性就很好,不需要额外客户端,也没有流量限制。不过本篇中的数据存储是部署服务器硬盘上的,虽说比个人手机电脑可靠多了,但仍有数据丢失之虞,保险起见,有重要文件的话还是建议选择大厂云服务做存储后端,像 S3、GCP 跟 Azure 这些 SFTPGo 本身就支持,或者也可以用 rsync 去挂载其他云服务作存储后端。


更新

  • 2020/12/6 SFTPGo 在 Windows 10 explorer 中上传文件变空的问题已解决;