SSD Nodes Learn 🎉 VPS $5.50/月起
指南 Matt Connor作者: Matt Connor · 已更新 2026-08-13

自行託管論壇軟體比較:Discourse、Flarum、NodeBB、phpBB

比較 Discourse、Flarum、NodeBB 與 phpBB 在 VPS 上的實際 RAM 需求、資料庫、垃圾訊息處理,以及從各專案遷移離開的路徑。

應該執行哪個自行託管的論壇軟體?

目前可在 VPS(virtual private server)上執行的自行託管論壇軟體,實際上有 4 個選擇:Discourse、Flarum、NodeBB 和 phpBB。如果能提供 4 GB RAM,且至少有 2 人願意進行管理,Discourse 是預設的合適選擇。若只有 1 GB RAM 和 1 位管理員,則應改用 Flarum 或 phpBB。能維持整潔的冷清論壇,勝過無法管理的優質論壇。

安裝是最簡單的部分。這些軟體都能在一個下午內執行。論壇能否在 1 年後繼續運作,取決於檢舉佇列和郵件傳遞路徑。因此,請先閱讀管理和電子郵件章節,再查看功能清單。

論壇實際需要哪些元件才能運作?

論壇由 4 個部分組成,而不是單一元件:應用程式程序、必須獨立於應用程式持續存在的資料庫、存放上傳頭像與附件的目錄,以及可正常寄送郵件的路徑。應用程式可以替換。資料庫則不能輕易替換,因為每篇文章、每個帳號與每則私人訊息都儲存在其中。因此,下列各節列出的資料庫是最重要的內容。當你想要離開某個專案時,資料庫會決定匯出的格式。

第二項成本是人力。開放公開註冊與公開發文後,通常在網域出現在爬蟲索引的第一週內,就會出現機器人註冊。這 4 個部分都能加以限制。只有其中 1 個在核心功能中內建完整的處理流程。

Discourse:預設選項,以及實際代價

Discourse 使用 Ruby on Rails,資料儲存在 PostgreSQL,Redis 負責快取與工作佇列,Sidekiq 執行背景工作。官方支援的安裝方式會將這些元件全部放在單一 Docker container 中,並根據 /var/discourse/containers/app.yml 的設定檔建置。你不需要自行安裝各個元件。

wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bash

如果缺少 git 或 Docker,該指令碼會先安裝;接著將 discourse_docker 複製到 /var/discourse,再交由互動式 discourse-setup 精靈處理。精靈會詢問主機名稱、管理員電子郵件地址與 SMTP(simple mail transfer protocol)詳細資料,寫入 app.yml,並建置 container。80 和 443 埠必須可用,因為 container 會執行自己的 nginx,並替你申請 Let’s Encrypt 憑證。

官方公布的最低需求是 1 GB RAM 並搭配 swap,以及 10 GB 磁碟空間。swap 的要求必須照字面理解。當精靈判定主機需要 swap 時,設定指令碼會使用 fallocate -l 2G /swapfile 建立 2 GB swapfile;這個 swap 並非可有可無。記憶體尖峰不是網站執行時的用量,而是 ./launcher rebuild app;每次升級時,這個步驟會在 container 內重新編譯 JavaScript 與 CSS 資產。在沒有 swap 的 1 GB 主機上,該步驟會執行到一半便被終止,重建失敗時畫面不會顯示有用的錯誤訊息,而 dmesg | tail 會顯示 Out of memory: Killed process 行。若要可靠執行,請配置 2 GB;論壇開始有較多使用者後,請配置 4 GB。

升級可在瀏覽器中從 /admin/upgrade 執行,也可從 shell 執行:

cd /var/discourse
./launcher rebuild app

rebuild 會摧毀正在執行的 container,從 app.yml 重新建立並啟動新的 container,因此網站會在這段作業所需的數分鐘內停止服務。單一 container 架構無法避免這種中斷。使用 data.ymlweb_only.yml 範例拆分成兩個 container,可讓 PostgreSQL 持續執行,而 web container 重新建置;當使用者開始注意到停機時間後,這種做法便值得採用。

Discourse 的記憶體需求主要來自內容管理。新帳戶從信任等級 0 開始,對可發布的連結數量與發布速度都有嚴格限制;使用者閱讀並參與討論後,信任等級才會提升。使用者檢舉會進入審查佇列,並記錄每項檢舉由誰處理。Akismet 與 StopForumSpam 整合是官方外掛。其他三項功能則必須透過附加元件自行組合。

匯入 Discourse 是它最強的功能。原始碼樹中的 script/import_scripts/ 目錄包含超過 60 個匯入工具,包括 phpbb3.rbvbulletin.rbxenforo.rbvanilla.rbmybb.rbflarum_import.rb、一個 nodebb 目錄,以及用於郵件清單封存資料的 mbox 匯入工具。這些 Ruby 指令碼會在 container 內執行,並針對舊資料庫的副本進行匯入。它們執行速度慢,但仍持續維護。

匯出 Discourse 則是較弱的部分。執行 ./launcher enter app,接著執行 discourse backup,會寫入一個 .tar.gz,其中包含 PostgreSQL 傾印檔與 uploads 目錄。其他 Discourse 執行個體可以還原該檔案。除此之外,沒有其他軟體能讀取它;因此若要離開 Discourse,你必須自行針對該傾印檔撰寫 SQL。在匯入 50,000 篇文章前,請先確認自己能接受這項限制。

Flarum:輕量 PHP 論壇

Flarum 是一般的 PHP 應用程式:由 nginx 或 Apache 置於 php-fpm 前方,使用 MySQL 或 MariaDB 資料庫,並將檔案儲存在磁碟上。文件列出的需求為 PHP 7.3 或更新版本,以及 curl、dom、fileinfo、gd、json、mbstring、openssl、pdo_mysql、tokenizer 和 zip 擴充功能,另外需要 MySQL 5.6+(或 8.0.23+)或 MariaDB 10.0.5+。Ubuntu 24.04 隨附 PHP 8.3,版本高於最低需求。

請注意清單中的 pdo_mysql。Flarum 不支援 PostgreSQL,也不支援 SQLite。如果你需要單一檔案資料庫,請改用下方的 phpBB。

sudo apt update
sudo apt install -y nginx mariadb-server composer php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
sudo install -d -m 755 /srv/flarum
cd /srv/flarum
sudo COMPOSER_ALLOW_SUPERUSER=1 composer create-project flarum/flarum:^1.8.0 .
sudo chown -R www-data:www-data /srv/flarum

請將 Web 伺服器指向 /srv/flarum/public,不要指向 /srv/flarum。應用程式程式碼、設定檔與資料庫密碼都位於 public 上一層,因此文件根目錄若設得高一層,任何提出請求的人都能取得你的憑證。在 Apache 上,你還需要 mod_rewriteAllowOverride All,讓隨附的 .htaccess 生效。在 nginx 上,請將隨附的 .nginx.conf 加入 server block。接著瀏覽該網域,Flarum 的安裝程式會要求你輸入資料庫與管理員帳號資訊。

截至 August 2026,版本狀態如下:1.8.17 是目前的 stable release,於 June 2026 發布;2.0 目前為 release candidate 5。不要使用 release candidate 建立新的社群。2.0 發布後,擴充功能必須更新才能載入,而這次升級可能讓你耗掉整個週末。

資源占用很少。只需要幾個 php-fpm worker、MariaDB 所需的幾百 MB 記憶體,以及靜態檔案。規模尚小的社群使用 1 GB 即可。

Moderation 是它明顯的弱項。Core 提供檢舉功能與群組層級權限。審核佇列與垃圾訊息封鎖功能來自擴充功能,主要是 FriendsOfFlarum collection;使用 composer require 安裝後,再從管理面板啟用。這些功能目前可以正常運作。但相較於 phpBB 或 Discourse,你依賴的是規模較小的志工生態系;如果擴充功能無人維護,下一次 Core 升級就會受阻,因為 composer 會拒絕在新版本上解析該擴充功能。

匯出資料很容易:mysqldump 資料庫,並複製 assets 目錄。匯入資料則比較困難。Discourse 隨附 flarum_import.rb,用於將 Flarum 匯入 Discourse,這也表示資料通常是往哪個方向流動。將 phpBB 匯入 Flarum 必須使用社群擴充功能,沒有官方內建工具。因此,請先對副本測試,再把唯一一份資料交給它處理。

NodeBB:即時發文,以及隨之而來的代價

NodeBB 是 Node.js 應用程式。它會透過 websockets 將新文章推送到開啟中的瀏覽器,因此使用者不必重新整理,討論串就能即時更新。這就是選用它的理由。README 要求 Node.js 22 或更新版本,以及 MongoDB 5+ 或 Redis 7.2+;source tree 也附有 PostgreSQL driver,作為第三種選項。

將 Redis 作為主要資料庫,是這段說明中的陷阱。Redis 將資料集保存在記憶體中,因此論壇越大,RAM 需求就越高,不會維持固定。MongoDB 或 PostgreSQL 會將資料保存在磁碟,並快取常用資料。除非你能說明原因,否則不要選 Redis。

Ubuntu 24.04 提供 Node.js 18,低於最低版本要求,因此請先安裝目前版本的 runtime。

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs git build-essential
sudo adduser --system --group --home /srv/nodebb nodebb
sudo -u nodebb git clone -b v4.x https://github.com/NodeBB/NodeBB.git /srv/nodebb
cd /srv/nodebb
sudo -u nodebb ./nodebb setup

./nodebb setup 是互動式程式。它會詢問要使用哪個資料庫及如何連線,接著建立管理員帳號並選擇連接埠,預設值為 4567。NodeBB 不會由 npm start 啟動。./nodebb script 是介面,輸出則會寫入 ./nodebb log

./nodebb start 會使程式以 daemon 方式執行,這不適合會重新開機的機器。請改為讓 systemd 在前景執行 loader。

[Unit]
Description=NodeBB
After=network.target

[Service]
Type=simple
User=nodebb
WorkingDirectory=/srv/nodebb
ExecStart=/usr/bin/env node loader.js --no-daemon
Restart=on-failure

[Install]
WantedBy=multi-user.target

--no-daemon 是最容易被忽略的部分。沒有它時,loader 會 fork,接著 parent 會結束,因此 systemctl status nodebb 會將 unit 回報為已停止,但 curl localhost:4567 仍然能回應,systemctl stop nodebb 也就無法停止任何程序。在 reverse proxy 後方,必須轉送 websocket upgrade headers。如果 nginx block 缺少 proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";,論壇仍可載入,但瀏覽器主控台會充滿失敗的 socket.io requests,而且新文章不會出現,直到讀者重新整理頁面。

Moderation 的功能介於 Flarum 與 Discourse 之間。管理面板提供 flag queue,也有每個 category 的權限與 reputation system。反垃圾訊息功能來自社群 plugins,例如 nodebb-plugin-spam-be-gone,它會整合 Akismet 與 StopForumSpam。

備份必須手動處理,通常要到需要備份的那天才會發現這件事。./nodebb CLI 沒有 backup command。你必須自行使用 mongodumppg_dump 傾印資料庫,並一併複製 public/uploads directory 與 config.jsonconfig.json 儲存資料庫認證資訊與 site URL,因此沒有它的 restore 只會建立全新的安裝。NodeBB 也沒有 first-party importer。nodebb-plugin-import 是一個進度落後的社群 project;Discourse 則附有 NodeBB importer,因此確定可行的退出路徑是轉向 Discourse。

phpBB:小巧、樸素,但依然可靠

phpBB 很老,而這正是選用它的理由。3.3 系列可執行於 PHP 7.2.0 至 PHP 8.3(含)之間,並支援 MySQL 4.1.3+、MariaDB 5.1+、PostgreSQL 8.3+、SQLite 3.6.15+、MS SQL Server 與 Oracle。它需要啟用 json、mbstring、XML 支援,以及 getimagesize() 函式。

SQLite 是它列入這份清單的原因。使用 SQLite 時,論壇只由 PHP 檔案目錄和一個資料庫檔案組成。不需要資料庫伺服器,不需要調校,也不需要額外備份其他元件。對於已執行其他服務的 1 GB VPS,這項差異很實際。小型社群可使用 SQLite;當同時發文量增加時,再移轉至 MySQL,因為 SQLite 會將寫入序列化,貼文會開始彼此排隊。

不需要執行 composer,也不需要容器。安裝含 PHP 的網頁伺服器,解開壓縮檔,然後執行瀏覽器安裝程式。完整的堆疊設定請參閱 Ubuntu 24.04 上的標準 LAMP 堆疊

sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-mysql php-mbstring php-xml php-gd unzip

從 phpbb.com 下載目前的 3.3 版本,將其解開至 vhost 提供服務的目錄,然後讓安裝程式需要寫入的路徑可由網頁伺服器使用者寫入。

sudo chown -R www-data:www-data /srv/phpbb
sudo chmod 660 /srv/phpbb/config.php
sudo chmod -R 770 /srv/phpbb/store /srv/phpbb/cache /srv/phpbb/files /srv/phpbb/images/avatars/upload

官方指示使用 666 和 777。這些權限值適用於共用主機,因為你無法控制 PHP 執行時所使用的使用者。在自己的 VPS 上,你可以控制該使用者,因此請將所有權交給 www-data,並阻止其他使用者存取。有一項 Apache 細節容易造成問題:Ubuntu 的設定只會授予其預設文件根目錄下的存取權,因此指向 /srv/phpbb 的 vhost 也需要相符的 <Directory> 區塊,並加入 Require all granted,否則每個請求都會在 phpBB 收到之前回傳 403 Forbidden。最後在瀏覽器中完成 /install/index.php,接著將 config.php 設回 640,並刪除 install/ 目錄。phpBB 會持續警告你該目錄存在,直到將它刪除為止。

垃圾訊息是 phpBB 的已知問題,但可以處理。註冊表單位於可預測的 URL(ucp.php?mode=register),因此網域被爬蟲檢索後,機器人幾天內就能找到它。有效的處理方式位於管理面板的 Spambot countermeasures:將反垃圾訊息方法設為 Question and Answer,並撰寫只有社群成員能回答的問題。Image CAPTCHAs(completely automated public Turing tests)可由按千次收費的服務低成本破解。與自身主題相關的問題則不會。

phpBB 也是最容易找到支援資料的移轉來源。Discourse 的 phpbb3.rb 是整篇文章中使用最廣泛的匯入工具,phpBB 支援論壇上也有 20 年累積的解答。移出 phpBB 的方式是 mysqldump,或直接複製 SQLite 檔案。無法一併移轉的是你的樣式與擴充功能。

為什麼論壇註冊信件一直收不到?

這 4 個論壇的註冊流程都需要確認信件。若信件未送達,帳號就不會啟用,日誌中只會顯示註冊流程中斷。論壇能否正常運作,取決於對外寄信的可投遞性,因此應將其視為安裝的一部分。

  • 大多數 VPS 供應商預設會封鎖對外連線埠 25,因此嘗試直接投遞郵件的本機 Postfix 不會送達任何地方。郵件日誌會顯示 connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out
  • 全新的 IP 位址沒有寄件信譽,因此即使成功送達,信件也可能落入垃圾郵件資料夾。對確認連結而言,這等同於信件未送達。
  • 若未在 DNS 發布 SPF(sender policy framework)與 DKIM(domainkeys identified mail)記錄,大型供應商會直接拒絕信件。Google 的拒絕訊息為 550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy。現在,任何大量寄信的寄件者也都應設定 DMARC(domain-based message authentication, reporting and conformance)。

實際的解決方式是使用 relay。將論壇的 SMTP 設定指向 587 連接埠上的交易型郵件供應商,發布該供應商提供的 SPF、DKIM 與 DMARC 記錄,並使用 mail.example.com 這類子網域寄信,讓論壇的寄件信譽與個人郵件分開。自行執行郵件伺服器並非不可能,VPS 上的完整自架郵件伺服器會說明相關做法,但論壇上線前夕並不適合才開始學習郵件投遞。

在公告論壇前先進行測試。在 Discourse 中,從容器內執行:

cd /var/discourse
./launcher enter app
rake emails:test[you@example.com]

這項工作會檢查 SMTP 連線並寄送郵件。認證資訊錯誤時,通常會以 Net::SMTPAuthenticationError 的形式指出失敗原因。phpBB 也能在管理面板的 Client communication 下執行等效測試。至於 Flarum 與 NodeBB,請使用大型供應商的實際信箱註冊一個暫用帳號,然後查看收到郵件的原始標頭。Authentication-Results 標頭中的 spf=passdkim=pass,就是要確認的結果。

Discourse 有一項需要注意的差異。截至 2026 年 8 月,設定精靈可略過 SMTP,改用 Discourse ID,讓使用者透過外部帳號登入,而不是使用郵件中的連結。這樣不使用 relay 也能先完成上線,但不會提供通知郵件或密碼重設功能。因此,仍應在社群規模擴大前設定 SMTP。

如何將論壇置於 TLS 後方?

Flarum 和 phpBB 都是一般的虛擬主機,因此在現有網頁伺服器上執行 certbot 即可。NodeBB 和 Discourse 則不同:它們是監聽本機連接埠的應用程式,前方必須有元件終止 TLS(transport layer security),並依主機名稱進行路由。如果論壇與其他服務共用同一台伺服器,請在所有服務前方放置一個反向代理;這正是 在多個 Docker Compose 應用程式前方使用 Traefik 的用途。

Discourse 預設會自行佔用 80 和 443 埠,使用自有的 nginx 及自有的 Let's Encrypt 範本。若要將它置於現有代理後方,請編輯 app.yml、移除 templates/web.letsencrypt.ssl.template.yml 行,將對外暴露的連接埠修改為讓容器只監聽本機位址,然後執行 ./launcher rebuild app。事後進行這項變更需要重新建置,並會造成幾分鐘的停機,因此應在安裝前決定,而不是安裝後才處理。

哪種論壇適合你的社群規模?

決策依據是人數,而不是功能。

  • 少於幾百名成員、由一名 moderator 管理、擁有 1 GB RAM:使用 SQLite 搭配 phpBB;如果想要現代化介面,且能執行 MariaDB,也可以選 Flarum。兩者都是單一 PHP 應用程式,只需持續修補同一個應用程式。
  • 社群持續成長、由 2 名以上 moderator 管理、擁有 4 GB RAM:使用 Discourse。當 moderation 已無法由一個人完全掌握時,trust levels 和 review queue 所需的資源就值得投入。
  • 如果你更重視即時對話,而不是可長期保留的討論串:使用 NodeBB;或者接受這其實是聊天需求,改用 Docker Compose 上的 Rocket.Chat。如果論壇內容到了下週就沒有任何值得閱讀的資訊,就應該使用 chat server。
  • 如果你真正需要的是文件,而不是討論:以上都不適合。BookStack、Wiki.js 或 Outline 更能解決這個需求;充滿重複問題的論壇,通常表示缺少 wiki。
  • 如果你仍在釐清伺服器上究竟應該部署哪些服務:2026 年更完整的 self-hosting 清單 是更好的起點,而 self-hosted Notion 替代方案指南 涵蓋論壇與共享工作區之間的重疊需求。

無論選擇哪個方案,論壇的持久性都取決於最近一次成功還原的 backup。依排程 dump database,並在同一個工作中複製 uploads directory;接著在其他位置還原一次,以確認 dump 可正常使用。VPS 上的排程 restic backups 說明這部分,而這也是整個設定中唯一沒有第二次機會的環節。

FAQ

自架論壇的最低伺服器需求是什麼?

phpBB 搭配 SQLite 時,只要 1 GB RAM 就能與其他服務共用,因為不需要資料庫伺服器。Flarum 需要 1 GB RAM,另加 MariaDB。NodeBB 搭配 MongoDB 時,使用 2 GB RAM 會較為寬裕。Discourse 將含 swap 與 10 GB 磁碟空間列為最低需求,但實際最低值應為 2 GB,繁忙論壇則適合 4 GB,因為 ./launcher rebuild app 每次升級都會在記憶體中重新編譯資產;小型伺服器常在這個階段被 kernel 的 out-of-memory handler 終止。

可以將 phpBB 論壇移轉到 Discourse 嗎?

可以,這是此處支援度最高的移轉路徑。Discourse 提供 script/import_scripts/phpbb3.rb,可在 container 內針對 phpBB 資料庫的副本執行,絕對不要使用運作中的資料庫。使用者、分類、主題、文章與附件都能移轉。樣式與擴充功能無法移轉,舊主題 URL 也會變更,因此切換 DNS 前,請先針對 phpBB 路徑規劃重新導向。大型論壇可能需要數小時,因此先在測試伺服器上完整演練一次匯入,並記錄所需時間。

為什麼新使用者一直收不到啟用電子郵件?

多數 VPS 供應商會封鎖對外連線的 port 25,因此本機 mail server 完全無法投遞郵件,日誌會在收件者的 mail exchanger 上顯示 Connection timed out。即使投遞正常,沒有 SPF 或 DKIM 記錄的新 IP 仍可能遭到拒絕或過濾,Google 會回覆 550 5.7.26 Unauthenticated email ... is not accepted due to domain's DMARC policy。請透過 port 587 的 relay 伺服器寄信,並發布該 relay 提供的 SPF、DKIM 與 DMARC 記錄。接著確認測試註冊,並讀取所收到郵件的 Authentication-Results 標頭。

哪一套自架論壇軟體需要的管理工作最少?

Discourse,因為相關工作流程已內建於 core,而不是透過外掛拼接。新帳號在閱讀足夠內容前會受到速率限制;檢舉會集中到佇列中,並記錄處理者;Akismet plugin 也由官方提供。啟用 Question and Answer anti-spam method 後,phpBB 的效果也很接近,能自行阻擋大多數機器人註冊。Flarum 與 NodeBB 則依賴社群擴充功能來處理相同工作。這些因素都不會改變真正的主要因素:moderation 負載取決於發文人數,而不是他們使用哪一套軟體發文。