设置环境变量

:notebook_with_decorative_cover: 这是关于在自托管 Discourse 安装中设置环境变量的 how-to 指南。

:person_raising_hand: 所需用户级别:管理员

环境变量在配置 Discourse 实例方面起着至关重要的作用。它们可以存储敏感数据,如 API 密钥和数据库密码,从而使您的安装更安全、更灵活。在 Discourse 中,环境变量在 Docker 容器设置中的 app.yml 文件中进行设置。

.yml (YAML) 文件添加环境变量非常简单。这是一个基本示例:

# 这是一个包含环境变量的 YAML 文件
env:
  VARIABLE_NAME: "Variable Value"
  ANOTHER_VARIABLE: "Another Value"

在 Discourse Docker 容器的上下文中,环境变量存储在 app.yml 文件的 env 部分。

这是一个 app.yml 文件的示例:
## 这是独立式 Discourse Docker 容器模板
##
## 更改此文件后,您必须重建
## /var/discourse/launcher rebuild app
##
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## 如果您希望添加 Let's Encrypt (https),请取消注释这两行
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## 此容器应公开哪些 TCP/IP 端口?
## 如果您希望 Discourse 与 Apache 或 nginx 等其他 Web 服务器共享端口,
## 请参阅 https://meta.discourse.org/t/17247 获取详细信息
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## 将 db_shared_buffers 设置为总内存的最多 25%。
  ## 将由 bootstrap 根据检测到的 RAM 自动设置,或者您可以覆盖它
  db_shared_buffers: "256MB"

env:
  LANG: en_US.UTF-8
  # DISCOURSE_DEFAULT_LOCALE: en

  ## 支持多少并发 Web 请求?取决于内存和 CPU 核心。
  ## 将由 bootstrap 根据检测到的 CPU 自动设置,或者您可以覆盖它
  UNICORN_WORKERS: 3

  ## TODO:此 Discourse 实例将响应的域名
  DISCOURSE_HOSTNAME: 'discourse.example.com'

  ## 如果您希望容器以与上面指定的相同主机名 (-h 选项) 启动,请取消注释
  ## (默认为“$hostname-$config”)
  #DOCKER_USE_HOSTNAME: true

  ## TODO:将成为初始注册的管理员和开发人员的逗号分隔的电子邮件列表
  ## 示例:'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@example.com'

  ## TODO:用于验证新帐户和发送通知的 SMTP 邮件服务器
  DISCOURSE_SMTP_ADDRESS: smtp.example.com         # (必需)
  DISCOURSE_SMTP_PORT: 587                        # (可选)
  DISCOURSE_SMTP_USER_NAME: user@example.com      # (可选)
  DISCOURSE_SMTP_PASSWORD: a_s3cr3t_p@ssword      # (可选)
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (可选, 默认为 true)

  ## 如果您添加了 Let's Encrypt 模板,请取消注释下方以获取免费 SSL 证书
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## 此 Discourse 实例的 CDN 地址(配置为拉取)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com
## Docker 容器是无状态的;所有数据都存储在 /shared 中
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## 插件放在这里
## 参阅 https://meta.discourse.org/t/19157 获取详细信息
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## 构建后要运行的任何自定义命令
run:
  - exec: echo "开始执行自定义命令"
  ## 如果您想设置首次注册的“发件人”电子邮件地址,请取消注释并更改:
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  ## 收到首次注册电子邮件后,重新注释该行。它只需要运行一次。
  - exec: echo "自定义命令结束"

让我们开始为您的网站添加环境变量吧!:mage:

:information_source: 以下说明是为 标准 Discourse 安装 编写的

登录到您的服务器

使用 PuTTY 或类 Unix 系统上的终端等工具 SSH 登录到您的服务器。

ssh username@your-server-ip

导航到 Discourse 目录

登录到服务器后,导航到包含 Discourse Docker 设置的目录,该目录通常位于 /var/discourse

cd /var/discourse

打开 app.yml 文件

您需要使用文本编辑器打开 app.yml 文件。在本示例中,我们将使用 nano

nano containers/app.yml

添加您的环境变量

app.yml 文件中,您会找到一个 env 部分。您可以在此处添加您的环境变量。

env:
  DISCOURSE_HOSTNAME: 'discourse.example.com'
  DISCOURSE_SMTP_ADDRESS: smtp.example.com
  DISCOURSE_SMTP_PORT: 587
  DISCOURSE_SMTP_USER_NAME: user@example.com
  DISCOURSE_SMTP_PASSWORD: a_s3cr3t_p@ssword

例如,如果您想将 DISCOURSE_ENABLE_CORS 环境变量设置为 true 以启用 跨域资源共享 (CORS),您将在 env 部分添加以下行:

env:
  DISCOURSE_ENABLE_CORS: "true"
  ...

:person_tipping_hand: 此处的空格和格式很重要,因此请确保新行的缩进正确(两个空格)

修改完变量后,保存并关闭文件。

重建 Discourse 容器

最后,您需要重建 Discourse Docker 容器才能使更改生效。您可以使用以下命令执行此操作:

./launcher rebuild app

或者,要更新正在运行的容器的环境变量而不重建,您还可以使用:

./launcher destroy app
./launcher start app

重建过程完成后,您的更新后的环境变量将可供您的 Discourse 应用程序使用!:tada:

4 个赞

如果能解释如何使用环境变量来覆盖(并从用户体验角度提供)系统设置或默认全局变量文件中的全局设置,那将更有用(并链接到该文件,以便人们可以看到那些设置,例如晦涩的 Redis 设置)

这是一个令人困惑的例子,因为它与 Discourse 无关。
你或许可以提到这与使用类比命令(如在 Docker 中设置)相同。

我看到你创建这个是因为你创建了 https://meta.discourse.org/t/setup-cross-origin-resource-sharing-cors/270819,所以也许可以以此为例。

7 个赞

是否有地方可以找到 Discourse 中所有可能的环境变量?

比一个说明环境变量在 app.ymlenv: 部分下的主题更有用 :laughing:

另外,要让应用程序“加载”更改的环境变量,我非常确定你只需要 restart 而不需要 rebuild,但如果我错了,请有人纠正我。

您可以销毁并启动容器;我认为这已添加到 OP 中。唯一的问题是,如果您通过 UX 进行升级,它们将会丢失。

您可以使用 DISCOURSE_SETTING_NAME 设置任何站点设置。另请参阅 config 下的默认设置。discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub

4 个赞

您好 @SaraDev,请问这些环境变量如何改变 Discourse 的行为?例如,我在 Discourse 源代码中找不到此帖子 Available settings for global rate limits and throttling 中提到的任何变量,那么这些变量是如何与 Discourse 关联的?谢谢!

我相信您可以在这里找到它们:

3 个赞

非常感谢您,@Arkshine

1 个赞

在非 Docker 托管的开发环境中设置环境变量的方法是什么?我计划最终使用 Docker 托管,但目前正在使用此设置在本地进行开发:Install Discourse on macOS for development \n这种情况下没有 app.yml

You can set them in the command line before you start rails, but what are you trying to do with those ENV variables?

我正尝试将 DISCOURSE_ENABLE_CORS 设置为 true 以实现 SSO。您能给我一个示例命令吗?我对 discourse / rails 开发是新手。另外,这最终会做什么?在 site_settings 表中创建一个记录?

我正在尝试在 Kubernetes 中自动设置 Discourse。因此,我计划构建一个自定义 Docker 镜像(DinD)。
但是,如果在我的 Dockerfile 中运行 ./discourse-setup.sh,它会询问配置选项——而 Docker 无法回答(因为这应该是自动完成的)。

我知道可以将这些环境变量放在 app.yml 文件中,但在这一点上根本不会有 app.yaml 文件,因为 ./discourse-setup 脚本还没有运行。

所以我的问题是:我如何为我的目的预先配置 Discourse,以便 ./discourse-setup 不需要我的用户输入?

discourse/docs/INSTALL-cloud.md at main · discourse/discourse (github.com) 安装指南根本没有提到预配置或配置文件。

预先感谢!

2 个赞

试试

./launcher start-cmd app

这将为您提供用于启动容器的 docker start 命令。您应该能够使用它来弄清楚如何在 k8s 中启动。

5 个赞

app.yml 文件是否还可能存在于其他常见位置,或者是否需要从头开始创建该文件?我“进入”了我的 Docker 容器(docker exec -it discourse_dev /bin/bash),但找不到名为 app.yml 的文件。

app.yml 文件应位于容器外部,而不是内部。

2 个赞