Logo de Oktanet Oktanet

Documentación de Oktavia · Instalación

Guías de instalación

Levantar Oktavia en una máquina de trabajo o en un servidor: prerrequisitos, Docker Compose, variables, bóveda de credenciales y los tropiezos típicos con su corrección.

  • Guía de instalación
  • Para quien implementa
  • Requiere Docker y Python 3.12

Instalación local

La instalación recomendada es con contenedores, incluso en una máquina de trabajo. Esta guía cubre los prerrequisitos comunes y el arranque sin contenedores, que sirve para desarrollar sobre la plataforma. Los comandos exactos y las versiones probadas están en la guía de instalación que se entrega con el software.

Prerrequisitos

RequisitoPara qué
Docker con Compose v2Los contenedores de los dos componentes y de sus servicios de apoyo
GitObtener los dos componentes
Python 3 en la versión indicada en la guíaEntorno del motor y sus herramientas de línea de comandos
PostgreSQLBase de datos de la interfaz (incluido en sus contenedores)
Node.js (opcional)Herramientas MCP de escritorio
Ollama (opcional)Modelo local para Argos; alternativa a la API de Anthropic

Instalar juntos

Los dos componentes deben quedar en el mismo directorio padre, porque sus contenedores comparten almacenamiento:

oktavia/
├── motor/        # Engine
└── interfaz/     # UI

Interfaz sin contenedores (desarrollo)

  1. Crea un entorno virtual e instala las dependencias.
  2. Parte de la configuración de ejemplo y apunta la conexión de base de datos a un PostgreSQL. Es el único motor soportado; no hay alternativa SQLite.
  3. Aplica las migraciones y crea el usuario administrador.
  4. Opcional: crea una organización propia y asígnale usuarios; importa inventario y resultados si ya hay artefactos del motor.
  5. Arranca el servidor de desarrollo.

Motor sin contenedores (desarrollo)

  1. Crea el entorno con la versión de Python indicada e instala las dependencias.
  2. Genera la configuración con la herramienta del motor. Si el componente de interfaz ya está instalado junto a él, la herramienta alinea los tres secretos compartidos y siembra las variables de servicio iniciales.
  3. Carga el inventario desde el CSV de equipos con la herramienta de línea de comandos.
  4. Arranca la API y, por separado, el ejecutor de jobs y el programador. Para correr el pipeline completo desde la línea de comandos hay un script que encadena discovery, respaldo, inventario, generación y compliance.

Producción

Fuera de desarrollo: modo de depuración apagado, secreto de la aplicación persistente, hosts permitidos explícitos, clave de cifrado de la bóveda compartida y respaldada, servidor de aplicación con varios workers y la siembra del laboratorio de demostración desactivada.

Docker Compose

Cada componente trae su propio Compose y se levantan en orden: primero el motor, después la interfaz.

Procesos del motor

ProcesoFunción
APIRecibe las peticiones de la UI y de integraciones
Ejecutor de jobsToma los jobs de la cola y los corre; recupera los que quedaron en cola si se reinicia
ProgramadorTareas programadas con ingesta automática a la UI
ColaCola de jobs
Series de tiempoInfluxDB para las métricas
RecolectorTelegraf para SNMP y syslog, una instancia por organización

Procesos de la interfaz

ProcesoFunción
Base de datosPostgreSQL
CachéCompartida entre los procesos de la aplicación
AplicaciónLa UI
Evaluador de automatizaciónEvalúa periódicamente las reglas de automatización de eventos
Worker de ArgosAvanza los ciclos de Argos

Hay variantes del Compose para depuración, para incluir un modelo de lenguaje local y para desplegar con imagen preconstruida.

Arranque

  1. Configura los dos componentes a partir de sus configuraciones de ejemplo (ver Variables de entorno).
  2. Levanta el motor y valida que su verificación de salud responde.
  3. Levanta la interfaz y espera a que la base de datos esté sana y la aplicación en marcha. Al arrancar, aplica migraciones, importa artefactos si se le pidió y recoge los estáticos.
  4. Punto de control obligatorio: crea el usuario administrador con el comando de gestión de la UI e inicia sesión.
  5. Sigue con la bóveda de credenciales y con la primera auditoría.

Si la aplicación no arranca por autenticación de base de datos, hay un volumen de PostgreSQL de una instalación anterior con otra contraseña. En una instalación nueva se eliminan los volúmenes y se vuelve a levantar. En una existente, no: eso borra la base.

Variables de entorno

Cada repositorio trae un .env.example con todas sus variables comentadas; esa es la referencia completa y se entrega con el código. Aquí va lo que hay que decidir antes del primer arranque. Por política de publicación, los nombres de las variables que contienen secretos no se documentan en este sitio.

Las tres parejas

Tres secretos deben coincidir entre la UI y el Engine. Si alguno difiere, la instalación arranca pero no funciona, y el síntoma no siempre apunta a la causa.

ParejaQué protegeSi no coincide
Clave de API UI→EngineLas llamadas de la UI al EngineEl Engine rechaza todas las llamadas de la UI
Token Engine→UILa lectura de la fuente de verdad y la ingesta de resultadosLa auditoría no encuentra inventario o la UI no recibe resultados
Clave de cifrado de la bóvedaLas credenciales de los equiposLas conexiones a los equipos fallan

La herramienta del motor genera los tres y, si el componente de interfaz está instalado junto a él, alinea también su configuración. Si se hace a mano, la clave de cifrado es una clave aleatoria de 32 bytes en base64 segura para URL.

Qué más decidir en la UI

  • La URL del motor.
  • La conexión a PostgreSQL.
  • En producción: modo de depuración apagado, secreto de la aplicación persistente, hosts permitidos y orígenes CSRF explícitos.
  • El tenant por omisión para los scripts de arranque.
  • La siembra del laboratorio de demostración, apagada en producción.

Qué más decidir en el Engine

  • La URL de la UI, para resolver el inventario por tenant.
  • El token de InfluxDB, que debe existir antes del primer arranque porque InfluxDB se inicializa con él.
  • La credencial SNMP para Telegraf, o su equivalente en la bóveda.
  • Las banderas de remediación por carril (FortiGate, FortiSwitch, Junos, Meraki, SD-WAN): todas apagadas por omisión. Se encienden a conciencia, cuando el carril ya se validó en dry-run.
  • La bandera que activa las plantillas por servicio (v2) en lugar de las legadas por rol.

Qué nunca va al repositorio

Los archivos de configuración con secretos y cualquier archivo con credenciales. El motor acepta credenciales legadas en archivos locales y variables de entorno sólo como ruta de migración hacia la bóveda.

Bóveda de credenciales

Las credenciales con que el Engine entra a los equipos se administran en la UI, en Integraciones → Credenciales, y viajan cifradas al Engine. El modelo está explicado en Seguridad y credenciales; aquí va la operación.

Dar de alta una credencial

  1. Elige el tipo: ssh (Cisco, FortiSwitch), snmp (Telegraf), fortigate (token de API), meraki (clave de Dashboard), bgp (contraseña de vecinos), sdwan (Manager), cml (red de pruebas).
  2. Elige el alcance: global para toda la organización, site con el código de sitio, o device con el nombre del equipo. En la resolución gana la más específica.
  3. Captura usuario y secreto. En los tipos de API agrega los metadatos: URL base, verificación TLS y, si el carril va a aplicar cambios, el permiso de escritura.
  4. Guarda. La UI entrega la bóveda cifrada al motor de inmediato; el motor la detecta sin reiniciar.

Una credencial es única por organización, tipo, alcance y valor de alcance. Se puede desactivar sin borrarla y la UI registra la última rotación.

Migrar desde credenciales en archivos

Si la instalación venía de la etapa en que las credenciales estaban en variables de entorno o en archivos locales del inventario, la UI trae un comando de gestión que las importa a la bóveda: lee la credencial SNMP, la contraseña BGP, el usuario y contraseña SSH y los tokens de FortiGate referenciados en el inventario. Se ejecuta primero en modo de prueba para revisar el resumen y después en firme. Está documentado en la guía que se entrega con el software, junto con los comandos para forzar la exportación y rotar tokens de FortiGate.

Cuando el carril va a escribir

  • FortiGate: token con permiso de escritura, permiso de escritura en la credencial y la bandera de remediación del carril en el Engine. El apply exige dry-run previo y un respaldo lógico reciente; sólo hace upserts, nunca borra.
  • Junos: usuario con permiso de configuración y la bandera de NETCONF; el commit confirmed de 10 minutos por omisión revierte si nadie confirma.
  • Meraki y SD-WAN: clave con escritura, permiso de escritura en la credencial y la bandera de cada carril. Meraki nunca ejecuta DELETE.
  • Cisco por SSH: el mismo usuario del discovery si tiene privilegio para configurar; el diff se muestra antes de aplicar.

Troubleshooting

Síntomas frecuentes en la instalación y su corrección. Cuando un síntoma apunta a los secretos, revisa primero las tres parejas.

SíntomaCausaCorrección
Error de archivo o directorio inexistente al levantar un componenteLos dos componentes no están instalados en el mismo directorio padreInstalarlos juntos
La UI no puede hablar con el motor (error de autenticación)La credencial de integración no coincide entre UI y motorIgualarla y reiniciar
Las conexiones SSH o de API a los equipos fallan sin error claroLa clave de cifrado de la bóveda no coincideMisma clave en ambos componentes; volver a guardar una credencial para reexportar
La auditoría se rechaza porque no hay reglas de la organizaciónLa organización no tiene intención sincronizadaGuardar una regla desde la UI
El motor está sano, pero la auditoría no encuentra el inventario de la organizaciónEl motor no alcanza la UI por red (frecuente en Linux)Revisar la resolución de nombres entre contenedores según la guía de instalación
Editar el inventario en archivos del motor no cambia nadaExiste un inventario de la organización con prioridadEditar el inventario en la UI y sincronizar
Tableros vacíos tras iniciar sesiónLa UI aún no ingirió artefactosReiniciar la UI o pulsar «Sincronizar resultados»
La aplicación no arranca por autenticación de base de datosVolumen de PostgreSQL de otra instalaciónEn instalación nueva, eliminar los volúmenes y volver a levantar
Telegraf no recolectaSNMP apagado, credencial errónea, ACL o alcanceProbar la recolección en modo prueba; revisar la credencial SNMP, timeouts y que el OID exista en ese fabricante
InfluxDB no recibe datosToken inválido o definido después del primer arranqueVerificar el token y el bucket; el token va antes del primer arranque
El programador no ejecutaProceso caído o configuración inválidaRevisar su estado en la UI y los registros del proceso
Un servicio v2 nunca aparece en la configuración generadaLas plantillas por servicio no están activadasActivar la bandera correspondiente en el motor
Timeouts de discovery en equipos virtuales lentosTiempo de lectura cortoAumentar el timeout de lectura en las opciones de conexión del inventario
«data missing» tras reemplazar un equipo con la misma IPCambió la llave SSH del hostAceptar la nueva llave desde la UI; el motor guarda las llaves conocidas por organización
Falsos negativos en reglas sobre interfacesNombres cortos en la regla, largos en el snapshotEscribir GigabitEthernet0/1, no gi0/1