1. 云笔记的选择
总喜欢有事没事写些东西,无论是总结新的技术点,还是读书笔记与感悟,抑或仅仅是一些心得体会,于是,这些东西写在哪里就成了我面临的一个选择难题。
1.1 印象笔记
大学时代,主要使用百度博客记录文字,大三的时候由于实习有了移动记录的诉求,于是开始使用印象笔记。
印象笔记可以说是最为稳定的一款笔记软件了,也是我至今使用唯一没有遇到过什么 bug 的软件,功能也非常基础,但十分易用。
可是到了 2015 年,印象笔记突然宣布免费用户只能登录两个设备,于是忍痛割爱,只能放弃了,主要问题有三个:
- 我至少需要三个设备同步:办公电脑、家用电脑、手机
- 不支持 markdown
- 不支持 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 的操作习惯:
[
{ "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 作为一款开源软件,并没有维护远程的笔记服务器,但他支持接入你自己的远程服务器,包括:
- onedrive
- Nextcloud
- WebDAV 服务器
- Dropbox
- 本地文件系统
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 的配置:
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 服务的挂载。