前言
筆者一直想找一款能代替 MWeb 的跨平臺(tái)工具蟀俊,由于工作的變更扎附,很多 Mac 上好用的軟件在 Windows 平臺(tái)直接無(wú)法使用……反正探索了一圈感覺 Joplin 看起來(lái)是不錯(cuò)的挠铲,筆記功能和 MWeb 很像西雀,跨平臺(tái)磺送,并且筆記數(shù)據(jù)可以本地保存。恰好筆者近日購(gòu)買了一臺(tái)群暉的 NAS谋减,一起剛剛好牡彻,如同量身定制美滋滋。
Joplin Server 介紹
既然決定將筆記存在本地自己的 NAS 上面逃顶,Joplin 提供的 Joplin Cloud, Dropbox 自然不在考慮范圍內(nèi)讨便。看了一下官方的 Joplin Server 廣告以政,Joplin Server 比 WebDAV 或者 Nextcloud 牛逼多了霸褒。所以也沒什么好說(shuō)的,選就對(duì)了盈蛮!
你最好整個(gè)域名
為什么說(shuō)要有個(gè)域名呢废菱,其實(shí)筆者半年前就想搭建 Joplin Server 了,那為什么現(xiàn)在才發(fā)文呢抖誉?是因?yàn)榘肽昵按钍×税⑹庵幔嚵税胩煊?IP:端口號(hào)
沒成功,查官網(wǎng)的說(shuō)法是支持的袒炉,但是筆者堅(jiān)信官方是在放屁旁理!
順便說(shuō)一下這玩意兒筆者認(rèn)為極不靠譜,坑賊多……如果讀者還有興趣的話且聽筆者慢慢道來(lái)……
部署 Joplin Server
- 選擇 PostgreSQL 作為數(shù)據(jù)庫(kù)我磁,Joplin Server 還提供了 SQLite 的支持孽文,但是介紹是作為開發(fā)、測(cè)試用的夺艰,并且筆者是斥巨資購(gòu)入的高端群暉 NAS芋哭,性能杠杠的,使用 PostgreSQL 毫無(wú)壓力郁副!
- 推薦使用 Docker 部署 Joplin Server减牺,由于 Joplin Server 是部署在 NAS 上的,如果把 NAS 當(dāng)成普通的 Linux 服務(wù)器直接懟服務(wù)上去存谎,難免會(huì)出事拔疚。
- 由于同時(shí)用到 postgres 和 joplin/server 兩個(gè)映像,推薦使用 Docker Compose
SSH 進(jìn)群暉后切換為 root既荚,在喜歡的路徑創(chuàng)建 .env
和 docker-compose.yml
兩個(gè)文件草雕。
推薦還是整一個(gè) .env
,當(dāng)然沒有也行固以,這樣數(shù)據(jù)庫(kù)的賬號(hào)密碼就得多復(fù)雜粘貼幾次
.env
POSTGRES_PASSWORD=極其復(fù)雜的密碼
POSTGRES_DATABASE=取個(gè)能分辨的數(shù)據(jù)庫(kù)名字
POSTGRES_USER=取個(gè)能分辨的用戶名字
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ù)訪問 Joplin Server 的域名,如果沒有域名就用不了這玩意兒 |
-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.
通過報(bào)錯(cuò)得知端口 5432
已經(jīng)被占用菌湃,查了一下是群暉 NAS 自己在 5432
開了個(gè) PostgreSQL 服務(wù)。所以講道理的話我們是可以不用再在 Docker 中啟動(dòng)一個(gè) PostgreSQL 服務(wù)遍略,直接用 NAS 自己?jiǎn)?dòng)的原生就好了(注意這樣要設(shè)置 Docker 網(wǎng)絡(luò)模式為 Host)惧所。不過這背離了我們不把 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í)際上訪問 22300
發(fā)現(xiàn)什么也沒有势似,進(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
回車
cing!大功告成皆怕!
這次這玩意兒是真的跑起來(lái)了毅舆,順便說(shuō)一下 PostgreSQL 的端口你通過 Docker 網(wǎng)絡(luò) bridge 橋接到哪個(gè)端口,只要 POSTGRES_PORT
和 command: -p
的端口對(duì)應(yīng)上了端逼,這玩意兒它都能啟動(dòng)起來(lái)朗兵,你說(shuō)離譜不離譜?難怪貼子里的大哥表示:
Don't know why
我嚴(yán)重懷疑 Joplin Server 用了什么 DEEP♂DARK♂FANTASY 連接 PostgreSQL 數(shù)據(jù)庫(kù)吧6ヌ病S嘁础!
結(jié)尾
Joplin Server 服務(wù)啟動(dòng)好了之后礁鲁,記得使用你高超的技巧讓它能通過你配置在 APP_BASE_URL
中的帥氣的域名可以訪問到盐欺,不要嘗使用 IP:端口號(hào)
的方式來(lái)訪問使用,節(jié)約一下寶貴的時(shí)間吧(
默認(rèn)賬戶 admin@localhost
密碼 admin
登錄仅醇,進(jìn)去后盡快修改郵箱和密碼冗美。配合它家的各種 app 即可跨平臺(tái)使用,用起來(lái)感覺還可以析二。
但我內(nèi)心中最真切的感受
天天搞邪道連接數(shù)據(jù)庫(kù)是不是哪天就給我崩了7弁荨=谠ぁ!