Ir al contenido

Configuración

Orionis Framework gestiona la configuración de la aplicación mediante dataclasses congeladas (frozen=True), centralizando los parámetros en el directorio config/. Estos archivos permiten definir aspectos clave como la base de datos, correo electrónico, sesiones, CORS y otros comportamientos esenciales.

Cada archivo define una dataclass que extiende una clase base del framework y utiliza Env.get() para cargar valores desde variables de entorno, con valores predeterminados seguros como respaldo.

Contiene la configuración principal de la aplicación: entorno de ejecución, red, workers, localización y cifrado.

La configuración se define mediante una dataclass congelada que extiende la clase base App:

from dataclasses import dataclass, field
from orionis.foundation.config.app.entities.app import App
from orionis.foundation.config.app.enums.ciphers import Cipher
from orionis.foundation.config.app.enums.environments import Environments
from orionis.services.environment.env import Env
@dataclass(frozen=True, kw_only=True)
class BootstrapApp(App):
# ... propiedades de configuración
  • name (str) — Nombre identificativo de la aplicación.

    • Variable de entorno: APP_NAME
    • Valor por defecto: 'Orionis Application'
  • env (str | Environments) — Entorno de ejecución.

    • Variable de entorno: APP_ENV
    • Valor por defecto: Environments.DEVELOPMENT
    • Opciones: DEVELOPMENT, TESTING, PRODUCTION
    from orionis.foundation.config.app.enums.environments import Environments
    Environments.DEVELOPMENT
    Environments.PRODUCTION
    Environments.TESTING
  • debug (bool) — Modo de depuración.

    • Variable de entorno: APP_DEBUG
    • Valor por defecto: True
  • host (str) — Dirección IP donde escucha la aplicación.

    • Variable de entorno: APP_HOST
    • Valor por defecto: '127.0.0.1'
    • Usa '0.0.0.0' para permitir acceso externo (con precaución en producción).
  • port (int) — Puerto de red donde escucha la aplicación.

    • Variable de entorno: APP_PORT
    • Valor por defecto: 8000
  • workers (int) — Número de procesos trabajadores para manejar solicitudes concurrentes.

    • Variable de entorno: APP_WORKERS
    • Valor por defecto: 1

    Orionis Framework proporciona la clase Workers para calcular automáticamente el número óptimo basado en CPU y RAM disponibles:

    from orionis.services.system.workers import Workers
    # Cálculo automático por CPU y RAM (0.5 GB por worker por defecto)
    workers = Workers().calculate()
    # Con asignación personalizada de RAM por worker
    workers = Workers(ram_per_worker=0.5).calculate()

    Si tu aplicación es stateful (mantiene estado en memoria), mantén workers = 1 o implementa un sistema de cache compartido (Memcached, Redis). Si es stateless, puedes incrementar los workers según la capacidad del servidor.

  • reload (bool) — Recarga automática al detectar cambios en el código.

    • Variable de entorno: APP_RELOAD
    • Valor por defecto: True
    • Solo funciona con workers = 1. Debe estar desactivado en producción.
  • timezone (str) — Zona horaria de la aplicación.

    • Variable de entorno: APP_TIMEZONE
    • Valor por defecto: 'UTC'
    • Acepta cualquier zona válida: 'America/New_York', 'Europe/Madrid', 'America/Bogota', etc.
  • locale (str) — Configuración regional predeterminada.

    • Variable de entorno: APP_LOCALE
    • Valor por defecto: 'en'
  • fallback_locale (str) — Configuración regional de respaldo.

    • Variable de entorno: APP_FALLBACK_LOCALE
    • Valor por defecto: 'en'
    • Se utiliza cuando el idioma principal no está disponible.
  • cipher (str | Cipher) — Algoritmo de cifrado para datos sensibles.

    • Variable de entorno: APP_CIPHER
    • Valor por defecto: Cipher.AES_256_CBC
    from orionis.foundation.config.app.enums.ciphers import Cipher
    Cipher.AES_128_CBC
    Cipher.AES_256_CBC
    Cipher.AES_128_GCM # Cifrado autenticado
    Cipher.AES_256_GCM # Cifrado autenticado
  • key (str | None) — Clave de cifrado de la aplicación.

    • Variable de entorno: APP_KEY
    • Valor por defecto: None
  • maintenance (str | bool) — Indicador de modo mantenimiento.

    • Variable de entorno: APP_MAINTENANCE
    • Valor por defecto: False

Define la configuración del sistema de autenticación. Actualmente hereda la estructura base sin campos adicionales personalizados:

from dataclasses import dataclass
from orionis.foundation.config.auth.entities.auth import Auth
@dataclass(frozen=True, kw_only=True)
class BootstrapAppAuth(Auth):
pass

Este archivo se extenderá con campos adicionales en futuras versiones del framework.

Configura el sistema de cache de la aplicación. Por defecto utiliza almacenamiento basado en archivos.

  • default (Drivers | str) — Driver de cache predeterminado.

    • Variable de entorno: CACHE_STORE
    • Valor por defecto: Drivers.FILE
  • stores (Stores | dict) — Configuración de stores disponibles.

    • file: Cache basado en archivos.
      • path: Ruta de almacenamiento. Variable de entorno: CACHE_FILE_PATH. Por defecto: "storage/framework/cache/data".

Configura el comportamiento de CORS (Cross-Origin Resource Sharing), controlando qué orígenes externos pueden interactuar con tu API y bajo qué condiciones.

Cuando un navegador realiza una solicitud desde un origen diferente (dominio, protocolo o puerto), el servidor responde con cabeceras CORS generadas automáticamente a partir de esta configuración.

  • allow_origins (list[str]) — Orígenes permitidos para acceder a la API.

    • Valor por defecto: ["*"]
    • Especifica dominios concretos en producción: ["https://miapp.com", "https://admin.miapp.com"]
  • allow_origin_regex (str | None) — Expresión regular para orígenes con patrón.

    • Valor por defecto: None
    • Ejemplo: r"^https://.*\.miapp\.com$" para subdominios dinámicos.
  • allow_methods (list[str]) — Métodos HTTP permitidos en solicitudes CORS.

    • Valor por defecto: ["*"]
    • Restringe en producción: ["GET", "POST", "PUT", "DELETE"]
  • allow_headers (list[str]) — Cabeceras HTTP permitidas del cliente.

    • Valor por defecto: ["*"]
  • expose_headers (list[str]) — Cabeceras expuestas al navegador en la respuesta.

    • Valor por defecto: []
  • allow_credentials (bool) — Permite credenciales (cookies, headers de autorización) en solicitudes CORS.

    • Valor por defecto: False
  • max_age (int | None) — Segundos para cachear la respuesta preflight (OPTIONS).

    • Valor por defecto: 600 (10 minutos)

Dado que las listas no pueden usarse como valores por defecto directamente en dataclasses, utiliza field con default_factory:

from dataclasses import dataclass, field
from orionis.foundation.config.cors.entities.cors import Cors
@dataclass(frozen=True, kw_only=True)
class BootstrapCors(Cors):
allow_origins: list[str] = field(
default_factory=lambda: ["https://miapp.com", "https://admin.miapp.com"]
)

Define las conexiones de base de datos de la aplicación. Soporta múltiples drivers: SQLite, MySQL, PostgreSQL y Oracle.

  • default (str) — Conexión de base de datos predeterminada.

    • Variable de entorno: DB_CONNECTION
    • Valor por defecto: "sqlite"
  • connections (Connections | dict) — Conexiones disponibles.

PropiedadVariable de entornoValor por defecto
driver"sqlite"
urlDB_URL"sqlite:///database/database.sqlite"
databaseDB_DATABASE"database.sqlite"
prefixDB_PREFIX""
foreign_key_constraintsDB_FOREIGN_KEYSSQLiteForeignKey.OFF
busy_timeoutDB_BUSY_TIMEOUT5000
journal_modeDB_JOURNAL_MODESQLiteJournalMode.DELETE
synchronousDB_SYNCHRONOUSSQLiteSynchronous.NORMAL
PropiedadVariable de entornoValor por defecto
driver"mysql"
hostDB_HOST"127.0.0.1"
portDB_PORT3306
databaseDB_DATABASE"orionis"
usernameDB_USERNAME"root"
passwordDB_PASSWORD""
unix_socketDB_SOCKET""
charsetMySQLCharset.UTF8MB4
collationMySQLCollation.UTF8MB4_UNICODE_CI
engineMySQLEngine.INNODB
strictTrue
PropiedadVariable de entornoValor por defecto
driver"pgsql"
hostDB_HOST"127.0.0.1"
portDB_PORT5432
databaseDB_DATABASE"orionis"
usernameDB_USERNAME"postgres"
passwordDB_PASSWORD""
charsetDB_CHARSETPGSQLCharset.UTF8
search_path"public"
sslmodePGSQLSSLMode.PREFER
PropiedadVariable de entornoValor por defecto
driver"oracle"
hostDB_HOST"localhost"
portDB_PORT1521
usernameDB_USERNAME"sys"
passwordDB_PASSWORD""
service_nameDB_SERVICE_NAME"ORCL"
sidDB_SIDNone
dsnDB_DSNNone
tns_nameDB_TNSNone
encodingDB_ENCODINGOracleEncoding.AL32UTF8
nencodingDB_NENCODINGOracleNencoding.AL32UTF8

Define el sistema de archivos de la aplicación mediante el patrón de múltiples discos, donde cada disco representa una ubicación de almacenamiento con su propia configuración.

  • default (str) — Disco de almacenamiento predeterminado.

    • Variable de entorno: FILESYSTEM_DISK
    • Valor por defecto: "local"
    • Opciones: "local", "public", "aws"
  • disks (Disks | dict) — Discos disponibles.

  • path: Ruta de almacenamiento. Por defecto: "storage/app/private".
  • path: Ruta de almacenamiento. Por defecto: "storage/app/public".
  • url: URL base para acceso web. Por defecto: "/static".
PropiedadValor por defectoDescripción
key""AWS Access Key ID
secret""AWS Secret Access Key
region"us-east-1"Región del bucket
bucket""Nombre del bucket
urlNoneURL personalizada (CloudFront)
endpointNoneEndpoint personalizado (MinIO)
use_path_style_endpointFalseEstilo de ruta vs subdominio
throwFalseLanzar excepciones en errores

Configura el sistema de logging con múltiples canales que representan diferentes estrategias de almacenamiento y rotación.

  • default (str) — Canal de logging predeterminado.

    • Variable de entorno: LOG_CHANNEL
    • Valor por defecto: "stack"
    • Opciones: "stack", "hourly", "daily", "weekly", "monthly", "chunked"
  • channels (Channels | dict) — Canales disponibles.

Logging básico sin rotación automática.

PropiedadValor por defecto
path"storage/logs/stack.log"
levelLevel.INFO
PropiedadValor por defecto
path"storage/logs/hourly_{suffix}.log"
levelLevel.INFO
retention_hours24
PropiedadValor por defecto
path"storage/logs/daily_{suffix}.log"
levelLevel.INFO
retention_days7
attime(0, 0) (medianoche)
PropiedadValor por defecto
path"storage/logs/weekly_{suffix}.log"
levelLevel.INFO
retention_weeks4
PropiedadValor por defecto
path"storage/logs/monthly_{suffix}.log"
levelLevel.INFO
retention_months4
PropiedadValor por defecto
path"storage/logs/chunked_{suffix}.log"
levelLevel.INFO
mb_size10 MB
files5 archivos máximo
from orionis.foundation.config.logging.enums.levels import Level
Level.DEBUG # Información detallada para debugging
Level.INFO # Información general de funcionamiento
Level.WARNING # Advertencias que no impiden el funcionamiento
Level.ERROR # Errores que afectan funcionalidades específicas
Level.CRITICAL # Errores críticos que pueden detener la aplicación

Define los transportes de correo electrónico disponibles: SMTP para envío real y almacenamiento en archivos para desarrollo.

  • default (str) — Transporte predeterminado.

    • Variable de entorno: MAIL_MAILER
    • Valor por defecto: "smtp"
    • Opciones: "smtp", "file"
  • mailers (Mailers | dict) — Transportes disponibles.

PropiedadVariable de entornoValor por defecto
urlMAIL_URL""
hostMAIL_HOST""
portMAIL_PORT587
encryptionMAIL_ENCRYPTION"TLS"
usernameMAIL_USERNAME""
passwordMAIL_PASSWORD""
timeoutNone
  • path: Directorio de almacenamiento. Por defecto: "storage/mail".

Ideal para desarrollo y testing — los correos se guardan como archivos para inspección sin envío real.

# Gmail
smtp = Smtp(host="smtp.gmail.com", port=587, encryption="TLS",
username="tu_email@gmail.com", password="tu_contraseña_de_aplicación")
# SendGrid
smtp = Smtp(host="smtp.sendgrid.net", port=587, encryption="TLS",
username="apikey", password="tu_api_key")
# Outlook
smtp = Smtp(host="smtp-mail.outlook.com", port=587, encryption="TLS",
username="tu_email@outlook.com", password="tu_contraseña")
# Mailgun
smtp = Smtp(host="smtp.mailgun.org", port=587, encryption="TLS",
username="postmaster@tu_dominio.mailgun.org", password="tu_contraseña")

Configura el sistema de colas de trabajo de la aplicación.

  • default (str) — Conexión de cola predeterminada.

    • Variable de entorno: QUEUE_CONNECTION
    • Valor por defecto: "async"
  • brokers (Brokers | dict) — Brokers disponibles.

PropiedadValor por defectoDescripción
jobs_table"jobs"Tabla de trabajos
failed_jobs_table"failed_jobs"Tabla de trabajos fallidos
queue"default"Nombre de la cola
visibility_timeout60Segundos antes de que un job sea visible de nuevo
retry_delay90Segundos entre reintentos
max_attempts3Intentos máximos por job
strategyStrategy.FIFOEstrategia de procesamiento (First In, First Out)

Configura el manejo de sesiones HTTP de la aplicación.

PropiedadVariable de entornoValor por defectoDescripción
secret_keyAPP_KEYClave para firmar cookies de sesión
session_cookieSESSION_COOKIE_NAME"orionis_session"Nombre de la cookie
max_ageSESSION_MAX_AGE1800 (30 min)Duración en segundos (None = hasta cerrar navegador)
same_siteSESSION_SAME_SITESameSitePolicy.LAXPolítica SameSite: lax, strict, none
pathSESSION_PATH"/"Path de la cookie
https_onlySESSION_HTTPS_ONLYFalseRestringir a HTTPS
domainSESSION_DOMAINNoneDominio de la cookie

Configura el comportamiento de las pruebas automatizadas del framework.

PropiedadValor por defectoDescripción
verbosityVerbosityMode.DETAILEDNivel de detalle en la salida (0: silent, 1: minimal, 2: detailed)
fail_fastFalseDetener ejecución tras el primer fallo
start_dir"tests"Directorio raíz de pruebas
file_pattern"test_*.py"Patrón de archivos de prueba
method_pattern"test*"Patrón de métodos de prueba
cache_resultsFalseGuardar resultados en archivo JSON
from orionis.foundation.config.testing.enums import VerbosityMode
VerbosityMode.SILENT # 0 - Sin salida
VerbosityMode.MINIMAL # 1 - Salida mínima
VerbosityMode.DETAILED # 2 - Salida detallada

El proceso de bootstrapping se encarga de inicializar la aplicación, cargar las configuraciones y preparar todos los servicios. Este proceso garantiza que los parámetros estén disponibles y validados antes de que cualquier componente comience a funcionar.

El archivo bootstrap/app.py es el punto central de inicialización. Crea la instancia de Application, registra configuraciones, rutas, proveedores de servicios y ejecuta el arranque:

from pathlib import Path
from app.console.scheduler import Scheduler
from app.exceptions.handler import ExceptionHandler
from app.providers.app_service_provider import AppServiceProvider
from orionis.foundation.application import Application
app = Application(
base_path=Path(__file__).parent.parent,
compiled=True,
compiled_path="storage/framework/bootstrap",
compiled_invalidation_paths=[
"app", "bootstrap", "config",
"resources", "routes", ".env"
],
)
app.withRouting(
console="routes/console.py",
web="routes/web.py",
api="routes/api.py",
health="/up",
)
app.withScheduler(Scheduler)
app.withExceptionHandler(ExceptionHandler)
app.withProviders(
AppServiceProvider,
)
app.create()

Durante app.create(), el framework ejecuta las siguientes etapas:

  1. Carga de configuración: Lee los archivos del directorio config/ y los combina con los valores predeterminados del framework.
  2. Validación: Verifica que los tipos y valores sean correctos según las dataclasses definidas.
  3. Registro de proveedores: Instancia y registra todos los proveedores eager en el contenedor de servicios.
  4. Bloqueo de configuración: La configuración queda inmutable (congelada) tras el arranque.

El parámetro compiled=True habilita el cache de configuración en el directorio especificado por compiled_path. Los paths listados en compiled_invalidation_paths son monitoreados para invalidar automáticamente el cache cuando se detectan cambios.

Esto acelera el arranque en producción al evitar la recarga de archivos de configuración en cada inicio.

Orionis sigue el principio de “funciona desde el primer momento”:

  • Cada configuración incluye valores predeterminados seguros para desarrollo.
  • Si una configuración no se personaliza, se utilizan los valores del framework.
  • Es posible ejecutar una aplicación sin modificar ningún archivo del directorio config/.

Además de personalizar los archivos en config/, puedes sobrescribir configuraciones directamente en bootstrap/app.py mediante los métodos withConfig* de la instancia Application. Cada método acepta keyword arguments que coinciden con los campos de la dataclass correspondiente:

app.withConfigApp(
name='Mi Aplicación',
env='production',
debug=False,
workers=4,
)
app.withConfigCors(
allow_origins=["https://miapp.com"],
allow_credentials=True,
)
app.withConfigDatabase(
default="pgsql",
)

Los métodos disponibles son:

MétodoArchivo de configuración
withConfigApp()config/app.py
withConfigAuth()config/auth.py
withConfigCache()config/cache.py
withConfigCors()config/cors.py
withConfigDatabase()config/database.py
withConfigFilesystems()config/filesystems.py
withConfigLogging()config/logging.py
withConfigMail()config/mail.py
withConfigQueue()config/queue.py
withConfigSession()config/session.py
withConfigTesting()config/testing.py
withConfigPaths()Rutas de directorios de la aplicación

El método withConfigPaths() permite personalizar las rutas de los directorios de la aplicación. Las claves disponibles corresponden a los directorios principales del proyecto:

app.withConfigPaths(
app="app",
console="app/console",
exceptions="app/exceptions",
http="app/http",
models="app/models",
providers="app/providers",
notifications="app/notifications",
services="app/services",
jobs="app/jobs",
bootstrap="app/bootstrap",
config="config",
database="database/database",
resources="resources",
routes="routes",
storage="storage",
tests="tests",
)

Las rutas se resuelven como relativas al base_path de la aplicación.


Una vez que la aplicación ha sido inicializada con app.create(), todas las configuraciones están disponibles globalmente.

Utiliza la facade Application con notación de puntos para acceder a cualquier valor de configuración:

from orionis.support.facades.application import Application
# Valores simples
nombre = Application.config('app.name')
entorno = Application.config('app.env')
debug = Application.config('app.debug')
# Valores anidados
host_smtp = Application.config('mail.mailers.smtp.host')
puerto_smtp = Application.config('mail.mailers.smtp.port')
driver_cache = Application.config('cache.default')
# Configuración completa (sin clave)
toda_la_config = Application.config()

Si la clave no existe, el método retorna None.

Puedes alterar configuraciones en tiempo de ejecución proporcionando la clave y el nuevo valor:

from orionis.support.facades.application import Application
Application.config('app.debug', False)
Application.config('cache.default', 'file')

Para revertir todos los cambios realizados en tiempo de ejecución y volver a los valores originales del bootstrapping:

from orionis.support.facades.application import Application
Application.resetRuntimeConfig()