在群晖上搭建基于 PostgreSQL 的 Joplin Server

前言

笔者一直想找一款能代替 MWeb 的跨平台工具,由于工作的变更,很多 Mac 上好用的软件在 Windows 平台直接无法使用……反正探索了一圈感觉 Joplin 看起来是不错的,笔记功能和 MWeb 很像,跨平台,并且笔记数据可以本地保存。恰好笔者近日购买了一台群晖的 NAS,一起刚刚好,如同量身定制美滋滋。

Joplin Server 介绍

既然决定将笔记存在本地自己的 NAS 上面,Joplin 提供的 Joplin Cloud, Dropbox 自然不在考虑范围内。看了一下官方的 Joplin Server 广告,Joplin Server 比 WebDAV 或者 Nextcloud 牛逼多了。所以也没什么好说的,选就对了!

你最好整个域名

为什么说要有个域名呢,其实笔者半年前就想搭建 Joplin Server 了,那为什么现在才发文呢?是因为半年前搭失败了阿,试了半天用 IP:端口号 没成功,查官网的说法是支持的,但是笔者坚信官方是在放屁!

顺便说一下这玩意儿笔者认为极不靠谱,坑贼多……如果读者还有兴趣的话且听笔者慢慢道来……

部署 Joplin Server

  • 选择 PostgreSQL 作为数据库,Joplin Server 还提供了 SQLite 的支持,但是介绍是作为开发、测试用的,并且笔者是斥巨资购入的高端群晖 NAS,性能杠杠的,使用 PostgreSQL 毫无压力!
  • 推荐使用 Docker 部署 Joplin Server,由于 Joplin Server 是部署在 NAS 上的,如果把 NAS 当成普通的 Linux 服务器直接怼服务上去,难免会出事。
  • 由于同时用到 postgres 和 joplin/server 两个映像,推荐使用 Docker Compose

SSH 进群晖后切换为 root,在喜欢的路径创建 .envdocker-compose.yml 两个文件。

推荐还是整一个 .env,当然没有也行,这样数据库的账号密码就得多复杂粘贴几次

.env

POSTGRES_PASSWORD=极其复杂的密码
POSTGRES_DATABASE=取个能分辨的数据库名字
POSTGRES_USER=取个能分辨的用户名字

docker-compose.yml

version: "3"

services:
    db:
        image: postgres:latest
        volumes:
            - ./data/postgres:/var/lib/postgresql/data
        ports:
            - "5432:5432"
        restart: unless-stopped
        environment:
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_DB=${POSTGRES_DATABASE}
    app:
        image: joplin/server:latest
        depends_on:
            - db
        ports:
            - "22300:22300"
        restart: unless-stopped
        environment:
            - APP_PORT=22300
            - APP_BASE_URL=帅气的域名
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DATABASE=${POSTGRES_DATABASE}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PORT=5432
            - POSTGRES_HOST=db

稍微说明一下几个参数:

Parameter Function
APP_BASE_URL 后续访问 Joplin Server 的域名,如果没有域名就用不了这玩意儿
-v /var/lib/postgresql/data 挂载 PostgreSQL 数据库持久化的路径,不设置这个每次重启映像数据就寄了
DB_CLIENT pg
POSTGRES_PORT 设置成 PostgreSQL 的端口,这里 PostgreSQL 映射的 5432

然后创建 当前路径/data/postgres 文件夹,使用 docker-compose up -d 命令

cing!大功告成……才怪。

Creating network "joplin_test_default" with the default driver
Creating joplin_test_db_1 ...
Creating joplin_test_db_1 ... error

ERROR: for joplin_test_db_1  Cannot start service db: driver failed programming external connectivity on endpoint joplin_test_db_1 (785aa7860ddfe145a4b72dd8f88dc516b8bf7af28cacaad96cf5d0f9df719ac7): Error starting userland proxy: listen tcp4 0.0.0.0:5432: bind: address already in use

ERROR: for db  Cannot start service db: driver failed programming external connectivity on endpoint joplin_test_db_1 (785aa7860ddfe145a4b72dd8f88dc516b8bf7af28cacaad96cf5d0f9df719ac7): Error starting userland proxy: listen tcp4 0.0.0.0:5432: bind: address already in use
ERROR: Encountered errors while bringing up the project.

通过报错得知端口 5432 已经被占用,查了一下是群晖 NAS 自己在 5432 开了个 PostgreSQL 服务。所以讲道理的话我们是可以不用再在 Docker 中启动一个 PostgreSQL 服务,直接用 NAS 自己启动的原生就好了(注意这样要设置 Docker 网络模式为 Host)。不过这背离了我们不把 NAS 当普通 Linux 服务器的初衷,所以只能换一个给 PostgreSQL 换一个端口号

修改一下 docker-compose.yml,笔者这里就让 PostgreSQL 映射的端口号为 12345

version: "3"

services:
    db:
        image: postgres:latest
        volumes:
            - ./data/postgres:/var/lib/postgresql/data
        ports:
            - "12345:5432"
        restart: unless-stopped
        environment:
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_DB=${POSTGRES_DATABASE}
    app:
        image: joplin/server:latest
        depends_on:
            - db
        ports:
            - "22300:22300"
        restart: unless-stopped
        environment:
            - APP_PORT=22300
            - APP_BASE_URL=帅气的域名
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DATABASE=${POSTGRES_DATABASE}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PORT=12345
            - POSTGRES_HOST=db

然后docker-compose up -d

cing!大功告成……才怪。

看着屏幕上打印的 done, done 仿佛一切尽在掌握之中,但实际上访问 22300 发现什么也没有,进入 Docker 查 Joplin Server 的日志,会发现疯狂报错:

db: Could not connect. Will try again. connect ECONNREFUSED 172.18.0.2:12345
db: Could not connect. Will try again. connect ECONNREFUSED 172.18.0.2:12345
db: Could not connect. Will try again. connect ECONNREFUSED 172.18.0.2:12345
[error] db: Timeout trying to connect to database: Error: connect ECONNREFUSED 172.18.0.2:12345
    at TCPConnectWrap.afterConnect [as oncomplete] (node:net:1161:16) {
  errno: -111,
  code: 'ECONNREFUSED',
  syscall: 'connect',
  address: '172.18.0.2',
  port: 12345
}
Error: Timeout trying to connect to database. Last error was: connect ECONNREFUSED 172.18.0.2:12345
    at Object. (/home/joplin/packages/server/src/db.ts:113:10)
    at Generator.next ()
    at fulfilled (/home/joplin/packages/server/dist/db.js:5:58)
    at processTicksAndRejections (node:internal/process/task_queues:96:5)

坏起来了,怎会如此。笔者在检查了半小时配置,github issues 模块冲浪多个小时之后,总算在这个贴子找到了解决的办法:

手动使用-p指定 PostgreSQL 的端口。再次修改 docker-compose.yml

version: "3"

services:
    db:
        image: postgres:latest
        volumes:
            - ./data/postgres:/var/lib/postgresql/data
        ports:
            - "12345:12345"
        restart: unless-stopped
        environment:
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_DB=${POSTGRES_DATABASE}
        command: -p 12345
    app:
        image: joplin/server:latest
        depends_on:
            - db
        ports:
            - "22300:22300"
        restart: unless-stopped
        environment:
            - APP_PORT=22300
            - APP_BASE_URL=https://joplin.0x11901.top/
            - DB_CLIENT=pg
            - POSTGRES_PASSWORD=${POSTGRES_PASSWORD}
            - POSTGRES_DATABASE=${POSTGRES_DATABASE}
            - POSTGRES_USER=${POSTGRES_USER}
            - POSTGRES_PORT=12345
            - POSTGRES_HOST=db

键入docker-compose up -d 回车

cing!大功告成!

这次这玩意儿是真的跑起来了,顺便说一下 PostgreSQL 的端口你通过 Docker 网络 bridge 桥接到哪个端口,只要 POSTGRES_PORTcommand: -p 的端口对应上了,这玩意儿它都能启动起来,你说离谱不离谱?难怪贴子里的大哥表示:

Don't know why

我严重怀疑 Joplin Server 用了什么 DEEP♂DARK♂FANTASY 连接 PostgreSQL 数据库吧!!!

结尾

Joplin Server 服务启动好了之后,记得使用你高超的技巧让它能通过你配置在 APP_BASE_URL 中的帅气的域名可以访问到,不要尝使用 IP:端口号 的方式来访问使用,节约一下宝贵的时间吧(
默认账户 admin@localhost 密码 admin 登录,进去后尽快修改邮箱和密码。配合它家的各种 app 即可跨平台使用,用起来感觉还可以。

但我内心中最真切的感受

天天搞邪道连接数据库是不是哪天就给我崩了!!!

你可能感兴趣的:(在群晖上搭建基于 PostgreSQL 的 Joplin Server)