Discourse 适合搭建产品社区、用户论坛、知识问答站和付费会员社区。它自带分类、标签、全文搜索、信任等级、审核、通知和移动端 PWA,比从零拼接 WordPress 论坛插件更完整,但对内存、邮件送达和日常维护的要求也更高。
本文使用 Discourse 官方支持的 Docker 安装方式,在全新的 Ubuntu VPS 上完成域名、自动 HTTPS、管理员注册、SMTP、备份、升级和常见故障排查。官方当前最低要求是 1 核、1GB 内存加 Swap、10GB 磁盘,生产环境更建议从 2 核 2GB、20GB SSD 起步。
| 场景 | 是否适合 | 说明 |
|---|---|---|
| 产品支持社区、用户论坛 | 适合 | 分类、标签、搜索、审核和通知完整 |
| 课程学员社区、会员交流 | 适合 | 可限制注册、邀请用户并接入第三方登录 |
| 纯内容博客 | 不优先 | WordPress、Ghost 等发布系统更直接 |
| 只有几十个静态问答页面 | 可能过重 | Discourse 会同时运行 Rails、PostgreSQL、Redis 和 Sidekiq |
| 需要邮件列表模式 | 适合,但必须配置邮件 | SMTP、退信处理和发件域名都要可靠 |
Discourse 不是一个普通 PHP 程序,也不支持用宝塔面板创建站点后上传源码完成安装。官方只支持基于 Docker 的部署,推荐使用独立、干净的 64 位 Linux VPS。
官方安装器会按 CPU 和内存自动调整 Unicorn Worker 与 PostgreSQL Shared Buffers。最低配置可以用于测试,公开运营时应给数据库、图片处理、搜索和升级构建预留空间。
| 使用规模 | 建议配置 | 适用情况 |
|---|---|---|
| 测试、迁移演练 | 1 核 1GB、2GB Swap、20GB SSD | 只适合少量用户和短期验证 |
| 小型公开社区 | 2 核 2-4GB、40GB SSD | 日活较低、附件不多 |
| 中型社区 | 4 核 8GB、80GB+ NVMe | 插件、搜索、图片和并发更多 |
| 大型社区 | Web、数据库、Redis 分离 | 需要监控、对象存储、CDN 和专业容量规划 |
磁盘不能只按程序大小计算。用户上传、自动备份、Docker 镜像、日志和升级时的临时文件都会持续增长。还没确定规格时,可以先看 VPS 配置选择指南。
准备以下内容:
- 一台全新的 Ubuntu 24.04 LTS 或 Debian VPS;
- root SSH 权限和公网 IPv4;
- 一个已解析到 VPS 的域名,例如
forum.example.com; - 可用的事务邮件服务,或暂时使用 Discourse ID 登录;
- 服务商快照或其他可回滚方案。
给域名添加 A 记录:
forum.example.com A 203.0.113.10
检查解析和端口占用:
dig +short forum.example.com A
sudo ss -lntp | grep -E ':(80|443)\b' || true
free -h
df -h
80 和 443 必须可用。服务器上如果已经运行 Nginx、Apache、Caddy、宝塔或其他面板,不要直接执行安装器;端口冲突会让连接检测和 HTTPS 签发失败。
云防火墙只需开放:
| 端口 | 用途 | 建议 |
|---|---|---|
| 22/TCP | SSH 管理 | 限制到管理 IP 更安全 |
| 80/TCP | HTTP、证书验证 | 允许公网访问 |
| 443/TCP | HTTPS 论坛 | 允许公网访问 |
PostgreSQL 和 Redis 不应直接暴露公网。
1GB 或 2GB VPS 在构建镜像、升级和重建容器时容易耗尽内存。官方安装器可以在低内存机器上创建 Swap,也可以提前手动配置:
sudo fallocate -l 2G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile swap swap defaults 0 0' | sudo tee -a /etc/fstab
echo 'vm.swappiness=10' | sudo tee /etc/sysctl.d/30-discourse-swap.conf
sudo sysctl --system
free -h
Swap 只能降低突发 OOM 的概率,不能替代物理内存。论坛经常使用 Swap 或响应明显变慢时,应升级配置,而不是继续扩大 Swap。
Discourse 当前官方快速安装命令是:
wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bash
如果希望先检查脚本再执行,可以拆成两步:
curl -fsSL https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse -o install-discourse
less install-discourse
sudo bash install-discourse
安装器会检查系统资源、安装 Docker 和 Git、下载 /var/discourse 配置,并进入交互式向导。向导主要询问:
- 管理员邮箱;
- 自有域名或
discourse.diy免费子域名; - SMTP 配置是否跳过;
- DNS、80/443 端口和 Swap 设置。
确认后会构建 app 容器,通常需要数分钟。不要因为终端暂时没有新输出就中断 SSH。可以另开一个窗口观察资源:
docker ps
docker stats --no-stream
df -h
安装完成后检查:
cd /var/discourse
sudo ./launcher logs app
curl -I https://forum.example.com
正常情况下,Let's Encrypt 证书由安装流程自动配置,不需要再在宿主机安装 Certbot。
浏览器打开 https://forum.example.com,使用安装时填写的管理员邮箱注册。只有匹配 DISCOURSE_DEVELOPER_EMAILS 的账号才能在首次注册后获得管理员权限。
首次进入后台后先完成:
- 设置站点名称、描述、Logo 和默认语言;
- 决定开放注册、邀请注册还是仅管理员创建用户;
- 建立分类、版规、隐私政策和服务条款;
- 启用敏感词、审核队列和新用户发帖限制;
- 创建一个普通测试账号,验证注册、发帖和通知链路。
不要只用管理员账号测试。普通用户权限、邮件验证、图片上传和信任等级问题,通常只有真实走一遍注册流程才会暴露。
新版官方安装器允许跳过 SMTP,并启用 Discourse ID 登录。这样可以先完成测试,也能通过统一身份服务使用邮件或 Google、GitHub、Apple 等登录方式。
但生产社区仍建议配置独立事务邮件。没有 SMTP 时,传统注册验证、摘要邮件、私信通知、邮件回复和部分账号恢复流程会受限。不要在同一台 VPS 上临时安装 Postfix 直发邮件,送达率、PTR、SPF、DKIM 和退信处理会明显增加维护成本。
常见 SMTP 参数如下:
SMTP 地址:smtp.example.net
SMTP 端口:587
SMTP 用户名:provider-user
SMTP 密码:独立 SMTP Key
发件地址:[email protected]
需要修改安装配置时编辑:
sudo nano /var/discourse/containers/app.yml
对应字段示例:
env:
DISCOURSE_HOSTNAME: 'forum.example.com'
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
DISCOURSE_SMTP_ADDRESS: 'smtp.example.net'
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: 'provider-user'
DISCOURSE_SMTP_PASSWORD: 'replace-with-smtp-key'
DISCOURSE_NOTIFICATION_EMAIL: '[email protected]'
YAML 对缩进敏感,密码包含 #、:、$ 等字符时必须使用引号。修改后重建容器:
cd /var/discourse
sudo ./launcher rebuild app
然后在后台发送测试邮件,并检查 SPF、DKIM、DMARC 与退信 Webhook。发件子域名应按邮件服务商要求验证,不要只看到后台提示“已发送”就认为用户一定能收到。
首次安装时建议把 Cloudflare 记录设置为 DNS Only,确保 Discourse 安装器能直接检测源站和签发证书。安装成功后再启用代理,并将 SSL/TLS 模式设为 Full (strict)。
不要使用 Flexible 模式,否则 Cloudflare 到源站使用 HTTP,容易出现循环跳转和登录 Cookie 异常。出现 HTTPS 循环时,可以参考 VPS HTTPS 跳转循环排查。
启用 Cloudflare 后检查:
curl -I http://forum.example.com
curl -I https://forum.example.com
curl -sS https://forum.example.com/srv/status
论坛的登录、发帖、上传和实时通知都需要完整测试,不能只看首页返回 200。
在 Admin → Backups 中启用自动备份,设置频率和保留数量。备份应包含数据库和用户上传,但本机备份仍会和 VPS 一起丢失,因此必须再复制到异地存储。
默认持久化数据位于:
/var/discourse/shared/standalone/
常见备份文件位于:
/var/discourse/shared/standalone/backups/default/
检查最近备份:
sudo find /var/discourse/shared/standalone/backups -type f -printf '%TY-%Tm-%Td %TH:%TM %s %p\n' | sort
建议同时保留三层:
- Discourse 后台自动备份;
- VPS 服务商快照,用于升级失败时快速回滚;
- S3、对象存储或另一台服务器上的异地副本。
至少执行一次测试恢复。只创建从未验证的备份,不能证明它在数据库损坏或误删后可用。完整方法可参考 VPS 备份恢复演练指南。
小版本更新可以从后台 /admin/upgrade 执行。涉及基础镜像、Docker 模板或重大版本变更时,使用命令行重建更容易保留完整日志:
cd /var/discourse
sudo ./launcher rebuild app
更新前执行:
free -h
df -h
docker ps
sudo ./launcher logs app
确保有最近备份和快照,再安排维护窗口。rebuild 会销毁旧容器并从配置重新构建,持久化数据保存在 /shared,但配置错误、磁盘不足或下载失败仍可能导致停机。
更新后检查首页、登录、发帖、搜索、图片上传、邮件和后台任务。不要只看到容器状态为 Up 就结束维护。
- SSH 使用密钥登录,并限制管理来源;
- 只开放 22、80、443,不暴露 PostgreSQL 和 Redis;
- 管理员启用双因素认证,日常发帖使用普通账号;
- 限制新用户链接、附件、私信和发帖频率;
- 及时安装 Discourse 安全更新;
- 插件只从可信仓库安装,并记录版本与用途;
- SMTP Key、OAuth Secret 和对象存储密钥不要写入公开仓库;
- 配置异地备份、磁盘告警和站点可用性监控。
Discourse 自带应用层限速,但不能替代云防火墙、CDN 和容量监控。公开社区遭遇 CC 攻击时,可结合 Cloudflare WAF 与 Nginx 限速排查清单处理。
sudo ss -lntp | grep -E ':(80|443)\b'
docker ps --format 'table {{.Names}}\t{{.Ports}}'
确认占用服务后再决定迁移或停止。不要直接结束不认识的生产进程。
dig +short forum.example.com A
curl -4 ifconfig.me
两个 IP 必须一致。还要检查错误的 AAAA 记录、Cloudflare 代理、云防火墙和 DNS 缓存。
free -h
swapon --show
dmesg -T | grep -i -E 'out of memory|killed process'
没有 Swap 时先配置 2GB Swap;长期运行仍频繁 OOM,应升级到 2GB 或 4GB 内存。
cd /var/discourse
sudo ./launcher logs app
docker ps -a
curl -I http://127.0.0.1
sudo tail -n 100 /var/discourse/shared/standalone/log/rails/production.log
重点检查 DNS、证书、磁盘空间、数据库启动、Rails 日志和端口映射。
核对 SMTP 地址、端口、用户名、Key、TLS 模式和发件域名。云厂商可能封锁 25 端口,事务邮件通常使用 587 或服务商指定端口。修改 app.yml 后必须重建才会生效。
先查看完整构建日志,确认插件是否支持当前 Discourse 版本。不要为了让升级继续而删除持久化目录。应回滚快照或从 app.yml 暂时移除不兼容插件,再重新构建并验证数据。
- 域名 A 记录指向当前 VPS,80/443 可访问
- 正文站点和后台均使用有效 HTTPS
- 普通用户可以注册、登录、发帖、搜索和上传图片
- SMTP 测试邮件可送达,SPF、DKIM、DMARC 正常
- 管理员已启用双因素认证
- 自动备份已启用,并复制到异地存储
- 已完成一次备份恢复演练
- 更新前有快照,更新后检查邮件和后台任务
- PostgreSQL、Redis 和管理凭据未暴露公网
- 磁盘、内存、证书和网站可用性有告警
Discourse 真正的部署成本不在第一次把首页打开,而在邮件送达、审核、附件增长、备份恢复和持续升级。小型社区从 2 核 2GB、独立事务邮件和异地备份开始,通常比在 1GB VPS 上反复处理 OOM、磁盘满和发信失败更省时间。
