开源社区Discourse在Rainbond上的部署

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
云原生数据库 PolarDB MySQL 版,通用型 2核8GB 50GB
简介:

开源社区Discourse在Rainbond上的部署

概述

Discourse 是一个完全开源的论坛平台。具有丰富的插件库与主题库,适用于开源社区的构建。Rainbond官方社区就是基于Discourse搭建的实际案例。

Rainbond官方社区建立之初就已经使用了Discourse,当时的版本为 1.5.4。时过境迁,为了更好的社区体验,Rainbond社区运营团队决定部署最新版本的Discourse社区,并将原社区的数据迁移到新社区中。

这篇文档,会详细介绍如何在Rainbond容器云平台上部署Discourse,以及在整个部署乃至迁移数据过程中所趟平的坑。对于有意搭建基于Discourse的社区的小伙伴,会有很大的帮助。

了解更多有关Discourse的信息:

基于应用市场快速安装

Discourse 已经发布到了Rainbond应用市场,可以一键部署安装,即点即用。

discoure-install

点击安装,选择应用后稍等一会,即可访问你的Discourse了

discoure-register

在正式使用前,一定要修改以下环境变量:

  • 环境变量:
    • 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,而是为用户准备了一套完整的工具,可以让用户高度自定义自己需要的镜像,这套工具就是discourse_docker。在这套工具里,用户可以根据其提供的模版自定义部署的方式、包含的插件等信息,并通过一条命令,快速构建对应的镜像;也可以利用它来管理本机正在运行的docker化部署的Discourse。

Discourse部署支持 all in one 的 Standalone 模式,也支持适用于生产的 Multiple 模式。Multiple 模式的意思,就是将Discourse 的WEB部分,和后端数据库Postgresql、缓存中间件Redis分离部署。

本次部署,将使用 Multiple 模式。最终的拓扑,将会是下面这种情况:

image-20191226093122462

  • 环境的要求
    首先,我们需要有一个可以运行docker服务的环境,如果你已经安装了Rainbond容器云平台,那么集群中任何一个节点,都可以满足你的需要。如果你还没有安装Rainbond,或者根本不知道它是什么,你需要点击了解一下

  • 获取discourse_docker

git clone https://github.com/discourse/discourse_docker.git
AI 代码解读
  • 配置模版
    在项目的根目录中,名为 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
    
    AI 代码解读

    具体原理及操作,点击了解一下

    其他的标准配置,如邮件服务器的配置,均以环境变量的方式指定,当前可以保持默认,部署于Rainbond的时候,可以支持自定义环境变量进行替换。

    关于Discourse 环境变量配置的说明

  • 构建WEB服务镜像
    使用命令行工具 launcher 来构建 web_only 镜像:

    ./launcher bootstrap web_only
    
    AI 代码解读

    构建完成后,在服务器的本地镜像列表里,就会出现对应的镜像:

    root@localhost:~/discourse_docker# docker images | grep web_only
    local_discourse/web_only   latest              79a99d0d8fd1        7 days ago          2.83GB
    
    AI 代码解读

    将这个镜像推送至Docker hub或者私有的镜像仓库备用即可,在我的部署环境里,我将其推送到了 Docker hub,具体的镜像地址为: rainbond/discourse_web:2.4.0-beta8

  • 构建数据库镜像

    使用命令行工具构建 data 镜像

    ./launcher bootstrap data
    
    AI 代码解读

    构建完成后,在服务器的本地镜像列表里,就会出现对应的镜像:

    root@iZj6chkije5xk0gfyvcrzyZ:~/discourse_docker# docker images | grep data
    local_discourse/data       latest              76e100480749        2 weeks ago         2.35GB
    
    AI 代码解读

    这个镜像不必推送到镜像仓库,后续的步骤会继续拆分这个镜像,并进行数据自动初始化的处理。

当前构建出来的data镜像,是一个合并了 postgresql 和 redis 的镜像。这还不符合我们想要的部署方式,我要将它进行进一步的拆分。

我决定使用官方镜像来运行 postgresql 和 redis。然后对 postgresql 进行处理,使之可以自动初始化。

redis 部署

这一步比较简单,直接基于镜像部署一个标准的redis即可:

image-20191226102759385

postgresql部署

基于官方的postgresql镜像做了进一步处理,使之可以自动初始化Discourse所需要的数据库。

部署的方式使用了基于 Dockerfile 的源码构建,项目地址:https://github.com/dazuimao1990/pri-postgresql

关键Dockerfile部分解析:

FROM postgres:10-alpine
MAINTAINER guox@goodrain.com
# 下面的步骤,会将初始化数据用的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
AI 代码解读

自动初始化的原理参见:https://hub.docker.com/_/postgres 中的 Initialization scripts 部分。docker化的数据库,大部分都支持这种方式自动初始化,这样做的好处是,基于此镜像的容器在首次启动时,不需要其他操作,就会自动执行sql脚本完成初始化。对于Rainbond部署而言,在将这样的数据库作为应用的一部分发布到应用市场后,执行一键安装可以达到即安即用的效果。

这一步的另一个重点在于如何获取初始化用的sql脚本。这需要利用到上个步骤构建出来的数据库镜像。

将这个镜像启动为容器:

./launcher start data
AI 代码解读

这时就会启动一个已经初始化好了的data容器。我们需要将它里面的数据库 discourse 备份出来。

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
AI 代码解读

输入密码后即可开始备份,备份完成后在服务器的 /var/discourse/shared/data/ 目录下,找到对应的 data.sql文件。

在官方镜像使用 data.sql 初始化的时候,发现一个小问题,官方镜像没有默认创建role:postgres 故此手动在 data.sql前面加入以下内容:

--
-- This row is added manually because when the SQL is imported manually, recived role "postgres" does not exist
-- 

CREATE USER postgres SUPERUSER;
AI 代码解读

准备就绪后,就可以在Rainbond部署订制的postgresql 了

image-20191226111213717

构建之前,需要定义高级设置:

  • 组件部署类型 :有状态服务
  • 环境变量:
    • POSTGRES_DB=discourse
    • POSTGRES_PASSWORD=自定义的数据库密码
    • POSTGRES_USER=discourse

部署Discourse_web

利用我们已经推送好的 rainbond/discourse_web:2.4.0-beta8 镜像,来部署WEB服务部分。

image-20191226114203876

点击构建之前,进行高级设置:

  • 环境变量:
    • 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账户的密码

建立依赖

  • discourse_web 依赖 postgresql10
  • discourse_web 依赖 redis

访问

访问discourse_web的80端口所对应的域名,看到欢迎页面即可证明系统部署完成了。

一些踩过的坑

邮件配置

Discourse初始化安装,是会向管理员的邮箱发送注册邮件的,所以正确的配置邮件服务是重中之重,官方推荐的邮件服务器及配置方式参见:

https://github.com/discourse/discourse/blob/master/docs/INSTALL-email.md

数据恢复

如果你是一个向我一样的老版本用户,那么将旧版本的数据导入到新版本的 Discourse,就会是个非常必要的操作。Discourse支持全站数据的备份与恢复,但是我在实际恢复过程中遇到了很多问题,究其原因还是我的旧版本实在是太老了。具体的解决方式,请参见下面的帖子,我得到了来自官方工程师大牛的帮助:

https://meta.discourse.org/t/restore-from-old-version-to-a-new-version-of-discourse-failed/135545

目录
打赏
0
0
0
0
49
分享
相关文章
2025 轻松部署 Odoo 18 社区版
传统手工部署 Odoo 存在诸多难题:手动安装 Docker 复杂易错、镜像拉取速度慢且易中断、配置参数繁琐、后期运维负担重。Websoft9 提供了一键安装解决方案,自动检测系统环境并加速国内镜像下载,智能配置避免端口冲突与弱密码风险。仅需三步(登录控制台、创建数据库、登录后台)即可完成极简部署,显著提升效率与安全性,是企业用户的理想选择。
127 0
2025 轻松部署 Odoo 18 社区版
快速部署 Cloudreve 社区版
Cloudreve 可助你即刻构建出兼备自用或公用的网盘服务,通过多种存储策略的支持、虚拟文件系统等特性实现灵活的文件管理体验。本文介绍如何使用计算巢快速部署Cloudreve服务。
快速部署 Cloudreve 社区版
快速部署 Zabbix 社区版
Zabbix 是一款监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康和完整性的软件。Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的告警,以实现对服务器问题做出快速反应。Zabbix 基于存储的数据提供出色的报告和数据可视化功能。这使得 Zabbix 成为容量规划的理想选择。本文介绍如何通过计算巢快速部署 Zabbix 社区版。
快速部署 Zabbix 社区版
快速部署 Docker 社区版
Docker Community Edition (CE) 是Docker项目的免费版本,面向广大开发者、爱好者以及希望利用容器技术的个人和组织。它是Docker企业版(Docker Enterprise Edition, EE)的社区驱动对应版,提供了强大的容器化应用构建、部署和运行能力。本文解释如何通过计算巢快速部署Docker社区版。
快速部署 Docker 社区版
快速部署 Typecho 社区版
Typecho基于PHP开发,支持多种数据库,是一款内核强健、扩展方便、体验友好、运行流畅的轻量级开源博客程序。本文介绍用计算巢快速部署typecho社区版服务。
快速部署 Typecho 社区版
快速部署 Halo 社区版
Halo 作为一款好用又强大的开源建站工具,配合上不同的模板与插件,可以很好地帮助你构建你心中的理想站点。它可以是你公司的官方网站,可以是你的个人博客,也可以是团队共享的知识库,甚至可以是一个论坛、一个商城。 本文介绍如何使用计算巢快速部署Halo社区版。
快速部署 Halo 社区版
快速部署 MaxKB 社区版
MaxKB = Max Knowledge Base,是一款基于 LLM 大语言模型的开源知识库问答系统,旨在成为企业的最强大脑。本文介绍如何使用计算巢快速部署 MaxKB 社区版。
快速部署 MaxKB 社区版
云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
云原生技术落地实现之二KubeSphere DevOps 系统在 Kubernetes 集群上实现springboot项目的自动部署和管理 CI/CD (2/2)
210 1
【排坑指南之kubeSphere】2022年最新版-”kubeSphere3.2.1 Paas容器云平台“使用DevOps-CICD之”排坑指南“
【排坑指南之kubeSphere】2022年最新版-”kubeSphere3.2.1 Paas容器云平台“使用DevOps-CICD之”排坑指南“
215 0
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等