7 分鐘閱讀

部落格留言系統從 Disqus 換成 Waline|Vercel + Neon 免費架設與踩雷紀錄

把部落格的留言系統從 Disqus 換成 Waline,用 Vercel 和 Neon 免費架起來。記錄為什麼換、怎麼設定,以及在 Netlify 上卡關的過程。

這次部落格大翻新,順便把用了很久的 Disqus 換掉,改用 Waline。

過程比想像中曲折,中間還在 Netlify 上卡了好一陣子。這篇把選擇的理由、設定步驟和踩到的雷都記下來。

為什麼不用 Disqus 了

  • 有廣告:免費版會在留言區塞廣告,而且越來越多。
  • 載入慢:會多載入一堆追蹤用的程式。
  • 外觀改不了:新的部落格是筆記本風格,Disqus 放進去很突兀。
  • 留言資料不在自己手上:都存在 Disqus 的平台裡。

考慮過的選擇

方案讀者要登入嗎缺點
Disqus 開訪客留言不用廣告、慢、外觀不搭
Giscus要 GitHub 帳號我的讀者大多沒有 GitHub
Google Form + 試算表不用沒有回覆串、沒有通知、要自己擋垃圾留言
Waline不用,填暱稱就好要自己架後端

我的讀者很多是搜尋簽證、打工度假資訊進來的,留言門檻越低越好,所以需要 GitHub 帳號的方案先排除。

最後選 Waline,因為:

  • 填暱稱就能留言
  • 沒有廣告
  • 留言存在自己的資料庫,隨時可以匯出
  • 回覆、email 通知、垃圾留言過濾、後台審核都內建
  • 外觀可以用 CSS 改成跟網站一致

Waline 的架構

Waline 分成三個部分:

  1. 前端:放在部落格文章頁下方的留言框(@waline/client)
  2. 後端:處理留言的程式,部署在 Vercel
  3. 資料庫:存留言的地方,我用 Neon(免費的 PostgreSQL)

Waline 本身是開源免費的,Vercel 和 Neon 的免費方案對個人部落格的留言量也夠用。

設定步驟

1. 在 Neon 建資料庫

到 Neon 建一個專案,服務只需要開 Postgres。

接著打開 SQL Editor,貼上 Waline 官方提供的 PostgreSQL 建表語法(waline.pgsql)執行。完成後會有三張表:wl_comment、wl_counter、wl_users。

2. 把後端部署到 Vercel

用 Waline 官方文件裡的 Deploy 按鈕,它會幫你建一個新的 repo 和 Vercel 專案。

3. 填環境變數

在 Vercel 專案的 Settings → Environment Variables 填入資料庫連線資訊:

PG_HOST=你的主機
PG_DB=資料庫名
PG_USER=使用者
PG_PASSWORD=密碼
PG_PORT=5432
PG_SSL=true

這些值從 Neon 的連線字串拆出來:

postgresql://使用者:密碼@主機/資料庫名?sslmode=require

填完要到 Deployments 按 Redeploy,環境變數才會生效。

4. 註冊管理員

打開 你的後端網址/ui/register 註冊。第一個註冊的人就是管理員,所以部署完要馬上做。之後在 /ui 可以審核和刪除留言。

5. 接到部落格

安裝前端套件:

npm install @waline/client

在文章頁放一個容器,等它快要捲到畫面裡時才載入 Waline,這樣不會拖慢文章本身的載入速度:

import('@waline/client').then(({ init }) => {
  init({
    el: container,
    serverURL: 'https://你的後端.vercel.app',
    path: '/zh/blog/nz/buy-car', // 每篇文章用網址路徑當作留言串的 key
    lang: 'zh-TW',
    meta: ['nick', 'mail'],
    requiredMeta: ['nick'], // 只有暱稱必填
  })
})

外觀是用 Waline 提供的 CSS 變數調整的,把邊框、按鈕顏色換成網站的墨線和紅色,就變成筆記本風格了。

我另外保留了一個退路:如果沒有設定 Waline 的後端網址,文章頁會顯示原本的 Disqus,這樣切換期間留言區不會壞掉。

踩到的雷

雷 1:在 Netlify 上部署,全部都是 Not Found

我的部落格本來就放在 Netlify,所以一開始想把 Waline 後端也放那邊,照著官方的 Netlify 教學做。

結果部署成功,但打開後端網址只有一行 Not Found,連管理頁也一樣。

查了很久才發現原因:Netlify 會把後端程式打包成單一檔案,但 Waline 是在執行的時候才去讀自己的程式檔,打包之後那些檔案不見了,所以它什麼網址都不認得。如果叫 Netlify 不要打包、整包帶上去,路由就正常了,但整包有將近 400MB,超過 Netlify 函式 250MB 的上限,一樣部署不了。

最後直接改用 Vercel,一次就成功。Waline 的後端套件名字就叫 @waline/vercel,那邊才是它主要支援的平台。

結論:Waline 後端直接放 Vercel,不要在 Netlify 上浪費時間。 部落格本身放 Netlify 沒問題,兩邊分開就好。

雷 2:PG_PORT 一定要填

Neon 的連線字串裡沒有寫連接埠,因為 5432 是 PostgreSQL 的預設值。但 Waline 的預設連接埠不是 5432,所以一定要自己加上 PG_PORT=5432。

雷 3:貼環境變數時多了一個換行

後端跑起來了,但留言送不出去,錯誤訊息是:

database "
neondb" does not exist

仔細看會發現 neondb 前面多了一個換行。是貼環境變數的時候不小心多帶到的,資料庫名稱變成「換行+neondb」,當然找不到。把那個值清空重新手打就好了。

雷 4:Neon 的設定指令不用跑

建完 Neon 專案後,它會顯示一串「在你的專案裡設定 Neon」的指令。那是給要在自己程式裡直接連資料庫的人用的。部落格本身不會連資料庫,連資料庫的是 Waline 後端,所以那串指令可以直接跳過。

建議再做的設定

  • SECURE_DOMAINS:在後端環境變數填自己的網域,避免別的網站拿你的後端去用。
  • COMMENT_AUDIT=true:想要留言先審核再顯示的話可以開。

換完的感想

留言區終於跟整個網站長得一樣了,而且不用登入就能留言。

唯一的代價是後端要自己顧:偶爾要去 Vercel 更新一下版本。但比起每次打開文章都看到廣告,我覺得很值得。

如果你也想換掉 Disqus,希望這篇能幫你少走一點冤枉路~歡迎在下面留言試試看新的留言系統!

相關文章

留言