虽然 Discourse 应用程序支持多站点,但这是一种高级系统管理员设置。如果您不知道自己在做什么,请不要设置多站点。Discourse 团队无法提供多站点配置支持。
如果您希望在单个 Docker 设置上托管多个域,则需要多站点配置。以下是其基本组成部分。
理解钩子 (hooks)
多站点是一个相当高级的主题。在尝试进行多站点构建之前,花些时间了解它们。
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 中的模板,以查看有哪些钩子可用。
修改您的独立容器以配置第二个站点租户
将整个 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;"'
after_code:
- exec:
cd: $home/plugins
cmd:
- mkdir -p plugins
- git clone https://github.com/discourse/docker_manager.git
before_bundle_exec:
- file:
path: $home/config/multisite.yml
contents: |
secondsite:
adapter: postgresql
database: b_discourse
pool: 25
timeout: 5000
db_id: 2
host_names:
- b.discourse.example.com
after_bundle_exec:
- exec: cd /var/www/discourse && sudo -H -E -u discourse bundle exec rake multisite:migrate
这里涉及 3 个钩子:
-
after_postgres确保在安装 postgres 之后创建一个名为b_discourse的附加数据库,并具有适当的权限。 -
before_bundle_exec确保docker_manager已就位,并且multisite.yml文件已就位(该文件定义了在哪里可以找到数据库)。 -
after_bundle_exec运行自定义数据库迁移任务rake multisite:migrate,这确保了所有数据库都是最新的。
关于配置的注意事项
上述示例可以根据需要拆分为数据容器/应用容器。只需在数据容器中运行 after_postgres 钩子,而在Web 容器中运行其余部分。
上述示例可以扩展以配置更多数据库。为此,请通过复制创建数据库等调用来配置更多数据库,并确保在 multisite.yml 中添加其他站点。
务必修改 multisite.yml 中的 host_names 节点,以匹配您希望托管的实际主机名。
此外,如果您计划运行 HTTPS,则需要在站点前面有一个代理来处理它,因为内置的 letsencrypt 功能在多站点场景中将无法工作。