云笔记到底哪家强 -- 教你搭建自己的网盘服务器

1. 云笔记的选择

总喜欢有事没事写些东西,无论是总结新的技术点,还是读书笔记与感悟,抑或仅仅是一些心得体会,于是,这些东西写在哪里就成了我面临的一个选择难题。

1.1 印象笔记

大学时代,主要使用百度博客记录文字,大三的时候由于实习有了移动记录的诉求,于是开始使用印象笔记。

印象笔记可以说是最为稳定的一款笔记软件了,也是我至今使用唯一没有遇到过什么 bug 的软件,功能也非常基础,但十分易用。

可是到了 2015 年,印象笔记突然宣布免费用户只能登录两个设备,于是忍痛割爱,只能放弃了,主要问题有三个:

  1. 我至少需要三个设备同步:办公电脑、家用电脑、手机
  2. 不支持 markdown
  3. 不支持 linux 系统

加上印象笔记当时频频传出的财务问题,随时担心因为公司倒闭发生一夜之间笔记全无的悲剧,于是放弃了继续使用印象笔记的打算。

1.2 有道云笔记

脱离印象笔记,马上开始寻找下一个好用的工具,于是找到了国内本地化做的很好的有道云笔记。

有道云笔记和其他许许多多国内互联网厂商一样,坚持走免费路线,但由于笔记这个领域过于小众,可以看出网易对于这个产品的投入力度也非常不足,虽然也有推出诸如学霸笔记、微信热门收藏这样亮眼的功能,但有一些 bug 却反复反馈始终未能改善,同时发版频率很低,也很担心某天如同网易相册一样被网易弃之如敝屐。

说到 bug,最让人抓狂的一件事就是在 ios 端,反复在几个 app 间切换几次,光标就会消失,在 windows 上偶尔也会遇到,电脑上光标消失至少可以用鼠标定位,而手机端一旦没有了光标,实在让人无从下手。

另一方面,有道云笔记对于 MacOS 的支持与 windows 系统中相差甚远,而对于 linux 操作系统,完全没有客户端可供使用,尽管有道云笔记、印象笔记都有网页端,并且网页端都拥有客户端的完整功能,但问题在于,受到网页端的带宽限制,即便是打开纯文本的笔记,也需要有几秒钟时间缓冲,严重影响使用体验,如果仅从网页版来看的话,百度云笔记要好用得多。

另一个问题在于,非付费用户只能每隔 3 个月全量导出一次,不论成功失败,我在使用中,多次进行导出,每次都遇到了导出过程中 app 崩溃,虽然导出失败了,但这三个月一次的机会已经一去不复返了,也许很多用户并不在乎导出功能,但事实上,这是一个笔记备份、文本处理等常用功能所依赖的十分重要的功能。

1.3 notion

现在全世界最为火热的云笔记非 notion 莫属了,功能强大且多端体验一致,他不仅是一个传统的云笔记,还同时实现了文档管理、待办事项,并且按块组织,开创了一种新的笔记管理形式。

但多端体验一致这个优势的深层原因在于这个工具是完全使用 html5 开发的,客户端只是在 h5 基础上套壳实现的。

这意味着,notion 是完全在线的云笔记,使用 notion 需要忍受境外服务器极不稳定的网络,甚至会因为国家屏蔽策略的变更导致 notion 无法使用,这在我看来是完全无法接受的。

当然,以我国软件开发团队的惯例,notion 在国外如此火热,势必很快会有本土化产品横空出世,到时候大概会成为云笔记市场中一个强有力的竞争者。

1.4 同步云盘 + 编辑器

如果只在电脑端使用笔记,那么,有一个同步云盘,加上一个好用的编辑器,vim、typora、emacs、vscode,无论哪个用起来都会感到得心应手,配合操作系统强大的 find、fzf、awk、grep、sed 等工具,文本查找、批量操作都会非常轻松。

但问题在于,现有的几款同步云,除了坚果云外,都不能在手机端编辑,坚果云近来的广告真是铺天盖地,markdown 笔记支持手机端编辑,但坚果云 markdown 不支持相对路径中的图片,这意味着想在笔记中添加图片是一件非常繁琐的事情。

同时,坚果云非付费用户有着每月 1GB 上传、3GB 下载的流量限制,一旦你对他的使用越来越多,作为网盘资料累计,你将面临不付费下载不下来的尴尬局面。

1.5 joplin

1.5.1 基础功能

最终博主选择了 joplin 作为我日常使用的笔记,joplin 是一款开源的笔记软件,支持 Winodows、Linux、MacOS、Android、IOS 全套操作系统,并且各个平台体验是一致的,这在笔记软件中是很难得的,更为难得的是,他还拥有命令行版本,joplin 是通过 nodejs 实现的,且代码组织得很不错,你可以按照自己的需要去修改他的源码,增添自己的功能,或者屏蔽一些报错。

joplin 只支持通过 markdown 来记录笔记,不过这已经足够了,他支持生成临时文件供外部编辑器进行编辑,这样,你就可以使用 Typora、vim 或是任何你喜欢的编辑器来编辑和查看笔记了。

joplin 对全量导出也没有任何限制,你可以随时全量导出,通过操作系统提供的工具进行批量操作,再全量导入,这是极为方便的一个功能了,你也可以通过设置定时任务定时进行导出备份,或者修改 js 代码,让每次同步后导出一份来实现笔记的随时备份。

对于软件的展示,joplin 支持你通过 css 自定义各种样式,提供了最大程度的灵活性。

1.5.2 joplin-cli

joplin 除了提供支持所有主流操作系统的桌面版客户端外,还为 linux、MacOS 提供了命令行版本。

通过 joplin help all 命令可以查看 joplin 支持的全部命令,这些命令可以让你非常方便的与操作系统提供的功能相组合,实现各种其他笔记所无法实现的功能。

直接执行 joplin 命令,你还可以打开一个终端模拟界面,你可以编辑 ~/.config/joplin/keymap.json 文件,设置这个终端模拟界面中的操作,例如我通过下面的配置实现了 vim 的操作习惯:

代码语言:javascript
复制
 [
     { "keys": ["TAB","l"], "type": "function", "command": "focus_next" },
     { "keys": ["SHIFT_TAB","h"], "type": "function", "command": "focus_previous" },
     { "keys": ["UP","k"], "type": "function", "command": "move_up" },
     { "keys": ["DOWN","j"], "type": "function", "command": "move_down" },
     { "keys": ["PAGE_UP","F","{"], "type": "function", "command": "page_up" },
     { "keys": ["PAGE_DOWN","B","}"], "type": "function", "command": "page_down" }
 ]

1.5.3 远程服务器

joplin 作为一款开源软件,并没有维护远程的笔记服务器,但他支持接入你自己的远程服务器,包括:

  1. onedrive
  2. Nextcloud
  3. WebDAV 服务器
  4. Dropbox
  5. 本地文件系统

Dropbox 在国内被屏蔽而无法使用,onedrive 同步速度很慢,国内除了坚果云外,所有的网盘都不支持 WebDAV 协议。

此时,你的目光又看到了坚果云,看来坚果云真是一家良心厂商,但是,问题又来了,这次不仅仅是免费用户,即使你是付费用户,WebDAV 服务也受到 30 分钟内最多 1500 次请求的限制,因此只要笔记一多,就总是会同步失败,这简直不可接受,所以并不推荐使用。

在试用 onedrive、坚果云做 joplin 的远程服务器并为之抓狂后,博主走上了自己搭建 WebDAV 服务器之路,这也是目前我认为体验最好、最为方便快捷的方式了,但前提是你需要一台自己的服务器,考虑到百度空间、网易相册、360 云盘等国内厂商一夜之间关停服务,为广大使用者带来深重灾难,任何一家国内互联网厂商都不值得信赖,唯有自建服务器多地备份才是保障数据安全的最佳途径。

2. 通过 nginx 搭建 WebDAV 服务器

2.1 WebDAV 协议

WebDAV 是一种基于 HTTP1.1 协议的通信协议,关于 HTTP 协议,可以参看:

详解 HTTP 协议

在 HTTP 协议的基础上,WebDAV 添加了 GET、POST、HEAD 等新的 HTTP 请求方法,让请求方可以实现直接在服务器上读写文件、资源管理的功能,同时,WebDAV 还支持了对文件版本控制、加锁与解锁等方法,让 web 服务器直接变身为一个拥有标准功能的网盘服务器。

2.2 基于 Nginx 配置 WebDAV 服务器

2.2.1 下载 nginx 源码

首先我们需要下载源码包并解压:

wget https://nginx.org/download/nginx-1.19.2.tar.gz tar -zxvf nginx-1.19.2.tar.gz && cd nginx-1.19.2/

2.2.2 下载 nginx dav 扩展

nginx 的源码中并不包含对 WebDAV 协议的支持,但 nginx 官方开发了开启 WebDAV 协议支持的模块,因此我们只需要下载并在 nginx 编译时引入该模块即可。

git clone https://github.com/arut/nginx-dav-ext-module.git

2.2.3 编译 nginx

下面是我使用的编译命令,你可以根据自己的需要酌情增删引入的模块,最重要的是其中的 --add-module=./nginx-dav-ext-module

./configure --prefix=/usr/share/nginx --conf-path=/etc/nginx/nginx.conf --http-log-path=/var/log/nginx/access.log --error-log-path=/var/log/nginx/error.log --lock-path=/var/lock/nginx.lock --pid-path=/run/nginx.pid --modules-path=/usr/lib/nginx/modules --http-client-body-temp-path=/var/lib/nginx/body --http-fastcgi-temp-path=/var/lib/nginx/fastcgi --http-proxy-temp-path=/var/lib/nginx/proxy --http-scgi-temp-path=/var/lib/nginx/scgi --http-uwsgi-temp-path=/var/lib/nginx/uwsgi --with-debug --with-compat --with-pcre-jit --with-http_ssl_module --with-http_stub_status_module --with-http_realip_module --with-http_auth_request_module --with-http_v2_module --with-http_dav_module --with-http_slice_module --with-threads --with-http_addition_module --with-http_geoip_module=dynamic --with-http_gunzip_module --with-http_gzip_static_module --with-http_image_filter_module=dynamic --with-http_sub_module --with-http_xslt_module=dynamic --with-stream=dynamic --with-stream_ssl_module --with-mail=dynamic --with-mail_ssl_module --add-module=./nginx-dav-ext-module make -j8 sudo cp objs/nginx /usr/sbin/nginx

2.2.4 生成加密文件

既然是网盘,自然不能随便访问,需要对用户权限进行限制,通过 apache 的 htpasswd,可以生成账户加密文件:

htpasswd -cb auth_file username password

2.2.5 nginx 配置

下面是 nginx 的配置:

代码语言:javascript
复制
 server {
     listen 1088;
 charset utf-8,gbk;
 location / {
     set $dest $http_destination;
     if (-d $request_filename) {
         rewrite ^(.*[^/])$ $1/;
         set $dest $dest/;
     }

     if ($request_method ~ MKCOL) {
         rewrite ^(.*[^/])$ $1/ break;
     }
     root /data/webdav;
     autoindex on;
     dav_methods PUT DELETE MKCOL COPY MOVE;
     dav_ext_methods PROPFIND OPTIONS;
     create_full_put_path on;
     client_max_body_size 0M;
     dav_access user:rw group:rw all:r;
     auth_basic "Authorized Users Only";
     auth_basic_user_file /etc/nginx/auth_file/webdav_auth_file;
 }

}

当然,最好是能够配置支持 ssl 加密,从而防止被篡改,ssl 加密的配置方法参看:

手把手教你配置 https 站

这里我们使用了 1088 端口,并且将同步路径设置为了 /data/webdav,你可以根据自己的需要修改这些参数,不过需要记得将同步路径设置为开放权限:

chmod -R 777 /data/webdav

接下来,只要在 joplin 或者其他你想要实用的软件中配置用户名密码与服务地址即可。

如果你想要将你的 WebDAV 服务器直接作为网盘来使用,windows 系统中,你可以安装 RaiDrive 后进行一些配置就可以直接使用。

linux 系统中安装 davfs2 后,执行下面命令即可实现网盘挂载:

echo "use_locks 0" >> /etc/davfs2/davfs2.conf mkdir /mnt/drive1 mount -t davfs https://xx.com/dav/ /mnt/drive1

目前很多文件管理器已经支持了直接通过可视化配置实现 WebDAV 服务的挂载。