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

2022-06-16 18:07:07 19点赞 137收藏 39评论

追加修改(2022-06-17 11:55:25):
原文代码糊在一起了,也没有找到地方可以重新编辑,只能追加修改了…… 这里放出最终版本的代码: .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: - "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 ----------------------------------------------------------------------

前言

笔者一直想找一款能代替 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: ige: 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: ige: 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

稍微说明一下几个参数

  1. APP_BASE_URL: 后续访问 Joplin Server 的域名,如果没有域名就用不了这玩意儿

  2. -v /var/lib/postgresql/data: 挂载 PostgreSQL 数据库持久化的路径,不设置这个每次重启映像数据就寄了

  3. DB_CLIENT: pg

  4. 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: ige: 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: ige: 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:12345db: Could not connect. Will try again. connect ECONNREFUSED 172.18.0.2:12345db: 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:12345at 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:12345at 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: ige: 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} comnd: -p 12345 app: ige: 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 即可跨平台使用,用起来感觉还可以。

但我内心中最真切的感受

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

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
39评论

  • 精彩
  • 最新
  • 看着好厉害,只是我不清楚joplin是啥

    校验提示文案

    提交
    简单来说就是Evernote的开源免费替代,他们的追求应该就是干翻收费的Evernote [得逞]

    校验提示文案

    提交
    看着好厉害,evernote 又是干啥的呢?

    校验提示文案

    提交
    收起所有回复
  • 有没有一种可能,第一次修改.yml的时候,db部分port是12345:5432 ,然后POSTGRES_PORT=5432呢? [邪恶] 因为在docker内部来说,那些docker都是用的172的ip,端口是5432,并不是bridge的端口12345 [邪恶] 第二次修改是强制POSTGRESsql运行在12345,所以joplin才能连接内部172地址的12345呢 [邪恶]

    校验提示文案

    提交
    感觉这里面哪里有问题就是了。而且同样有用到POSTGRESsql的其他东西比如teamcity,我用12345:5432这种方式就完全没问题。这种方式讲道理是非常符合直觉的 [阴笑]

    校验提示文案

    提交
    收起所有回复
  • 代码哪里要从新编辑下,全部在一起了

    校验提示文案

    提交
    好家伙,找半天没找到哪里可以重新编辑 [小怒]

    校验提示文案

    提交
    收起所有回复
  • 我是在群晖上用webdav同步的Joplin。
    joplin server默认不知道把文件存在哪里。。。官方文档上是有如何把文件保存到本地文件系统的说明的,那玩意儿我也没看明白到底是在.env里设置还是在哪里设置。。。
    不知道文件存在哪里,就没办法备份同步文件,这点就很没安全感。

    校验提示文案

    提交
    qs,他们这东西真的离谱。好多功能做了,但是又不给你说怎么用,可能这就是beta版本吧。
    比如你修改账户邮箱之后,他会向修改后的邮箱发确认的邮件,但是xs根本发不出去,因为要设置SMTP,但是界面上又没地方配。需要在.env里面设置。参数还得你去翻他的社区,有个人在评论里面偷偷告诉你,啧啧啧,牛*吧 [小怒]

    校验提示文案

    提交
    补充一个webdav同步的坑,webdav的地址在MAC和pc上都可以填域名,但是在iphone上只能填IP,如果填域名就永远连接错误!也是我在他们git上刷了半天在一个评论里找到的。。。。

    校验提示文案

    提交
    还有3条回复
    收起所有回复
  • 好像把图片什么的都存数据库了。这样媒体方面的效率不好啊,

    校验提示文案

    提交
    毕竟它目的是干翻Evernote,Evernote的裁剪功能……反正PostgreSQL虽说没有MySQL快,但是稳还是稳如老狗的。

    校验提示文案

    提交
    收起所有回复
  • 我说我用ip端口死活不能登陆呢,这个坑太坑了。

    校验提示文案

    提交
    这种还好解决,就是他把所有的都放数据库的话 效率和数据库大小就比较麻烦

    校验提示文案

    提交
    [想一想] qs,就像他们官网的文档一样,全是坑

    校验提示文案

    提交
    收起所有回复
  • 这个坑遇到过。。。。域名必须与配置的相同才行 [内伤]

    校验提示文案

    提交
    总感觉这玩意儿坑不是一般的多,可能免费的才是最贵的吧 [流鼻涕]

    校验提示文案

    提交
    收起所有回复
  • obsidian+syncthing全面秒杀

    校验提示文案

    提交
    obsidian要钱啊 [小怒]

    校验提示文案

    提交
    都写了syncthing啊,不用官网同步不就不要钱。

    校验提示文案

    提交
    还有2条回复
    收起所有回复
  • joplin直接部署在腾讯cos就行了,一年下来不到十块钱……自带版本控制,比这样部署在私人服务器上访问快的多,基本一秒同步。端口那些问题也自然都不存在了

    校验提示文案

    提交
  • 这追加修改了个*啊,摆烂 [喜极而泣]

    校验提示文案

    提交
  • 学习学习,想摸索一下outline怎么部署

    校验提示文案

    提交
  • 不错哦 抓到了重点, 我之前装这个也是详细查了官方文档才发现app_base
    _url的坑,不过他目前的标的就是beta版本,所以后期如果优化修复好了应该会解放限制吧

    校验提示文案

    提交
  • 后来在用trilium了,还是需要web端的

    校验提示文案

    提交
  • 我用的trilium。个人感觉挺好用。

    校验提示文案

    提交
    trilium 有没有特别慢 我数据库文件100M+ 加载笔记特别慢

    校验提示文案

    提交
    没有。你的笔记很多?我的基本都是保存的网页,和整理后的网页,还有自己上传的一些附件。数据库我没看的多大。我用的中文版的。trilium-cn.

    校验提示文案

    提交
    还有4条回复
    收起所有回复
  • 这玩意不配置反向代理转不成https,没法通过互联网同步数据。。。

    校验提示文案

    提交
    同样的配置,但是手机上怎么用呀

    校验提示文案

    提交
    收起所有回复
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章

0x11901

Ta还没有介绍自己

关注 打赏
最新文章 热门文章
137
扫一下,分享更方便,购买更轻松