在群晖上搭建基于 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 服务器直接怼服务上去,难免会出事。
  • 由于同时用到 postgresjoplin/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.<anonymous> (/home/joplin/packages/server/src/db.ts:113:10)
    at Generator.next (<anonymous>)
    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 即可跨平台使用,用起来感觉还可以。

但我内心中最真切的感受

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,999评论 4 368
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 68,102评论 1 302
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 110,709评论 0 250
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,439评论 0 217
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,846评论 3 294
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,881评论 1 224
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 32,062评论 2 317
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,783评论 0 205
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,517评论 1 248
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,762评论 2 253
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,241评论 1 264
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,568评论 3 260
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,236评论 3 241
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,145评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,941评论 0 201
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,965评论 2 283
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,802评论 2 275

推荐阅读更多精彩内容