2019年9月7日 星期六

commento 幫任何靜態網頁加上留言/投票功能

想幫你的網站加上留言功能嗎? 熱門的 disqus 有一些隱私疑慮; 於是我搜尋到 commento。 比較簡單的方法是 到官網註冊付費使用。 點 「Try the Demo」、 在文字輸入框打幾個字、 (不必登入) 勾選 「comment anonymously」、 點 「add comment」, 你的留言就出現了。 管理員也可以設定禁止 (或審查過才准發表) 匿名留言。 至於投票, 當然一定要登入, 算是簡單版的防止灌票。 畢竟我是因為官網強調尊重隱私而被吸引過來的, 當然就選擇自己架囉。 以下安裝設定筆記分別在 Debian 9 及 lubuntu 18.04 執行。 自己架的版本只成功了 http 而沒有 https。

  1. 安裝 postgresql 套件 -- commento 需要用到它。
  2. sudo -u postgres psql 以 postgres 使用者的身份進入 postgres 客戶端操作:
    create database commento_db;
    create user commento_user with encrypted password '猜不到的密碼';
    grant all privileges on database commento_db to commento_user;
    
    以上建立了一個 commento_db 資料庫、 建立了一位 commento_user 用戶, 並且讓 commento_user 有權限讀寫 commento_db。 其實兩者都稱為 commento 會更簡單。 我只是為了寫教學文比較清楚才區分。 我也不會用 postgresql; 通通是從 這一篇 學來的。 密碼建議只用文數字, 等一下比較不會出錯。 如果有必要, 就學一下 postgresql 改密碼
  3. 照著 官網指示, 下載 commento-linux-amd64-某版本.tar.gz、 解壓縮到某個目錄, 比方說是 /usr/local/extra/commento/ 好了。
  4. [建議略過] 如果要自行從原始碼編譯, 要先 用 npm 而非 apt 安裝 yarn 從官網而非 ubuntu 套件庫安裝 golang

然後用編輯器建立一個設定檔, 例如 /etc/commento.env , 裡面貼以下內容:

COMMENTO_POSTGRES='postgres://commento_user:猜不到的密碼@localhost:5432/commento_db?sslmode=disable'
COMMENTO_PORT=1463
COMMENTO_ORIGIN=http://localhost:1463

其中埠號 (1463) 可以任選。 就是這裡, 如果密碼含有空格或某些標點符號, 會卡關。 把這幾句環境變數的設定貼到命令列上執行、 再補一句: export COMMENTO_POSTGRES COMMENTO_PORT COMMENTO_ORIGIN 。 執行 /usr/local/extra/commento/commento , 然後就可以用瀏覽器打開 http://localhost:1463 進入管理頁面。

點 「sign up」 連結, 填妥 e-mail、 姓名 (或暱稱當然也可以)、 密碼 (兩次), 註冊一個管理員帳號。 管理員最主要的工作是決定允許哪些網站可以使用這個剛剛架好的 commento 服務。 按 「+ New Domain」 可以新增一個允許的網站。

可是 localhost 要怎麼允許別人來用啊? 於是改在自己管的、 有在 DNS 註冊的網站上重架一次。 這次環境變數要改兩個地方:

COMMENTO_POSTGRES=postgres://commento_user:猜不到的密碼@localhost:5432/commento_db?sslmode=disable
COMMENTO_PORT=1463
COMMENTO_ORIGIN=http://my.vps.dom.ain:1463
COMMENTO_BIND_ADDRESS=0.0.0.0

除了網址當然要改之外, 還要加上 COMMENTO_BIND_ADDRESS=0.0.0.0 那一句, commento 才會允許 (本機以外的) 外界瀏覽器來造訪。 這次註冊管理員帳號後, 用 「+ New Domain」 把想要使用 commento 的網站 (比方說叫做 nice.blog.com.tw 好了) 列入白名單。

等一下.. 任何人都可以註冊一個管理員帳號、 都可以把任何網站加入白名單.. 這樣有點不太對啊~ 就免費分享運算資源、 無私服務世界的意思嗎? 趕快到 /etc/commento.env 去, 補上一句: COMMENTO_FORBID_NEW_OWNERS=true 以便停用 「自助註冊管理員帳號」 功能。 (以上從 這一篇 學來的。) 至於未來使用留言/投票功能的訪客們則不受影響, 照樣可以註冊。 (他們不是 "owner") 當然, 要先 ctrl-c 把原先正在執行的服務砍掉、 重新剪貼那些環境變數、 重跑執行檔, 才會生效。

現在到 nice.blog.com.tw 去, 在你的網頁上貼上一小段 html 碼:

<div id="commento"></div>
<script src="http://http://my.vps.dom.ain:1463/js/commento.js"></script>

之類的 -- 從 commento 的管理介面、 白名單內某網站的 「Installation Guide」 頁籤可以抄到正確的寫法。

瀏覽 nice.blog.com.tw 上面改好的頁面。 如果網址是 https 開頭, 那就會看不到任何改變。 在瀏覽器裡面按 ctrl-shift-i 打開 「開發者工具」, 會看到 "Blocked loading mixed active content "http://http://my.vps.dom.ain:1463/js/commento.js" 之類的錯誤訊息。 這是因為 (加密的) https 頁面裡, 凡是遇到 (未加密的) http 的資源 (css、 圖片、 javascript、 ...) 都會被瀏覽器擋下來。 根據 這個問答, 可以點網址左邊的鎖頭、 點 "connection" 右邊的右箭頭、 點 "Disable Protection for Now" 暫時允許載入未加密的 http 資源。 登登! 留言板出現了!

如果希望允許匿名留言, 可以用瀏覽器回到 commento 的管理畫面, 在 "General" 底下設定。 還有 "Moderation Settings" 頁籤底下可決定較嚴格 (先通過人工審核, 留言才會出現) 或較寬鬆的審核政策等等。 在管理畫面, 還可以查看統計數據、 匯入來自 discus 的留言、 刪除所有留言等等。 如果想讓訪客可以透過 google/twitter/github/gitlab 第三方帳號登入, 就要設定更多環境變數, 詳見 後臺設定手冊 關於 COMMENTO_*_KEY 跟 COMMENTO_*_SECRET 的部分。 [含密碼, 要小心安全防護啊!]

回來談 https vs http 的問題。 雖然有看到 123 好像可以幫 commento 從 http 升級成 https, 但沒成功。 我沒有照著那幾篇做, 而是根據 這篇的提示 設定 apache 的反向代理伺服器, 幾乎快要成功時才發現: 雖然上面剪貼的 html 代碼可以改成 https; 但是後續 commento.js 自己下載的網址都還是 http, 照樣會被擋住啊~ 難道要去改程式碼嗎? 不應該這麼複雜啊~ 是我弄錯了嗎? 總之我放棄了, 如果你試出較簡單的 https 版 commento 設定方式, 請留言分享。 最後乾脆把 (位於 nice.blog.com.tw 的) 欲加留言的頁面的網址降級, 改打 http , 全面不加密, 那就不需要上面的 "Disable Protection for Now" 動作。

再來是設定開機自動執行。 首先 在 Debian 9 (Stretch) 中啟用消失的 rc.local, 在 /etc/rc.local 裡面隨便寫一個 date > /tmp/bootlog.txt 之類的, 確認 rc.local 可用。 理論上, 應該只要在 /etc/rc.local 裡面放這句: COMMENTO_CONFIG_FILE=/etc/commento.env /usr/local/extra/commento/commento 以後開機就會自動執行。 但我先用手動方式執行 /etc/rc.local 以便查看錯誤訊息, 發現不知道為什麼 COMMENTO_POSTGRES 那一句就是會被忽略。 是怎樣? 從設定檔讀取而沒有從命令列下 export, commento 就不開心了嗎? 可是! COMMENTO_POSTGRES 那一句有密碼, 所以當然不應該寫在 /etc/rc.local 裡面。 最後只好把 /etc/rc.local 改成這樣:

eval $(sed 's/^/export /' /etc/commento.env)
/usr/local/extra/commento/commento &
並且 把 /etc/rc.local 的權限改為 700 以免密碼外洩。

其實自從看到 唐鳳去年在 DebConf 18 的演講 之後, 就很想找 slido 的自由軟體替代品, 想要在我的演講或課堂上測試 「互動式演講」。 目前先簡單架起來, 能動就好。 這學期將在中興通識的 「資訊科技與社會」 課堂實驗。 學生們可以在課堂中默默留言、 投票, 左右老師講課的內容, 應該比較有參與感吧 :-)

沒有留言:

張貼留言