这个帖子的缘起就是本站的站长在部署这个论坛的时候,发现目前互联网上没有任何一个 1Panel 的 Discourse 的部署教程能够顺利完成部署。于是,决定写下自己的部署过程。
使用此方法安装的 Discourse 可被面板管理,文件和配置修改等操作不需要进入 Docker SSH。可通过宿主机 SSH 正常重建。且不影响 1Panel 面板的其他功能和其他应用。Discourse 可被 1Panel WAF 正常防护。
1. 为什么你应该用面板部署 Discourse?(背景解释,可跳过)
搜索很多关于使用 1Panel 和宝塔部署 Discourse 的咨询贴,最后都导向了“别用面板”。
这是自然的,下面我会解释为什么这种说法有道理。但我们先谈谈为什么仍然应该用面板来部署 Discourse。
很简单:因为大多数普通人的运维能力,不足以不用面板来维护一个安全的服务器。
跳过面板直接部署 Discourse 非常简单,遵循官方的标准安装教程即可。
但后期,你想在服务器上加 WAF,想做些前后端分离,想控制访问权限,想把服务器的 SSH 关掉或仅支持密钥登录,都会变得非常困难。不安全甚至对大部分小白来说还是小事,更普遍的是一不小心就会把自己关在服务器外面不得不格掉重装。
2. 为什么用面板部署 Discourse 不行?(原理解释,可跳过)
因为 Discourse 官方虽然只提供了 Docker 一种安装方式,但它不是标准的 Docker 部署。
如果你经历过 Discourse 的标准安装,就会发现,它尽管内嵌了多个服务,但没有用 Docker Compose,而是使用了一套自己的编译系统,在本地编译镜像。编译完成后,仅借助 Docker 来运行。在默认安装中,它安装完成后甚至只有一个容器在运行,而容器内则封装了 PostgreSQL 数据库和 Redis 缓存,这非常不符合 Docker 本来的目的。
1Panel 和宝塔的“应用”,都依赖标准 Docker 镜像或通过 Docker Compose 编排来拉取多个标准镜像,修改镜像配置。这与 Discourse 官方推荐的部署方式非常不同——因为,Discourse 的镜像,是根据你的需求(包括插件、SMTP 设置等),在安装的那一刻打包生成的。
因此,1Panel 和宝塔选择了使用知名第三方镜像服务商 Bitmain Docker 打包的镜像——这个镜像,把 Discourse 的编译工具也打包进了镜像里!
这意味着,当你在 1Panel 和宝塔的一键部署功能部署 Discourse 时,它首先会启动一个容器,在这个容器里再编译一份镜像,然后再把这个镜像的运行,映射到最外层。
在这个过程中,面板里的很多操作 ,会产生意外操作。比如,安装插件:
当你根据 1Panel 官方的方法,对一键部署的 Discourse 安装插件时,Discourse 可能会崩溃。
再比如,如果你在 1Panel 里对部署好的 Discourse 点击了“重建”,那么 Discourse 也会崩溃并且再也无法启动。
这些问题没有很好的解决方案,一切根源来自于 Discourse 的构建方式。
因此,综合“你应该用 Linux 运维面板来管理 Discourse”和“你没法用 Linux 运维面板安装 Discourse ”两个看似不和调和的矛盾之后,我们正确的选择是:
使用 Linux 面板运维服务器,然后按照 Discourse 官方推荐安装方式进行安装。
3. 实战安装
第一步:完成这些前置步骤
- 购买一个域名
- 购买一个服务器
- 安装 1Panel 或宝塔面板
3.1 安装好 openresty ,启用“网站”功能。 - 设置好 SSH
如果这些你都不知道如何操作,那你应该先学习如何建站,并尝试从一个简单的应用开始部署,比如 Wordpress。等把一些基础搞明白之后,再挑战 Discourse。
在 1Panel 中建立一个 discourse 文件夹
进入 1Panel > 系统 > 文件,创建一下这个目录:/opt/1panel/apps/discourse/
我们之所以将 discourse 放在 1Panel 的 Apps 目录之下,是为了方便在后续使用 1Panel 进行备份时寻找路径。
下载 discourse 源代码
使用 SSH 连入服务器,然后执行以下命令:
sudo -s
git clone https://github.com/discourse/discourse_docker.git /opt/1panel/apps/discourse
cd /opt/1panel/apps/discourse
chmod 700 1panel
这几段代码的意思分别是:
root权限
把代码下载到指定目录
切换到那个目录
赋予目录执行权限
如果你的目录权限不对,也可以在完成这些之后,去 1Panel 的可视化面板里,把这个新下载下来的目录赋予 700 权限。
编辑 Discourse 配置
因为 Linux 面板会占用默认的 80 443 端口,并且我们的安装目录也和默认的不一样,所以我们不能直接按照官方执行 ./discourse-setup
,而是需要先编辑配置!
我们回到 1Panel 的可视化界面,找到 /opt/1panel/apps/discourse/containers/app.yml 这个文件,直接打开编辑。
需要编辑的点有以下几个:
- 端口映射
expose:
- "127.0.0.1:8973:80" # http
- "127.0.0.1:4433:443" # https
这里,我们将容器在宿主机的端口设置为了 8973 和 4433,这样就不会因为面板占用端口而安装失败了,你也可以改成别的端口,但记住,后面要用。同时,我们禁止了容器直接向公网暴露自己,方便我们使用 1Panel 防火墙。
- 访问地址
DISCOURSE_HOSTNAME: 'vibe.akashio.com'
不必多说,就是你的域名。
-
管理员邮件地址
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
这个一定要提前设好自己的邮箱,不然最后一步没法激活管理员账号。 -
邮件发送配置
DISCOURSE_SMTP_ADDRESS: smtp.you.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: 邮箱
DISCOURSE_SMTP_PASSWORD: 密码
DISCOURSE_NOTIFICATION_EMAIL: 发信邮箱 # (address to send notifications from)
这个很少有人能一次性配对,考虑到不同人使用不同的邮件供应商,你们可以在网上搜搜怎么配。Discourse 的安装向导,必须在收到管理员激活邮件之后才能正常完成。但没关系,我们稍后有一节专门讲这个。
- 配置永久化存储
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 每次“重建”时不会丢失内容。后续,你也可以用 1Panel 的文件直接去管理这些目录,不用深入 Docker 终端了。
完成之后,检查一遍,点击确认保存。
开始安装
回到终端,如果已经断开连接了,你需要重新用 SSH 连接。
cd /opt/1panel/apps/discourse
回到安装目录。
然后执行:
./launcher rebuild app
等待安装结束,即可完成安装了。
如果一切正常,终端将不会弹出任何错误提示,并回到命令行。然后,你将在 1Panel 的“容器”面板里,看到一个已经在运行的容器:
配置网站和反向代理
如图,进入 1Panel 的网站里,创建一个新的网站,类型选择反向代理,域名写上你刚才在配置里填的域名,反向代理的地址填上 localhost:8973。如果你刚才改了端口,这里就也要改一下端口。
配置 SSL
在 1Panel 里,点刚才创建的网站,点配置,选择 HTTPS,打开自动跳转,根据提示跳转到证书页面创建证书。然后回到这里配置好证书,你的安装就结束了。
如果你之前的邮件配置正确,此时,你可以用浏览器访问你的 yourname.com 完成剩下的安装进程。
安装过程中出现任何问题,你都可以通过修改配置,重新执行 ./launcher rebuild app
来继续安装。
4. 常见答疑
如何反复调试邮件服务器?
啊,正常人很难一次配置成功。
如果失败了怎么办?我们假设你已经完成了上面的所有步骤,并且卡在 Web 界面无法激活管理员账号。
首先,用终端连接服务器,然后 cd /opt/1panel/apps/discourse
去到安装目录。
然后执行 ./discourse-doctor
命令,该命令会执行一个诊断程序,并且会让你提供一个邮件地址发送测试邮件。你可以根据发送结果的错误,在网上搜索,你到底是哪里配置错了。
然后,你需要修改你的 SMTP 设置,怎么修改呢?
在 1Panel 的可视化面板里,进入 /opt/1panel/apps/discourse/containers
这个目录,然后用文本编辑器编辑 app.yml ,直接编辑你之前的 SMTP 设置。
编辑完成后保存,回到终端。
在终端中执行 ./launcher destroy app
然后等待执行结束。
再执行 ./launcher start app
等待执行结束。
如果你只是修改 SMTP,是不需要./launcher rebuild app
的,destroy 和 start 就能生效,并且速度更快。
然后,你可以重复执行 ./discourse-doctor
诊断进行调试。
如何安装插件
在 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
这个前缀,那么你新增的插件行业不要有。
编辑完成后,确认保存。
然后,我们用 SSH 连接服务器。
执行 cd /opt/1panel/apps/discourse
去到安装目录。
然后执行:
./launcher rebuild app
等待执行完毕,插件安装完成。
架构与维护
在这个教程的安装中,Discourse 所需的所有资源被打包成一个整体映像,在 Docker 中运行。可由 1Panel 容器面板管理。
用于编译映像的所有文件,存储于 /opt/1panel/apps/discourse 文件夹之中,你可以用 1Panel 文件面板进行图形化管理。
容器运行于宿主机,而非容器中的容器,所以,使用 Discourse CLI 的各项管理命令(如重建),需要使用 SSH 连接至宿主机。这一步,你也可以用 1Panel 的 Web 终端来完成。