Definir variáveis ambientais

:notebook_with_decorative_cover: Este é um guia how-to para configurar variáveis de ambiente em uma instalação autohospedada do Discourse.

:person_raising_hand: Nível de usuário necessário: Administrador

As variáveis de ambiente desempenham um papel crucial na configuração da sua instância do Discourse. Elas podem armazenar dados sensíveis como chaves de API e senhas de banco de dados, tornando sua instalação mais segura e flexível. No Discourse, as variáveis de ambiente são definidas no arquivo app.yml dentro da configuração do seu contêiner Docker.

Adicionar variáveis de ambiente a um arquivo .yml (YAML) é simples. Aqui está um exemplo básico:

# Este é um arquivo YAML com variáveis de ambiente
env:
  NOME_DA_VARIAVEL: "Valor da Variável"
  OUTRA_VARIAVEL: "Outro Valor"

No contexto de um contêiner Docker do Discourse, as variáveis de ambiente são armazenadas na seção env do seu arquivo app.yml.

Aqui está um exemplo de um arquivo app.yml:
## este é o template de contêiner Docker do Discourse tudo-em-um e autônomo
##
## Após fazer alterações neste arquivo, você deve reconstruir
## /var/discourse/launcher rebuild app
##
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomente estas duas linhas se desejar adicionar o Let's Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## quais portas TCP/IP este contêiner deve expor?
## Se você quiser que o Discourse compartilhe uma porta com outro servidor web como Apache ou nginx,
## consulte https://meta.discourse.org/t/17247 para obter detalhes
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Defina db_shared_buffers para um máximo de 25% da memória total.
  ## será definido automaticamente pelo bootstrap com base na RAM detectada, ou você pode substituir
  db_shared_buffers: "256MB"

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

  ## Quantas requisições web concorrentes são suportadas? Depende da memória e dos núcleos da CPU.
  ## será definido automaticamente pelo bootstrap com base nas CPUs detectadas, ou você pode substituir
  UNICORN_WORKERS: 3

  ## TODO: O nome de domínio que esta instância do Discourse responderá
  DISCOURSE_HOSTNAME: 'discourse.example.com'

  ## Descomente se você quiser que o contêiner seja iniciado com o mesmo
  ## nome de host (-h option) especificado acima (padrão "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de e-mails separados por vírgula que serão administradores e desenvolvedores
  ## na inscrição inicial, exemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@example.com'

  ## TODO: O servidor de e-mail SMTP usado para validar novas contas e enviar notificações
  DISCOURSE_SMTP_ADDRESS: smtp.example.com         # (obrigatório)
  DISCOURSE_SMTP_PORT: 587                        # (opcional)
  DISCOURSE_SMTP_USER_NAME: user@example.com      # (opcional)
  DISCOURSE_SMTP_PASSWORD: a_s3cr3t_p@ssword      # (opcional)
  #DISCOURSE_SMTP_ENABLE_START_TLS: true           # (opcional, padrão true)

  ## Se você adicionou o template Let's Encrypt, descomente abaixo para obter um certificado SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## O endereço CDN para esta instância do Discourse (configurado para puxar)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com
## O contêiner Docker é sem estado; todos os dados são armazenados em /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Plugins vão aqui
## consulte https://meta.discourse.org/t/19157 para detalhes
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Quaisquer comandos personalizados a serem executados após a compilação
run:
  - exec: echo "Início dos comandos personalizados"
  ## Se você quiser definir o endereço de e-mail 'De' para o seu primeiro registro, descomente e altere:
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  ## Após receber o primeiro e-mail de inscrição, comente a linha novamente. Ela só precisa ser executada uma vez.
  - exec: echo "Fim dos comandos personalizados"

Vamos começar a adicionar variáveis de ambiente ao seu site! :mage:

:information_source: As instruções a seguir são escritas para uma Instalação Padrão do Discourse

Faça Login no Seu Servidor

Use uma ferramenta como PuTTY ou o terminal em sistemas baseados em Unix para fazer SSH no seu servidor.

ssh username@your-server-ip

Navegue até o Diretório do Discourse

Uma vez que você tenha acesso ao seu servidor, navegue até o diretório que contém a configuração do Docker do Discourse, que geralmente está localizado em /var/discourse.

cd /var/discourse

Abra o Arquivo app.yml

Você precisará abrir o arquivo app.yml em um editor de texto. Para este exemplo, usaremos nano.

nano containers/app.yml

Adicione Suas Variáveis de Ambiente

No arquivo app.yml, você encontrará uma seção env. É aqui que você pode adicionar suas variáveis de ambiente.

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

Por exemplo, se você quisesse definir a variável de ambiente DISCOURSE_ENABLE_CORS como true para habilitar o Compartilhamento de Recursos de Origem Cruzada (CORS), você adicionaria a seguinte linha à seção env:

env:
  DISCOURSE_ENABLE_CORS: "true"
  ...

:person_tipping_hand: O espaço em branco e a formatação são importantes aqui, então certifique-se de manter a indentação correta (dois espaços) para a nova linha.

Depois de modificar suas variáveis, salve e feche o arquivo.

Reconstrua o Contêiner do Discourse

Finalmente, você precisará reconstruir seu contêiner Docker do Discourse para que as alterações entrem em vigor. Você pode fazer isso com o seguinte comando:

./launcher rebuild app

Alternativamente, para atualizar variáveis de ambiente para um contêiner em execução sem reconstruir, você também pode usar:

./launcher destroy app
./launcher start app

Após a conclusão do processo de reconstrução, suas variáveis de ambiente atualizadas estarão disponíveis para sua aplicação Discourse! :tada:

4 curtidas

Isso seria muito mais útil se explicasse como usar variáveis de ambiente para substituir (e fornecer a partir da UX) as configurações do sistema ou as configurações globais no arquivo de variáveis globais padrão (e vinculasse a ele para que as pessoas pudessem ver essas configurações, como configurações obscuras do Redis)

Este é um exemplo confuso, pois não tem nada a ver com o Discourse.
Você poderia mencionar que é o mesmo que usar o comando análogo, como a configuração no Docker, talvez.

Vejo que você fez isso porque criou Setup Cross-Origin Resource Sharing (CORS), então talvez use isso como exemplo.

7 curtidas

Existe um local onde se pode encontrar todas as variáveis de ambiente possíveis usadas no Discourse?

Isso teria sido muito mais útil do que um tópico que diz que as variáveis de ambiente vão em app.yml na seção env: :laughing:

Além disso, para que a aplicação “carregue” as variáveis de ambiente alteradas, tenho quase certeza de que basta um restart e não é necessário um rebuild, mas por favor, alguém me corrija se eu estiver errado.

Você pode destruir e iniciar o contêiner; isso foi adicionado ao OP, eu acho. O único problema é se você fez atualizações do UX, elas são perdidas.

Você pode definir qualquer configuração do site com DISCOURSE_SETTING_NAME. Veja também as configurações padrão em config. discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub

4 curtidas

Olá @SaraDev, posso saber como essas variáveis de ambiente alteram o comportamento do Discourse? Por exemplo, de todas as variáveis mencionadas neste post Available settings for global rate limits and throttling, não consigo encontrar nenhuma delas no código-fonte do Discourse, então como essas variáveis são conectadas ao Discourse? Obrigado!

Acredito que você possa vê-los aqui:

3 curtidas

Muito obrigado @Arkshine.

1 curtida

Existe uma maneira de definir variáveis de ambiente em um ambiente de desenvolvimento não hospedado em docker? Pretendo hospedar com docker eventualmente, mas estou desenvolvendo localmente com esta configuração: Install Discourse on macOS for development
Não há app.yml neste caso

Você pode defini-las na linha de comando antes de iniciar o rails, mas o que você está tentando fazer com essas variáveis de ambiente?

Estou tentando definir DISCOURSE_ENABLE_CORS como true para SSO. Você se importaria de me enviar um comando de exemplo? Sou novo no desenvolvimento de discourse / rails. Além disso, o que isso faz no final? Cria um registro na tabela site_settings?

Estou tentando configurar o Discourse automaticamente dentro do Kubernetes. Portanto, planejo criar uma imagem Docker personalizada (DinD).
MAS se eu executasse ./discourse-setup.sh no meu Dockerfile, ele me pediria opções de configuração - que o Docker não pode responder (já que isso deve ser feito automaticamente).

Entendo que eu poderia colocar essas variáveis de ambiente dentro do arquivo app.yml, mas neste ponto não haverá nenhum arquivo app.yaml de forma alguma, pois o script ./discourse-setup ainda não foi executado.

Então, minha pergunta seria: Como posso pré-configurar o Discourse para meus propósitos, para que ./discourse-setup não exija minha entrada do usuário?

O guia de instalação discourse/docs/INSTALL-cloud.md em main · discourse/discourse (github.com) não diz nada sobre pré-configurações ou arquivos de configuração.

Obrigado antecipadamente!

2 curtidas

Tente

./launcher start-cmd app

Isso lhe dará o comando de inicialização do Docker usado para iniciar o contêiner. Você deve ser capaz de usá-lo para descobrir como iniciar as coisas no k8s.

5 curtidas

Existem outros locais comuns onde o arquivo app.yml pode residir, ou seria possível que este arquivo precise ser criado do zero? Eu “entrei” no meu contêiner Docker (docker exec -it discourse_dev /bin/bash) e não consegui encontrar nenhum arquivo chamado app.yml.

O arquivo app.yml deve estar fora do seu contêiner, em vez de dentro dele.

2 curtidas