1. 前言
曾经付费使用过印象笔记,有道云笔记和 One Note,痛点主要是私有化格式和导入导出的问题,其次是速度问题。经过一番考察研究后,决定切换到Joplin。
Joplin值得拥有的主要特性是:
- 开源软件,完全免费;
- 跨终端:支持的Mac,Windows和Linux桌面版,以及Andoid和iOS移动端;
- 本地存储;网页剪藏因为直接保存到本地,速度极快;
- 导入导出功能丰富,没有任何限制;
- 支持和各种云空间实现同步;
- 支持自建Joplin服务器实现同步;
Joplin的如果使用云空间(如坚果云,Dropbox等)进行同步,则没有发布笔记的功能。因此购买了一年的Joplin Cloud服务,一方面空间有限而且确实不便宜,同时又遇到了另外一个问题,因为服务器在国外,同步速度非常慢。
使用Joplin 2年后,认可了这是一款非常适合自己的笔记软件,因此决定自建Joplin服务器来实现同步,把最后一个短板补上。
2. 准备工作
需要做如下准备:
- 一台云服务器:100G SSD硬盘,2M带宽,2核4G内存即可;
- 服务器操作系统是 Debian12;
- 服务器上使用nginx
- 一个域名;
Joplin Server 占用资源不多,因此可以和其他服务共用服务器。
从网上找了一个教程:Joplin全平台笔记软件同步服务器搭建,基本上可用,但缺少了一些关键步骤,而且有些地方写的过于简略,配置文件中还有坑,所以基于这个教程,结合自己的实际搭建过程,形成了本文。
3. 安装 docker和docker-compose
此处略过,不会的童鞋请自行谷歌;
4. 使用docker安装Joplin
- 创建Joplin的安装目录并进入目录中
mkdir -p /usr/local/joplin
cd /usr/local/joplin
-
创建docker-compose.yml文件:
vim docker-compose.yml -
在文件中粘贴如下内容:
version: '3'
services:
db:
image: postgres:16
volumes:
- ./data/postgres:/var/lib/postgresql/data
restart: unless-stopped
environment:
- POSTGRES_USER=joplinuser
- POSTGRES_PASSWORD=joplinpwd
- POSTGRES_DB=joplin
app:
image: joplin/server:latest
depends_on:
- db
ports:
- "22300:22300"
restart: unless-stopped
environment:
- APP_PORT=22300
#此处写访问Joplin服务的域名
- APP_BASE_URL=https://joplin.example.com
- DB_CLIENT=pg
- POSTGRES_USER=joplinuser
- POSTGRES_PASSWORD=joplinpwd
- POSTGRES_DATABASE=joplin
- POSTGRES_PORT=5432
- POSTGRES_HOST=db
教程中的配置文件中用了一个4876的反向代理端口,造成了一些困扰,经过实践检验,直接删除了。
注意最重要的是这一行:APP_BASE_URL=https://joplin.example.com,此处要修改为准备好的域名。这个APP_BASE_URL 就是Web 管理页面的访问地址,也是同步服务器的地址。
- 在当前目录下,执行以下命令安装Joplin,并启动Joplin服务:
docker-compose up -d。 - 执行以下命令进行测试:
curl https://joplin.joinsino.com.cn/api/ping
如果Joplin正常启动,应返回:
{“status”:“ok”,“message”:“Joplin Server is running”}
- 如果要停止Joplin服务运行,在当前目录执行:
docker-compose shutdown
5. 生成自签名的SSL证书
因为Joplin同步时,必须使用https协议连接Joplin服务器,所以需要使用服务器CA证书。本文只说明自建免费证书的方法(略过从CA中心获得免费CA,以及购买CA的方式)。
5.1 生成到CA私钥和根证书
- 生成CA私钥(
selfca.key):openssl genrsa -des3 -out selfca.key 2048 - 生成CA自签名证书(
selfca.crt):
openssl req -new -x509 -days 3650 -key selfca.key \
-subj "/C=CN/ST=BJ/L=BJ/O=MyRootCA/OU=MyCA/CN=JoplinCA" \
-out selfca.crt`
5.2 生成服务器私钥(server.key)和服务器证书申请文件 (server.csr)
openssl req -newkey rsa:2048 -nodes -keyout server.key \
-subj "/C=CN/ST=BJ/L=BJ/O=MyRootServer/OU=MyServer/CN=Joplin.example.com" \
-out server.csr
5.3 使用CA根证书签名生成服务器证书(server.crt)
openssl x509 -req -extfile <(printf "subjectAltName=DNS:Joplin.example.com") \
-days 3650 -in server.csr -CA selfca.crt -CAkey selfca.key \
-CAcreateserial -out server.crt`
5.4 最终的文件列表
至此CA根证书和自签名SSL证书就生成好了,一共获得了5个文件,作用分别如下:
selfca.key:CA私钥,用于后续签名SSL证书selfca.crt:CA根证书,用于后续签名SSL证书,需要加入到操作系统或浏览器的信任列表中server.key:服务器私钥,需要配置到https服务,比如Apache和Nginx配置文件中server.csr:证书签署请求文件,后续没用了server.crt:自签名SSL证书,需要配置到https服务,比如Apache和Nginx配置文件中,这就是代表服务器的身份证件
5.5 将根证书导入到系统中
根证书导入到系统中后,浏览器访问或curl访问就不会出现证书信任的问题了。
- macOS:
- 将自签名根证书文件(
selfca.crt)拷贝到本地。 - 双击该证书,然后在 钥匙串访问 中,设置为 始终信任。
- 将自签名根证书文件(
- Windows:
- 右键点击
.crt文件,选择 安装证书。 - 安装到 受信任的根证书颁发机构。
- 右键点击
- Linux:
- 执行以下命令,将证书更新到系统中
sudo cp selfca.crt /usr/local/share/ca-certificates/selfca.crt
sudo update-ca-certificates`
5.6 拷贝服务器私钥和证书到 nginx 目录下备用
mkdir -p /etc/nginx/ca
cp server.key /etc/nginx/ca
cp server.crt /etc/nginx/ca
6. 设置 nginx 和解析域名
- 编辑 nginx 配置文件
vim /etc/nginx/nginx.conf`
- 在 http{} 中,添加以下内容
http {
...
# 引入 Joplin 的配置文件
include /etc/nginx/conf.d/joplin.conf;
# 设置最大上传文件大小
client_max_body_size 100M;
...
}
- 创建
/etc/nginx/conf.d/joplin.conf文件,内容如下,需修改其中的域名:
# HTTPS 配置
server {
listen 443 ssl;
# 此处使用 Joplin 设置的 APP_BASE_URL 中的域名
server_name joplin.example.com;
# ssl证书路径
ssl_certificate /etc/nginx/ca/server.crt;
ssl_certificate_key /etc/nginx/ca/server.key;
location / {
proxy_pass http://localhost:22300;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto https;
}
}
# Http重定向到Https
server {
listen 80;
# 此处使用 Joplin 设置的 APP_BASE_URL 中的域名
server_name joplin.example.com;
return 301 https://$host$request_uri;
}
- 重新启动 nginx:
nginx -s reload - 解析域名:将Joplin服务的域名(APP_BASE_UR)
joplin.example.com,解析到Joplin服务器的IP地址;
7. 设置Joplin服务器,创建使用用户
-
登陆 web 管理页面:
https://joplin.example.com,默认帐号admin@localhost,默认密码admin,首次进入后一定要修改默认账号的密码。 -
在 ‘user’ 标签下,点击 “Add User”按钮创建新用户;
- 设置用户的属性(默认为不限制):
8. 设置 Jolin 客户端的同步
8.1 设置同步目标、服务器以及账号信息
- 打开Joplin客户端的设置界面;
- 左侧菜单栏选择“同步”;
- 在“同步目标”下拉框中选择 “Joplin服务器(Beta)”;
- 在“Joplin 服务器URL”文本输入框中,输入 Joplin的 APP_BASE_UR:
joplin.example.com; - 在Joplin服务器邮箱和服务器密码中,填写账号和密码;
8.2 设置自建的根证书
- 点击“显示高级选项”按钮,弹出高级选项的内容项:
- 在“自定义TLS证书”中,输入根证书 selfca.crt 文件的绝对路径;
8.3 检查同步配置
- 点击“检查同步配置”按钮,测试是否可以连接成功;
- 显示连接成功后,点击返回即可开始同步,可以手动点击“同步”按钮,或等待自动同步启动;