1Panel部署Discourse

结城 建站 9 次阅读 2117 字 发布于 2026-05-13 预计阅读时间: 10 分钟


Discourse 的标准安装内嵌了多个服务,没有用 Docker Compose 而是使用了一套自己的编译系统,在本地编译镜像。编译完成后借助 Docker 来运行。

Discourse 官方只提供了 Docker 一种安装方式,但它不是标准的 Docker 部署。

在默认安装中,安装完成后只有一个容器在运行,容器封装 PostgreSQL 数据库和 Redis 缓存,理论上讲这非常不符合 Docker 本来的目的。

1Panel 依赖标准 Docker 镜像或通过 Docker Compose 编排来拉取多个标准镜像,修改镜像配置,通过嵌套的方式进行组装,而不是本地重新编译镜像。

这与 Discourse 官方推荐的部署方式不同,Discourse 的镜像是根据你的需求配置,无论是插件还是SMTP服务配置,都是在安装的那一刻打包生成,而并非组装各种本地的服务。

1Panel 选择了使用知名第三方镜像服务商 Bitmain Docker 打包的镜像,将整个 Discourse 打包进了镜像内部,在容器内进行所有的操作。这意味着首先会启动一个容器,在这个容器里再编译一份镜像,然后再把这个镜像的运行,映射到最外层。

看似部署省事,实则会产生各种各样的问题。

使用端口访问会导致控制台无法显示,请修改为使用域名访问。

在浏览器中访问 URI /admin/site_settings/category/required​,将 default locale​ 设置为 简体中文 即可。

安装应用时手动编辑 docker-compose ,修改 SMTP 相关配置即可。

安装或卸载插件。

进入 容器​页面,找到 Discourse 应用,点击右侧操作列中的 终端 按钮,在容器终端中执行以下命令:

cd /opt/bitnami/discourse

# 安装插件 PLUGIN_REPO_URL 替换为插件地址
sudo RAILS_ENV=production bundle exec rake plugin:install repo=PLUGIN_REPO_URL

# 预编译新资源以供插件使用
sudo RAILS_ENV=production bundle exec rake assets:precompile

进入 容器​ 页面,找到 Discourse 应用,点击右侧操作列中的 终端 按钮,在容器终端中执行以下命令:

cd /opt/bitnami/discourse/plugins

# 删除插件目录 PLUGIN-DIR 替换为插件目录
rm -rf PLUGIN-DIR

# 预编译新资源
sudo RAILS_ENV=production bundle exec rake assets:precompile

这些问题根源来自于 Discourse 的构建方式。较为正确的解决方案是:

按照 Discourse 官方推荐安装方式进行安装,然后使用面板进行管理,而并非使用应用商店安装的方式进行。

使用此方法安装的 Discourse 可被面板管理,挂载到宿主机的文件和配置修改等操作不需要进入 Docker SSH。

可通过宿主机 SSH 正常重建,无需重建容器和重新编译。不影响 1Panel 面板的其他功能和其他应用。

1.建立 discourse 文件夹

创建用来克隆项目的文件夹

mkdir /opt/1panel/apps/discourse/

2.下载 discourse 源代码

使用 SSH 连入服务器,然后执行以下命令:

git clone https://github.com/discourse/discourse_docker.git /opt/1panel/apps/discourse
cd /opt/1panel/apps/discourse
chmod 700 containers

如果系统没有安装git先执行以下命令安装。

sudo apt update

先进行系统更新,避免之后安装出现各种奇奇怪怪的bug导致安装出错

sudo apt install -y git


3.编辑 Discourse 配置

因为 Linux 面板会占用默认的 80443​ 端口,这会和面板自身的端口占用冲突,不能直接按照官方教程执行 ./discourse-setup,而是需要先编辑配置!

在discorse的文件夹内,找到 /opt/1panel/apps/discourse/samples/standalone.yml 这个文件,这是用于单容器安装的模板配置文件。

我们将它复制并重命名为app.yml​到 /opt/1panel/apps/discourse/containers/app.yml 这个位置,然后用 1Panel 的文本编辑器直接打开编辑。

需要编辑的点有以下几个:

3.1端口映射

expose:
  - "127.0.0.1:8080:80"   # http
  - "127.0.0.1:4430:443" # https

这里,我们将容器在宿主机的端口设置为了 8080 和 4430,这样不会因为面板占用端口而安装失败。

你也可以改成别的端口,这些暴露的端口都是暴露在服务器本地,不会对外开放。

3.2访问地址

DISCOURSE_HOSTNAME: 'vibe.akashio.com'

不必多说,就是你的域名。

3.3管理员邮件地址

DISCOURSE_DEVELOPER_EMAILS: 'you@me.com'

这个一定要提前设好自己的邮箱,邮箱验证强制开启,收不到邮件则无法激活管理员账号。

3.4邮件发送配置

  DISCOURSE_SMTP_ADDRESS: smtp.you.com
  DISCOURSE_SMTP_PORT: 465
  DISCOURSE_SMTP_FORCE_TLS: true
  DISCOURSE_SMTP_USER_NAME: 邮箱
  DISCOURSE_SMTP_PASSWORD: 密码
  DISCOURSE_NOTIFICATION_EMAIL: 发信邮箱    # (address to send notifications from)

Discourse 的安装向导,必须在收到管理员激活邮件之后才能正常完成。

如果你的邮箱服务器端口是465,那么必须要开启DISCOURSE_SMTP_FORCE_TLS: true,否则邮箱服务器的TLS加密邮件无法发送。


3.5配置永久化存储

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

相当于将两个宿主机文件映射到运行容器内,使得 Discourse 每次“重建”时不会丢失内容。

4.开始安装

回到Discourse安装目录,就是你克隆下来的Discourse仓库。

执行命令

./launcher rebuild app

等待安装进度完成即可。

需要注意,安装过程中会出现一个临时的容器,等待安装完成后临时容器便会消失,最后只留下一个app名称的容器。

安装过程中会自动连接网络下载基础的构建镜像服务,并且补充镜像构建,速度会很慢,依照网络情况有所不同。

至少预留10G空间用于构建临时镜像和下载镜像构建服务资源。

安装过程中出现任何问题,你都可以通过修改配置,重新执行 ./launcher rebuild app 来继续安装。

需要注意的是,由于国内机器访问github或者docker有困难,需要配置全局科学上网,这里不在赘述。

对于邮件服务器调试,可以执行 ./discourse-doctor 命令,该命令会执行一个诊断程序,并且会让你提供一个邮件地址发送测试邮件。可以根据控制台输出判断是哪里错了。

当你找到了错误,想重新配置你的邮箱服务器时,不需要重新编译。

修改 SMTP,是不需要./launcher rebuild app,直接执行 destroy 和 start 就能生效,并且速度更快。编辑保存你的配置文件后,在终端中执行。

./launcher destroy app

然后等待执行结束。再执行等待执行结束。

./launcher start app 

然后,你可以重复执行 ./discourse-doctor 诊断进行调试。

简单来说就是,修改邮箱服务直接摧毁然后启动,修改其余配置再重建app。

5.安装插件(可选)

最新版本的Discourse已经内置了核心插件,不需要再进行手动安装

下列方式只适用于安装第三方插件

在 1Panel 的可视化面板里,进入 /opt/1panel/apps/discourse/containers 这个目录,然后用文本编辑器编辑 app.yml 。然后找到如下这一段:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git

你需要的,就是在 https://github.com/discourse/docker_manager.git​ 这一行下面,添加一行你插件的地址。比如 Discourse AI 这个插件的地址是 https://github.com/discourse/discourse-ai,那么,修改后的就是:

hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - sudo -E -u discourse git clone https://github.com/discourse/docker_manager.git
          - sudo -E -u discourse git clone https://github.com/discourse/discourse-ai.git

有两个注意点,一个是结尾别忘了加.git​,另一个是,如果你原本的那条里没有- sudo -E -u discourse这个前缀,那么你新增的插件也不需要这个前缀。

编辑完成后,确认保存。

cd到安装目录。执行重建app,等待执行完毕,插件安装完成。

./launcher rebuild app