今天來把我們的讀書會《一個讀書會》的網站從 Halo 搬家到 Ghost。其實 Halo 算是不錯用的 CMS(內容管理系統),也提供多用戶協作管理,但可惜權限顆粒不夠細緻,除非大家都設為管理員否則沒辦法協作同一篇文章,不盡理想。而 Ghost 就提供 Admins, Editors, Authors, Contributors 四種身份,其中的 Editor 恰好就是我們需要的——同一次讀書會,分享者們能把內容丟進同一篇文章之中。

editor

那你說文章協作為何不直接用 Notion?其實,Notion 會是相當理想的解決方案。作為協作平台,他甚至還能將文章上線,完美整合了我們想協作又想上線(觸及外網交朋友、同時方便我們自己隨時訪問複習)的需求。不過若能自架,我還是會更願意先走自架的方案,萬一讀書會舉辦到第三十個年頭結果 Notion 倒了,那就不舒服啦。總之,我們來架設 Ghost 網站吧!

透過 Docker Compose 架設 Ghost

官方對於自架提供了完整的文檔指引,然而嘛,官方的預設做法綁定了 Caddy 作代理,並且整合了 Tinybird 跟 ActivityPub 在裡面,想搞一個整合生態系的企圖心很重,挺好,樂見其成。

但是,因為我們的伺服器上已經跑了多個服務,且一直都是用 Nginx Proxy Manager 來管理路由跟反向代理,這裡就不跟著官方的指引走咯。如果你也一樣不方便、不想用 Caddy,或是只想架設最基本的 Ghost 服務,可以參考參考。

我們的 docker-compose.yml 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
services:

ghost:
image: ghost:latest
restart: always
ports:
- 2368:2368
environment:
# see <https://ghost.org/docs/config/#configuration-options>
database__client: mysql
database__connection__host: db
database__connection__user: root
database__connection__password: example
database__connection__database: ghost
# this url value is just an example, and is likely wrong for your environment!
url: https://你的網域
# contrary to the default mentioned in the linked documentation, this image defaults to NODE_ENV=production (so development mode needs to be explicitly specified if desired)
#NODE_ENV: development
mail__transport: SMTP
mail__options__service: Mailgun
mail__options__host: smtp.mailgun.org
mail__options__port: 465
mail__options__secure: true
mail__options__auth__user: mailgun的SMTP使用者
mail__options__auth__pass: mailgun的SMTP密碼
volumes:
- ghost:/var/lib/ghost/content

db:
image: mysql:8.0
restart: always
environment:
MYSQL_ROOT_PASSWORD: example
volumes:
- db:/var/lib/mysql

volumes:
ghost:
db:

其中:

  • ghost:latest 我拉到的是 6.10.3
  • database__connection__userdatabase__connection__password 按需修改
  • url 就填你的網域咯,或是可以先用本地的 IP 來測試,但因為常規服務就會需要用到 SMTP 了,這裡建議要有一個可以用的網域
  • mail 的部分是重點,我們下述

透過 Mailgun 設定 SMTP 服務

就算你沒有打算搞訂閱、發電子信,Ghost 中的協作邀請、密碼重設、用戶註冊這些基本功能都是透過 Mail 來進行。Ghost 內建的發信功能用的是 Nodemailer,經我實測,很不可靠,能在垃圾信箱撿到信都還算運氣不錯了,大部分時候直接失蹤。所以我們還是用官方文檔中提到的第三方服務商 Mailgun 來替我們送信吧。

撰文當下,Mailgun 免費方案可以每個月寄 3000 封信,支撐 Ghost 的基本功能完全夠用,甚至能發行少量受眾的電子信,挺好。但要注意的是,如果沒有設定自己的域名,SMTP 服務是無法正常使用的,域名還是要搞定一下哦。(每年花個幾百塊訂閱一個自己的域名絕對是值得的投資,真心不騙啦)

Mailgun 註冊好、域名設定好之後,我們需要到 Send > Domain settings > SMTP credentials > Add new SMTP user 來新增一個用戶實體。而這裡 Login 欄位就是你的 mailgun的SMTP使用者,密碼就是你的 mailgun的SMTP密碼,分別將之填入我們 docker-compose.ymlmail__options__auth__usermail__options__auth__pass 中。

mailgun

設定反向代理

最後只要把我們 url 裡面設定的網域指向我們伺服器的 Ghost 容器之所在,即可快樂訪問咯。

以我這邊為例,在 Cloudflare 中將該網域以 CNAME 指向我的 DuckDNS 設定好的 DDNS 網域,並在 Nginx Proxy Manager 中將該網域路由到伺服器的 2368 port。

實際訪問,成功:

clubweb

以上!