Настройка переменных окружения

:notebook_with_decorative_cover: Это руководство по настройке переменных окружения в установке Discourse на собственном хостинге.

:person_raising_hand: Требуемый уровень доступа пользователя: Администратор

Переменные окружения играют ключевую роль в конфигурации вашего экземпляра Discourse. Они позволяют хранить конфиденциальные данные, такие как API-ключи и пароли баз данных, делая вашу установку более безопасной и гибкой. В Discourse переменные окружения задаются в файле app.yml в рамках настройки вашего Docker-контейнера.

Добавление переменных окружения в файл .yml (YAML) — простая задача. Вот базовый пример:

# Это YAML-файл с переменными окружения
env:
  VARIABLE_NAME: "Значение переменной"
  ANOTHER_VARIABLE: "Другое значение"

В контексте Docker-контейнера Discourse переменные окружения хранятся в секции env вашего файла app.yml.

Вот пример файла app.yml:
## Это шаблон Docker-контейнера Discourse all-in-one, автономный
##
## После внесения изменений в этот файл необходимо выполнить пересборку
## /var/discourse/launcher rebuild app
##
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Раскомментируйте эти две строки, если хотите добавить Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## Какие TCP/IP-порты должен открывать этот контейнер?
## Если вы хотите, чтобы Discourse использовал порт совместно с другим веб-сервером, например Apache или nginx,
## см. 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% от общего объема памяти.
  ## Будет установлено автоматически при загрузке в зависимости от обнаруженной оперативной памяти, либо вы можете переопределить
  db_shared_buffers: "256MB"

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

  ## Сколько одновременных веб-запросов поддерживается? Зависит от памяти и количества ядер процессора.
  ## Будет установлено автоматически при загрузке в зависимости от обнаруженных процессоров, либо вы можете переопределить
  UNICORN_WORKERS: 3

  ## TODO: Доменное имя, на которое будет реагировать этот экземпляр Discourse
  DISCOURSE_HOSTNAME: 'discourse.example.com'

  ## Раскомментируйте, если хотите, чтобы контейнер запускался с тем же
  ## именем хоста (опция -h), как указано выше (по умолчанию "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Список email-адресов через запятую, которые станут администраторами и разработчиками
  ## при первоначальной регистрации, например '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)

  ## Если вы добавили шаблон Lets Encrypt, раскомментируйте ниже, чтобы получить бесплатный SSL-сертификат
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## Адрес CDN для этого экземпляра Discourse (настроен для извлечения)
  #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 "Начало пользовательских команд"
  ## Если вы хотите установить адрес электронной почты в поле 'From' для первой регистрации, раскомментируйте и измените:
  #- 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

После получения доступа к серверу перейдите в каталог, содержащий вашу настройку Docker для Discourse; обычно это /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

Наконец, вам нужно пересобрать ваш Docker-контейнер Discourse, чтобы изменения вступили в силу. Это можно сделать с помощью следующей команды:

./launcher rebuild app

Альтернативно, для обновления переменных окружения в работающем контейнере без пересборки можно также использовать:

./launcher destroy app
./launcher start app

После завершения процесса пересборки ваши обновленные переменные окружения станут доступны вашему приложению Discourse! :tada:

4 лайка

Это было бы гораздо полезнее, если бы объясняло, как использовать переменные окружения для переопределения (и предоставления через интерфейс пользователя) системных настроек или глобальных настроек в файле глобальных переменных по умолчанию (
и ссылалось бы на него, чтобы люди могли видеть эти настройки, например, скрытые настройки Redis.

Это запутанный пример, так как он не имеет ничего общего с Discourse.

Можно упомянуть, что это то же самое, что использование аналогичной команды настройки в Docker, возможно.

Я вижу, что вы сделали это, потому что создали Setup Cross-Origin Resource Sharing (CORS), так что, возможно, используйте это в качестве примера.

7 лайков

Есть ли место, где можно найти все возможные переменные окружения, используемые в Discourse?

Это было бы гораздо полезнее, чем тема, утверждающая, что переменные окружения указываются в app.yml в секции env: :laughing:

Кроме того, чтобы приложение “загрузило” изменённые переменные окружения, я почти уверен, что достаточно просто выполнить restart, и не нужно делать rebuild, но, пожалуйста, поправьте меня, если я ошибаюсь.

Можно уничтожить и запустить контейнер заново; я думаю, это добавлено в исходный пост. Единственная проблема в том, что если вы выполняли обновления через UX, они будут потеряны.

Вы можете установить любой параметр сайта с помощью DISCOURSE_SETTING_NAME. См. также параметры по умолчанию в разделе config. discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub

4 лайка

Привет, @SaraDev! Подскажите, пожалуйста, как эти переменные окружения влияют на поведение Discourse? Например, я не могу найти ни одной из переменных, упомянутых в этом посте Available settings for global rate limits and throttling, в исходном коде Discourse. Как тогда эти переменные подключаются к Discourse? Спасибо!

Полагаю, вы можете увидеть их здесь:

3 лайка

Огромное спасибо @Arkshine.

1 лайк

Можно ли задать переменные окружения в среде разработки, не использующей Docker? В будущем я планирую развернуть решение с помощью Docker, но сейчас работаю локально в такой конфигурации: Install Discourse on macOS for development
В данном случае файла app.yml нет.

Вы можете задать их в командной строке перед запуском Rails, но что именно вы планируете делать с этими переменными окружения?

Я пытаюсь установить DISCOURSE_ENABLE_CORS в true для SSO. Не могли бы вы прислать мне пример команды? Я новичок в разработке Discourse/Rails. Также, что именно это делает в итоге? Создает запись в таблице site_settings?

Я пытаюсь автоматически настроить Discourse в Kubernetes. Поэтому я планирую создать собственный Docker-образ (DinD).

ОДНАКО, если я запущу ./discourse-setup.sh в своем Dockerfile, он запросит у меня параметры конфигурации — на что Docker ответить не может (так как это должно быть выполнено автоматически).

Я понимаю, что можно поместить эти переменные окружения в файл app.yml, но на данном этапе файла app.yml вообще не будет, так как скрипт ./discourse-setup еще не был выполнен.

Таким образом, мой вопрос: как я могу предварительно настроить Discourse для своих целей, чтобы ./discourse-setup не требовал моего ввода?

В руководстве по установке discourse/docs/INSTALL-cloud.md в ветке main · discourse/discourse (github.com) ничего не говорится о предварительной настройке или файлах конфигурации.

Заранее спасибо!

2 лайка

Попробуйте

./launcher start-cmd app

Это даст вам команду запуска Docker, используемую для запуска контейнера. Вы сможете использовать её, чтобы понять, как запускать процессы в k8s.

5 лайков

Есть ли другие распространённые места, где может находиться файл app.yml, или возможно, что этот файл нужно создать с нуля? Я “вошёл” в свой Docker-контейнер (docker exec -it discourse_dev /bin/bash), но не смог найти файл с именем app.yml.

Файл app.yml должен находиться вне вашего контейнера, а не внутри него.

2 лайка