Docker 多站点配置


(Erick Guan) #1

原文于官方论坛,于2015-01-13。

您可能想要在 Docker 上同时部署多个域名。请按照以下指引操作:

我们强烈建议您分别独立运行 web 容器和 data 容器

standalone 容器非常容易配置,不过有几个缺点

  1. 您将在初始化新镜像时需要关闭您的站点
  2. 您只要在必要时才要初始化数据库

多站点安装比较复杂,在开始配置前你应该先理解相关的接口。

理解钩子

Discourse 模板使用了 pups,其规则简单但强大。

对每个规则您可以定义一个钩子:

run:
  exec:
    cd: some/path
    hook: my_hook
    cmd:
      - echo 1

之后在您容器中您就可以在钩子前或后插入规则:

hooks:
  before_my_hook:
    - exec: echo "I ran before"
  after_my_hook:
     - exec: echo "I ran after"

所以按照上面的例子您将看到以下的输出:

I ran before
1
I ran after

您可以在 /var/discourse/templates 中浏览钩子,看看哪些可以使用。

修改 standalone 容器准备链接站点

将 hooks 那一节完整替换为:

hooks:
  after_postgres:
     - exec: sudo -u postgres createdb b_discourse || exit 0
     - exec:
          stdin: |
            grant all privileges on database b_discourse to discourse;
          cmd: sudo -u postgres psql b_discourse
          raise_on_fail: false

     - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "alter schema public owner to discourse;"'
     - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists hstore;"'
     - exec: /bin/bash -c 'sudo -u postgres psql b_discourse <<< "create extension if not exists pg_trgm;"'

  before_bundle_exec:
    - exec:
        cd: /var/www/discourse/plugins
        cmd:
          - mkdir -p plugins
          - git clone https://github.com/discourse/docker_manager.git
    - file:
        path: /var/www/discourse/config/multisite.yml
        contents: |
         secondsite:
           adapter: postgresql
           database: b_discourse
           pool: 25
           timeout: 5000
           db_id: 2
           host_names:
             - b.discourse

  after_bundle_exec:
    - exec: cd /var/www/discourse && sudo -E -u discourse bundle exec rake multisite:migrate

定义了 3 个钩子:

  1. after_postgres,使得 PostgreSQL 安装后新建了另一个叫做 b_discourse 的数据库,并授予了适当的权限。

  2. before_bundle_exec,使得 docker_manager 安装到恰当的位置上,并且设置好 multisite.yml 文件(其中设置好了数据库的连接方式)

  3. after_bundle_exec,运行自定义的数据库迁移任务 rake multisite:migrate,让所有数据库更新至最新。

以上的例子还能按需要分离成 data 容器和 app 容器(只要在 data 容器中运行 after_postgres 钩子,在 web 容器中运行其他钩子即可)

以上的例子也能扩展至更多数量的数据库,要这样做,复制创建数据库那些操作,并且确定在 mutlisite.yml 中添加额外的站点。

但要保证在 mutlisite.yml 中添加的 host_names 和你想要部署至的主机的主机地址匹配。


可以在一台服务器上部署多个discourse吗?
Dicourse 多容器部署
有没有熟悉ruby的啊我想搞个android客户端网页太慢了
30 分钟内在云上部署 Discourse
请问有discourse多站点的设置方法或中文文档吗?
(四川脑壳) #2

太复杂了,看不太明白,有没有更详细的教程或实施过的朋友说明一下,谢谢!


(Dante) #3

非常感谢 分享,你的教程正好解决了我的一个痛点,但是感觉有点复杂,可以做个视频吗 ?


(Erick Guan) #4

我在视频解说上特别糟糕…可能有比我更适合做这件事的人吧


(tim) #5

multisite.yml 谁能贴一个可用的?


(雪莱鸟) #6

希望能获取到可用多站的yml


(雪莱鸟) #7

希望能获取一个可用的mutlisite.yml ,希望能在一台服务器上面同时运行多个discourse :heart_eyes: