Sistema de Entorno

Gestiona variables de entorno a través de backends de almacenamiento configurables.

Visión General

El sistema de entorno separa el almacenamiento del acceso:

  • Almacenes - Donde se guardan los valores (SO, archivos, memoria)
  • Variables - Referencias nombradas a valores en almacenes

Las variables pueden referenciarse por:

  • Nombre público - El valor del campo variable (debe ser único en el sistema)
  • ID de Entrada - Referencia completa namespace:nombre

Si no desea que una variable sea accesible públicamente por nombre, omita el campo variable.

Tipos de Entrada

Tipo Descripción
env.storage.memory Almacenamiento clave-valor en memoria
env.storage.file Almacenamiento basado en archivo (formato .env)
env.storage.os Acceso de solo lectura al entorno del SO
env.storage.static Almacenamiento estático de solo lectura clave-valor
env.storage.router Encadena múltiples almacenes
env.variable Variable nombrada referenciando un almacén

Backends de Almacenamiento

Almacén de Memoria

Almacenamiento volátil en memoria.

- name: runtime_env
  kind: env.storage.memory

Almacén de Archivo

Almacenamiento persistente usando formato de archivo .env (KEY=VALUE con comentarios #).

- name: app_config
  kind: env.storage.file
  file_path: /etc/app/config.env
  auto_create: true
  file_mode: 0600
  dir_mode: 0700
Propiedad Tipo Por Defecto Descripción
file_path string requerido Ruta al archivo .env
auto_create boolean false Crear archivo si no existe
file_mode integer 0644 Permisos de archivo
dir_mode integer 0755 Permisos de directorio

Almacén del SO

Acceso de solo lectura a variables de entorno del sistema operativo.

- name: os_env
  kind: env.storage.os

Siempre de solo lectura. Las operaciones de escritura retornan PERMISSION_DENIED.

Almacén Estático

Almacenamiento de solo lectura con valores definidos directamente en la configuración. Los valores se integran en la entrada y no pueden cambiarse en tiempo de ejecución. Útil para constantes de configuración públicas que se distribuyen con un módulo o paquete.

- name: defaults
  kind: env.storage.static
  values:
    PUBLIC_API_HOST: "https://api.example.com"
    PUBLIC_WS_HOST: "wss://api.example.com/ws"
    APP_ENV: "production"
Propiedad Tipo Descripción
values map Pares clave-valor (string a string)

Siempre de solo lectura. Las operaciones de escritura retornan PERMISSION_DENIED.

Almacén Router

Encadena múltiples almacenes. Las lecturas buscan en orden hasta encontrar. Las escrituras van solo al primer almacén.

- name: config
  kind: env.storage.router
  storages:
    - app.config:memory    # Primario (escribe aquí)
    - app.config:file      # Respaldo
    - app.config:os        # Respaldo
Propiedad Tipo Descripción
storages array Lista ordenada de referencias de almacenes

Variables

Las variables proporcionan acceso nombrado a valores de almacenes.

- name: DATABASE_URL
  kind: env.variable
  variable: DATABASE_URL
  storage: app.config:file
  default: postgres://localhost/app
  read_only: false
Propiedad Tipo Descripción
variable string Nombre de variable pública (opcional, debe ser único)
storage string Referencia de almacén (namespace:nombre)
default string Valor por defecto si no se encuentra
read_only boolean Prevenir modificaciones

Nomenclatura de Variables

Los nombres de variables deben contener solo: a-z, A-Z, 0-9, _

Patrones de Acceso

# Variable pública - accesible por nombre "PORT"
- name: port_var
  kind: env.variable
  variable: PORT
  storage: app.config:os
  default: "8080"

# Variable privada - accesible solo por ID "app.config:internal_key"
- name: internal_key
  kind: env.variable
  storage: app.config:secrets

Interpolación de Placeholders

Las variables registradas se incorporan a la configuración de las entradas con placeholders ${env:NAME}, resueltos centralmente en el momento de la decodificación contra este registro. Cualquier campo string en los datos de una entrada puede referenciar una variable de esta forma.

Sintaxis Significado
${env:NAME} Resuelve NAME a través del registro env; error si no está definida y no hay valor por defecto
${env:NAME|default} Resuelve NAME, recurriendo a default cuando no está definida
${NAME|default} Forma abreviada; NAME debe ser upper-snake (A-Z0-9_) y el |default es obligatorio — un ${VAR} simple se deja intacto para que los fragmentos de shell/plantillas incrustados no se confundan con referencias
$${ ${ literal (escape)

NAME es el nombre público de una variable registrada o su ID de entrada (forma de id de registro con puntos/dos puntos, ej. app.env:tls_cert). No es una variable de entorno cruda del SO: un valor del SO solo es alcanzable cuando una variable respaldada por env.storage.os está registrada bajo ese nombre.

- name: api
  kind: http.service
  addr: ":443"
  tls:
    mode: manual
    cert: ${env:app.env:tls_cert}
    key:  ${env:app.env:tls_key}

Un campo cuyo valor completo es un único placeholder toma el valor tipado de la variable (convertido a bool/int/float cuando se da un valor por defecto tipado); un placeholder mezclado con texto circundante se interpola en un string. El default propio de la variable se respeta antes que el |default en línea del placeholder. Una referencia que no resuelve a nada y no tiene valor por defecto hace fallar la decodificación.

La resolución ocurre solo en el momento de la decodificación: la entrada almacenada en el registro conserva los placeholders sin resolver, de modo que los secretos resueltos nunca aparecen en los resultados de registry.get ni en el estado persistido. Las entradas que referencian ${env:...} se ordenan automáticamente en el arranque después de los almacenes env y las variables de las que dependen.

Las configuraciones antiguas usan una directiva hermana <field>_env (por ejemplo cert_env: app.env:tls_cert) que se resuelve de la misma forma. Esta forma está deprecada — migrala al placeholder ${env:NAME}. Una clave <field>_env que nombra una variable no registrada no se trata como directiva y se deja tal cual; una que nombra una variable registrada pero vacía conserva el valor en línea de <field>. Solo un ${env:NAME} explícito sin valor por defecto falla de forma estricta ante una variable ausente.

Errores

Condición Tipo Reintentable
Variable no encontrada errors.NOT_FOUND no
Almacén no encontrado errors.NOT_FOUND no
Variable es de solo lectura errors.PERMISSION_DENIED no
Almacén es de solo lectura errors.PERMISSION_DENIED no
Nombre de variable inválido errors.INVALID no

Acceso en Tiempo de Ejecución

Ver También