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

自托管论坛软件对比:Discourse、Flarum、NodeBB与phpBB

对比 Discourse、Flarum、NodeBB 和 phpBB 在 VPS 上的真实内存需求、数据库依赖、垃圾信息处理与迁移路径,说明 1 GB 和 4 GB RAM 应如何选择。

应运行哪种自托管论坛软件?

目前可在 VPS(虚拟专用服务器)上运行的自托管论坛软件,主要有 4 个实际选择:Discourse、Flarum、NodeBB 和 phpBB。如果您能提供 4 GB RAM,并且至少有 2 人愿意负责审核,Discourse 是默认的合适选择。如果只有 1 GB RAM 和 1 名审核员,则应改用 Flarum 或 phpBB。能够保持整洁的安静论坛,比无法维护的功能更强的论坛更有价值。

安装是最简单的部分。这些软件都可以在一个下午内运行起来。决定论坛能否在 1 年后继续运行的,是举报队列和邮件路径。因此,请先阅读审核和电子邮件部分,再阅读功能列表。

论坛实际需要哪些组件才能运行?

论坛由四个部分组成,而不是一个单独的组件:应用进程、必须独立于应用持续存在的数据库、用于存储用户上传头像和附件的目录,以及可正常发送邮件的链路。应用可以替换。数据库不能轻易替换,因为每篇帖子、每个账户和每条私信都存储在其中。因此,下面各节中每个项目选择的数据库是最重要的一行内容。您计划迁移时,导出的数据格式由它决定。

第二项成本是人工成本。启用公开注册和公开发帖后,通常在域名出现在爬虫抓取结果中的第一周内,就会出现机器人注册。四个部分都可以加固。只有其中一个在核心功能中内置了完整的处理流程。

Discourse:默认选择及其真实成本

Discourse 基于 Ruby on Rails,使用 PostgreSQL 存储数据,使用 Redis 处理缓存和作业队列,并由 Sidekiq 执行后台任务。官方支持的安装方式会将这些组件全部放入一个 Docker 容器中,该容器根据 /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(简单邮件传输协议)详细信息,写入 app.yml,然后构建容器。80 和 443 端口必须空闲,因为容器会运行自己的 nginx,并为您申请 Let's Encrypt 证书。

官方公布的最低配置是 1 GB RAM 并包含 swap,以及 10 GB 磁盘空间。这里的 swap 必须按字面理解。向导判断服务器需要 swap 时,安装脚本会通过 fallocate -l 2G /swapfile 创建一个 2 GB 的 swapfile;这个 swap 不是可有可无的配置。内存峰值并不出现在网站运行期间,而是在 ./launcher rebuild app 期间出现:每次升级时,该步骤都会在容器内重新编译 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 会销毁正在运行的容器,根据 app.yml 引导创建新容器并启动,因此网站会中断数分钟,具体取决于该过程耗时。在单容器部署中无法避免这一点。使用 data.ymlweb_only.yml 示例拆分为两个容器后,Web 容器重建期间 PostgreSQL 仍可运行。等到有用户会注意到停机后,这种方式就值得采用。

Discourse 的 RAM 需求主要来自其审核功能。新账号从信任等级 0 开始,对可发布的链接数量和发布速度有严格限制;用户阅读并参与讨论后,信任等级会逐步提升。用户举报会进入审核队列,并记录每项内容由谁处理。Akismet 和 StopForumSpam 集成是官方插件。其他三个平台则需要通过附加组件自行组合实现。

导入到 Discourse 是它最强的功能。源代码树中的 script/import_scripts/ 目录包含超过六十个导入器,包括 phpbb3.rbvbulletin.rbxenforo.rbvanilla.rbmybb.rbflarum_import.rb、一个 nodebb 目录,以及一个用于邮件列表存档的 mbox 导入器。这些都是 Ruby 脚本,需要在容器内针对旧数据库副本运行。它们运行速度较慢,但仍在维护。

从 Discourse 导出则是其薄弱之处。先执行 ./launcher enter app,再执行 discourse backup,会生成一个 .tar.gz,其中包含 PostgreSQL 转储和上传目录。只有另一个 Discourse 实例能够恢复它。其他软件无法读取该文件,因此如果离开 Discourse,您必须自行针对该转储编写 SQL。在导入 50,000 篇帖子之前,请先确认您能接受这一限制。

轻量 PHP 论坛:Flarum

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 块中。然后访问该域名,Flarum 自带的安装程序会要求您输入数据库信息和管理员账户信息。

截至 2026 年 8 月,版本情况如下:1.8.17 是当前稳定版本,于 2026 年 6 月发布;2.0 已进入第 5 个候选发布版本。不要使用候选发布版本创建新的社区。2.0 发布后,扩展需要更新才能加载;这次升级可能会占用您整个周末。

它占用的资源很少。运行几个 php-fpm worker,MariaDB 占用几百 MB,再加上静态文件即可。新建的社区使用 1 GB 就够了。

审核功能是它明显的弱项。核心功能提供举报和按用户组划分的权限。审批队列和垃圾信息拦截依赖扩展,主要来自 FriendsOfFlarum 集合;使用 composer require 安装后,还需要在管理面板中启用。这些功能目前可以正常使用。但与 phpBB 或 Discourse 相比,您依赖的是规模更小的志愿者生态。某个扩展停止维护后,会阻止您升级核心版本,因为 composer 无法将该扩展与新版本解析到一起。

导出数据很容易:mysqldump 数据库,并复制 assets 目录。导入数据则更困难。Discourse 提供了用于 Flarum 到 Discourse 方向的 flarum_import.rb,这说明数据迁移通常是单向的。将 phpBB 导入 Flarum 需要依赖社区扩展,而不是官方内置功能。因此,在将唯一的数据副本交给它之前,请先使用副本进行测试。

NodeBB:实时发帖及其代价

NodeBB 基于 Node.js 开发。它通过 WebSocket 将新帖子推送到已打开的浏览器,因此活跃主题无需刷新即可更新。这正是选择它的原因。README 要求使用 Node.js 22 或更高版本,以及 MongoDB 5+ 或 Redis 7.2+;源代码树中还附带 PostgreSQL 驱动,可作为第三种选择。

将 Redis 作为主数据库是这句话中的陷阱。Redis 将数据集保存在内存中,因此论坛越大,所需 RAM 越多,而不是保持不变。MongoDB 或 PostgreSQL 将数据保存在磁盘上,并缓存热点数据。只有在明确知道原因时,才应选择 Redis。

Ubuntu 24.04 提供 Node.js 18,低于最低版本要求,因此应先安装当前版本的运行时。

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 脚本是操作接口,输出会写入 ./nodebb log

./nodebb start 会将进程转为守护进程,这不适合需要重启的服务器。应让 systemd 在前台运行加载器。

[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 是人们容易遗漏的部分。没有它,加载器会 fork,父进程随后退出,因此 systemctl status nodebb 会将该单元报告为已停止,而 curl localhost:4567 仍能响应;此时 systemctl stop nodebb 不会停止任何进程。在反向代理后运行时,必须透传 WebSocket 升级标头。如果 nginx 配置块中缺少 proxy_set_header Upgrade $http_upgrade;proxy_set_header Connection "upgrade";,论坛仍能加载,但浏览器控制台会不断出现失败的 socket.io 请求;读者必须刷新页面后,新帖子才会显示。

NodeBB 的审核能力介于 Flarum 和 Discourse 之间。管理面板中有举报队列,支持按类别设置权限,并提供声誉系统。反垃圾邮件功能来自社区插件,例如 nodebb-plugin-spam-be-gone;该插件可接入 Akismet 和 StopForumSpam。

备份需要手动完成,直到真正需要备份时,人们才会注意到这一点。./nodebb CLI 没有备份命令。您需要自行使用 mongodumppg_dump 导出数据库,并同时复制 public/uploads 目录和 config.jsonconfig.json 保存数据库凭据和站点 URL;没有它,恢复出来的只是一次全新安装。NodeBB 也没有官方导入工具。nodebb-plugin-import 是一个社区项目,但其更新已经跟不上当前版本;Discourse 则附带 NodeBB 导入工具,因此确定可行的迁移出口是 Discourse。

phpBB:稳定运行的小型老牌方案

phpBB 已经很老,这正是它的优势。3.3 系列支持 PHP 7.2.0 至 PHP 8.3(含 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 的 Web 服务器,解压归档文件,然后运行浏览器安装程序。完整的堆栈配置请参阅 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 版本,将其解压到虚拟主机提供服务的目录,然后将安装程序需要写入的路径设为 Web 服务器用户可写。

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 的虚拟主机还需要一个匹配的 <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,并编写一个只有社区成员才能回答的问题。图像 CAPTCHA(完全自动化的公共图灵测试)可以由按千次收费的服务低成本破解。关于社区自身主题的问题则不会。

phpBB 也是迁移支持最完善的来源。Discourse 的 phpbb3.rb 是本文中使用最广泛的导入器,phpBB 支持论坛上还有二十年来积累的解答。迁出方式是 mysqldump,或者复制 SQLite 文件。无法迁移的是您的样式和扩展。

为什么论坛注册邮件始终收不到?

这四个平台的注册流程都要求确认邮件。如果邮件没有到达,账户就不会激活,日志中只会显示注册流程中途停止。出站邮件的可送达性决定论坛能否正常运行,因此应将其视为安装过程的一部分。

  • 大多数 VPS 提供商默认会阻止出站端口 25,因此尝试直接投递的本地 Postfix 不会成功。邮件日志会显示 connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out
  • 全新的 IP 地址没有发信信誉,因此即使投递成功,邮件也会进入垃圾邮件文件夹。对于确认链接来说,这等同于邮件未到达。
  • 如果没有在 DNS 中发布 SPF(发件人策略框架)和 DKIM(域名密钥识别邮件)记录,大型邮件提供商会直接拒收邮件。Google 的拒绝信息为 550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy。如今,任何大量发信的服务都应配置 DMARC(基于域名的消息认证、报告和一致性)。

实际解决方案是使用中继。将论坛的 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 还有一个细节需要注意。截至 August 2026,安装向导允许跳过 SMTP,并回退到 Discourse ID。用户可以通过外部账户登录,而不使用邮件链接。这样无需中继即可上线,但不会提供通知邮件或密码重置邮件。因此,在社区规模扩大前仍应配置 SMTP。

如何为论坛配置 TLS?

Flarum 和 phpBB 都是普通的虚拟主机,因此在现有 Web 服务器上运行 certbot 即可。NodeBB 和 Discourse 则不同:它们是监听本地端口的应用,需要由前置组件终止 TLS(传输层安全)并根据主机名路由流量。如果论坛与其他服务共用同一台服务器,应在所有服务前放置一个反向代理;在多个 Docker Compose 应用前使用 Traefik就是为此设计的。

Discourse 默认会自行占用 80 和 443 端口,并使用自带的 nginx 和自带的 Let's Encrypt 模板。要将它置于现有代理之后,请编辑 app.yml,删除 templates/web.letsencrypt.ssl.template.yml 行,修改暴露端口,使容器仅监听本地地址,然后运行 ./launcher rebuild app。事后执行这些更改需要重建,并会造成几分钟停机,因此应在安装前决定,而不是安装后再修改。

哪个论坛适合您的社区规模?

决策依据是人数,而不是功能。

  • 成员少于几百人、由一名版主管理、拥有 1 GB RAM:选择基于 SQLite 的 phpBB;如果您希望使用现代界面并且可以运行 MariaDB,也可以选择 Flarum。两者都是单一 PHP 应用,便于持续安装补丁。
  • 社区正在增长、拥有两名或更多版主、拥有 4 GB RAM:选择 Discourse。当版主管理工作超出一个人的处理范围后,信任等级和审核队列很快就能体现出其资源占用的价值。
  • 如果您更需要实时交流,而不是持久讨论串:选择 NodeBB;或者接受它本质上是聊天系统,改用 Docker Compose 运行 Rocket.Chat。如果论坛中的内容一周后就没有任何阅读价值,那么您本来就应该使用聊天服务器。
  • 如果您实际需要的是文档,而不是讨论:这些都不合适。BookStack、Wiki.js 或 Outline 更适合这一需求;充斥着重复问题的论坛通常说明缺少 wiki。
  • 如果您还在确定服务器上究竟应该运行哪些服务:2026 年更完整的自托管服务清单是更好的起点,自托管 Notion 替代方案指南则介绍了论坛与共享工作区之间的交集。

无论选择哪一个,论坛的持久性都取决于最近一次成功恢复的备份。按计划导出数据库,在同一任务中复制 uploads 目录,并在其他位置恢复一次,以确认导出的备份可用。在 VPS 上使用 restic 设置计划备份介绍了这一部分;在整个部署中,这是唯一不能失败第二次的环节。

FAQ

自托管论坛的最低服务器要求是什么?

phpBB 使用 SQLite 时只需 1 GB RAM,即可与其他服务共存,因为不需要数据库服务器。Flarum 需要 1 GB RAM,外加 MariaDB。NodeBB 配合 MongoDB 使用 2 GB RAM 即可稳定运行。Discourse 将 1 GB RAM、swap 和 10 GB 磁盘空间列为最低要求,但实际最低配置应为 2 GB RAM;繁忙论坛适合使用 4 GB RAM,因为 ./launcher rebuild app 每次升级都会在内存中重新编译资源,此时小型服务器可能会被内核的内存不足处理程序终止。

可以将 phpBB 论坛迁移到 Discourse 吗?

可以,这是这里支持最完善的迁移路径。Discourse 自带 script/import_scripts/phpbb3.rb,应在容器内使用 phpBB 数据库副本运行,绝不能针对正在运行的生产数据库执行。用户、分类、主题、帖子和附件都可以迁移。样式和扩展无法迁移,旧主题 URL 也会改变,因此应在切换 DNS 前,为 phpBB 路径规划重定向。大型论坛的迁移可能需要数小时,因此应先在临时服务器上演练一次导入并记录耗时。

为什么新用户始终收不到激活邮件?

大多数 VPS 提供商会阻止出站端口 25,因此本地邮件服务器根本无法投递,日志会针对收件人的邮件交换服务器显示 Connection timed out。即使投递正常,没有 SPF 或 DKIM 记录的新 IP 也可能被拒收或过滤,Google 会返回 550 5.7.26 Unauthenticated email ... is not accepted due to domain's DMARC policy。请通过端口 587 的中继服务器发送邮件,并发布该中继服务器提供的 SPF、DKIM 和 DMARC 记录,然后注册一个测试用户进行确认,并读取所收邮件的 Authentication-Results 头部。

哪种自托管论坛软件需要的审核工作最少?

Discourse,因为审核流程已经集成在核心功能中,而不是通过额外组件拼接。新账户在完成足够的阅读前会受到速率限制,举报会集中到一个队列中,并记录处理举报的人员;Akismet 插件也是官方插件。启用 Question and Answer 反垃圾邮件方法后,phpBB 也接近这一水平,可以自动阻止大多数机器人注册。Flarum 和 NodeBB 则依赖社区扩展来完成相同的工作。但真正决定审核负担的因素并未改变:审核工作量取决于发帖人数,而不是他们使用哪种软件发帖。