Joplin 是一个开源(免费)笔记应用,支持 Markdown 语法,横跨 Mac/iOS 等各个平台。通常 Joplin 有三种同步方式:

方式优点缺点
Joplin 官方云省心,稳定数据不安全,要付钱
公网 S3/网盘同步省心,稳定数据不安全,可能要付钱
Joplin 自建云同步数据相对安全,成本较低操作复杂

这里就选择了第三种看起来比较复杂的方式。借助 Docker,服务安装门槛已经大大降低;Cloudflare,则可以更加方便地进行网络端口映射。

0. 准备工作

  1. 一张 Visa/Mastercard 的信用卡,用于购买下面三种服务
    1. 一台 Linux 服务器,可以是运行在自己家里的 Linux 服务器,也可以是从云服务厂商购买的云主机
    2. 自己的域名,可以从常见域名服务商处购买(假定已买好了域名 example.com)
    3. Cloudflare 域名解析和内网穿透服务
  2. 基本的 Linux 操作
    1. terminal 的简单使用
    2. copy & paste 技能

1. Joplin 客户端的安装

Joplin 支持 iOS/macOS 等平台:

2. 在服务器上运行 Joplin Server

2.1 服务器选择

这里需要一个 Linux 服务器,它可以是:

  1. 本地安装 Linux 的电脑
  2. Windows 也可以,使用 WSL:https://learn.microsoft.com/en-us/windows/wsl/install
  3. 云计算厂商(如 Amazon/Google/Azure)提供的云服务器

这里推荐 Vultr 提供的云服务器:

  1. 价格实惠,最低可以到 $2.5 / 月
  2. 按时计费
  3. 支持支付宝/微信付款

2.2 docker-compose 运行 Joplin Server

Joplin Server 的安装配置比较麻烦,这里使用 docker-compose 来简化安装配置过程。可以参考 Docker 安装教程 来安装 docker-compose。用 docker-compose 来运行 Joplin Server 服务,对应的 docker-compose.yaml 配置文件如下:

version: "3"

services:
  database:
    image: postgres:13.1
    container_name: postgres_joplin
    volumes:
      - ./postgres:/var/lib/postgresql/data
    ports:
      - "$POSTGRES_PORT:$POSTGRES_PORT"
    restart: unless-stopped
    environment:
      - POSTGRES_PASSWORD=$POSTGRES_PASSWORD
      - POSTGRES_USER=$POSTGRES_USER
      - POSTGRES_DB=$POSTGRES_DATABASE
  joplin:
    image: joplin/server:latest
    container_name: joplin
    depends_on:
      - database
    ports:
      - "$APP_PORT:$APP_PORT"
    restart: unless-stopped
    environment:
      - APP_BASE_URL=$APP_BASE_URL
      - APP_PORT=$APP_PORT
      - DB_CLIENT=$DB_CLIENT
      - POSTGRES_PASSWORD=$POSTGRES_PASSWORD
      - POSTGRES_DATABASE=$POSTGRES_DATABASE
      - POSTGRES_USER=$POSTGRES_USER
      - POSTGRES_PORT=$POSTGRES_PORT
      - POSTGRES_HOST=$POSTGRES_HOST

docker-compose.yaml 文件中有一些外部环境变量,如 $POSTGRES_PORT 等,它们的值来自于 docker-compose.yaml 同目录下的 .env 文件。

POSTGRES_PASSWORD=joplin
POSTGRES_USER=joplin
POSTGRES_DATABASE=joplin
POSTGRES_PORT=5432
POSTGRES_HOST=database
APP_PORT=8087
APP_BASE_URL=https://joplin.example.com
DB_CLIENT=pg

其它说明:

到刚才保存 docker-compose.yml 的文件夹,执行:

docker-compose up # 直接运行,会打印log,退出terminal就会停掉
docker-compose up -d # 后台运行,不打印log,退出terminal后继续运行
docker-compose down # 关闭Joplin Server和postgres服务

3. 外网访问配置

前面通过 docker-compose 运行了 Joplin Server 服务。但并不能直接配置客户端进行同步,因为网络还没有配置好,客户端找不到 Joplin Server 连接的入口。这里还需要将 Joplin Server 同步服务暴露到公网。

3.1 域名购买

域名是我们访问互联网的入口,它能够帮我们方便定位服务器的”位置”。我们的 Joplin Server 也需要域名作为入口。更简单的理解是,我们的手机、电脑得在互联网上找到我们自建的 Joplin Server 的地址,此时就需要域名作为互联网上的门牌号了。

域名可以在 Namecheap 或者 Cloudflare 上购买。

cloudflare_register

要使用 Cloudflare 的话,需要一个 Cloudflare 的账户。注册时候要用到 Visa 或者 Mastercard 的信用卡了。

3.2 Cloudflare 解析域名

买好域名之后,还要做一个域名解析。其实就是在域名解析服务器上登记一下。

啥是域名解析

解析的意思是说让域名和某个 IP 对应起来,实际上,整个互联网上机器的连接是用 IP 地址作为地址的,但是 IP 地址实在不好给出更多的便于人类记忆的意义,所以就需要域名解析这一过程,将 IP 地址和域名联系起来。

比如我说我在这个地方,22.3193° N, 114.1694° E。嗯,你要用导弹来打我,那肯定是足够了。但是单单这个经纬度实际上给不了太多的信息,如果我告诉你这是香港,你就会自然地获得更多信息了。这里这个经纬度就是 IP 地址,而香港就是域名。显然,域名和 IP 的对应关系是可以更改的。比如说在晚清,香港被割让,就成了英属香港;而 1997 年之后就叫香港特别行政区。

这里可以看到 Cloudflare 的计划,0 元计划已经能够满足我们大部分需求。

cloudflare_plan

需要到域名提供商上修改域名服务器为 Cloudflare。修改完成之后,等一会解析就会生效了。

3.3 Cloudflare Zero Trust 做内网穿透

用 Cloudflare 还有一个好处就是白嫖它的内网穿透,用 Cloudflare 的 Zero Trust 做内网穿透,让整个互联网都能访问到你的服务。这个免费的内网穿透服务,比市面上那些收费的内网穿透盒子什么的不知道高到哪里去了。

1 在控制台上找到 Zero Trust 部分,或者直接点开这里

zer_trust

2 找到 Access -> Tunnels —> Create a tunnel

create_a_tunnel

3 新建 tunnel

new_tunnel

4 服务器安装客户端

docker_install_cloudflare

这里选择用 Docker 的方式进行安装。直接复制上面命令:

Cloudflare 客户端 docker 安装命令
docker run \
        --name cloudflare \
        --restart always \
        -d \
        cloudflare/cloudflared:latest \
        tunnel \
        --no-autoupdate run \
        --token xxxxxx # copy from the cloudflare website

5 在 Cloudflare 的网页上新建一个内网穿透隧道:

add_host

6 填写相关信息

host_details

  • subdomain: joplin
  • domain: example.com # 通过下拉菜单选取
  • service: http # 选择 http(而非其它)服务
  • url: 10.10.10.11:8087 # 前面的 ip 是客户端宿主机 IP,后面是 8087 是端口,参考 docker-compose.yaml 中 APP_PORT 的值

2.4 服务端账户密码修改

服务器端、内网穿透配置已经全部完成,在浏览器中访问:https://joplin.example.com。

这里的 joplin 就是前面的 subdomain,example.com 就是 domain。

login

此时还是默认账户名和密码:

  • 账户名:admin@localhost
  • 密码:admin

登录后需要修改账户名和密码!登录后需要修改账户名和密码!登录后需要修改账户名和密码!

4. 客户端连接

4.1 Mac 客户端同步

这里下载客户端进行安装。

可以看到这里有多种连接方式,这里选择 Joplin Server:

4.2 iOS 客户端同步

打开 Joplin 应用后,找到

ios_app_sync,输入:

  • 同步目标 Joplin Server
  • Joplin 主机 URL 在 .envAPP_BASE_URL 的值
  • Joplin 主机 email 一般是 admin@localhost
  • Joplin 主机密码 默认密码是 admin,需要登录后修改

配置完成之后,则可以点检查同步配置,查看配置结果。

ios_sync_success

这里显示同步配置成功了,以后打开 Joplin 时候就会自动同步。

5. 小结

本文介绍了用 docker-compose 自建 Joplin Server 的方式,实现了 Mac 和 iOS 上 Joplin 笔记的同步。为了能够在公网访问,则用 Cloudflare 的 Zero Trust 服务做了内网穿透,实现了外部数据同步。