---
title: "Configuración y ajustes"
description: "Cómo Nibiru carga la configuración desde archivos INI específicos del entorno."
---

La capa de configuración de Nibiru está intencionalmente sencilla: analiza un solo archivo `settings.<env>.ini` al arrancar, lo expone a través de un singleton y permite que los módulos agreguen sus propios INIs a través del [Registro](/core/registry/).

## Selección del entorno

La variable de entorno `APPLICATION_ENV` selecciona qué archivo cargar:

| `APPLICATION_ENV` | Archivo cargado |
|---|---|
| `development` (por defecto) | `application/settings/config/settings.development.ini` |
| `staging` | `application/settings/config/settings.staging.ini` |
| `production` | `application/settings/config/settings.production.ini` |
```bash
export APPLICATION_ENV=production
./nibiru -mi production
```
Si `APPLICATION_ENV` no está establecido, Nibiru predetermina a `desarrollo`.

## Secciones

Un archivo típico `settings.<env>.ini`:
```ini
[ENGINE]
templates    = "/../../application/view/templates/"
templates_c  = "/../../application/view/templates_c/"
cache        = "/../../application/view/cache/"
config_dir   = "/../../application/view/configs/"
caching      = false
debug        = true
error.controller = "error"

[AUTOLOADER]
iface.pos[]  = "users"
iface.pos[]  = "cms"
class.pos[]  = "users"
class.pos[]  = "cms"

[SETTINGS]
page.url            = "https://my-app.local"
navigation          = "/../../application/settings/config/navigation/main.json"
modules.path        = "/../../application/module/"
entries.per.page    = 25
smarty.css[]        = "/public/css/app.css"
smarty.js[]         = "/public/js/app.js"
timezone            = "Europe/Vienna"

[DATABASE]
driver    = "pdo"
hostname  = "localhost"
port      = 3306
username  = "nibiru"
password  = "secret"
basename  = "nibiru_dev"
encoding  = "utf8mb4"
is.active = true

[SECURITY]
password_hash = "change-me-at-once"

[GENERATOR]
database          = true
database.overwrite = true

[EMAIL]
host       = "smtp.example.com"
port       = 587
encryption = "tls"
username   = "noreply@example.com"
password   = "smtp-secret"
from       = "Nibiru <noreply@example.com>"

[NIBIRU_ROUTING]
; optional regex routes — see /core/routing/

[NIBIRU_SECURITY]
password_hash = "another-salt-for-AES_DECRYPT"
```
## Leyendo la configuración
```php
$cfg = \Nibiru\Config::getInstance()->getConfig();
$cfg['DATABASE']['driver'];       // 'pdo'
$cfg['SETTINGS']['page.url'];     // 'https://my-app.local'
```
Para configuraciones profundamente anidadas, utilice las constantes tipadas de la interfaz View:
```php
$cfg[\Nibiru\View::NIBIRU_SETTINGS]['smarty.css'];   // ['/public/css/app.css']
```
## Configuraciones del módulo

Cada módulo bajo `application/module/<nombre>/settings/` puede llevar sus propios archivos INI. El Registro los detecta automáticamente y los expone a través de:
```php
$users = \Nibiru\Registry::getInstance()->loadModuleConfigByName('users');
$users->session_lifetime;        // from [USERS] section in users.ini
```
El Registro prefiere `<módulo>.<entorno>.ini` sobre `<módulo>.ini`, por lo que obtienes anulaciones por entorno de forma gratuita.

## Secretos

Los archivos INI son texto *plano*. Dos opciones seguras para producción:

### A. Capa de entorno

Mantén `settings.production.ini` en el control de versiones con marcadores de posición e inyecta valores reales desde las variables de entorno en tiempo de ejecución:
```ini
[DATABASE]
password = "${DB_PASSWORD}"
```
Luego expándelos en tu contenedor/CI:
```bash
envsubst < settings.production.ini.tpl > settings.production.ini
```
### B. Configuración fuera del árbol

Mantén `settings.production.ini` fuera del repositorio y crea un enlace simbólico al momento de la implementación:
```bash
ln -s /etc/nibiru/settings.production.ini \
      application/settings/config/settings.production.ini
```
El marco no se preocupa por dónde vive el archivo siempre y cuando `parse_ini_file` pueda leerlo.

## Semántica de recarga

La configuración se lee **una vez** al arrancar, en el `Settings` estático. Los cambios en el INI requieren un ciclo de solicitud para que surtan efecto (o para scripts de larga ejecución, una llamada explícita a `Settings::setConfig(\Nibiru\Config::getEnv())`).

## Trucos comunes

- **Ruta que lleva `/../../`.** Las rutas INI del framework son *relativas al directorio del framework*. Deben comenzar con `/../../` para escapar hasta la raíz de su proyecto. Sí, esto parece extraño; sí, funciona.
- **Análisis booleano.** `parse_ini_file` es permisivo — `true`, `on`, `1` todos se convierten en `1`; `false`, `off`, `0`, `""` se convierten en `0`. Usa cadenas de tres comillas si realmente necesitas un literal `"true"`.
- **Valores de array.** Usa la sintaxis `[]` (`smarty.css[] = …`) — Nibiru depende de que estos sean arrays.
