
筆者的 個人備忘 服務使用了開源軟體 TiddlyWiki 搭建,並部署於一台年付 $9.9 USD 的 RackNerd 虛擬主機服務上。曾經有訪客來信詢問過是怎麼搭建的,想了想便寫篇文紀錄以供參考,畢竟這是一個十分小眾的需求,要找到解決方案也並不容易……
操作步驟
Step 01. 在 cPanel 後台綁定網域
首先我們需要登入 cPanel 後台綁定網域,並且在網域的名稱服務器(Name Server)中設定好 DNS Record 來讓使用者在訪問網址時,能夠將網域解析到虛擬主機的 IP 位址,並且正確地反向代理(reverse proxy)到部署的 Node.js 服務上。
在 cPanel 後台中,根據使用者介面設定的語言,可以直接搜尋 網域
、域名
或 Domain
進入網域設定頁面:

Domain
設定頁面選項接著點擊畫面中位於表格右上方的 Create A New Domain
按鈕,並輸入要綁定的網域(domain)以及站點的根目錄(document root)位置,完成後點擊 Submit
按鈕:

Create A New Domain
按鈕
Submit
按鈕其中,網域(domain)欄位填入的內容應以最終的網址為依據,比如筆者以 memo.hhpeng.org
作為個人備忘服務的網址,而根目錄(document root)欄位則以個人管理習慣為主,個人習慣使用 /domains/[DOMAIN_NAME]/public_html
的格式,此處則不一定要與筆者一致。
在完成上述設定之後,虛擬主機會於後台建置對應的目錄,以及完成反向代理(reverse proxy)的設定,別忘了還要在名稱伺服器(Name Server)中設定對應的 DNS Record 將網域指向虛擬主機的 IP 位址!一般來說,在 cPanel 後台的儀表板中可以看到其 IP 位址,接著只需要設定 A Record 即可。

Step 02. 在 cPanel 後台中創建 Node.js 應用程式
接著我們需要創建 Node.js 應用程式,可以直接於 cPanel 後台中,搜尋 Node.js
找到對應的連結進入 Node.js 應用程式設定頁面:

Node.js
應用程式設定選項接著點擊畫面中位於表格右上方的 Create Application
按鈕,並輸入 Node.js 應用程式相關設定,完成後點擊 Create
按鈕:

Create Application
按鈕
Create
按鈕其中:
- Node.js Version:不同主機服務商,甚至同一主機服務商下的不同台主機提供的選項會不一致,筆者建議以「穩定」或「新舊程度」來選擇。截至筆者撰文當下,長期支援(LTS)版本為 v22.15.0,恰好筆者使用的主機商有提供 v22.14.0!
- Application Mode:實際上的影響是會變更
NODE_ENV
環境變數,如果為正式環境設定為 Production 即可。 - Application Root:設定 Node.js 應用程式的根目錄,不一定需要位於網域的根目錄中,筆者個人習慣是採
domains/[DOMAIN_NAME]/application
的格式。 - Application URL:設定 Node.js 應用程式的網址,選擇對應的網域即可,除非需要放置到網域的子目錄中。
- Application Startup File:設定 Node.js 應用程式的腳本入口。
/home/[USERNAME]/domains/[DOMAIN_NAME]/application
目錄下,是便於備份打包;注意此處並不是放置於前面設定的網域根目錄 /home/[USERNAME]/domains/[DOMAIN_NAME]/public_html
中,這樣可以避免 application
下的文件於公網上被訪問到。
創建完成後,此時訪問對應的網域,如果可以看到類似於 "It works! NodeJS 22.14.0" 的文字便代表 Node.js 應用程式創建成功,接著我們還需要安裝並設定 TiddlyWiki。

Step 03. 在 cPanel 後台中的終端機中安裝設定 TiddlyWiki
在完成 Step 02. 中的設定後,點擊 Create
按鈕後頁面會重新整理,畫面中會多出一個可以在終端機(terminal)中啟用對應 Node.js 虛擬環境(virtual environment)的命令:

接著在 cPanel 後台中可以找到 Terminal
選項,點擊進去便可以在瀏覽器中操作虛擬主機的終端機;當然,這類終端機為了確保不會影響到同一台主機上的其他使用者,是受限的 Jail Shell。

Terminal
選項我們需要在終端機執行包含前述的啟用虛擬環境在內的若干命令如下:
# 啟用虛擬環境
$ source /home/hhpeng/nodevenv/domains/memo-demo.hhpeng.org/application/22/bin/activate && cd /home/hhpeng/domains/memo-demo.hhpeng.org/application
# 創建專案文件
$ npm init
# 安裝 TiddlyWiki
$ npm install tiddlywiki
# 創建 TiddlyWiki 維基實例
$ npx tiddlywiki memo --init server
執行到這個步驟,我們已經建立了 TiddlyWiki 維基實例,但是 TiddlyWiki 官方文件中所提供的部署方式,是使用 tiddlywiki
命令啟用服務,而網路上許多文章中部署方法是使用 pm2 管理 Node.js 行程……
實際上 cPanel 和 DirectAdmin 等控制面板中所提供的 Node.js 應用程式部署服務,採用了 Passenger 這款工具來實現,需要提供一個 "Application Startup File" 入口文件,這也是前面為什麼需要設定的原因。我們可以修改這個 app.js
入口文件的內容如下:
const tw = require('tiddlywiki').TiddlyWiki();
tw.boot.argv = ["memo", "--listen", "credentials=../users.csv", "readers=(anon)", "writers=(authenticated)", "admin=H.-H."];
tw.boot.boot();
上述的 JavaScript 腳本其實對應了 tiddlywiki memo --listen credentials=../users.csv readers=(anon) writers=(authenticated)
命令,意味著使用前述初始化的 memo
啟用 TiddlyWiki 服務,其中的 ../user.csv
文件是放置於 memo
父級目錄中,用於標示 TiddlyWiki 實例使用者帳號與密碼的文件,詳見:WebServer Parameter: credentials。
app.js
是怎麼得到的感到好奇,筆者也有將 我是如何將部署 TiddlyWiki 的命令,轉換為入口腳本文件的? 記錄下來。
Step 04. 重新啟動 Node.js 服務
在我們安裝 TiddlyWiki 並更新 app.js
入口文件後,還需要重新啟動 Node.js 應用程式,才會使用更新的入口文件來運行服務:

此時再造訪對應的網址,便可以開始使用 TiddlyWiki 了:

後記
或許是受到網路上許多文章的影響,筆者早期對虛擬主機(Shared Hosting)和 PHP 程式語言有著先入為主的偏見,認為其用途有限或是寫起來毛病特多;直到替友人處理相關需求而嘗試之後,才發現是自己 圖樣圖森破(Too Young Too Simple) 被既定的刻板印象限制了。
其實這些工具運用得當,考量自己的需求也未必真的需要使用到 VPS 搭建或是使用雲服務搭建,也不是所有的服務都適合或有必要包裝成 Docker 映像再使用 Kubernetes 編排……
在虛擬主機上部署其他 Node.js 應用程式的方式也是大同小異,筆者曾經嘗試過在虛擬主機上搭建 HedgeDoc、Umami、UpTime Kuma、Ghost 等服務,都是可以成功部署運行;差別僅在於設定上與入口文件上會有些許不同。或許你也可以嘗試看看!
張貼留言