Linux上自建Joplin Server的详细过程

1,932 阅读6分钟

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”按钮创建新用户;

image.png

  • 设置用户的属性(默认为不限制):

image.png

8. 设置 Jolin 客户端的同步

8.1 设置同步目标、服务器以及账号信息

  • 打开Joplin客户端的设置界面;
  • 左侧菜单栏选择“同步”;
  • 在“同步目标”下拉框中选择 “Joplin服务器(Beta)”;
  • 在“Joplin 服务器URL”文本输入框中,输入 Joplin的 APP_BASE_UR:joplin.example.com
  • 在Joplin服务器邮箱和服务器密码中,填写账号和密码;

image.png

8.2 设置自建的根证书

image.png

  • 点击“显示高级选项”按钮,弹出高级选项的内容项:
  • 在“自定义TLS证书”中,输入根证书 selfca.crt 文件的绝对路径;

8.3 检查同步配置

  • 点击“检查同步配置”按钮,测试是否可以连接成功;
  • 显示连接成功后,点击返回即可开始同步,可以手动点击“同步”按钮,或等待自动同步启动;