概述
Discourse 是一个完全开源的论坛平台。具有丰富的插件库与主题库,适用于开源社区的构建。Rainbond官方社区就是基于Discourse搭建的实际案例。
Rainbond官方社区建立之初就已经使用了Discourse,当时的版本为 1.5.4。时过境迁,为了更好的社区体验,Rainbond社区运营团队决定部署最新版本的Discourse社区,并将原社区的数据迁移到新社区中。
这篇文档,会详细介绍如何在Rainbond容器云平台上部署Discourse,以及在整个部署乃至迁移数据过程中所趟平的坑。对于有意搭建基于Discourse的社区的小伙伴,会有很大的帮助。
了解更多有关Discourse的信息:
- Discourse官方网站
- Discourse Github
基于应用市场快速安装
Discourse 已经发布到了Rainbond应用市场,可以一键部署安装,即点即用。
在正式使用前,一定要修改以下环境变量:
环境变量:
- DISCOURSE_DB_PASSWORD=你自定义的数据库密码
- DISCOURSE_DEVELOPER_EMAILS=管理员的邮箱地址
- DISCOURSE_HOSTNAME=为社区准备的域名,如果希望使用Rainbond默认为80端口生成的域名,这个值设置为 ${DOMAIN}
- DISCOURSE_SMTP_ADDRESS=可用的smtp服务器
- DISCOURSE_SMTP_PORT=smtp服务器的端口
- DISCOURSE_SMTP_USER_NAME=smtp账户
- DISCOURSE_SMTP_PASSWORD=smtp账户的密码
修改完成后,就可以继续注册使用了。 Discourse应用如何制作 =============== 在使用旧版本Discourse的时候,为了将其容器化,我们做了很多工作。但在当前版本,Discourse官方已经支持并且主推容器化部署,这对于将Discourse部署在Rainbond容器云平台非常友好。 接下来的部分,我将说明如何制作一个即点即用的Discourse应用。 获取镜像 ---- 部署的第一步,就是获取到Discourse的镜像。 区别于一般的容器化部署,Discourse并没有将它自己的镜像托管于[Docker Hub](https://hub.docker.com/),而是为用户准备了一套完整的工具,可以让用户高度自定义自己需要的镜像,这套工具就是[discourse\_docker](https://github.com/discourse/discourse_docker)。在这套工具里,用户可以根据其提供的模版自定义部署的方式、包含的插件等信息,并通过一条命令,快速构建对应的镜像;也可以利用它来管理本机正在运行的docker化部署的Discourse。 Discourse部署支持 all in one 的 Standalone 模式,也支持适用于生产的 Multiple 模式。Multiple 模式的意思,就是将Discourse 的WEB部分,和后端数据库Postgresql、缓存中间件Redis分离部署。 本次部署,将使用 Multiple 模式。最终的拓扑,将会是下面这种情况: ![image-20191226093122462](https://tva1.sinaimg.cn/large/006tNbRwly1ga9vfrheklj30p20mswfm.jpg) * 环境的要求 首先,我们需要有一个可以运行docker服务的环境,如果你已经安装了Rainbond容器云平台,那么集群中任何一个节点,都可以满足你的需要。如果你还没有安装Rainbond,或者根本不知道它是什么,你需要点击[了解一下](https://www.rainbond.com/)。 * 获取discourse\_docker git clone https://github.com/discourse/discourse\_docker.git FROM postgres:10-alpine MAINTAINER [email protected] \# 下面的步骤,会将初始化数据用的sql脚本放置在指定目录下 ADD sql/\*.sql /docker-entrypoint-initdb.d/ ADD docker-entrypoint.sh / RUN chmod +x /docker-entrypoint.sh ENV TZ Aisa/Shanghai ENV LANG en\_US.utf8 ENV PGDATA /var/lib/postgresql/data ENV PG\_MAJOR 10 ENV PG\_VERSION 10.11 VOLUME /var/lib/postgresql/data EXPOSE 5432 ./launcher start data docker exec \-ti data bash pg\_dump \-d discourse \-h 127.0.0.1 \-U discourse > data.sqlpg\_dump \-d discourse \-h 127.0.0.1 \-U discourse > /shared/data.sql \-- \-- This row is added manually because when the SQL is imported manually, recived role "postgres" does not exist \-- CREATE USER postgres SUPERUSER; [https://meta.discourse.org/t/restore-from-old-version-to-a-new-version-of-discourse-failed/135545](https://meta.discourse.org/t/restore-from-old-version-to-a-new-version-of-discourse-failed/135545) 如果你是一个向我一样的老版本用户,那么将旧版本的数据导入到新版本的 Discourse,就会是个非常必要的操作。Discourse支持全站数据的备份与恢复,但是我在实际恢复过程中遇到了很多问题,究其原因还是我的旧版本实在是太老了。具体的解决方式,请参见下面的帖子,我得到了来自官方工程师大牛的帮助: 数据恢复 ---- [https://github.com/discourse/discourse/blob/master/docs/INSTALL-email.md](https://github.com/discourse/discourse/blob/master/docs/INSTALL-email.md) Discourse初始化安装,是会向管理员的邮箱发送注册邮件的,所以正确的配置邮件服务是重中之重,官方推荐的邮件服务器及配置方式参见: 邮件配置 ---- 一些踩过的坑 ====== 访问discourse\_web的80端口所对应的域名,看到欢迎页面即可证明系统部署完成了。 访问 -- * discourse\_web 依赖 postgresql10 * discourse\_web 依赖 redis 利用Rainbond[依赖关系](https://www.rainbond.com/docs/user-manual/app-service-manage/service-rely/),将三个服务建立起正确的依赖关系。 建立依赖 ---- * 环境变量: * DISCOURSE\_DB\_HOST=127.0.0.1 * DISCOURSE\_DB\_PASSWORD=你自定义的数据库密码 * DISCOURSE\_DB\_USERNAME=discourse * DISCOURSE\_DEVELOPER\_EMAILS=管理员的邮箱地址 * DISCOURSE\_HOSTNAME=为社区准备的域名,如果希望使用Rainbond默认为80端口生成的域名,这个值设置为 ${DOMAIN} * DISCOURSE\_REDIS\_HOST=127.0.0.1 * DISCOURSE\_SMTP\_ADDRESS=可用的smtp服务器 * DISCOURSE\_SMTP\_PORT=smtp服务器的端口 * DISCOURSE\_SMTP\_USER\_NAME=smtp账户 * DISCOURSE\_SMTP\_PASSWORD=smtp账户的密码 点击构建之前,进行高级设置: ![image-20191226114203876](https://tva1.sinaimg.cn/large/006tNbRwly1ga9z5gzg21j31r70u0gt3.jpg) 利用我们已经推送好的 rainbond/discourse\_web:2.4.0-beta8 镜像,来部署WEB服务部分。 部署Discourse\_web ---------------- * 组件部署类型 :有状态服务 * 环境变量: * POSTGRES\_DB=discourse * POSTGRES\_PASSWORD=自定义的数据库密码 * POSTGRES\_USER=discourse 构建之前,需要定义高级设置: ![image-20191226111213717](https://tva1.sinaimg.cn/large/006tNbRwly1ga9yadl0p2j31r90u045z.jpg) 准备就绪后,就可以在Rainbond部署订制的postgresql 了 在官方镜像使用 data.sql 初始化的时候,发现一个小问题,官方镜像没有默认创建`role:postgres` 故此手动在 `data.sql`前面加入以下内容: 输入密码后即可开始备份,备份完成后在服务器的 `/var/discourse/shared/data/` 目录下,找到对应的 `data.sql`文件。 这时就会启动一个已经初始化好了的data容器。我们需要将它里面的数据库 `discourse` 备份出来。 将这个镜像启动为容器: 这一步的另一个重点在于如何获取初始化用的sql脚本。这需要利用到上个步骤构建出来的数据库镜像。 自动初始化的原理参见:[https://hub.docker.com/\_/postgres](https://hub.docker.com/_/postgres) 中的 `Initialization scripts` 部分。docker化的数据库,大部分都支持这种方式自动初始化,这样做的好处是,基于此镜像的容器在首次启动时,不需要其他操作,就会自动执行sql脚本完成初始化。对于Rainbond部署而言,在将这样的数据库作为应用的一部分发布到应用市场后,执行一键安装可以达到即安即用的效果。 关键Dockerfile部分解析: 部署的方式使用了基于 Dockerfile 的源码构建,项目地址:[https://github.com/dazuimao1990/pri-postgresql](https://github.com/dazuimao1990/pri-postgresql) 基于官方的postgresql镜像做了进一步处理,使之可以自动初始化Discourse所需要的数据库。 postgresql部署 ------------ ![image-20191226102759385](https://tva1.sinaimg.cn/large/006tNbRwly1ga9x0cv4srj31qh0u0dos.jpg) 这一步比较简单,直接基于镜像部署一个标准的redis即可: redis 部署 -------- 我决定使用官方镜像来运行 postgresql 和 redis。然后对 postgresql 进行处理,使之可以自动初始化。 当前构建出来的data镜像,是一个合并了 postgresql 和 redis 的镜像。这还不符合我们想要的部署方式,我要将它进行进一步的拆分。 * 配置模版 在项目的根目录中,名为 `samples` 的目录下,会有我们所需要的模版文件 `web_only.yml` `data.yml` ,将这两个模版文件拷贝到项目根目录下的 `containers` 目录下。 * 自定义配置 Discourse最主要的自定义在于主题(theme) 和插件(plugins),其中主题可以在网站设置中配置,而插件的安装,则需要修改上述的模版文件。 编辑`web_only.yml`文件,在第84行附近找到如下段落,并追加插件地址: hooks: after\_code: \- exec: cd: $home/plugins cmd: \- git clone https://github.com/discourse/docker\_manager.git \- git clone https://github.com/discourse/discourse-whos-online.git 关于Rainbond如何[自定义环境变量](https://www.rainbond.com/docs/user-manual/app-service-manage/service-other-set/#%E8%87%AA%E5%AE%9A%E4%B9%89%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F) 关于Discourse [环境变量配置的说明](https://github.com/discourse/discourse_docker#environment-variables) 其他的标准配置,如邮件服务器的配置,均以环境变量的方式指定,当前可以保持默认,部署于Rainbond的时候,可以支持自定义环境变量进行替换。 具体原理及操作,点击[了解一下](https://meta.discourse.org/t/install-plugins-in-discourse/19157) * 构建WEB服务镜像 使用命令行工具 `launcher` 来构建 web\_only 镜像: ./launcher bootstrap web\_only root@localhost:~/discourse\_docker\# docker images | grep web\_only local\_discourse/web\_only latest 79a99d0d8fd1 7 days ago 2.83GB 将这个镜像推送至Docker hub或者私有的镜像仓库备用即可,在我的部署环境里,我将其推送到了 Docker hub,具体的镜像地址为: `rainbond/discourse_web:2.4.0-beta8`。 构建完成后,在服务器的本地镜像列表里,就会出现对应的镜像: * 构建数据库镜像 使用命令行工具构建 data 镜像 ./launcher bootstrap data root@iZj6chkije5xk0gfyvcrzyZ:~/discourse\_docker\# docker images | grep data local\_discourse/data latest 76e100480749 2 weeks ago 2.35GB 这个镜像不必推送到镜像仓库,后续的步骤会继续拆分这个镜像,并进行数据自动初始化的处理。 构建完成后,在服务器的本地镜像列表里,就会出现对应的镜像: