很多人想在一台 VPS 上用 1Panel 部署 Discourse,直觉上会去点“应用市场 → 一键安装”。但现实经常是:
这篇文章给你一个更稳的思路:
用 1Panel 管服务器(反代 / HTTPS / WAF / 防火墙 / 备份),用 Discourse 官方
discourse_docker完成安装与重建。
这个方案的目标不是“最省事”,而是:后期可维护、可升级、可加插件、并且能融进面板化运维体系。
说明:本文方案与踩坑点主要参考了 Akashio 的帖子《如何正确的使用 1Panel 部署 Discourse?》,并对照 Discourse 官方安装文档做了补充与纠错(链接见文末参考)。
核心原因:Discourse 的官方安装方式虽然是 Docker,但它不是“标准 Docker Compose 拉镜像”那种模型。
discourse_docker 工作流,会在安装/重建时根据你的配置(域名、SMTP、插件等)去 bootstrap / rebuild。而很多面板的一键应用更偏向:
当这两种模型叠在一起,最常见的后果就是:
./launcher rebuild app所以更推荐的折中是:
常见冲突点是:
更稳的做法是:
8973)127.0.0.1:8973这样 Discourse 不直接暴露在公网端口上,面板也更容易统一治理。
下面步骤默认你已经:
forum.example.com)为了后续备份/管理更顺手,可以把 Discourse 放在:
/opt/1panel/apps/discoursediscourse_docker用 SSH 连到宿主机:
sudo -s
git clone https://github.com/discourse/discourse_docker.git /opt/1panel/apps/discourse
cd /opt/1panel/apps/discoursediscourse_docker 仓库里有 launcher、samples/、containers/、shared/ 等目录结构,官方也明确:containers/ 目录是你要维护的容器定义目录,通常从 samples/ 复制模板开始。
containers/app.ymlDiscourse 单容器安装通常基于 samples/standalone.yml。
把它复制到 containers/app.yml:
cp samples/standalone.yml containers/app.yml权限方面:containers/ 和 app.yml 会包含敏感配置(SMTP、密钥等),建议把权限收紧(至少不要 world-readable)。不少踩坑反馈里提到误把整个目录 chmod 到 700 导致问题,因此我更建议只对 containers/ 做收紧:
chmod 700 containers具体权限策略你可以按团队习惯调整,但原则是:只收紧需要收紧的目录,别一把梭把整个项目目录改到过严。
containers/app.yml(关键)你需要重点改几个地方:
把对外端口改成只监听本机:
expose:
- '127.0.0.1:8973:80' # http
- '127.0.0.1:4433:443' # https(可选)思路就是:容器别直接暴露到公网,公网访问交给 1Panel 的反代站点。
DISCOURSE_HOSTNAME: 'forum.example.com'安装向导会要求管理员激活,务必提前写好:
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'参考 Discourse 官方安装文档,SMTP 在新版本安装流程里是可跳过的:如果跳过 SMTP,可以使用 Discourse ID 登录等方式先把站跑起来,后面再补邮件配置。
但生产环境还是建议配好 SMTP(通知、注册、找回密码都需要)下列是基础的配置。如果还有问题建议去了解官方文档
DISCOURSE_SMTP_ADDRESS: smtp.example.com #发信客户端
DISCOURSE_SMTP_PORT: 587 #发信端口一般配置465/587
DISCOURSE_SMTP_USER_NAME: [email protected] #邮箱/Username
DISCOURSE_SMTP_PASSWORD: 'pa$$word' #密码
DISCOURSE_SMTP_FORCE_TLS: true #TLS开关如果使用465/587端口一定要开启否则无法正常发信你需要确保 uploads / 日志等在宿主机持久化(shared/ 目录就是为这个设计的),这样你后面 ./launcher rebuild app 不会“重建=清空”。
建议配置
volumes:
- volume:
host: /opt/1panel/apps/discourse/shared/standalone
guest: /shared
- volume:
host: /opt/1panel/apps/discourse/shared/standalone/log/var-log
guest: /var/log(具体 volume 配置建议以 standalone.yml 模板为基准,只在你明确知道含义时再改。)
在 discourse_docker 目录下执行:
./launcher rebuild app这一步会拉依赖、构建镜像并启动容器,时间取决于你机器配置与网络环境。构建完成后会在1Panel->容器出现"app"的 容器

当容器起来后,你可以在 1Panel:
forum.example.com127.0.0.1:8973然后在站点配置里申请/配置证书:
这样,你的公网访问链路就是:
User → 1Panel 站点/WAF/HTTPS → 127.0.0.1:8973 → Discourse 容器
可以按参考帖的思路:
./discourse-doctor 做诊断与测试邮件containers/app.yml 的 SMTP 配置./discourse-doctor
./launcher destroy app
./launcher start app这通常是内存不足导致 OOM。
参考帖里有人用 加大 swap 的方式跑过编译阶段:
这是可选项:用于 IP 地理位置相关功能;不影响论坛核心可用性。官方安装文档也给了如何配置 MaxMind license key 的说明。
discourse_docker 的典型方式是在 app.yml 的 hooks 里增加插件 git clone,然后 rebuild:
hooks -> after_code./launcher rebuild app我的建议是:
你最终要的不是“今天能跑”,而是: