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

前言

筆者一直想找一款能代替 MWeb 的跨平臺(tái)工具,由于工作的變更,很多 Mac 上好用的軟件在 Windows 平臺(tái)直接無(wú)法使用……反正探索了一圈感覺(jué) Joplin 看起來(lái)是不錯(cuò)的,筆記功能和 MWeb 很像,跨平臺(tái),并且筆記數(shù)據(jù)可以本地保存。恰好筆者近日購(gòu)買(mǎi)了一臺(tái)群暉的 NAS,一起剛剛好,如同量身定制美滋滋。

Joplin Server 介紹

既然決定將筆記存在本地自己的 NAS 上面,Joplin 提供的 Joplin Cloud, Dropbox 自然不在考慮范圍內(nèi)??戳艘幌鹿俜降?Joplin Server 廣告,Joplin Server 比 WebDAV 或者 Nextcloud 牛逼多了。所以也沒(méi)什么好說(shuō)的,選就對(duì)了!

你最好整個(gè)域名

為什么說(shuō)要有個(gè)域名呢,其實(shí)筆者半年前就想搭建 Joplin Server 了,那為什么現(xiàn)在才發(fā)文呢?是因?yàn)榘肽昵按钍×税?,試了半天?IP:端口號(hào) 沒(méi)成功,查官網(wǎng)的說(shuō)法是支持的,但是筆者堅(jiān)信官方是在放屁!

順便說(shuō)一下這玩意兒筆者認(rèn)為極不靠譜,坑賊多……如果讀者還有興趣的話且聽(tīng)筆者慢慢道來(lái)……

部署 Joplin Server

  • 選擇 PostgreSQL 作為數(shù)據(jù)庫(kù),Joplin Server 還提供了 SQLite 的支持,但是介紹是作為開(kāi)發(fā)、測(cè)試用的,并且筆者是斥巨資購(gòu)入的高端群暉 NAS,性能杠杠的,使用 PostgreSQL 毫無(wú)壓力!
  • 推薦使用 Docker 部署 Joplin Server,由于 Joplin Server 是部署在 NAS 上的,如果把 NAS 當(dāng)成普通的 Linux 服務(wù)器直接懟服務(wù)上去,難免會(huì)出事。
  • 由于同時(shí)用到 postgresjoplin/server 兩個(gè)映像,推薦使用 Docker Compose

SSH 進(jìn)群暉后切換為 root,在喜歡的路徑創(chuàng)建 .envdocker-compose.yml 兩個(gè)文件。

推薦還是整一個(gè) .env,當(dāng)然沒(méi)有也行,這樣數(shù)據(jù)庫(kù)的賬號(hào)密碼就得多復(fù)雜粘貼幾次

.env

POSTGRES_PASSWORD=極其復(fù)雜的密碼
POSTGRES_DATABASE=取個(gè)能分辨的數(shù)據(jù)庫(kù)名字
POSTGRES_USER=取個(gè)能分辨的用戶(hù)名字

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

稍微說(shuō)明一下幾個(gè)參數(shù):

Parameter Function
APP_BASE_URL 后續(xù)訪問(wèn) Joplin Server 的域名,如果沒(méi)有域名就用不了這玩意兒
-v /var/lib/postgresql/data 掛載 PostgreSQL 數(shù)據(jù)庫(kù)持久化的路徑,不設(shè)置這個(gè)每次重啟映像數(shù)據(jù)就寄了
DB_CLIENT pg
POSTGRES_PORT 設(shè)置成 PostgreSQL 的端口,這里 PostgreSQL 映射的 5432

然后創(chuàng)建 當(dāng)前路徑/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.

通過(guò)報(bào)錯(cuò)得知端口 5432 已經(jīng)被占用,查了一下是群暉 NAS 自己在 5432 開(kāi)了個(gè) PostgreSQL 服務(wù)。所以講道理的話我們是可以不用再在 Docker 中啟動(dòng)一個(gè) PostgreSQL 服務(wù),直接用 NAS 自己?jiǎn)?dòng)的原生就好了(注意這樣要設(shè)置 Docker 網(wǎng)絡(luò)模式為 Host)。不過(guò)這背離了我們不把 NAS 當(dāng)普通 Linux 服務(wù)器的初衷,所以只能換一個(gè)給 PostgreSQL 換一個(gè)端口號(hào)

修改一下 docker-compose.yml,筆者這里就讓 PostgreSQL 映射的端口號(hào)為 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 仿佛一切盡在掌握之中,但實(shí)際上訪問(wèn) 22300 發(fā)現(xiàn)什么也沒(méi)有,進(jìn)入 Docker 查 Joplin Server 的日志,會(huì)發(fā)現(xiàn)瘋狂報(bào)錯(cuò):

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)

壞起來(lái)了,怎會(huì)如此。筆者在檢查了半小時(shí)配置,github issues 模塊沖浪多個(gè)小時(shí)之后,總算在這個(gè)貼子找到了解決的辦法:

手動(dòng)使用-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 回車(chē)

cing!大功告成!

這次這玩意兒是真的跑起來(lái)了,順便說(shuō)一下 PostgreSQL 的端口你通過(guò) Docker 網(wǎng)絡(luò) bridge 橋接到哪個(gè)端口,只要 POSTGRES_PORTcommand: -p 的端口對(duì)應(yīng)上了,這玩意兒它都能啟動(dòng)起來(lái),你說(shuō)離譜不離譜?難怪貼子里的大哥表示:

Don't know why

我嚴(yán)重懷疑 Joplin Server 用了什么 DEEP♂DARK♂FANTASY 連接 PostgreSQL 數(shù)據(jù)庫(kù)吧?。?!

結(jié)尾

Joplin Server 服務(wù)啟動(dòng)好了之后,記得使用你高超的技巧讓它能通過(guò)你配置在 APP_BASE_URL 中的帥氣的域名可以訪問(wèn)到,不要嘗使用 IP:端口號(hào) 的方式來(lái)訪問(wèn)使用,節(jié)約一下寶貴的時(shí)間吧(
默認(rèn)賬戶(hù) admin@localhost 密碼 admin 登錄,進(jìn)去后盡快修改郵箱和密碼。配合它家的各種 app 即可跨平臺(tái)使用,用起來(lái)感覺(jué)還可以。

但我內(nèi)心中最真切的感受

天天搞邪道連接數(shù)據(jù)庫(kù)是不是哪天就給我崩了?。。?/p>

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容