从很早以前就困扰我的一个问题就是没有一个很好的办法, 来管理个人知识. 从小学到高中使用纸质笔记本, 大学使用了 Evernote, OneNote, 之后又陆陆续续用了 NoteShelf, Bear, SimpleNote, 但是感觉还是没法满足全部的需求. 最近又动了折腾的心思, 今天搞了一个 0.1 版本, 在这篇博客分享一下.

需求分析

目前我个人大概有这几种类型的记录需求, 不代表大多数人的场景.

名称 记录形式 条理化程度 拓扑结构 例子
阅读笔记 手写 线性 读书笔记
整理后的笔记 电子 线性 源码阅读笔记
知识点 电子 网状 各种概念 / 设计 / 算法
博客 电子 点状 博客

考虑到这些需求的差异性, 我打算同时使用多种方式来满足这些需求.

  1. 纸质笔记本 + NoteShelf 满足阅读笔记的需求.
  2. 使用以”书”为单位的 BookStack 满足整理后的笔记的记录需求.
  3. 使用维基系统 WikiJS 满足知识点的记录需求.
  4. 使用个人博客 满足博客的记录需求.

VPS 选择

各大 VPS 相同价格的机器差不多, 比如 Vultr 最低配置为 1G 内存, 1CPU, 5 美金一个月. 我尝试了一下在这个配置的机器上使用 Docker 部署, 非常吃力, 一直报 Out of Memory. 然后我找了一下有没有便宜一点的 VPS, 然后发现了这个叫 SSDNodes 的提供商, 感受一下这个价格. 不过看上去好像是正在促销, 难道是我运气这么好, 第一次听说就正好在促销, 力度还这么大…

SSDNodes

部署

由于博客之前就搞好了, 所以今天只搞了一下 BookStack 和 WikiJS.

BookStack 和 WikiJS

BookStack 支持使用 Docker 部署, 需要使用数据库 (我使用了 MySQL) 同时需要指定访问 BookStack 的 URL. 我刚开始配置的时候因为想先部署在配置域名, 所以就先放着没配, 之后一直遇到没法加载 CSS 之类的问题. 所以加上 TODO 对我这种健忘的人来说还是有必要的…

WikiJS 也支持用 Docker 部署, 也需要使用数据库 (我也使用了 MySQL).

这里附上一个 Docker Compose 的样例配置文件. Bookstack 的官方文档有几个参数名错了, 样例文件里是对的. 可以通过执行以下命令部署:

1
2
3
4
export DATA=/some/path # 数据库文件的宿主机路径
mkdir -p $DATA/data_wikijs
mkdir -p $DATA/data_bookstack
USERNAME=数据库用户名 PASSWORD=数据库密码 docker-compose up -d

反向代理

作为一个贫穷的人, 我只买了一个机器, 部署这两个服务. 所以我又跑了一个 Nginx 做反向代理, 分别将 wiki.nearsyh.me 和 books.nearsyh.me 转发个对应的服务. 之前也没用过 Nginx, 今天花了几分钟糙快猛写了个配置文件, 结果也没遇到啥问题. 配置如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
http {
# original content

# add
server {
listen 80;
server_name wiki_domain; # wiki 域名
location / {
proxy_pass http://localhost:6000 # wiki 的端口号
}
}

server {
listen 80;
server_name bookstack_domain; # bookstack 域名
location / {
proxy_pass http://localhost:6001 # bookStack 端口号
}
}
}

SSL 配置

SSL 我使用了 Certbot 来签发证书. 它会自动更新 Nginx 配置, 还是挺方便的. Ubuntu 系统中指令如下

1
2
3
4
add-apt-repository ppa:certbot/certbot
apt-get update
apt-get install python-certbot-nginx
certbot --nginx -d example1.com -d example2.com

未完成的使命

因为刚开始搞的时候光顾着部署 Wiki 和 Bookstack 了, 写这篇博客的时候才意识到 Nginx 也可以用 Docker 部署, 之后可以考虑改进一下. 另一个问题是现在这些数据都保存在了本地数据库里, 得想一想如何备份和迁移数据.

2020-02-06 更新

WikiJS 支持同步到一个 Git 仓库, 解决了 Wiki 的备份问题.