开源社区Discourse在Rainbond上的部署

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云原生数据库 PolarDB MySQL 版,通用型 2核4GB 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
  • 配置模版
    在项目的根目录中,名为 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的时候,可以支持自定义环境变量进行替换。

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

  • 构建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
    

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

当前构建出来的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

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

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

将这个镜像启动为容器:

./launcher start data

这时就会启动一个已经初始化好了的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

输入密码后即可开始备份,备份完成后在服务器的 /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;

准备就绪后,就可以在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

相关文章
|
消息中间件 Kubernetes 关系型数据库
教程get | K8S部署OpenStack容器云(下)
如何借助OpenStack Kolla-K8S项目,通过K8S对OpenStack进行容器化部署?并最终部署一套All-In-One类型的OpenStack容器云?让我们继续部署: 部署kolla-kubernetes ■  覆盖默认的RBAC设置 通过kubectl replace命令进行默.
4687 0
|
5月前
|
人工智能 数据可视化 开发者
快速部署 Dify 社区版
Dify.AI 是一款 LLMOps 平台,帮助开发者更简单、更快速地构建 AI 应用。它的核心理念是通过可声明式的 YAML 文件定义 AI 应用的各个方面,包括 Prompt、上下文和插件等。Dify 提供了可视化的 Prompt 编排、运营、数据集管理等功能。这些功能使得开发者能够在数天内完成 AI 应用的开发,或将 LLM 快速集成到现有应用中,并进行持续运营和改进,创造一个真正有价值的 AI 应用。本文介绍使用计算巢快速部署 Dify 社区版。
快速部署 Dify 社区版
|
4月前
|
关系型数据库 应用服务中间件 nginx
部署开源项目管理工具focalboard
部署开源项目管理工具focalboard
146 0
|
7月前
|
Java 关系型数据库 MySQL
开源项目部署环境准备
开源项目部署环境准备
75 3
|
存储 Kubernetes Docker
【排坑指南之kubeSphere】2022年最新版-”kubeSphere3.2.1 Paas容器云平台“使用DevOps-CICD之”排坑指南“
【排坑指南之kubeSphere】2022年最新版-”kubeSphere3.2.1 Paas容器云平台“使用DevOps-CICD之”排坑指南“
140 0
|
Java jenkins 应用服务中间件
使用开源软件Jenkins一键发布项目到服务器
搭建步骤其实很简单,先去官网(https://jenkins.io/)下载一个war包。然后上传linux服务器,或者直接用wget命令下载。下载好后可以直接用java -jar jenkins.war 运行。如果安装了tomcat等web服务器的话就放入对应的路径运行服务器即可。tomcat在webapps下。不推荐使用tomcat,因为war包里本身就包括了一个内置的服务器。如果想后台运行可以用nohup命令。nohup java -jar jenkins.war & ,指定端口加上 --httpPort=xxxx 。
333 0
|
Kubernetes Devops Java
建木在 Rainbond 上使用实践
建木 是一个面向 DevOps 领域的极易扩展的开源无代码(图形化)/低代码(GitOps)工具,可以帮助用户轻松编排各种DevOps流程并分发到不同平台执行
|
存储 Dragonfly 人工智能
【开源之夏 2023】欢迎报名 Dragonfly、Kata Containers、Nydus 社区项目!
开源之夏是由“开源软件供应链点亮计划”发起并长期支持的一项暑期开源活动,旨在鼓励在校学生积极参与开源软件的开发维护,促进优秀开源软件社区的蓬勃发展,培养和发掘更多优秀的开发者。
|
XML JavaScript Cloud Native
云原生之使用Docker部署kkFileView在线文档管理平台
云原生之使用Docker部署kkFileView在线文档管理平台
2152 0
云原生之使用Docker部署kkFileView在线文档管理平台
|
NoSQL Devops Linux
Chef 宣布 100% 开源,要走红帽模式?
  近日,自动化配置管理工具 Chef 官方博客发布博文宣布了两件事情:   从现在起,Chef 将扩展开源许可范围,将其 100%的软件纳入 Apache 2.0 许可证(与现有的 Chef Infra,Chef InSpec 和 Chef Habitat 许可条款一致),对使用、分发和货币化没有任何限制,只要尊重 Chef 的商标政策。为了满足企业用户对 DevOps,自动化等方面的需求,Chef 发布了一款新的商业发行版 Chef Enterprise Automation Stack。该企业版基于 Chef Workstation,Chef Workstation 能快速启动和运行开
240 0