Configurar variables de entorno

:notebook_with_decorative_cover: Esta es una guía #cómo-hacer::tag para configurar variables de entorno en una instalación autoalojada de Discourse.

:person_raising_hand: Nivel de usuario requerido: Administrador

Las variables de entorno juegan un papel crucial en la configuración de tu instancia de Discourse. Pueden almacenar datos sensibles como claves API y contraseñas de bases de datos, haciendo tu instalación más segura y flexible. En Discourse, las variables de entorno se configuran en el archivo app.yml dentro de la configuración de tu contenedor Docker.

Añadir variables de entorno a un archivo .yml (YAML) es sencillo. Aquí tienes un ejemplo básico:

# Este es un archivo YAML con variables de entorno
env:
  NOMBRE_VARIABLE: "Valor de la Variable"
  OTRA_VARIABLE: "Otro Valor"

En el contexto de un contenedor Docker de Discourse, las variables de entorno se almacenan en la sección env de tu archivo app.yml.

Aquí tienes un ejemplo de un archivo app.yml:
## esta es la plantilla de contenedor Docker de Discourse todo en uno y autónoma
##
## Después de realizar cambios en este archivo, debes reconstruir
## /var/discourse/launcher rebuild app
##
templates:
  - "templates/postgres.template.yml"
  - "templates/redis.template.yml"
  - "templates/web.template.yml"
  - "templates/web.ratelimited.template.yml"
## Descomenta estas dos líneas si deseas añadir Lets Encrypt (https)
  #- "templates/web.ssl.template.yml"
  #- "templates/web.letsencrypt.ssl.template.yml"

## ¿qué puertos TCP/IP debe exponer este contenedor?
## Si deseas que Discourse comparta un puerto con otro servidor web como Apache o nginx,
## consulta https://meta.discourse.org/t/17247 para obtener detalles
expose:
  - "80:80"   # http
  - "443:443" # https

params:
  db_default_text_search_config: "pg_catalog.english"

  ## Establece db_shared_buffers a un máximo del 25% de la memoria total.
  ## será establecido automáticamente por bootstrap basado en la RAM detectada, o puedes anularlo
  db_shared_buffers: "256MB"

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

  ## ¿Cuántas solicitudes web concurrentes se admiten? Depende de la memoria y los núcleos de CPU.
  ## será establecido automáticamente por bootstrap basado en las CPUs detectadas, o puedes anularlo
  UNICORN_WORKERS: 3

  ## TODO: El nombre de dominio al que responderá esta instancia de Discourse
  DISCOURSE_HOSTNAME: 'discourse.example.com'

  ## Descomenta si deseas que el contenedor se inicie con el mismo
  ## nombre de host (-h option) que el especificado anteriormente (por defecto "$hostname-$config")
  #DOCKER_USE_HOSTNAME: true

  ## TODO: Lista de correos electrónicos separados por comas que se convertirán en administradores y desarrolladores
  ## en el registro inicial, ejemplo 'user1@example.com,user2@example.com'
  DISCOURSE_DEVELOPER_EMAILS: 'user@example.com'

  ## TODO: El servidor de correo SMTP utilizado para validar nuevas cuentas y enviar notificaciones
  DISCOURSE_SMTP_ADDRESS: smtp.example.com         # (obligatorio)
  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, por defecto true)

  ## Si añadiste la plantilla Lets Encrypt, descomenta abajo para obtener un certificado SSL gratuito
  #LETSENCRYPT_ACCOUNT_EMAIL: me@example.com

  ## La dirección CDN para esta instancia de Discourse (configurada para tirar)
  #DISCOURSE_CDN_URL: //discourse-cdn.example.com
## El contenedor Docker no tiene estado; todos los datos se almacenan en /shared
volumes:
  - volume:
      host: /var/discourse/shared/standalone
      guest: /shared
  - volume:
      host: /var/discourse/shared/standalone/log/var-log
      guest: /var/log

## Los plugins van aquí
## consulta https://meta.discourse.org/t/19157 para obtener detalles
hooks:
  after_code:
    - exec:
        cd: $home/plugins
        cmd:
          - git clone https://github.com/discourse/docker_manager.git

## Cualquier comando personalizado para ejecutar después de la construcción
run:
  - exec: echo "Comenzando comandos personalizados"
  ## Si deseas establecer la dirección de correo electrónico 'De' para tu primer registro, descomenta y cambia:
  #- exec: rails r "SiteSetting.notification_email='info@unconfigured.discourse.org'"
  ## Después de recibir el primer correo electrónico de registro, vuelve a comentar la línea. Solo necesita ejecutarse una vez.
  - exec: echo "Fin de los comandos personalizados"

¡Empecemos a añadir variables de entorno a tu sitio! :mage:

:information_source: Las siguientes instrucciones están escritas para una Instalación Estándar de Discourse

Inicia sesión en tu servidor

Usa una herramienta como PuTTY o la terminal en sistemas basados en Unix para conectarte por SSH a tu servidor.

ssh username@your-server-ip

Navega al Directorio de Discourse

Una vez que tengas acceso a tu servidor, navega al directorio que contiene tu configuración Docker de Discourse, normalmente ubicado en /var/discourse.

cd /var/discourse

Abre el archivo app.yml

Necesitarás abrir el archivo app.yml en un editor de texto. Para este ejemplo, usaremos nano.

nano containers/app.yml

Añade tus variables de entorno

En el archivo app.yml, encontrarás una sección env. Aquí es donde puedes añadir tus variables de entorno.

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 ejemplo, si quisieras establecer la variable de entorno DISCOURSE_ENABLE_CORS a true para habilitar Compartir Recursos Entre Orígenes (CORS), añadirías la siguiente línea a la sección env:

env:
  DISCOURSE_ENABLE_CORS: "true"
  ...

:person_tipping_hand: El espacio en blanco y el formato son importantes aquí, así que asegúrate de mantener la indentación correcta (dos espacios) para la nueva línea.

Una vez que hayas modificado tus variables, guarda y cierra el archivo.

Reconstruye el contenedor de Discourse

Finalmente, necesitarás reconstruir tu contenedor Docker de Discourse para que los cambios surtan efecto. Puedes hacerlo con el siguiente comando:

./launcher rebuild app

Alternativamente, para actualizar las variables de entorno de un contenedor en ejecución sin reconstruir, también puedes usar:

./launcher destroy app
./launcher start app

¡Después de que el proceso de reconstrucción se complete, tus variables de entorno actualizadas estarán disponibles para tu aplicación Discourse! :tada:

4 Me gusta

Sería mucho más útil si explicara cómo usar variables de entorno para anular (y proporcionar desde la UX) la configuración del sistema o la configuración global en el archivo de variables globales predeterminado (y enlazara a él para que la gente pudiera ver esas configuraciones, como configuraciones oscuras de Redis)

Este es un ejemplo confuso ya que no tiene nada que ver con Discourse.
Podrías mencionar que es lo mismo que usar el comando análogo como la configuración en Docker, quizás.
Veo que hiciste esto porque hiciste Setup Cross-Origin Resource Sharing (CORS), así que tal vez úsalo como ejemplo.

7 Me gusta

¿Hay algún lugar donde se puedan encontrar todas las variables de entorno posibles que se usan en Discourse?

Eso habría sido mucho más útil que un tema que dice que las variables de entorno van en app.yml bajo la sección env: :laughing:

Además, para que la aplicación “cargue” las variables de entorno cambiadas, estoy bastante seguro de que solo necesitas restart y no necesitas rebuild, pero por favor, que alguien me corrija si me equivoco.

Puedes destruir e iniciar el contenedor; eso se añadió al OP, creo. El único problema es si hiciste actualizaciones desde la UX, se pierden.

Puedes establecer cualquier configuración del sitio con DISCOURSE_SETTING_NAME. Consulta también la configuración predeterminada en config. discourse/config/discourse_defaults.conf at main · discourse/discourse · GitHub

4 Me gusta

Hola @SaraDev, ¿puedo saber cómo estas variables de entorno cambian el comportamiento de Discourse? Por ejemplo, de todas las variables mencionadas en esta publicación Available settings for global rate limits and throttling, no puedo encontrar ninguna en el código fuente de Discourse, entonces, ¿cómo están conectadas estas variables a Discourse? ¡Gracias!

Creo que puedes verlos aquí:

3 Me gusta

Muchas gracias @Arkshine.

1 me gusta

¿Hay alguna forma de configurar variables de entorno en un entorno de desarrollo no alojado en Docker? Planeo alojarlo con Docker eventualmente, pero estoy desarrollando localmente con esta configuración: Install Discourse on macOS for development
En este caso no hay app.yml

Puedes establecerlas en la línea de comandos antes de iniciar rails, pero ¿qué intentas hacer con esas variables de entorno?

Estoy intentando configurar DISCOURSE_ENABLE_CORS en true para SSO. ¿Podrías enviarme un comando de ejemplo? Soy nuevo en el desarrollo de discourse / rails. ¿Y qué hace eso finalmente? ¿Crea un registro en la tabla site_settings?

Estoy intentando configurar Discourse automáticamente dentro de Kubernetes. Por lo tanto, planeo construir una imagen Docker personalizada (DinD).
PERO si ejecutara ./discourse-setup.sh en mi Dockerfile, me pediría opciones de configuración, a las que Docker no puede responder (ya que esto debería hacerse automáticamente).

Entiendo que podría poner esas variables de entorno dentro del archivo app.yml, pero en este punto no habrá ningún archivo app.yaml en absoluto, ya que el script ./discourse-setup aún no se ha ejecutado.

Entonces, mi pregunta sería: ¿Cómo puedo preconfigurar Discourse para mis propósitos, de modo que ./discourse-setup no requiera mi intervención?

La guía de instalación discourse/docs/INSTALL-cloud.md en main · discourse/discourse (github.com) no dice nada sobre preconfiguraciones o archivos de configuración en absoluto.

¡Gracias de antemano!

2 Me gusta

Prueba

./launcher start-cmd app

Eso te dará el comando de inicio de docker que se usa para encender el contenedor. Deberías poder usar eso para averiguar cómo encender las cosas en k8s.

5 Me gusta

¿Existen otros lugares comunes donde podría residir el archivo app.yml, o podría ser posible que este archivo deba crearse desde cero? “Entré” en mi contenedor Docker (docker exec -it discourse_dev /bin/bash) y no pude encontrar ningún archivo llamado app.yml.

El archivo app.yml debe estar fuera de tu contenedor, en lugar de dentro de él.

2 Me gusta