ogcore/ogCore_Documentacion_Tecnic...

2452 lines
134 KiB
HTML

<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="" xml:lang="">
<head>
<meta charset="utf-8" />
<meta name="generator" content="pandoc" />
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
<meta name="author" content="Equipo OpenGnsys" />
<title>ogCore - Documentación Técnica y Funcional</title>
<style>
code{white-space: pre-wrap;}
span.smallcaps{font-variant: small-caps;}
div.columns{display: flex; gap: min(4vw, 1.5em);}
div.column{flex: auto; overflow-x: auto;}
div.hanging-indent{margin-left: 1.5em; text-indent: -1.5em;}
/* The extra [class] is a hack that increases specificity enough to
override a similar rule in reveal.js */
ul.task-list[class]{list-style: none;}
ul.task-list li input[type="checkbox"] {
font-size: inherit;
width: 0.8em;
margin: 0 0.8em 0.2em -1.6em;
vertical-align: middle;
}
.display.math{display: block; text-align: center; margin: 0.5rem auto;}
/* CSS for syntax highlighting */
pre > code.sourceCode { white-space: pre; position: relative; }
pre > code.sourceCode > span { line-height: 1.25; }
pre > code.sourceCode > span:empty { height: 1.2em; }
.sourceCode { overflow: visible; }
code.sourceCode > span { color: inherit; text-decoration: inherit; }
div.sourceCode { margin: 1em 0; }
pre.sourceCode { margin: 0; }
@media screen {
div.sourceCode { overflow: auto; }
}
@media print {
pre > code.sourceCode { white-space: pre-wrap; }
pre > code.sourceCode > span { text-indent: -5em; padding-left: 5em; }
}
pre.numberSource code
{ counter-reset: source-line 0; }
pre.numberSource code > span
{ position: relative; left: -4em; counter-increment: source-line; }
pre.numberSource code > span > a:first-child::before
{ content: counter(source-line);
position: relative; left: -1em; text-align: right; vertical-align: baseline;
border: none; display: inline-block;
-webkit-touch-callout: none; -webkit-user-select: none;
-khtml-user-select: none; -moz-user-select: none;
-ms-user-select: none; user-select: none;
padding: 0 4px; width: 4em;
color: #aaaaaa;
}
pre.numberSource { margin-left: 3em; border-left: 1px solid #aaaaaa; padding-left: 4px; }
div.sourceCode
{ }
@media screen {
pre > code.sourceCode > span > a:first-child::before { text-decoration: underline; }
}
code span.al { color: #ff0000; font-weight: bold; } /* Alert */
code span.an { color: #60a0b0; font-weight: bold; font-style: italic; } /* Annotation */
code span.at { color: #7d9029; } /* Attribute */
code span.bn { color: #40a070; } /* BaseN */
code span.bu { color: #008000; } /* BuiltIn */
code span.cf { color: #007020; font-weight: bold; } /* ControlFlow */
code span.ch { color: #4070a0; } /* Char */
code span.cn { color: #880000; } /* Constant */
code span.co { color: #60a0b0; font-style: italic; } /* Comment */
code span.cv { color: #60a0b0; font-weight: bold; font-style: italic; } /* CommentVar */
code span.do { color: #ba2121; font-style: italic; } /* Documentation */
code span.dt { color: #902000; } /* DataType */
code span.dv { color: #40a070; } /* DecVal */
code span.er { color: #ff0000; font-weight: bold; } /* Error */
code span.ex { } /* Extension */
code span.fl { color: #40a070; } /* Float */
code span.fu { color: #06287e; } /* Function */
code span.im { color: #008000; font-weight: bold; } /* Import */
code span.in { color: #60a0b0; font-weight: bold; font-style: italic; } /* Information */
code span.kw { color: #007020; font-weight: bold; } /* Keyword */
code span.op { color: #666666; } /* Operator */
code span.ot { color: #007020; } /* Other */
code span.pp { color: #bc7a00; } /* Preprocessor */
code span.sc { color: #4070a0; } /* SpecialChar */
code span.ss { color: #bb6688; } /* SpecialString */
code span.st { color: #4070a0; } /* String */
code span.va { color: #19177c; } /* Variable */
code span.vs { color: #4070a0; } /* VerbatimString */
code span.wa { color: #60a0b0; font-weight: bold; font-style: italic; } /* Warning */
</style>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/github-markdown-css/5.1.0/github-markdown.min.css" />
</head>
<body>
<header id="title-block-header">
<h1 class="title">ogCore - Documentación Técnica y Funcional</h1>
<p class="author">Equipo OpenGnsys</p>
<p class="date">Octubre 2025</p>
</header>
<nav id="TOC" role="doc-toc">
<ul>
<li><a href="#ogcore---documentación-técnica-y-funcional"
id="toc-ogcore---documentación-técnica-y-funcional"><span
class="toc-section-number">1</span> ogCore - Documentación Técnica y
Funcional</a>
<ul>
<li><a href="#tabla-de-contenidos" id="toc-tabla-de-contenidos"><span
class="toc-section-number">1.1</span> Tabla de Contenidos</a></li>
<li><a href="#introducción" id="toc-introducción"><span
class="toc-section-number">1.2</span> 1. Introducción</a>
<ul>
<li><a href="#propósito-del-sistema"
id="toc-propósito-del-sistema"><span
class="toc-section-number">1.2.1</span> 1.1 Propósito del
Sistema</a></li>
<li><a href="#alcance" id="toc-alcance"><span
class="toc-section-number">1.2.2</span> 1.2 Alcance</a></li>
</ul></li>
<li><a href="#descripción-del-proyecto"
id="toc-descripción-del-proyecto"><span
class="toc-section-number">1.3</span> 2. Descripción del Proyecto</a>
<ul>
<li><a href="#qué-es-ogcore" id="toc-qué-es-ogcore"><span
class="toc-section-number">1.3.1</span> 2.1 ¿Qué es ogCore?</a></li>
<li><a href="#características-principales"
id="toc-características-principales"><span
class="toc-section-number">1.3.2</span> 2.2 Características
Principales</a></li>
<li><a href="#versión-actual" id="toc-versión-actual"><span
class="toc-section-number">1.3.3</span> 2.3 Versión Actual</a></li>
</ul></li>
<li><a href="#arquitectura-del-sistema"
id="toc-arquitectura-del-sistema"><span
class="toc-section-number">1.4</span> 3. Arquitectura del Sistema</a>
<ul>
<li><a href="#arquitectura-general" id="toc-arquitectura-general"><span
class="toc-section-number">1.4.1</span> 3.1 Arquitectura
General</a></li>
<li><a href="#capas-de-la-aplicación"
id="toc-capas-de-la-aplicación"><span
class="toc-section-number">1.4.2</span> 3.2 Capas de la
Aplicación</a></li>
<li><a href="#patrones-de-diseño-utilizados"
id="toc-patrones-de-diseño-utilizados"><span
class="toc-section-number">1.4.3</span> 3.3 Patrones de Diseño
Utilizados</a></li>
</ul></li>
<li><a href="#tecnologías-utilizadas"
id="toc-tecnologías-utilizadas"><span
class="toc-section-number">1.5</span> 4. Tecnologías Utilizadas</a>
<ul>
<li><a href="#backend" id="toc-backend"><span
class="toc-section-number">1.5.1</span> 4.1 Backend</a></li>
<li><a href="#base-de-datos" id="toc-base-de-datos"><span
class="toc-section-number">1.5.2</span> 4.2 Base de Datos</a></li>
<li><a href="#infraestructura" id="toc-infraestructura"><span
class="toc-section-number">1.5.3</span> 4.3 Infraestructura</a></li>
<li><a href="#testing" id="toc-testing"><span
class="toc-section-number">1.5.4</span> 4.4 Testing</a></li>
<li><a href="#desarrollo" id="toc-desarrollo"><span
class="toc-section-number">1.5.5</span> 4.5 Desarrollo</a></li>
</ul></li>
<li><a href="#requisitos-del-sistema"
id="toc-requisitos-del-sistema"><span
class="toc-section-number">1.6</span> 5. Requisitos del Sistema</a>
<ul>
<li><a href="#requisitos-de-hardware-producción"
id="toc-requisitos-de-hardware-producción"><span
class="toc-section-number">1.6.1</span> 5.1 Requisitos de Hardware
(Producción)</a></li>
<li><a href="#requisitos-de-software"
id="toc-requisitos-de-software"><span
class="toc-section-number">1.6.2</span> 5.2 Requisitos de
Software</a></li>
<li><a href="#puertos-requeridos" id="toc-puertos-requeridos"><span
class="toc-section-number">1.6.3</span> 5.3 Puertos Requeridos</a></li>
</ul></li>
<li><a href="#instalación-y-configuración"
id="toc-instalación-y-configuración"><span
class="toc-section-number">1.7</span> 6. Instalación y Configuración</a>
<ul>
<li><a href="#instalación-con-docker-recomendado"
id="toc-instalación-con-docker-recomendado"><span
class="toc-section-number">1.7.1</span> 6.1 Instalación con Docker
(Recomendado)</a></li>
<li><a href="#configuración" id="toc-configuración"><span
class="toc-section-number">1.7.2</span> 6.2 Configuración</a></li>
<li><a href="#instalación-en-producción"
id="toc-instalación-en-producción"><span
class="toc-section-number">1.7.3</span> 6.3 Instalación en
Producción</a></li>
</ul></li>
<li><a href="#modelo-de-datos" id="toc-modelo-de-datos"><span
class="toc-section-number">1.8</span> 7. Modelo de Datos</a>
<ul>
<li><a href="#diagrama-de-entidades"
id="toc-diagrama-de-entidades"><span
class="toc-section-number">1.8.1</span> 7.1 Diagrama de
Entidades</a></li>
<li><a href="#entidades-principales"
id="toc-entidades-principales"><span
class="toc-section-number">1.8.2</span> 7.2 Entidades
Principales</a></li>
<li><a href="#índices-y-optimizaciones"
id="toc-índices-y-optimizaciones"><span
class="toc-section-number">1.8.3</span> 7.3 Índices y
Optimizaciones</a></li>
</ul></li>
<li><a href="#componentes-del-sistema"
id="toc-componentes-del-sistema"><span
class="toc-section-number">1.9</span> 8. Componentes del Sistema</a>
<ul>
<li><a href="#controllers-controladores"
id="toc-controllers-controladores"><span
class="toc-section-number">1.9.1</span> 8.1 Controllers
(Controladores)</a></li>
<li><a href="#states-procesadores-de-estado"
id="toc-states-procesadores-de-estado"><span
class="toc-section-number">1.9.2</span> 8.2 States (Procesadores de
Estado)</a></li>
<li><a href="#dtos-data-transfer-objects"
id="toc-dtos-data-transfer-objects"><span
class="toc-section-number">1.9.3</span> 8.3 DTOs (Data Transfer
Objects)</a></li>
<li><a href="#validators-validadores"
id="toc-validators-validadores"><span
class="toc-section-number">1.9.4</span> 8.4 Validators
(Validadores)</a></li>
<li><a href="#eventsubscribers-suscriptores-de-eventos"
id="toc-eventsubscribers-suscriptores-de-eventos"><span
class="toc-section-number">1.9.5</span> 8.5 EventSubscribers
(Suscriptores de Eventos)</a></li>
<li><a href="#factories-fábricas" id="toc-factories-fábricas"><span
class="toc-section-number">1.9.6</span> 8.6 Factories
(Fábricas)</a></li>
</ul></li>
<li><a href="#api-restful" id="toc-api-restful"><span
class="toc-section-number">1.10</span> 9. API RESTful</a>
<ul>
<li><a href="#documentación" id="toc-documentación"><span
class="toc-section-number">1.10.1</span> 9.1 Documentación</a></li>
<li><a href="#formato-de-respuestas"
id="toc-formato-de-respuestas"><span
class="toc-section-number">1.10.2</span> 9.2 Formato de
Respuestas</a></li>
<li><a href="#paginación" id="toc-paginación"><span
class="toc-section-number">1.10.3</span> 9.3 Paginación</a></li>
<li><a href="#filtrado" id="toc-filtrado"><span
class="toc-section-number">1.10.4</span> 9.4 Filtrado</a></li>
<li><a href="#ordenamiento" id="toc-ordenamiento"><span
class="toc-section-number">1.10.5</span> 9.5 Ordenamiento</a></li>
<li><a href="#endpoints-principales"
id="toc-endpoints-principales"><span
class="toc-section-number">1.10.6</span> 9.6 Endpoints
Principales</a></li>
<li><a href="#códigos-de-estado-http"
id="toc-códigos-de-estado-http"><span
class="toc-section-number">1.10.7</span> 9.7 Códigos de Estado
HTTP</a></li>
</ul></li>
<li><a href="#seguridad-y-autenticación"
id="toc-seguridad-y-autenticación"><span
class="toc-section-number">1.11</span> 10. Seguridad y Autenticación</a>
<ul>
<li><a href="#sistema-de-autenticación-jwt"
id="toc-sistema-de-autenticación-jwt"><span
class="toc-section-number">1.11.1</span> 10.1 Sistema de Autenticación
JWT</a></li>
<li><a href="#control-de-acceso" id="toc-control-de-acceso"><span
class="toc-section-number">1.11.2</span> 10.2 Control de Acceso</a></li>
<li><a href="#roles-de-usuario" id="toc-roles-de-usuario"><span
class="toc-section-number">1.11.3</span> 10.3 Roles de Usuario</a></li>
<li><a href="#seguridad-de-contraseñas"
id="toc-seguridad-de-contraseñas"><span
class="toc-section-number">1.11.4</span> 10.4 Seguridad de
Contraseñas</a></li>
<li><a href="#cors-cross-origin-resource-sharing"
id="toc-cors-cross-origin-resource-sharing"><span
class="toc-section-number">1.11.5</span> 10.5 CORS (Cross-Origin
Resource Sharing)</a></li>
<li><a href="#ssltls" id="toc-ssltls"><span
class="toc-section-number">1.11.6</span> 10.6 SSL/TLS</a></li>
</ul></li>
<li><a href="#servicios-principales"
id="toc-servicios-principales"><span
class="toc-section-number">1.12</span> 11. Servicios Principales</a>
<ul>
<li><a href="#createpartitionservice"
id="toc-createpartitionservice"><span
class="toc-section-number">1.12.1</span> 11.1
CreatePartitionService</a></li>
<li><a href="#createtraceservice" id="toc-createtraceservice"><span
class="toc-section-number">1.12.2</span> 11.2
CreateTraceService</a></li>
<li><a href="#changeclientnetworksettingsservice"
id="toc-changeclientnetworksettingsservice"><span
class="toc-section-number">1.12.3</span> 11.3
ChangeClientNetworkSettingsService</a></li>
<li><a href="#externalgitrepositoryservice"
id="toc-externalgitrepositoryservice"><span
class="toc-section-number">1.12.4</span> 11.4
ExternalGitRepositoryService</a></li>
<li><a href="#statusservice-ogbootogdhcpogrepository"
id="toc-statusservice-ogbootogdhcpogrepository"><span
class="toc-section-number">1.12.5</span> 11.5 StatusService
(OgBoot/OgDhcp/OgRepository)</a></li>
<li><a href="#udsclient" id="toc-udsclient"><span
class="toc-section-number">1.12.6</span> 11.6 UDSClient</a></li>
<li><a href="#tracecreateservice" id="toc-tracecreateservice"><span
class="toc-section-number">1.12.7</span> 11.7
Trace/CreateService</a></li>
<li><a href="#utilsgetpartitioncodeservice"
id="toc-utilsgetpartitioncodeservice"><span
class="toc-section-number">1.12.8</span> 11.8
Utils/GetPartitionCodeService</a></li>
<li><a href="#utilssimplifyoglivefilenameservice"
id="toc-utilssimplifyoglivefilenameservice"><span
class="toc-section-number">1.12.9</span> 11.9
Utils/SimplifyOgLiveFilenameService</a></li>
<li><a href="#utilsgetipaddressandnetmaskfromcidrservice"
id="toc-utilsgetipaddressandnetmaskfromcidrservice"><span
class="toc-section-number">1.12.10</span> 11.10
Utils/GetIpAddressAndNetmaskFromCIDRService</a></li>
</ul></li>
<li><a href="#comandos-de-consola" id="toc-comandos-de-consola"><span
class="toc-section-number">1.13</span> 12. Comandos de Consola</a>
<ul>
<li><a href="#comandos-de-inicialización"
id="toc-comandos-de-inicialización"><span
class="toc-section-number">1.13.1</span> 12.1 Comandos de
Inicialización</a></li>
<li><a href="#comandos-de-operación"
id="toc-comandos-de-operación"><span
class="toc-section-number">1.13.2</span> 12.2 Comandos de
Operación</a></li>
<li><a href="#comandos-de-migración"
id="toc-comandos-de-migración"><span
class="toc-section-number">1.13.3</span> 12.3 Comandos de
Migración</a></li>
<li><a href="#comandos-de-desarrollo"
id="toc-comandos-de-desarrollo"><span
class="toc-section-number">1.13.4</span> 12.4 Comandos de
Desarrollo</a></li>
<li><a href="#configuración-de-cron"
id="toc-configuración-de-cron"><span
class="toc-section-number">1.13.5</span> 12.5 Configuración de
Cron</a></li>
</ul></li>
<li><a href="#migraciones-de-datos" id="toc-migraciones-de-datos"><span
class="toc-section-number">1.14</span> 13. Migraciones de Datos</a>
<ul>
<li><a href="#sistema-de-migraciones-de-doctrine"
id="toc-sistema-de-migraciones-de-doctrine"><span
class="toc-section-number">1.14.1</span> 13.1 Sistema de Migraciones de
Doctrine</a></li>
<li><a href="#migración-desde-opengnsys-1.1"
id="toc-migración-desde-opengnsys-1.1"><span
class="toc-section-number">1.14.2</span> 13.2 Migración desde OpenGnsys
1.1</a></li>
<li><a href="#backup-y-restauración"
id="toc-backup-y-restauración"><span
class="toc-section-number">1.14.3</span> 13.3 Backup y
Restauración</a></li>
</ul></li>
<li><a href="#testing-1" id="toc-testing-1"><span
class="toc-section-number">1.15</span> 14. Testing</a>
<ul>
<li><a href="#framework-de-testing" id="toc-framework-de-testing"><span
class="toc-section-number">1.15.1</span> 14.1 Framework de
Testing</a></li>
<li><a href="#ejecutar-tests" id="toc-ejecutar-tests"><span
class="toc-section-number">1.15.2</span> 14.2 Ejecutar Tests</a></li>
<li><a href="#tipos-de-tests" id="toc-tipos-de-tests"><span
class="toc-section-number">1.15.3</span> 14.3 Tipos de Tests</a></li>
<li><a href="#factories-para-testing"
id="toc-factories-para-testing"><span
class="toc-section-number">1.15.4</span> 14.4 Factories para
Testing</a></li>
<li><a href="#base-de-datos-de-testing"
id="toc-base-de-datos-de-testing"><span
class="toc-section-number">1.15.5</span> 14.5 Base de Datos de
Testing</a></li>
</ul></li>
<li><a href="#despliegue" id="toc-despliegue"><span
class="toc-section-number">1.16</span> 15. Despliegue</a>
<ul>
<li><a href="#despliegue-con-docker-compose"
id="toc-despliegue-con-docker-compose"><span
class="toc-section-number">1.16.1</span> 15.1 Despliegue con Docker
Compose</a></li>
<li><a href="#despliegue-con-jenkins"
id="toc-despliegue-con-jenkins"><span
class="toc-section-number">1.16.2</span> 15.2 Despliegue con
Jenkins</a></li>
<li><a href="#paquete-debian" id="toc-paquete-debian"><span
class="toc-section-number">1.16.3</span> 15.3 Paquete Debian</a></li>
<li><a href="#configuración-de-producción"
id="toc-configuración-de-producción"><span
class="toc-section-number">1.16.4</span> 15.4 Configuración de
Producción</a></li>
<li><a href="#monitoreo" id="toc-monitoreo"><span
class="toc-section-number">1.16.5</span> 15.5 Monitoreo</a></li>
<li><a href="#escalabilidad" id="toc-escalabilidad"><span
class="toc-section-number">1.16.6</span> 15.6 Escalabilidad</a></li>
</ul></li>
<li><a href="#mantenimiento-y-operaciones"
id="toc-mantenimiento-y-operaciones"><span
class="toc-section-number">1.17</span> 16. Mantenimiento y
Operaciones</a>
<ul>
<li><a href="#reiniciar-base-de-datos"
id="toc-reiniciar-base-de-datos"><span
class="toc-section-number">1.17.1</span> 16.1 Reiniciar Base de
Datos</a></li>
<li><a href="#limpiar-caché" id="toc-limpiar-caché"><span
class="toc-section-number">1.17.2</span> 16.2 Limpiar Caché</a></li>
<li><a href="#actualizar-dependencias"
id="toc-actualizar-dependencias"><span
class="toc-section-number">1.17.3</span> 16.3 Actualizar
Dependencias</a></li>
<li><a href="#regenerar-claves-jwt" id="toc-regenerar-claves-jwt"><span
class="toc-section-number">1.17.4</span> 16.4 Regenerar Claves
JWT</a></li>
<li><a href="#backups-automáticos" id="toc-backups-automáticos"><span
class="toc-section-number">1.17.5</span> 16.5 Backups
Automáticos</a></li>
<li><a href="#monitoreo-de-salud" id="toc-monitoreo-de-salud"><span
class="toc-section-number">1.17.6</span> 16.6 Monitoreo de
Salud</a></li>
<li><a href="#rotación-de-logs" id="toc-rotación-de-logs"><span
class="toc-section-number">1.17.7</span> 16.7 Rotación de Logs</a></li>
</ul></li>
<li><a href="#integración-con-otros-servicios"
id="toc-integración-con-otros-servicios"><span
class="toc-section-number">1.18</span> 17. Integración con Otros
Servicios</a>
<ul>
<li><a href="#ogrepository" id="toc-ogrepository"><span
class="toc-section-number">1.18.1</span> 17.1 ogRepository</a></li>
<li><a href="#ogdhcp" id="toc-ogdhcp"><span
class="toc-section-number">1.18.2</span> 17.2 ogDhcp</a></li>
<li><a href="#ogboot" id="toc-ogboot"><span
class="toc-section-number">1.18.3</span> 17.3 ogBoot</a></li>
<li><a href="#ogagent" id="toc-ogagent"><span
class="toc-section-number">1.18.4</span> 17.4 ogAgent</a></li>
<li><a href="#uds-universal-desktop-services"
id="toc-uds-universal-desktop-services"><span
class="toc-section-number">1.18.5</span> 17.5 UDS (Universal Desktop
Services)</a></li>
<li><a href="#git-versionado-de-imágenes"
id="toc-git-versionado-de-imágenes"><span
class="toc-section-number">1.18.6</span> 17.6 Git (Versionado de
Imágenes)</a></li>
<li><a href="#mercure-notificaciones-en-tiempo-real"
id="toc-mercure-notificaciones-en-tiempo-real"><span
class="toc-section-number">1.18.7</span> 17.7 Mercure (Notificaciones en
Tiempo Real)</a></li>
</ul></li>
<li><a href="#roadmap-y-changelog" id="toc-roadmap-y-changelog"><span
class="toc-section-number">1.19</span> 18. Roadmap y Changelog</a>
<ul>
<li><a href="#versión-actual-0.5.0" id="toc-versión-actual-0.5.0"><span
class="toc-section-number">1.19.1</span> 18.1 Versión Actual:
0.5.0</a></li>
<li><a href="#últimas-características-v0.25.1---octubre-2025"
id="toc-últimas-características-v0.25.1---octubre-2025"><span
class="toc-section-number">1.19.2</span> 18.2 Últimas Características
(v0.25.1 - Octubre 2025)</a></li>
<li><a href="#próximas-características-roadmap"
id="toc-próximas-características-roadmap"><span
class="toc-section-number">1.19.3</span> 18.3 Próximas Características
(Roadmap)</a></li>
<li><a href="#changelog-resumido" id="toc-changelog-resumido"><span
class="toc-section-number">1.19.4</span> 18.4 Changelog
Resumido</a></li>
</ul></li>
<li><a href="#contribución" id="toc-contribución"><span
class="toc-section-number">1.20</span> 19. Contribución</a>
<ul>
<li><a href="#guía-de-contribución" id="toc-guía-de-contribución"><span
class="toc-section-number">1.20.1</span> 19.1 Guía de
Contribución</a></li>
<li><a href="#estándares-de-código" id="toc-estándares-de-código"><span
class="toc-section-number">1.20.2</span> 19.2 Estándares de
Código</a></li>
<li><a href="#proceso-de-revisión" id="toc-proceso-de-revisión"><span
class="toc-section-number">1.20.3</span> 19.3 Proceso de
Revisión</a></li>
<li><a href="#reportar-bugs" id="toc-reportar-bugs"><span
class="toc-section-number">1.20.4</span> 19.4 Reportar Bugs</a></li>
</ul></li>
<li><a href="#soporte-y-contacto" id="toc-soporte-y-contacto"><span
class="toc-section-number">1.21</span> 20. Soporte y Contacto</a>
<ul>
<li><a href="#documentación-adicional"
id="toc-documentación-adicional"><span
class="toc-section-number">1.21.1</span> 20.1 Documentación
Adicional</a></li>
<li><a href="#recursos" id="toc-recursos"><span
class="toc-section-number">1.21.2</span> 20.2 Recursos</a></li>
<li><a href="#equipo-de-desarrollo" id="toc-equipo-de-desarrollo"><span
class="toc-section-number">1.21.3</span> 20.3 Equipo de
Desarrollo</a></li>
<li><a href="#licencia" id="toc-licencia"><span
class="toc-section-number">1.21.4</span> 20.4 Licencia</a></li>
</ul></li>
<li><a href="#apéndices" id="toc-apéndices"><span
class="toc-section-number">1.22</span> Apéndices</a>
<ul>
<li><a href="#apéndice-a-glosario-de-términos"
id="toc-apéndice-a-glosario-de-términos"><span
class="toc-section-number">1.22.1</span> Apéndice A: Glosario de
Términos</a></li>
<li><a href="#apéndice-b-puertos-y-servicios"
id="toc-apéndice-b-puertos-y-servicios"><span
class="toc-section-number">1.22.2</span> Apéndice B: Puertos y
Servicios</a></li>
<li><a href="#apéndice-c-estructura-de-directorios"
id="toc-apéndice-c-estructura-de-directorios"><span
class="toc-section-number">1.22.3</span> Apéndice C: Estructura de
Directorios</a></li>
<li><a href="#apéndice-d-variables-de-entorno-completas"
id="toc-apéndice-d-variables-de-entorno-completas"><span
class="toc-section-number">1.22.4</span> Apéndice D: Variables de
Entorno Completas</a></li>
</ul></li>
</ul></li>
</ul>
</nav>
<h1 data-number="1"
id="ogcore---documentación-técnica-y-funcional"><span
class="header-section-number">1</span> ogCore - Documentación Técnica y
Funcional</h1>
<h2 data-number="1.1" id="tabla-de-contenidos"><span
class="header-section-number">1.1</span> Tabla de Contenidos</h2>
<ol type="1">
<li><a href="#1-introducción">Introducción</a></li>
<li><a href="#2-descripción-del-proyecto">Descripción del
Proyecto</a></li>
<li><a href="#3-arquitectura-del-sistema">Arquitectura del
Sistema</a></li>
<li><a href="#4-tecnologías-utilizadas">Tecnologías Utilizadas</a></li>
<li><a href="#5-requisitos-del-sistema">Requisitos del Sistema</a></li>
<li><a href="#6-instalación-y-configuración">Instalación y
Configuración</a></li>
<li><a href="#7-modelo-de-datos">Modelo de Datos</a></li>
<li><a href="#8-componentes-del-sistema">Componentes del
Sistema</a></li>
<li><a href="#9-api-restful">API RESTful</a></li>
<li><a href="#10-seguridad-y-autenticación">Seguridad y
Autenticación</a></li>
<li><a href="#11-servicios-principales">Servicios Principales</a></li>
<li><a href="#12-comandos-de-consola">Comandos de Consola</a></li>
<li><a href="#13-migraciones-de-datos">Migraciones de Datos</a></li>
<li><a href="#14-testing">Testing</a></li>
<li><a href="#15-despliegue">Despliegue</a></li>
<li><a href="#16-mantenimiento-y-operaciones">Mantenimiento y
Operaciones</a></li>
<li><a href="#17-integración-con-otros-servicios">Integración con Otros
Servicios</a></li>
<li><a href="#18-roadmap-y-changelog">Roadmap y Changelog</a></li>
<li><a href="#19-contribución">Contribución</a></li>
<li><a href="#20-soporte-y-contacto">Soporte y Contacto</a></li>
</ol>
<hr />
<h2 data-number="1.2" id="introducción"><span
class="header-section-number">1.2</span> 1. Introducción</h2>
<p><strong>ogCore</strong> es el servicio central de
<strong>OpenGnsys</strong>, una plataforma de código abierto diseñada
para la gestión centralizada de aulas de informática, laboratorios y
entornos educativos. Este servicio proporciona una API RESTful robusta
que permite administrar de manera eficiente clientes (equipos), imágenes
de sistemas operativos, perfiles de hardware y software, tareas
programadas, y mucho más.</p>
<h3 data-number="1.2.1" id="propósito-del-sistema"><span
class="header-section-number">1.2.1</span> 1.1 Propósito del
Sistema</h3>
<p>El propósito principal de ogCore es:</p>
<ul>
<li><strong>Centralizar la gestión</strong> de equipos informáticos en
entornos educativos y corporativos</li>
<li><strong>Automatizar el despliegue</strong> de sistemas operativos e
imágenes</li>
<li><strong>Gestionar inventarios</strong> de hardware y software</li>
<li><strong>Programar y ejecutar tareas</strong> de manera
automática</li>
<li><strong>Proporcionar trazabilidad</strong> de todas las operaciones
realizadas</li>
<li><strong>Facilitar la migración</strong> desde versiones anteriores
de OpenGnsys</li>
</ul>
<h3 data-number="1.2.2" id="alcance"><span
class="header-section-number">1.2.2</span> 1.2 Alcance</h3>
<p>ogCore gestiona: - Clientes (equipos físicos) - Imágenes de sistemas
operativos - Repositorios de imágenes - Perfiles de hardware y software
- Unidades organizativas (aulas, grupos) - Redes y subredes - Plantillas
PXE - Menús de arranque - Comandos y tareas programadas - Trazas de
ejecución - Calendarios remotos - Integración con sistemas externos
(UDS, ogRepository, ogDhcp, ogBoot)</p>
<hr />
<h2 data-number="1.3" id="descripción-del-proyecto"><span
class="header-section-number">1.3</span> 2. Descripción del
Proyecto</h2>
<h3 data-number="1.3.1" id="qué-es-ogcore"><span
class="header-section-number">1.3.1</span> 2.1 ¿Qué es ogCore?</h3>
<p>ogCore es el núcleo central de OpenGnsys desarrollado con tecnologías
modernas de PHP. Actúa como backend que expone una API RESTful completa,
permitiendo la gestión de todos los aspectos relacionados con la
administración de aulas informáticas.</p>
<h3 data-number="1.3.2" id="características-principales"><span
class="header-section-number">1.3.2</span> 2.2 Características
Principales</h3>
<ul>
<li><strong>API RESTful completa</strong> con documentación
Swagger/OpenAPI</li>
<li><strong>Autenticación JWT</strong> con refresh tokens</li>
<li><strong>Arquitectura basada en eventos</strong> con notificaciones
en tiempo real (Mercure)</li>
<li><strong>Sistema de colas</strong> para la ejecución de tareas
programadas</li>
<li><strong>Integración con múltiples servicios</strong> externos</li>
<li><strong>Migraciones automatizadas</strong> desde OpenGnsys 1.1</li>
<li><strong>Versionado de imágenes</strong> con integración Git</li>
<li><strong>Sistema de trazabilidad</strong> completo</li>
<li><strong>Gestión de hardware</strong> con inventario automático</li>
<li><strong>Despliegues masivos</strong> de imágenes (unicast,
multicast, torrent, p2p)</li>
<li><strong>Gestión de particiones</strong> automática</li>
<li><strong>Sistema de validación</strong> robusto</li>
</ul>
<h3 data-number="1.3.3" id="versión-actual"><span
class="header-section-number">1.3.3</span> 2.3 Versión Actual</h3>
<ul>
<li><strong>Versión</strong>: 0.5.0</li>
<li><strong>Estado</strong>: En desarrollo activo</li>
<li><strong>Última actualización</strong>: Octubre 2025</li>
</ul>
<hr />
<h2 data-number="1.4" id="arquitectura-del-sistema"><span
class="header-section-number">1.4</span> 3. Arquitectura del
Sistema</h2>
<h3 data-number="1.4.1" id="arquitectura-general"><span
class="header-section-number">1.4.1</span> 3.1 Arquitectura General</h3>
<p>ogCore sigue una arquitectura de <strong>microservicios</strong>
basada en el patrón <strong>API-First</strong>:</p>
<pre><code>┌─────────────────────────────────────────────────────────────┐
│ Frontend (Web UI) │
└────────────────────────┬────────────────────────────────────┘
│ HTTP/REST
┌────────────────────────▼────────────────────────────────────┐
│ ogCore API (Symfony) │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Controllers │ States │ DTOs │ Validators │ Filters │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Business Logic (Services) │ │
│ └──────────────────────────────────────────────────────┘ │
│ ┌──────────────────────────────────────────────────────┐ │
│ │ Entities │ Repositories │ Doctrine ORM │ │
│ └──────────────────────────────────────────────────────┘ │
└────────────────────┬───────────────┬───────────────────────┘
│ │
┌───────────▼──┐ ┌──────▼──────┐
│ MariaDB │ │ Mercure │
│ Database │ │ (WebSocket)│
└──────────────┘ └─────────────┘
┌─────────────────────────────────────────────────────────────┐
│ Servicios Externos Integrados │
├──────────────┬──────────────┬──────────────┬────────────────┤
│ ogRepository│ ogDhcp │ ogBoot │ UDS/Git │
└──────────────┴──────────────┴──────────────┴────────────────┘</code></pre>
<h3 data-number="1.4.2" id="capas-de-la-aplicación"><span
class="header-section-number">1.4.2</span> 3.2 Capas de la
Aplicación</h3>
<h4 data-number="1.4.2.1" id="capa-de-presentación-api"><span
class="header-section-number">1.4.2.1</span> 3.2.1 Capa de Presentación
(API)</h4>
<ul>
<li><strong>API Platform</strong>: Framework para crear APIs REST</li>
<li><strong>Controllers</strong>: Controladores personalizados (102
controladores)</li>
<li><strong>DTOs (Data Transfer Objects)</strong>: 93 objetos de
transferencia de datos</li>
<li><strong>OpenAPI/Swagger</strong>: Documentación automática de la
API</li>
</ul>
<h4 data-number="1.4.2.2" id="capa-de-negocio"><span
class="header-section-number">1.4.2.2</span> 3.2.2 Capa de Negocio</h4>
<ul>
<li><strong>Services</strong>: Lógica de negocio (13 servicios
principales)</li>
<li><strong>Handlers</strong>: Manejadores de eventos (2 handlers)</li>
<li><strong>EventSubscribers</strong>: Suscriptores de eventos (8
suscriptores)</li>
<li><strong>Validators</strong>: Validadores personalizados (18
validadores)</li>
</ul>
<h4 data-number="1.4.2.3" id="capa-de-datos"><span
class="header-section-number">1.4.2.3</span> 3.2.3 Capa de Datos</h4>
<ul>
<li><strong>Entities</strong>: 35 entidades del modelo de datos</li>
<li><strong>Repositories</strong>: 32 repositorios personalizados</li>
<li><strong>Doctrine ORM</strong>: Mapeo objeto-relacional</li>
<li><strong>Migrations</strong>: 85 migraciones de base de datos</li>
</ul>
<h4 data-number="1.4.2.4" id="capa-de-infraestructura"><span
class="header-section-number">1.4.2.4</span> 3.2.4 Capa de
Infraestructura</h4>
<ul>
<li><strong>Docker</strong>: Contenedorización de servicios</li>
<li><strong>Nginx</strong>: Servidor web reverse proxy</li>
<li><strong>PHP-FPM</strong>: Procesador de PHP</li>
<li><strong>MariaDB</strong>: Sistema de gestión de base de datos</li>
<li><strong>Mercure</strong>: Sistema de notificaciones en tiempo
real</li>
</ul>
<h3 data-number="1.4.3" id="patrones-de-diseño-utilizados"><span
class="header-section-number">1.4.3</span> 3.3 Patrones de Diseño
Utilizados</h3>
<ol type="1">
<li><strong>Repository Pattern</strong>: Para abstracción de acceso a
datos</li>
<li><strong>DTO Pattern</strong>: Para transferencia de datos entre
capas</li>
<li><strong>Factory Pattern</strong>: Para creación de entidades
complejas</li>
<li><strong>Event-Driven Architecture</strong>: Para notificaciones y
reactividad</li>
<li><strong>State Pattern</strong>: Para gestión de estados de
procesamiento</li>
<li><strong>Service Layer</strong>: Para encapsulación de lógica de
negocio</li>
</ol>
<hr />
<h2 data-number="1.5" id="tecnologías-utilizadas"><span
class="header-section-number">1.5</span> 4. Tecnologías Utilizadas</h2>
<h3 data-number="1.5.1" id="backend"><span
class="header-section-number">1.5.1</span> 4.1 Backend</h3>
<table>
<colgroup>
<col style="width: 37%" />
<col style="width: 28%" />
<col style="width: 34%" />
</colgroup>
<thead>
<tr class="header">
<th>Tecnología</th>
<th>Versión</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>PHP</strong></td>
<td>8.3</td>
<td>Lenguaje de programación principal</td>
</tr>
<tr class="even">
<td><strong>Symfony</strong></td>
<td>6.4</td>
<td>Framework web principal</td>
</tr>
<tr class="odd">
<td><strong>Doctrine ORM</strong></td>
<td>2.19</td>
<td>Mapeo objeto-relacional</td>
</tr>
<tr class="even">
<td><strong>API Platform</strong></td>
<td>3.2</td>
<td>Creación de APIs REST</td>
</tr>
<tr class="odd">
<td><strong>Lexik JWT</strong></td>
<td>3.0</td>
<td>Autenticación JWT</td>
</tr>
<tr class="even">
<td><strong>Gesdinet JWT Refresh Token</strong></td>
<td>1.3</td>
<td>Refresh tokens</td>
</tr>
<tr class="odd">
<td><strong>Stof Doctrine Extensions</strong></td>
<td>1.10</td>
<td>Extensiones de Doctrine (timestampable, etc.)</td>
</tr>
<tr class="even">
<td><strong>Ramsey UUID</strong></td>
<td>2.0</td>
<td>Generación de UUIDs</td>
</tr>
</tbody>
</table>
<h3 data-number="1.5.2" id="base-de-datos"><span
class="header-section-number">1.5.2</span> 4.2 Base de Datos</h3>
<table>
<thead>
<tr class="header">
<th>Tecnología</th>
<th>Versión</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>MariaDB</strong></td>
<td>10.11</td>
<td>Sistema de gestión de base de datos</td>
</tr>
<tr class="even">
<td><strong>Doctrine DBAL</strong></td>
<td>3.x</td>
<td>Capa de abstracción de base de datos</td>
</tr>
<tr class="odd">
<td><strong>Doctrine Migrations</strong></td>
<td>3.3</td>
<td>Gestión de migraciones</td>
</tr>
</tbody>
</table>
<h3 data-number="1.5.3" id="infraestructura"><span
class="header-section-number">1.5.3</span> 4.3 Infraestructura</h3>
<table>
<thead>
<tr class="header">
<th>Tecnología</th>
<th>Versión</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Docker</strong></td>
<td>Latest</td>
<td>Contenedorización</td>
</tr>
<tr class="even">
<td><strong>Docker Compose</strong></td>
<td>Latest</td>
<td>Orquestación de contenedores</td>
</tr>
<tr class="odd">
<td><strong>Nginx</strong></td>
<td>Latest</td>
<td>Servidor web / Reverse proxy</td>
</tr>
<tr class="even">
<td><strong>PHP-FPM</strong></td>
<td>8.3</td>
<td>Procesador FastCGI</td>
</tr>
<tr class="odd">
<td><strong>Mercure</strong></td>
<td>0.3.9</td>
<td>Hub de notificaciones en tiempo real</td>
</tr>
</tbody>
</table>
<h3 data-number="1.5.4" id="testing"><span
class="header-section-number">1.5.4</span> 4.4 Testing</h3>
<table>
<thead>
<tr class="header">
<th>Tecnología</th>
<th>Versión</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>PHPUnit</strong></td>
<td>9.5</td>
<td>Framework de testing</td>
</tr>
<tr class="even">
<td><strong>Symfony PHPUnit Bridge</strong></td>
<td>7.0</td>
<td>Integración con Symfony</td>
</tr>
<tr class="odd">
<td><strong>DAMA Doctrine Test Bundle</strong></td>
<td>8.1</td>
<td>Transacciones de prueba</td>
</tr>
<tr class="even">
<td><strong>Zenstruck Foundry</strong></td>
<td>1.37</td>
<td>Factories para testing</td>
</tr>
</tbody>
</table>
<h3 data-number="1.5.5" id="desarrollo"><span
class="header-section-number">1.5.5</span> 4.5 Desarrollo</h3>
<table>
<thead>
<tr class="header">
<th>Tecnología</th>
<th>Versión</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><strong>Symfony Maker Bundle</strong></td>
<td>1.59</td>
<td>Generación de código</td>
</tr>
<tr class="even">
<td><strong>Symfony Web Profiler</strong></td>
<td>6.4</td>
<td>Debugging y profiling</td>
</tr>
<tr class="odd">
<td><strong>Monolog</strong></td>
<td>3.x</td>
<td>Logging</td>
</tr>
<tr class="even">
<td><strong>PHPStan</strong></td>
<td>Latest</td>
<td>Análisis estático</td>
</tr>
</tbody>
</table>
<hr />
<h2 data-number="1.6" id="requisitos-del-sistema"><span
class="header-section-number">1.6</span> 5. Requisitos del Sistema</h2>
<h3 data-number="1.6.1" id="requisitos-de-hardware-producción"><span
class="header-section-number">1.6.1</span> 5.1 Requisitos de Hardware
(Producción)</h3>
<ul>
<li><strong>CPU</strong>: Mínimo 4 cores, recomendado 8+ cores</li>
<li><strong>RAM</strong>: Mínimo 8GB, recomendado 16GB+</li>
<li><strong>Disco</strong>:
<ul>
<li>Sistema: 20GB SSD</li>
<li>Base de datos: 50GB+ SSD</li>
<li>Logs: 10GB</li>
</ul></li>
<li><strong>Red</strong>: 1Gbps mínimo</li>
</ul>
<h3 data-number="1.6.2" id="requisitos-de-software"><span
class="header-section-number">1.6.2</span> 5.2 Requisitos de
Software</h3>
<ul>
<li><strong>Sistema Operativo</strong>: Linux (Ubuntu 20.04+, Debian
11+, CentOS 8+)</li>
<li><strong>Docker</strong>: &gt;= 20.10</li>
<li><strong>Docker Compose</strong>: &gt;= 2.0</li>
<li><strong>Git</strong>: &gt;= 2.25 (para gestión de código)</li>
</ul>
<h3 data-number="1.6.3" id="puertos-requeridos"><span
class="header-section-number">1.6.3</span> 5.3 Puertos Requeridos</h3>
<table>
<thead>
<tr class="header">
<th>Puerto</th>
<th>Servicio</th>
<th>Propósito</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>8080</td>
<td>Nginx/HTTP</td>
<td>API y documentación</td>
</tr>
<tr class="even">
<td>3306</td>
<td>MariaDB</td>
<td>Base de datos</td>
</tr>
<tr class="odd">
<td>9000</td>
<td>PHP-FPM</td>
<td>Procesador PHP</td>
</tr>
<tr class="even">
<td>3000</td>
<td>Mercure</td>
<td>WebSocket/SSE</td>
</tr>
</tbody>
</table>
<hr />
<h2 data-number="1.7" id="instalación-y-configuración"><span
class="header-section-number">1.7</span> 6. Instalación y
Configuración</h2>
<h3 data-number="1.7.1" id="instalación-con-docker-recomendado"><span
class="header-section-number">1.7.1</span> 6.1 Instalación con Docker
(Recomendado)</h3>
<h4 data-number="1.7.1.1" id="clonar-el-repositorio"><span
class="header-section-number">1.7.1.1</span> 6.1.1 Clonar el
Repositorio</h4>
<div class="sourceCode" id="cb2"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb2-1"><a href="#cb2-1" aria-hidden="true" tabindex="-1"></a><span class="fu">git</span> clone <span class="op">&lt;</span>url-del-repositorio<span class="op">&gt;</span> ogcore</span>
<span id="cb2-2"><a href="#cb2-2" aria-hidden="true" tabindex="-1"></a><span class="bu">cd</span> ogcore</span></code></pre></div>
<h4 data-number="1.7.1.2" id="verificar-puertos-disponibles"><span
class="header-section-number">1.7.1.2</span> 6.1.2 Verificar Puertos
Disponibles</h4>
<p>Asegúrate de que los puertos 8080 y 3306 no estén en uso:</p>
<div class="sourceCode" id="cb3"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb3-1"><a href="#cb3-1" aria-hidden="true" tabindex="-1"></a><span class="fu">sudo</span> lsof <span class="at">-i</span> :8080</span>
<span id="cb3-2"><a href="#cb3-2" aria-hidden="true" tabindex="-1"></a><span class="fu">sudo</span> lsof <span class="at">-i</span> :3306</span></code></pre></div>
<h4 data-number="1.7.1.3" id="desplegar-contenedores"><span
class="header-section-number">1.7.1.3</span> 6.1.3 Desplegar
Contenedores</h4>
<div class="sourceCode" id="cb4"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb4-1"><a href="#cb4-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> compose up <span class="at">--build</span> <span class="at">-d</span></span></code></pre></div>
<h4 data-number="1.7.1.4" id="verificar-contenedores"><span
class="header-section-number">1.7.1.4</span> 6.1.4 Verificar
Contenedores</h4>
<div class="sourceCode" id="cb5"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb5-1"><a href="#cb5-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> ps</span></code></pre></div>
<p>Deberías ver tres contenedores activos: - <code>ogcore-nginx</code> -
<code>ogcore-php</code> - <code>ogcore-database</code></p>
<h4 data-number="1.7.1.5" id="instalar-dependencias"><span
class="header-section-number">1.7.1.5</span> 6.1.5 Instalar
Dependencias</h4>
<div class="sourceCode" id="cb6"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb6-1"><a href="#cb6-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php composer install</span></code></pre></div>
<h4 data-number="1.7.1.6" id="generar-claves-jwt"><span
class="header-section-number">1.7.1.6</span> 6.1.6 Generar Claves
JWT</h4>
<div class="sourceCode" id="cb7"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb7-1"><a href="#cb7-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console lexik:jwt:generate-keypair <span class="at">--overwrite</span></span></code></pre></div>
<h4 data-number="1.7.1.7" id="inicializar-base-de-datos"><span
class="header-section-number">1.7.1.7</span> 6.1.7 Inicializar Base de
Datos</h4>
<div class="sourceCode" id="cb8"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb8-1"><a href="#cb8-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Ejecutar migraciones</span></span>
<span id="cb8-2"><a href="#cb8-2" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:migrations:migrate <span class="at">--no-interaction</span></span>
<span id="cb8-3"><a href="#cb8-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-4"><a href="#cb8-4" aria-hidden="true" tabindex="-1"></a><span class="co"># Cargar datos iniciales (fixtures)</span></span>
<span id="cb8-5"><a href="#cb8-5" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:fixtures:load <span class="at">--no-interaction</span></span>
<span id="cb8-6"><a href="#cb8-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-7"><a href="#cb8-7" aria-hidden="true" tabindex="-1"></a><span class="co"># Cargar grupos de usuarios por defecto</span></span>
<span id="cb8-8"><a href="#cb8-8" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console app:load-default-user-groups</span>
<span id="cb8-9"><a href="#cb8-9" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb8-10"><a href="#cb8-10" aria-hidden="true" tabindex="-1"></a><span class="co"># Cargar comandos por defecto</span></span>
<span id="cb8-11"><a href="#cb8-11" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console app:load-default-commands</span></code></pre></div>
<h4 data-number="1.7.1.8" id="acceder-a-la-aplicación"><span
class="header-section-number">1.7.1.8</span> 6.1.8 Acceder a la
Aplicación</h4>
<p>Abre tu navegador y accede a:</p>
<pre><code>http://127.0.0.1:8080/docs</code></pre>
<p>Deberías ver la documentación Swagger de la API de ogCore.</p>
<h3 data-number="1.7.2" id="configuración"><span
class="header-section-number">1.7.2</span> 6.2 Configuración</h3>
<h4 data-number="1.7.2.1" id="variables-de-entorno"><span
class="header-section-number">1.7.2.1</span> 6.2.1 Variables de
Entorno</h4>
<p>El archivo <code>.env</code> contiene las variables de configuración
principales:</p>
<div class="sourceCode" id="cb10"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb10-1"><a href="#cb10-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Entorno</span></span>
<span id="cb10-2"><a href="#cb10-2" aria-hidden="true" tabindex="-1"></a><span class="va">APP_ENV</span><span class="op">=</span>dev</span>
<span id="cb10-3"><a href="#cb10-3" aria-hidden="true" tabindex="-1"></a><span class="va">APP_SECRET</span><span class="op">=&lt;</span>tu-secreto<span class="op">&gt;</span></span>
<span id="cb10-4"><a href="#cb10-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb10-5"><a href="#cb10-5" aria-hidden="true" tabindex="-1"></a><span class="co"># Base de datos</span></span>
<span id="cb10-6"><a href="#cb10-6" aria-hidden="true" tabindex="-1"></a><span class="va">DATABASE_URL</span><span class="op">=</span><span class="st">&quot;mysql://user:password@ogcore-database:3306/ogcore&quot;</span></span>
<span id="cb10-7"><a href="#cb10-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb10-8"><a href="#cb10-8" aria-hidden="true" tabindex="-1"></a><span class="co"># JWT</span></span>
<span id="cb10-9"><a href="#cb10-9" aria-hidden="true" tabindex="-1"></a><span class="va">JWT_SECRET_KEY</span><span class="op">=</span>%kernel.project_dir%/config/jwt/private.pem</span>
<span id="cb10-10"><a href="#cb10-10" aria-hidden="true" tabindex="-1"></a><span class="va">JWT_PUBLIC_KEY</span><span class="op">=</span>%kernel.project_dir%/config/jwt/public.pem</span>
<span id="cb10-11"><a href="#cb10-11" aria-hidden="true" tabindex="-1"></a><span class="va">JWT_PASSPHRASE</span><span class="op">=&lt;</span>tu-passphrase<span class="op">&gt;</span></span>
<span id="cb10-12"><a href="#cb10-12" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb10-13"><a href="#cb10-13" aria-hidden="true" tabindex="-1"></a><span class="co"># Mercure</span></span>
<span id="cb10-14"><a href="#cb10-14" aria-hidden="true" tabindex="-1"></a><span class="va">MERCURE_URL</span><span class="op">=</span>http://mercure:3000/.well-known/mercure</span>
<span id="cb10-15"><a href="#cb10-15" aria-hidden="true" tabindex="-1"></a><span class="va">MERCURE_PUBLIC_URL</span><span class="op">=</span>http://127.0.0.1:8080/.well-known/mercure</span>
<span id="cb10-16"><a href="#cb10-16" aria-hidden="true" tabindex="-1"></a><span class="va">MERCURE_JWT_SECRET</span><span class="op">=&lt;</span>tu-secreto-mercure<span class="op">&gt;</span></span>
<span id="cb10-17"><a href="#cb10-17" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb10-18"><a href="#cb10-18" aria-hidden="true" tabindex="-1"></a><span class="co"># Servicios externos</span></span>
<span id="cb10-19"><a href="#cb10-19" aria-hidden="true" tabindex="-1"></a><span class="va">REMOTE_PC_URL</span><span class="op">=&lt;</span>url-uds<span class="op">&gt;</span></span>
<span id="cb10-20"><a href="#cb10-20" aria-hidden="true" tabindex="-1"></a><span class="va">REMOTE_PC_AUTH_LOGIN</span><span class="op">=&lt;</span>login<span class="op">&gt;</span></span>
<span id="cb10-21"><a href="#cb10-21" aria-hidden="true" tabindex="-1"></a><span class="va">REMOTE_PC_AUTH_USERNAME</span><span class="op">=&lt;</span>username<span class="op">&gt;</span></span>
<span id="cb10-22"><a href="#cb10-22" aria-hidden="true" tabindex="-1"></a><span class="va">REMOTE_PC_AUTH_PASSWORD</span><span class="op">=&lt;</span>password<span class="op">&gt;</span></span>
<span id="cb10-23"><a href="#cb10-23" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb10-24"><a href="#cb10-24" aria-hidden="true" tabindex="-1"></a><span class="co"># SSL/TLS</span></span>
<span id="cb10-25"><a href="#cb10-25" aria-hidden="true" tabindex="-1"></a><span class="va">SSL_ENABLED</span><span class="op">=</span>false</span></code></pre></div>
<h4 data-number="1.7.2.2" id="configuración-de-cors"><span
class="header-section-number">1.7.2.2</span> 6.2.2 Configuración de
CORS</h4>
<p>Edita <code>config/packages/nelmio_cors.yaml</code> para configurar
CORS según tus necesidades.</p>
<h4 data-number="1.7.2.3" id="configuración-de-api-platform"><span
class="header-section-number">1.7.2.3</span> 6.2.3 Configuración de API
Platform</h4>
<p>La configuración de API Platform se encuentra en
<code>config/packages/api_platform.yaml</code>.</p>
<h3 data-number="1.7.3" id="instalación-en-producción"><span
class="header-section-number">1.7.3</span> 6.3 Instalación en
Producción</h3>
<p>Para entornos de producción, utiliza el archivo
<code>docker-compose-deploy.yml</code>:</p>
<div class="sourceCode" id="cb11"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb11-1"><a href="#cb11-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> compose <span class="at">-f</span> docker-compose-deploy.yml up <span class="at">-d</span></span></code></pre></div>
<p>Asegúrate de: - Cambiar todas las contraseñas por defecto -
Configurar SSL/TLS - Configurar backups automáticos de base de datos -
Configurar monitoreo y alertas - Revisar los límites de recursos de
Docker</p>
<hr />
<h2 data-number="1.8" id="modelo-de-datos"><span
class="header-section-number">1.8</span> 7. Modelo de Datos</h2>
<h3 data-number="1.8.1" id="diagrama-de-entidades"><span
class="header-section-number">1.8.1</span> 7.1 Diagrama de
Entidades</h3>
<p>El sistema cuenta con 35 entidades principales agrupadas en los
siguientes dominios:</p>
<h3 data-number="1.8.2" id="entidades-principales"><span
class="header-section-number">1.8.2</span> 7.2 Entidades
Principales</h3>
<h4 data-number="1.8.2.1" id="client-cliente"><span
class="header-section-number">1.8.2.1</span> 7.2.1 Client (Cliente)</h4>
<p>Representa un equipo físico en el sistema.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre del cliente - <code>serialNumber</code>:
Número de serie - <code>mac</code>: Dirección MAC (única) -
<code>ip</code>: Dirección IP (única) - <code>status</code>: Estado del
cliente (active, inactive, busy, windows, linux, etc.) -
<code>netiface</code>: Interfaz de red - <code>netDriver</code>: Driver
de red - <code>validation</code>: Estado de validación -
<code>maintenance</code>: Modo mantenimiento - <code>position</code>:
Posición en el aula (x, y) - <code>firmwareType</code>: Tipo de firmware
(BIOS/UEFI) - <code>agentJobId</code>: ID del trabajo del agente en
ejecución - <code>pxeSync</code>: Sincronización PXE -
<code>token</code>: Token de autenticación del cliente</p>
<p><strong>Relaciones:</strong> - <code>organizationalUnit</code>:
Pertenece a una unidad organizativa (aula/grupo) -
<code>partitions</code>: Tiene múltiples particiones -
<code>menu</code>: Menú de arranque asignado -
<code>hardwareProfile</code>: Perfil de hardware asociado -
<code>template</code>: Plantilla PXE asignada - <code>repository</code>:
Repositorio de imágenes - <code>subnet</code>: Subred a la que pertenece
- <code>ogLive</code>: Imagen Live asignada</p>
<h4 data-number="1.8.2.2"
id="organizationalunit-unidad-organizativa"><span
class="header-section-number">1.8.2.2</span> 7.2.2 OrganizationalUnit
(Unidad Organizativa)</h4>
<p>Representa aulas o grupos de equipos.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre de la unidad - <code>description</code>:
Descripción - <code>type</code>: Tipo (aula, grupo, etc.)</p>
<p><strong>Relaciones:</strong> - <code>parent</code>: Unidad
organizativa padre (jerarquía) - <code>children</code>: Unidades hijas -
<code>clients</code>: Clientes pertenecientes -
<code>networkSettings</code>: Configuración de red heredable -
<code>remoteCalendar</code>: Calendario remoto asociado</p>
<h4 data-number="1.8.2.3" id="image-imagen"><span
class="header-section-number">1.8.2.3</span> 7.2.3 Image (Imagen)</h4>
<p>Representa una imagen de sistema operativo.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre de la imagen - <code>description</code>:
Descripción - <code>type</code>: Tipo de imagen - <code>size</code>:
Tamaño en bytes - <code>partition</code>: Partición de origen -
<code>status</code>: Estado (creating, success, failed, etc.) -
<code>isGlobal</code>: Imagen global compartida -
<code>isVirtual</code>: Imagen virtual - <code>version</code>: Versión
de la imagen</p>
<p><strong>Relaciones:</strong> - <code>operativeSystem</code>: Sistema
operativo - <code>softwareProfile</code>: Perfil de software -
<code>repositories</code>: Repositorios que contienen la imagen -
<code>originClient</code>: Cliente origen de la imagen</p>
<h4 data-number="1.8.2.4" id="command-comando"><span
class="header-section-number">1.8.2.4</span> 7.2.4 Command
(Comando)</h4>
<p>Comandos ejecutables en el sistema.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre del comando - <code>description</code>:
Descripción - <code>script</code>: Script a ejecutar</p>
<p><strong>Relaciones:</strong> - <code>commandGroups</code>: Grupos de
comandos a los que pertenece</p>
<h4 data-number="1.8.2.5" id="commandtask-tarea-de-comando"><span
class="header-section-number">1.8.2.5</span> 7.2.5 CommandTask (Tarea de
Comando)</h4>
<p>Tarea programada para ejecutar comandos.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>datetime</code>: Fecha y hora de ejecución -
<code>parameters</code>: Parámetros de ejecución - <code>status</code>:
Estado de la tarea</p>
<p><strong>Relaciones:</strong> - <code>commands</code>: Comandos a
ejecutar - <code>commandGroups</code>: Grupos de comandos -
<code>clients</code>: Clientes objetivo - <code>schedule</code>:
Programación recurrente</p>
<h4 data-number="1.8.2.6" id="trace-traza"><span
class="header-section-number">1.8.2.6</span> 7.2.6 Trace (Traza)</h4>
<p>Registro de ejecución de comandos.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>command</code>: Nombre del comando ejecutado - <code>input</code>:
Parámetros de entrada - <code>output</code>: Resultado de ejecución -
<code>status</code>: Estado (pending, processing, success, failed,
cancelled) - <code>executedAt</code>: Fecha de ejecución -
<code>finishedAt</code>: Fecha de finalización - <code>cancelled</code>:
Indica si fue cancelada - <code>jobId</code>: ID del trabajo en el
agente</p>
<p><strong>Relaciones:</strong> - <code>client</code>: Cliente donde se
ejecutó</p>
<h4 data-number="1.8.2.7" id="hardwareprofile-perfil-de-hardware"><span
class="header-section-number">1.8.2.7</span> 7.2.7 HardwareProfile
(Perfil de Hardware)</h4>
<p>Inventario de hardware de un cliente.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>cpu</code>: Información de CPU - <code>ram</code>: Memoria RAM -
<code>storage</code>: Almacenamiento - <code>networkCards</code>:
Tarjetas de red</p>
<p><strong>Relaciones:</strong> - <code>client</code>: Cliente asociado
- <code>hardwareTypes</code>: Tipos de hardware detectados</p>
<h4 data-number="1.8.2.8" id="softwareprofile-perfil-de-software"><span
class="header-section-number">1.8.2.8</span> 7.2.8 SoftwareProfile
(Perfil de Software)</h4>
<p>Software instalado en una imagen.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre del perfil</p>
<p><strong>Relaciones:</strong> - <code>software</code>: Software
incluido - <code>images</code>: Imágenes que usan este perfil</p>
<h4 data-number="1.8.2.9"
id="imagerepository-repositorio-de-imágenes"><span
class="header-section-number">1.8.2.9</span> 7.2.9 ImageRepository
(Repositorio de Imágenes)</h4>
<p>Servidor de almacenamiento de imágenes.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre del repositorio (único) - <code>ip</code>:
Dirección IP o DNS (único) - <code>port</code>: Puerto -
<code>sshPort</code>: Puerto SSH - <code>sshUser</code>: Usuario SSH -
<code>apiKey</code>: Clave API - <code>status</code>: Estado del
repositorio</p>
<p><strong>Relaciones:</strong> - <code>images</code>: Imágenes
almacenadas</p>
<h4 data-number="1.8.2.10" id="subnet-subred"><span
class="header-section-number">1.8.2.10</span> 7.2.10 Subnet
(Subred)</h4>
<p>Configuración de red.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre de la subred - <code>cidr</code>: Notación
CIDR - <code>gateway</code>: Puerta de enlace - <code>dns</code>:
Servidores DNS - <code>dhcpStart</code>: Inicio rango DHCP -
<code>dhcpEnd</code>: Fin rango DHCP</p>
<p><strong>Relaciones:</strong> - <code>clients</code>: Clientes en la
subred</p>
<h4 data-number="1.8.2.11" id="partition-partición"><span
class="header-section-number">1.8.2.11</span> 7.2.11 Partition
(Partición)</h4>
<p>Partición de disco de un cliente.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>partitionNumber</code>: Número de partición -
<code>partitionType</code>: Tipo de partición -
<code>partitionSize</code>: Tamaño - <code>partitionCode</code>: Código
de partición - <code>usedSize</code>: Tamaño usado -
<code>filesystem</code>: Sistema de archivos</p>
<p><strong>Relaciones:</strong> - <code>client</code>: Cliente
propietario - <code>image</code>: Imagen desplegada -
<code>operativeSystem</code>: Sistema operativo instalado</p>
<h4 data-number="1.8.2.12" id="pxetemplate-plantilla-pxe"><span
class="header-section-number">1.8.2.12</span> 7.2.12 PxeTemplate
(Plantilla PXE)</h4>
<p>Plantilla de arranque PXE.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre de la plantilla - <code>content</code>:
Contenido de la plantilla - <code>default</code>: Plantilla por
defecto</p>
<p><strong>Relaciones:</strong> - <code>clients</code>: Clientes que
usan la plantilla</p>
<h4 data-number="1.8.2.13" id="remotecalendar-calendario-remoto"><span
class="header-section-number">1.8.2.13</span> 7.2.13 RemoteCalendar
(Calendario Remoto)</h4>
<p>Integración con sistemas de reservas remotas.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre del calendario - <code>url</code>: URL del
servicio - <code>available</code>: Disponibilidad</p>
<p><strong>Relaciones:</strong> - <code>organizationalUnits</code>:
Unidades organizativas asociadas - <code>rules</code>: Reglas del
calendario</p>
<h4 data-number="1.8.2.14" id="user-usuario"><span
class="header-section-number">1.8.2.14</span> 7.2.14 User (Usuario)</h4>
<p>Usuario del sistema.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>username</code>: Nombre de usuario (único) -
<code>password</code>: Contraseña (hasheada) - <code>email</code>:
Correo electrónico - <code>roles</code>: Roles del usuario</p>
<p><strong>Relaciones:</strong> - <code>userGroups</code>: Grupos de
usuarios - <code>view</code>: Vista preferida</p>
<h4 data-number="1.8.2.15" id="gitrepository-repositorio-git"><span
class="header-section-number">1.8.2.15</span> 7.2.15 GitRepository
(Repositorio Git)</h4>
<p>Repositorio Git para versionado de imágenes.</p>
<p><strong>Campos principales:</strong> - <code>id</code>: UUID único -
<code>name</code>: Nombre del repositorio - <code>url</code>: URL del
repositorio - <code>branch</code>: Rama - <code>credentials</code>:
Credenciales de acceso</p>
<h3 data-number="1.8.3" id="índices-y-optimizaciones"><span
class="header-section-number">1.8.3</span> 7.3 Índices y
Optimizaciones</h3>
<p>La base de datos está optimizada con índices en: - Campos de búsqueda
frecuente (status, updatedAt) - Campos únicos (IP, MAC, username) -
Claves foráneas - Índices compuestos para consultas complejas</p>
<hr />
<h2 data-number="1.9" id="componentes-del-sistema"><span
class="header-section-number">1.9</span> 8. Componentes del Sistema</h2>
<h3 data-number="1.9.1" id="controllers-controladores"><span
class="header-section-number">1.9.1</span> 8.1 Controllers
(Controladores)</h3>
<p>El sistema cuenta con <strong>102 controladores</strong> organizados
por dominio:</p>
<h4 data-number="1.9.1.1" id="controladores-principales"><span
class="header-section-number">1.9.1.1</span> Controladores
principales:</h4>
<ul>
<li><strong>ClientController</strong>: Gestión de clientes</li>
<li><strong>ImageController</strong>: Gestión de imágenes</li>
<li><strong>OrganizationalUnitController</strong>: Gestión de unidades
organizativas</li>
<li><strong>CommandController</strong>: Gestión de comandos</li>
<li><strong>TraceController</strong>: Gestión de trazas</li>
<li><strong>UserController</strong>: Gestión de usuarios</li>
<li><strong>SubnetController</strong>: Gestión de subredes</li>
<li><strong>RepositoryController</strong>: Gestión de repositorios</li>
</ul>
<h3 data-number="1.9.2" id="states-procesadores-de-estado"><span
class="header-section-number">1.9.2</span> 8.2 States (Procesadores de
Estado)</h3>
<p>Los States implementan el patrón State de API Platform:</p>
<h4 data-number="1.9.2.1" id="states-principales-55-procesadores"><span
class="header-section-number">1.9.2.1</span> States principales (55
procesadores):</h4>
<ul>
<li><strong>Providers</strong>: Obtención de datos</li>
<li><strong>Processors</strong>: Procesamiento de escritura</li>
<li><strong>Custom States</strong>: Lógica personalizada</li>
</ul>
<h3 data-number="1.9.3" id="dtos-data-transfer-objects"><span
class="header-section-number">1.9.3</span> 8.3 DTOs (Data Transfer
Objects)</h3>
<p><strong>93 DTOs</strong> para transferencia de datos:</p>
<h4 data-number="1.9.3.1" id="tipos-de-dtos"><span
class="header-section-number">1.9.3.1</span> Tipos de DTOs:</h4>
<ul>
<li><strong>Input DTOs</strong>: Para recepción de datos</li>
<li><strong>Output DTOs</strong>: Para envío de datos</li>
<li><strong>Transformation DTOs</strong>: Para transformaciones</li>
</ul>
<h3 data-number="1.9.4" id="validators-validadores"><span
class="header-section-number">1.9.4</span> 8.4 Validators
(Validadores)</h3>
<p><strong>18 validadores personalizados</strong> para: - Validación de
IPs y MACs - Validación de rangos DHCP - Validación de particiones -
Validación de imágenes - Validación de comandos - Validación de
usuarios</p>
<h3 data-number="1.9.5"
id="eventsubscribers-suscriptores-de-eventos"><span
class="header-section-number">1.9.5</span> 8.5 EventSubscribers
(Suscriptores de Eventos)</h3>
<p><strong>8 suscriptores</strong> para: - Publicación en Mercure al
cambiar estados - Limpieza de recursos - Validaciones pre/post
persistencia - Logging de eventos</p>
<h3 data-number="1.9.6" id="factories-fábricas"><span
class="header-section-number">1.9.6</span> 8.6 Factories (Fábricas)</h3>
<p><strong>24 factories</strong> para testing con Foundry: - Creación de
entidades para tests - Datos de prueba realistas - Estados
predefinidos</p>
<hr />
<h2 data-number="1.10" id="api-restful"><span
class="header-section-number">1.10</span> 9. API RESTful</h2>
<h3 data-number="1.10.1" id="documentación"><span
class="header-section-number">1.10.1</span> 9.1 Documentación</h3>
<p>La API está completamente documentada con <strong>OpenAPI
3.0</strong> y accesible en:</p>
<pre><code>http://127.0.0.1:8080/docs</code></pre>
<h3 data-number="1.10.2" id="formato-de-respuestas"><span
class="header-section-number">1.10.2</span> 9.2 Formato de
Respuestas</h3>
<h4 data-number="1.10.2.1" id="formato-estándar-json-ld"><span
class="header-section-number">1.10.2.1</span> Formato estándar
(JSON-LD):</h4>
<div class="sourceCode" id="cb13"><pre
class="sourceCode json"><code class="sourceCode json"><span id="cb13-1"><a href="#cb13-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span>
<span id="cb13-2"><a href="#cb13-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@context&quot;</span><span class="fu">:</span> <span class="st">&quot;/contexts/Client&quot;</span><span class="fu">,</span></span>
<span id="cb13-3"><a href="#cb13-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;/clients/123e4567-e89b-12d3-a456-426614174000&quot;</span><span class="fu">,</span></span>
<span id="cb13-4"><a href="#cb13-4" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;Client&quot;</span><span class="fu">,</span></span>
<span id="cb13-5"><a href="#cb13-5" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;id&quot;</span><span class="fu">:</span> <span class="st">&quot;123e4567-e89b-12d3-a456-426614174000&quot;</span><span class="fu">,</span></span>
<span id="cb13-6"><a href="#cb13-6" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;PC-01&quot;</span><span class="fu">,</span></span>
<span id="cb13-7"><a href="#cb13-7" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;mac&quot;</span><span class="fu">:</span> <span class="st">&quot;00:11:22:33:44:55&quot;</span><span class="fu">,</span></span>
<span id="cb13-8"><a href="#cb13-8" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;ip&quot;</span><span class="fu">:</span> <span class="st">&quot;192.168.1.100&quot;</span><span class="fu">,</span></span>
<span id="cb13-9"><a href="#cb13-9" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;status&quot;</span><span class="fu">:</span> <span class="st">&quot;active&quot;</span></span>
<span id="cb13-10"><a href="#cb13-10" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div>
<h4 data-number="1.10.2.2" id="formato-alternativo-json"><span
class="header-section-number">1.10.2.2</span> Formato alternativo
(JSON):</h4>
<div class="sourceCode" id="cb14"><pre
class="sourceCode json"><code class="sourceCode json"><span id="cb14-1"><a href="#cb14-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span>
<span id="cb14-2"><a href="#cb14-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;id&quot;</span><span class="fu">:</span> <span class="st">&quot;123e4567-e89b-12d3-a456-426614174000&quot;</span><span class="fu">,</span></span>
<span id="cb14-3"><a href="#cb14-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;name&quot;</span><span class="fu">:</span> <span class="st">&quot;PC-01&quot;</span><span class="fu">,</span></span>
<span id="cb14-4"><a href="#cb14-4" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;mac&quot;</span><span class="fu">:</span> <span class="st">&quot;00:11:22:33:44:55&quot;</span><span class="fu">,</span></span>
<span id="cb14-5"><a href="#cb14-5" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;ip&quot;</span><span class="fu">:</span> <span class="st">&quot;192.168.1.100&quot;</span><span class="fu">,</span></span>
<span id="cb14-6"><a href="#cb14-6" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;status&quot;</span><span class="fu">:</span> <span class="st">&quot;active&quot;</span></span>
<span id="cb14-7"><a href="#cb14-7" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div>
<h3 data-number="1.10.3" id="paginación"><span
class="header-section-number">1.10.3</span> 9.3 Paginación</h3>
<p>Todas las colecciones soportan paginación:</p>
<pre><code>GET /clients?page=1&amp;itemsPerPage=30</code></pre>
<p>Respuesta:</p>
<div class="sourceCode" id="cb16"><pre
class="sourceCode json"><code class="sourceCode json"><span id="cb16-1"><a href="#cb16-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span>
<span id="cb16-2"><a href="#cb16-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@context&quot;</span><span class="fu">:</span> <span class="st">&quot;/contexts/Client&quot;</span><span class="fu">,</span></span>
<span id="cb16-3"><a href="#cb16-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;/clients&quot;</span><span class="fu">,</span></span>
<span id="cb16-4"><a href="#cb16-4" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;hydra:Collection&quot;</span><span class="fu">,</span></span>
<span id="cb16-5"><a href="#cb16-5" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;hydra:member&quot;</span><span class="fu">:</span> <span class="ot">[</span><span class="er">...</span><span class="ot">]</span><span class="fu">,</span></span>
<span id="cb16-6"><a href="#cb16-6" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;hydra:totalItems&quot;</span><span class="fu">:</span> <span class="dv">150</span><span class="fu">,</span></span>
<span id="cb16-7"><a href="#cb16-7" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;hydra:view&quot;</span><span class="fu">:</span> <span class="fu">{</span></span>
<span id="cb16-8"><a href="#cb16-8" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@id&quot;</span><span class="fu">:</span> <span class="st">&quot;/clients?page=1&quot;</span><span class="fu">,</span></span>
<span id="cb16-9"><a href="#cb16-9" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;@type&quot;</span><span class="fu">:</span> <span class="st">&quot;hydra:PartialCollectionView&quot;</span><span class="fu">,</span></span>
<span id="cb16-10"><a href="#cb16-10" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;hydra:first&quot;</span><span class="fu">:</span> <span class="st">&quot;/clients?page=1&quot;</span><span class="fu">,</span></span>
<span id="cb16-11"><a href="#cb16-11" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;hydra:last&quot;</span><span class="fu">:</span> <span class="st">&quot;/clients?page=5&quot;</span><span class="fu">,</span></span>
<span id="cb16-12"><a href="#cb16-12" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;hydra:next&quot;</span><span class="fu">:</span> <span class="st">&quot;/clients?page=2&quot;</span></span>
<span id="cb16-13"><a href="#cb16-13" aria-hidden="true" tabindex="-1"></a> <span class="fu">}</span></span>
<span id="cb16-14"><a href="#cb16-14" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div>
<h3 data-number="1.10.4" id="filtrado"><span
class="header-section-number">1.10.4</span> 9.4 Filtrado</h3>
<p>Soporta filtros avanzados:</p>
<pre><code>GET /clients?status=active
GET /clients?organizationalUnit.name=Aula1
GET /traces?client.id=123&amp;status=pending</code></pre>
<h3 data-number="1.10.5" id="ordenamiento"><span
class="header-section-number">1.10.5</span> 9.5 Ordenamiento</h3>
<pre><code>GET /clients?order[name]=asc
GET /traces?order[createdAt]=desc</code></pre>
<h3 data-number="1.10.6" id="endpoints-principales"><span
class="header-section-number">1.10.6</span> 9.6 Endpoints
Principales</h3>
<h4 data-number="1.10.6.1" id="autenticación"><span
class="header-section-number">1.10.6.1</span> 9.6.1 Autenticación</h4>
<pre><code>POST /auth/login
POST /auth/refresh</code></pre>
<h4 data-number="1.10.6.2" id="clientes"><span
class="header-section-number">1.10.6.2</span> 9.6.2 Clientes</h4>
<pre><code>GET /clients
POST /clients
GET /clients/{id}
PUT /clients/{id}
PATCH /clients/{id}
DELETE /clients/{id}
POST /clients/batch
POST /clients/{id}/power-on
POST /clients/{id}/power-off
POST /clients/{id}/reboot</code></pre>
<h4 data-number="1.10.6.3" id="imágenes"><span
class="header-section-number">1.10.6.3</span> 9.6.3 Imágenes</h4>
<pre><code>GET /images
POST /images
GET /images/{id}
PUT /images/{id}
DELETE /images/{id}
POST /images/{id}/deploy
POST /images/{id}/create
POST /images/{id}/backup</code></pre>
<h4 data-number="1.10.6.4" id="comandos-y-tareas"><span
class="header-section-number">1.10.6.4</span> 9.6.4 Comandos y
Tareas</h4>
<pre><code>GET /commands
POST /commands
GET /command-tasks
POST /command-tasks
PUT /command-tasks/{id}
DELETE /command-tasks/{id}</code></pre>
<h4 data-number="1.10.6.5" id="trazas"><span
class="header-section-number">1.10.6.5</span> 9.6.5 Trazas</h4>
<pre><code>GET /traces
GET /traces/{id}
PUT /traces/{id}
PATCH /traces/{id}/complete
PATCH /traces/{id}/cancel</code></pre>
<h3 data-number="1.10.7" id="códigos-de-estado-http"><span
class="header-section-number">1.10.7</span> 9.7 Códigos de Estado
HTTP</h3>
<table>
<thead>
<tr class="header">
<th>Código</th>
<th>Significado</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>200</td>
<td>OK - Operación exitosa</td>
</tr>
<tr class="even">
<td>201</td>
<td>Created - Recurso creado</td>
</tr>
<tr class="odd">
<td>204</td>
<td>No Content - Eliminación exitosa</td>
</tr>
<tr class="even">
<td>400</td>
<td>Bad Request - Datos inválidos</td>
</tr>
<tr class="odd">
<td>401</td>
<td>Unauthorized - No autenticado</td>
</tr>
<tr class="even">
<td>403</td>
<td>Forbidden - Sin permisos</td>
</tr>
<tr class="odd">
<td>404</td>
<td>Not Found - Recurso no encontrado</td>
</tr>
<tr class="even">
<td>409</td>
<td>Conflict - Conflicto (cliente ocupado, constraint violation)</td>
</tr>
<tr class="odd">
<td>422</td>
<td>Unprocessable Entity - Validación fallida</td>
</tr>
<tr class="even">
<td>500</td>
<td>Internal Server Error - Error del servidor</td>
</tr>
</tbody>
</table>
<hr />
<h2 data-number="1.11" id="seguridad-y-autenticación"><span
class="header-section-number">1.11</span> 10. Seguridad y
Autenticación</h2>
<h3 data-number="1.11.1" id="sistema-de-autenticación-jwt"><span
class="header-section-number">1.11.1</span> 10.1 Sistema de
Autenticación JWT</h3>
<p>ogCore utiliza <strong>JSON Web Tokens (JWT)</strong> para
autenticación:</p>
<h4 data-number="1.11.1.1" id="obtener-token"><span
class="header-section-number">1.11.1.1</span> 10.1.1 Obtener Token</h4>
<div class="sourceCode" id="cb24"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb24-1"><a href="#cb24-1" aria-hidden="true" tabindex="-1"></a><span class="ex">POST</span> /auth/login</span>
<span id="cb24-2"><a href="#cb24-2" aria-hidden="true" tabindex="-1"></a><span class="ex">Content-Type:</span> application/json</span>
<span id="cb24-3"><a href="#cb24-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb24-4"><a href="#cb24-4" aria-hidden="true" tabindex="-1"></a><span class="kw">{</span></span>
<span id="cb24-5"><a href="#cb24-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;username&quot;</span><span class="ex">:</span> <span class="st">&quot;admin&quot;</span>,</span>
<span id="cb24-6"><a href="#cb24-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;password&quot;</span><span class="ex">:</span> <span class="st">&quot;password&quot;</span></span>
<span id="cb24-7"><a href="#cb24-7" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span></code></pre></div>
<p>Respuesta:</p>
<div class="sourceCode" id="cb25"><pre
class="sourceCode json"><code class="sourceCode json"><span id="cb25-1"><a href="#cb25-1" aria-hidden="true" tabindex="-1"></a><span class="fu">{</span></span>
<span id="cb25-2"><a href="#cb25-2" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;token&quot;</span><span class="fu">:</span> <span class="st">&quot;eyJ0eXAiOiJKV1QiLCJhbGc...&quot;</span><span class="fu">,</span></span>
<span id="cb25-3"><a href="#cb25-3" aria-hidden="true" tabindex="-1"></a> <span class="dt">&quot;refresh_token&quot;</span><span class="fu">:</span> <span class="st">&quot;def50200a54b7b...&quot;</span></span>
<span id="cb25-4"><a href="#cb25-4" aria-hidden="true" tabindex="-1"></a><span class="fu">}</span></span></code></pre></div>
<h4 data-number="1.11.1.2" id="usar-token"><span
class="header-section-number">1.11.1.2</span> 10.1.2 Usar Token</h4>
<p>Incluir el token en el header <code>Authorization</code>:</p>
<div class="sourceCode" id="cb26"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb26-1"><a href="#cb26-1" aria-hidden="true" tabindex="-1"></a><span class="ex">GET</span> /clients</span>
<span id="cb26-2"><a href="#cb26-2" aria-hidden="true" tabindex="-1"></a><span class="ex">Authorization:</span> Bearer eyJ0eXAiOiJKV1QiLCJhbGc...</span></code></pre></div>
<h4 data-number="1.11.1.3" id="refresh-token"><span
class="header-section-number">1.11.1.3</span> 10.1.3 Refresh Token</h4>
<div class="sourceCode" id="cb27"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb27-1"><a href="#cb27-1" aria-hidden="true" tabindex="-1"></a><span class="ex">POST</span> /auth/refresh</span>
<span id="cb27-2"><a href="#cb27-2" aria-hidden="true" tabindex="-1"></a><span class="ex">Content-Type:</span> application/json</span>
<span id="cb27-3"><a href="#cb27-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb27-4"><a href="#cb27-4" aria-hidden="true" tabindex="-1"></a><span class="kw">{</span></span>
<span id="cb27-5"><a href="#cb27-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&quot;refresh_token&quot;</span><span class="ex">:</span> <span class="st">&quot;def50200a54b7b...&quot;</span></span>
<span id="cb27-6"><a href="#cb27-6" aria-hidden="true" tabindex="-1"></a><span class="kw">}</span></span></code></pre></div>
<h3 data-number="1.11.2" id="control-de-acceso"><span
class="header-section-number">1.11.2</span> 10.2 Control de Acceso</h3>
<h4 data-number="1.11.2.1" id="rutas-públicas"><span
class="header-section-number">1.11.2.1</span> Rutas Públicas:</h4>
<ul>
<li><code>/auth/login</code></li>
<li><code>/auth/refresh</code></li>
<li><code>/docs</code></li>
<li><code>/opengnsys/rest/*</code> (webhooks)</li>
<li><code>/og-repository/webhook</code></li>
<li><code>/menu-browser</code></li>
</ul>
<h4 data-number="1.11.2.2" id="rutas-protegidas"><span
class="header-section-number">1.11.2.2</span> Rutas Protegidas:</h4>
<ul>
<li>Todo lo demás requiere <code>IS_AUTHENTICATED_FULLY</code></li>
</ul>
<h3 data-number="1.11.3" id="roles-de-usuario"><span
class="header-section-number">1.11.3</span> 10.3 Roles de Usuario</h3>
<p>Los roles se gestionan en la entidad <code>User</code>:</p>
<div class="sourceCode" id="cb28"><pre
class="sourceCode php"><code class="sourceCode php"><span id="cb28-1"><a href="#cb28-1" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span>-&gt;setRoles([<span class="st">&#39;ROLE_USER&#39;</span>])<span class="ot">;</span></span>
<span id="cb28-2"><a href="#cb28-2" aria-hidden="true" tabindex="-1"></a><span class="va">$user</span>-&gt;setRoles([<span class="st">&#39;ROLE_ADMIN&#39;</span>])<span class="ot">;</span></span></code></pre></div>
<h3 data-number="1.11.4" id="seguridad-de-contraseñas"><span
class="header-section-number">1.11.4</span> 10.4 Seguridad de
Contraseñas</h3>
<ul>
<li>Hashing con <strong>bcrypt</strong> automático</li>
<li>Validación de fortaleza</li>
<li>Cambio de contraseña seguro</li>
</ul>
<h3 data-number="1.11.5" id="cors-cross-origin-resource-sharing"><span
class="header-section-number">1.11.5</span> 10.5 CORS (Cross-Origin
Resource Sharing)</h3>
<p>Configurado en <code>nelmio_cors.yaml</code> para permitir acceso
desde frontend.</p>
<h3 data-number="1.11.6" id="ssltls"><span
class="header-section-number">1.11.6</span> 10.6 SSL/TLS</h3>
<p>Para producción, habilitar SSL:</p>
<div class="sourceCode" id="cb29"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb29-1"><a href="#cb29-1" aria-hidden="true" tabindex="-1"></a><span class="va">SSL_ENABLED</span><span class="op">=</span>true</span></code></pre></div>
<p>Configurar certificados en <code>/certs/</code>.</p>
<hr />
<h2 data-number="1.12" id="servicios-principales"><span
class="header-section-number">1.12</span> 11. Servicios Principales</h2>
<h3 data-number="1.12.1" id="createpartitionservice"><span
class="header-section-number">1.12.1</span> 11.1
CreatePartitionService</h3>
<p><strong>Propósito</strong>: Crear y actualizar particiones de
clientes.</p>
<p><strong>Funcionalidad</strong>: - Recibe información de particiones
del agente - Crea/actualiza particiones en base de datos - Detecta tipo
de firmware (BIOS/UEFI) - Calcula códigos de partición</p>
<h3 data-number="1.12.2" id="createtraceservice"><span
class="header-section-number">1.12.2</span> 11.2 CreateTraceService</h3>
<p><strong>Propósito</strong>: Crear trazas de ejecución para tareas
programadas.</p>
<p><strong>Funcionalidad</strong>: - Genera trazas para cada combinación
cliente-comando - Gestiona comandos agrupados - Establece estado inicial
y fecha de ejecución</p>
<h3 data-number="1.12.3" id="changeclientnetworksettingsservice"><span
class="header-section-number">1.12.3</span> 11.3
ChangeClientNetworkSettingsService</h3>
<p><strong>Propósito</strong>: Cambiar configuración de red de
clientes.</p>
<p><strong>Funcionalidad</strong>: - Actualiza subnet, IP, configuración
de red - Sincroniza con servicios externos (DHCP)</p>
<h3 data-number="1.12.4" id="externalgitrepositoryservice"><span
class="header-section-number">1.12.4</span> 11.4
ExternalGitRepositoryService</h3>
<p><strong>Propósito</strong>: Gestión de repositorios Git para
imágenes.</p>
<p><strong>Funcionalidad</strong>: - Backup de imágenes a Git -
Versionado de imágenes - Sincronización con repositorios remotos</p>
<h3 data-number="1.12.5"
id="statusservice-ogbootogdhcpogrepository"><span
class="header-section-number">1.12.5</span> 11.5 StatusService
(OgBoot/OgDhcp/OgRepository)</h3>
<p><strong>Propósito</strong>: Verificar estado de servicios
externos.</p>
<p><strong>Funcionalidad</strong>: - Health checks de servicios - Manejo
de errores de conexión - Logging de estado</p>
<h3 data-number="1.12.6" id="udsclient"><span
class="header-section-number">1.12.6</span> 11.6 UDSClient</h3>
<p><strong>Propósito</strong>: Integración con UDS (Universal Desktop
Services).</p>
<p><strong>Funcionalidad</strong>: - Autenticación con UDS - Obtención
de service pools - Cálculo de asientos disponibles - Gestión de
calendarios remotos</p>
<h3 data-number="1.12.7" id="tracecreateservice"><span
class="header-section-number">1.12.7</span> 11.7
Trace/CreateService</h3>
<p><strong>Propósito</strong>: Servicio especializado para creación de
trazas.</p>
<p><strong>Funcionalidad</strong>: - Validación de parámetros de entrada
- Creación de trazas individuales o masivas</p>
<h3 data-number="1.12.8" id="utilsgetpartitioncodeservice"><span
class="header-section-number">1.12.8</span> 11.8
Utils/GetPartitionCodeService</h3>
<p><strong>Propósito</strong>: Obtener código de partición según tipo y
filesystem.</p>
<h3 data-number="1.12.9" id="utilssimplifyoglivefilenameservice"><span
class="header-section-number">1.12.9</span> 11.9
Utils/SimplifyOgLiveFilenameService</h3>
<p><strong>Propósito</strong>: Simplificar nombres de archivos OgLive
para mostrar al usuario.</p>
<h3 data-number="1.12.10"
id="utilsgetipaddressandnetmaskfromcidrservice"><span
class="header-section-number">1.12.10</span> 11.10
Utils/GetIpAddressAndNetmaskFromCIDRService</h3>
<p><strong>Propósito</strong>: Convertir notación CIDR a IP y máscara de
red.</p>
<hr />
<h2 data-number="1.13" id="comandos-de-consola"><span
class="header-section-number">1.13</span> 12. Comandos de Consola</h2>
<p>ogCore incluye <strong>18 comandos de consola</strong> para tareas
administrativas:</p>
<h3 data-number="1.13.1" id="comandos-de-inicialización"><span
class="header-section-number">1.13.1</span> 12.1 Comandos de
Inicialización</h3>
<h4 data-number="1.13.1.1"
id="cargar-grupos-de-usuario-por-defecto"><span
class="header-section-number">1.13.1.1</span> 12.1.1 Cargar Grupos de
Usuario por Defecto</h4>
<div class="sourceCode" id="cb30"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb30-1"><a href="#cb30-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:load-default-user-groups</span></code></pre></div>
<p>Crea los grupos de usuarios predeterminados del sistema.</p>
<h4 data-number="1.13.1.2" id="cargar-comandos-por-defecto"><span
class="header-section-number">1.13.1.2</span> 12.1.2 Cargar Comandos por
Defecto</h4>
<div class="sourceCode" id="cb31"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb31-1"><a href="#cb31-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:load-default-commands</span></code></pre></div>
<p>Carga los comandos básicos del sistema.</p>
<h4 data-number="1.13.1.3" id="cargar-usuario-admin"><span
class="header-section-number">1.13.1.3</span> 12.1.3 Cargar Usuario
Admin</h4>
<div class="sourceCode" id="cb32"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb32-1"><a href="#cb32-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:load-default-user-admin</span></code></pre></div>
<p>Crea el usuario administrador por defecto.</p>
<h4 data-number="1.13.1.4" id="cargar-menú-por-defecto"><span
class="header-section-number">1.13.1.4</span> 12.1.4 Cargar Menú por
Defecto</h4>
<div class="sourceCode" id="cb33"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb33-1"><a href="#cb33-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:load-default-menu</span></code></pre></div>
<p>Carga menús de arranque predeterminados.</p>
<h4 data-number="1.13.1.5" id="cargar-tipos-de-hardware"><span
class="header-section-number">1.13.1.5</span> 12.1.5 Cargar Tipos de
Hardware</h4>
<div class="sourceCode" id="cb34"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb34-1"><a href="#cb34-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:load-hardware-types</span></code></pre></div>
<p>Inicializa la tabla de tipos de hardware.</p>
<h4 data-number="1.13.1.6"
id="cargar-unidad-organizativa-por-defecto"><span
class="header-section-number">1.13.1.6</span> 12.1.6 Cargar Unidad
Organizativa por Defecto</h4>
<div class="sourceCode" id="cb35"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb35-1"><a href="#cb35-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:load-organizational-unit-default</span></code></pre></div>
<p>Crea la unidad organizativa raíz.</p>
<h3 data-number="1.13.2" id="comandos-de-operación"><span
class="header-section-number">1.13.2</span> 12.2 Comandos de
Operación</h3>
<h4 data-number="1.13.2.1"
id="verificar-disponibilidad-de-clientes"><span
class="header-section-number">1.13.2.1</span> 12.2.1 Verificar
Disponibilidad de Clientes</h4>
<div class="sourceCode" id="cb36"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb36-1"><a href="#cb36-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:check-client-availability</span></code></pre></div>
<p><strong>Ejecución</strong>: Cada 1 minuto (cron)</p>
<p>Verifica el estado de conectividad de los clientes y actualiza su
estado si no responden en un tiempo determinado.</p>
<h4 data-number="1.13.2.2" id="ejecutar-trazas-pendientes"><span
class="header-section-number">1.13.2.2</span> 12.2.2 Ejecutar Trazas
Pendientes</h4>
<div class="sourceCode" id="cb37"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb37-1"><a href="#cb37-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:execute-pending-traces</span></code></pre></div>
<p><strong>Ejecución</strong>: Cada 1 minuto (cron)</p>
<p>Procesa las trazas en estado <code>PENDING</code> y las ejecuta en
los clientes correspondientes.</p>
<h4 data-number="1.13.2.3" id="ejecutar-tareas-programadas"><span
class="header-section-number">1.13.2.3</span> 12.2.3 Ejecutar Tareas
Programadas</h4>
<div class="sourceCode" id="cb38"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb38-1"><a href="#cb38-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:run-scheduled-command-tasks</span></code></pre></div>
<p><strong>Ejecución</strong>: Cada 1 minuto (cron)</p>
<p>Ejecuta tareas programadas que han llegado a su hora de
ejecución.</p>
<h3 data-number="1.13.3" id="comandos-de-migración"><span
class="header-section-number">1.13.3</span> 12.3 Comandos de
Migración</h3>
<p>Comandos para migrar datos desde OpenGnsys 1.1:</p>
<h4 data-number="1.13.3.1" id="migrar-unidades-organizativas"><span
class="header-section-number">1.13.3.1</span> 12.3.1 Migrar Unidades
Organizativas</h4>
<div class="sourceCode" id="cb39"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb39-1"><a href="#cb39-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console opengnsys:migration:organizational-unit</span></code></pre></div>
<h4 data-number="1.13.3.2" id="migrar-perfiles-de-hardware"><span
class="header-section-number">1.13.3.2</span> 12.3.2 Migrar Perfiles de
Hardware</h4>
<div class="sourceCode" id="cb40"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb40-1"><a href="#cb40-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console opengnsys:migration:hardware-profile</span></code></pre></div>
<h4 data-number="1.13.3.3" id="migrar-clientes"><span
class="header-section-number">1.13.3.3</span> 12.3.3 Migrar
Clientes</h4>
<div class="sourceCode" id="cb41"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb41-1"><a href="#cb41-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console opengnsys:migration:clients</span></code></pre></div>
<h4 data-number="1.13.3.4" id="migrar-sistemas-operativos"><span
class="header-section-number">1.13.3.4</span> 12.3.4 Migrar Sistemas
Operativos</h4>
<div class="sourceCode" id="cb42"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb42-1"><a href="#cb42-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console opengnsys:migration:os</span></code></pre></div>
<h4 data-number="1.13.3.5" id="migrar-imágenes"><span
class="header-section-number">1.13.3.5</span> 12.3.5 Migrar
Imágenes</h4>
<div class="sourceCode" id="cb43"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb43-1"><a href="#cb43-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console opengnsys:migration:image</span></code></pre></div>
<h4 data-number="1.13.3.6" id="migrar-perfiles-de-software"><span
class="header-section-number">1.13.3.6</span> 12.3.6 Migrar Perfiles de
Software</h4>
<div class="sourceCode" id="cb44"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb44-1"><a href="#cb44-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console opengnsys:migration:software-profile</span></code></pre></div>
<h4 data-number="1.13.3.7" id="migrar-particiones-de-clientes"><span
class="header-section-number">1.13.3.7</span> 12.3.7 Migrar Particiones
de Clientes</h4>
<div class="sourceCode" id="cb45"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb45-1"><a href="#cb45-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console opengnsys:migration:partition-client</span></code></pre></div>
<h3 data-number="1.13.4" id="comandos-de-desarrollo"><span
class="header-section-number">1.13.4</span> 12.4 Comandos de
Desarrollo</h3>
<h4 data-number="1.13.4.1" id="crear-repositorios-de-imágenes"><span
class="header-section-number">1.13.4.1</span> 12.4.1 Crear Repositorios
de Imágenes</h4>
<div class="sourceCode" id="cb46"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb46-1"><a href="#cb46-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:create-image-repositories</span></code></pre></div>
<p>Crea repositorios de imágenes para desarrollo/testing.</p>
<h4 data-number="1.13.4.2" id="cargar-trazas-de-ejemplo"><span
class="header-section-number">1.13.4.2</span> 12.4.2 Cargar Trazas de
Ejemplo</h4>
<div class="sourceCode" id="cb47"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb47-1"><a href="#cb47-1" aria-hidden="true" tabindex="-1"></a><span class="ex">php</span> bin/console app:charge-example-trace</span></code></pre></div>
<p>Carga trazas de ejemplo para testing.</p>
<h3 data-number="1.13.5" id="configuración-de-cron"><span
class="header-section-number">1.13.5</span> 12.5 Configuración de
Cron</h3>
<p>Agregar al crontab:</p>
<div class="sourceCode" id="cb48"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb48-1"><a href="#cb48-1" aria-hidden="true" tabindex="-1"></a><span class="ex">*</span> <span class="pp">*</span> <span class="pp">*</span> <span class="pp">*</span> <span class="pp">*</span> docker exec ogcore-php php bin/console app:check-client-availability</span>
<span id="cb48-2"><a href="#cb48-2" aria-hidden="true" tabindex="-1"></a><span class="ex">*</span> <span class="pp">*</span> <span class="pp">*</span> <span class="pp">*</span> <span class="pp">*</span> docker exec ogcore-php php bin/console app:execute-pending-traces</span>
<span id="cb48-3"><a href="#cb48-3" aria-hidden="true" tabindex="-1"></a><span class="ex">*</span> <span class="pp">*</span> <span class="pp">*</span> <span class="pp">*</span> <span class="pp">*</span> docker exec ogcore-php php bin/console app:run-scheduled-command-tasks</span></code></pre></div>
<hr />
<h2 data-number="1.14" id="migraciones-de-datos"><span
class="header-section-number">1.14</span> 13. Migraciones de Datos</h2>
<h3 data-number="1.14.1" id="sistema-de-migraciones-de-doctrine"><span
class="header-section-number">1.14.1</span> 13.1 Sistema de Migraciones
de Doctrine</h3>
<p>ogCore utiliza Doctrine Migrations para gestionar cambios en el
esquema de base de datos.</p>
<h4 data-number="1.14.1.1" id="crear-una-migración"><span
class="header-section-number">1.14.1.1</span> 13.1.1 Crear una
Migración</h4>
<div class="sourceCode" id="cb49"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb49-1"><a href="#cb49-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console make:migration</span></code></pre></div>
<h4 data-number="1.14.1.2" id="ejecutar-migraciones"><span
class="header-section-number">1.14.1.2</span> 13.1.2 Ejecutar
Migraciones</h4>
<div class="sourceCode" id="cb50"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb50-1"><a href="#cb50-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:migrations:migrate</span></code></pre></div>
<h4 data-number="1.14.1.3" id="ver-estado-de-migraciones"><span
class="header-section-number">1.14.1.3</span> 13.1.3 Ver Estado de
Migraciones</h4>
<div class="sourceCode" id="cb51"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb51-1"><a href="#cb51-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:migrations:status</span></code></pre></div>
<h4 data-number="1.14.1.4" id="revertir-migración"><span
class="header-section-number">1.14.1.4</span> 13.1.4 Revertir
Migración</h4>
<div class="sourceCode" id="cb52"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb52-1"><a href="#cb52-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:migrations:migrate prev</span></code></pre></div>
<h3 data-number="1.14.2" id="migración-desde-opengnsys-1.1"><span
class="header-section-number">1.14.2</span> 13.2 Migración desde
OpenGnsys 1.1</h3>
<p>Para migrar datos desde una instalación de OpenGnsys 1.1:</p>
<h4 data-number="1.14.2.1" id="crear-base-de-datos-temporal"><span
class="header-section-number">1.14.2.1</span> 13.2.1 Crear Base de Datos
Temporal</h4>
<div class="sourceCode" id="cb53"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb53-1"><a href="#cb53-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:database:create <span class="at">--connection</span><span class="op">=</span>og_1</span></code></pre></div>
<h4 data-number="1.14.2.2" id="cargar-dump-de-opengnsys-1.1"><span
class="header-section-number">1.14.2.2</span> 13.2.2 Cargar Dump de
OpenGnsys 1.1</h4>
<div class="sourceCode" id="cb54"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb54-1"><a href="#cb54-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec <span class="at">-i</span> ogcore-database mysql <span class="at">-u</span> user <span class="at">-p</span> ogcore_old_og <span class="op">&lt;</span> dump_og_1.1.sql</span></code></pre></div>
<h4 data-number="1.14.2.3" id="ejecutar-migraciones-1"><span
class="header-section-number">1.14.2.3</span> 13.2.3 Ejecutar
Migraciones</h4>
<p>Ejecutar los comandos de migración en orden:</p>
<div class="sourceCode" id="cb55"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb55-1"><a href="#cb55-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console opengnsys:migration:organizational-unit</span>
<span id="cb55-2"><a href="#cb55-2" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console opengnsys:migration:hardware-profile</span>
<span id="cb55-3"><a href="#cb55-3" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console opengnsys:migration:clients</span>
<span id="cb55-4"><a href="#cb55-4" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console opengnsys:migration:os</span>
<span id="cb55-5"><a href="#cb55-5" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console opengnsys:migration:image</span>
<span id="cb55-6"><a href="#cb55-6" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console opengnsys:migration:software-profile</span></code></pre></div>
<h3 data-number="1.14.3" id="backup-y-restauración"><span
class="header-section-number">1.14.3</span> 13.3 Backup y
Restauración</h3>
<h4 data-number="1.14.3.1" id="backup-de-base-de-datos"><span
class="header-section-number">1.14.3.1</span> 13.3.1 Backup de Base de
Datos</h4>
<div class="sourceCode" id="cb56"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb56-1"><a href="#cb56-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-database mysqldump <span class="at">-u</span> user <span class="at">-p</span> ogcore <span class="op">&gt;</span> backup_<span class="va">$(</span><span class="fu">date</span> +%Y%m%d<span class="va">)</span>.sql</span></code></pre></div>
<h4 data-number="1.14.3.2" id="restaurar-base-de-datos"><span
class="header-section-number">1.14.3.2</span> 13.3.2 Restaurar Base de
Datos</h4>
<div class="sourceCode" id="cb57"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb57-1"><a href="#cb57-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec <span class="at">-i</span> ogcore-database mysql <span class="at">-u</span> user <span class="at">-p</span> ogcore <span class="op">&lt;</span> backup_20251008.sql</span></code></pre></div>
<hr />
<h2 data-number="1.15" id="testing-1"><span
class="header-section-number">1.15</span> 14. Testing</h2>
<h3 data-number="1.15.1" id="framework-de-testing"><span
class="header-section-number">1.15.1</span> 14.1 Framework de
Testing</h3>
<p>ogCore utiliza <strong>PHPUnit</strong> con integración de Symfony y
Doctrine.</p>
<h3 data-number="1.15.2" id="ejecutar-tests"><span
class="header-section-number">1.15.2</span> 14.2 Ejecutar Tests</h3>
<h4 data-number="1.15.2.1" id="todos-los-tests"><span
class="header-section-number">1.15.2.1</span> 14.2.1 Todos los
Tests</h4>
<div class="sourceCode" id="cb58"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb58-1"><a href="#cb58-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> compose exec php bin/phpunit</span></code></pre></div>
<h4 data-number="1.15.2.2" id="tests-específicos"><span
class="header-section-number">1.15.2.2</span> 14.2.2 Tests
Específicos</h4>
<div class="sourceCode" id="cb59"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb59-1"><a href="#cb59-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> compose exec php bin/phpunit tests/Functional/ClientTest.php</span></code></pre></div>
<h4 data-number="1.15.2.3" id="tests-con-coverage"><span
class="header-section-number">1.15.2.3</span> 14.2.3 Tests con
Coverage</h4>
<div class="sourceCode" id="cb60"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb60-1"><a href="#cb60-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> compose exec php bin/phpunit <span class="at">--coverage-html</span> coverage/</span></code></pre></div>
<h3 data-number="1.15.3" id="tipos-de-tests"><span
class="header-section-number">1.15.3</span> 14.3 Tipos de Tests</h3>
<h4 data-number="1.15.3.1" id="tests-funcionales"><span
class="header-section-number">1.15.3.1</span> 14.3.1 Tests
Funcionales</h4>
<p>Ubicación: <code>tests/Functional/</code></p>
<p>20 archivos de tests funcionales que prueban: - Endpoints de API -
Flujos completos - Integraciones</p>
<p>Ejemplo:</p>
<div class="sourceCode" id="cb61"><pre
class="sourceCode php"><code class="sourceCode php"><span id="cb61-1"><a href="#cb61-1" aria-hidden="true" tabindex="-1"></a><span class="kw">public</span> <span class="kw">function</span> testCreateClient()<span class="ot">:</span> <span class="dt">void</span></span>
<span id="cb61-2"><a href="#cb61-2" aria-hidden="true" tabindex="-1"></a>{</span>
<span id="cb61-3"><a href="#cb61-3" aria-hidden="true" tabindex="-1"></a> <span class="va">$client</span> <span class="op">=</span> <span class="kw">static</span>::createClient()<span class="ot">;</span></span>
<span id="cb61-4"><a href="#cb61-4" aria-hidden="true" tabindex="-1"></a> <span class="va">$client</span>-&gt;request(<span class="st">&#39;POST&#39;</span><span class="ot">,</span> <span class="st">&#39;/clients&#39;</span><span class="ot">,</span> [</span>
<span id="cb61-5"><a href="#cb61-5" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;json&#39;</span> =&gt; [</span>
<span id="cb61-6"><a href="#cb61-6" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;name&#39;</span> =&gt; <span class="st">&#39;Test Client&#39;</span><span class="ot">,</span></span>
<span id="cb61-7"><a href="#cb61-7" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;mac&#39;</span> =&gt; <span class="st">&#39;00:11:22:33:44:55&#39;</span><span class="ot">,</span></span>
<span id="cb61-8"><a href="#cb61-8" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;ip&#39;</span> =&gt; <span class="st">&#39;192.168.1.100&#39;</span></span>
<span id="cb61-9"><a href="#cb61-9" aria-hidden="true" tabindex="-1"></a> ]</span>
<span id="cb61-10"><a href="#cb61-10" aria-hidden="true" tabindex="-1"></a> ])<span class="ot">;</span></span>
<span id="cb61-11"><a href="#cb61-11" aria-hidden="true" tabindex="-1"></a> </span>
<span id="cb61-12"><a href="#cb61-12" aria-hidden="true" tabindex="-1"></a> <span class="va">$this</span>-&gt;assertResponseStatusCodeSame(<span class="dv">201</span>)<span class="ot">;</span></span>
<span id="cb61-13"><a href="#cb61-13" aria-hidden="true" tabindex="-1"></a>}</span></code></pre></div>
<h3 data-number="1.15.4" id="factories-para-testing"><span
class="header-section-number">1.15.4</span> 14.4 Factories para
Testing</h3>
<p>Se utilizan <strong>Zenstruck Foundry</strong> factories (24
factories) para crear datos de prueba:</p>
<div class="sourceCode" id="cb62"><pre
class="sourceCode php"><code class="sourceCode php"><span id="cb62-1"><a href="#cb62-1" aria-hidden="true" tabindex="-1"></a><span class="cn">C</span>lientFactory::createOne([</span>
<span id="cb62-2"><a href="#cb62-2" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;name&#39;</span> =&gt; <span class="st">&#39;Test PC&#39;</span><span class="ot">,</span></span>
<span id="cb62-3"><a href="#cb62-3" aria-hidden="true" tabindex="-1"></a> <span class="st">&#39;status&#39;</span> =&gt; <span class="st">&#39;active&#39;</span></span>
<span id="cb62-4"><a href="#cb62-4" aria-hidden="true" tabindex="-1"></a>])<span class="ot">;</span></span></code></pre></div>
<h3 data-number="1.15.5" id="base-de-datos-de-testing"><span
class="header-section-number">1.15.5</span> 14.5 Base de Datos de
Testing</h3>
<p>Los tests utilizan <strong>DAMA Doctrine Test Bundle</strong> para: -
Ejecutar cada test en una transacción - Rollback automático después de
cada test - Aislamiento completo entre tests</p>
<hr />
<h2 data-number="1.16" id="despliegue"><span
class="header-section-number">1.16</span> 15. Despliegue</h2>
<h3 data-number="1.16.1" id="despliegue-con-docker-compose"><span
class="header-section-number">1.16.1</span> 15.1 Despliegue con Docker
Compose</h3>
<h4 data-number="1.16.1.1" id="desarrollo-1"><span
class="header-section-number">1.16.1.1</span> 15.1.1 Desarrollo</h4>
<div class="sourceCode" id="cb63"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb63-1"><a href="#cb63-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> compose up <span class="at">-d</span></span></code></pre></div>
<h4 data-number="1.16.1.2" id="producción"><span
class="header-section-number">1.16.1.2</span> 15.1.2 Producción</h4>
<div class="sourceCode" id="cb64"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb64-1"><a href="#cb64-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> compose <span class="at">-f</span> docker-compose-deploy.yml up <span class="at">-d</span></span></code></pre></div>
<h3 data-number="1.16.2" id="despliegue-con-jenkins"><span
class="header-section-number">1.16.2</span> 15.2 Despliegue con
Jenkins</h3>
<p>El proyecto incluye <strong>Jenkinsfile</strong> para CI/CD.</p>
<h4 data-number="1.16.2.1" id="pipeline-stages"><span
class="header-section-number">1.16.2.1</span> Pipeline stages:</h4>
<ol type="1">
<li><strong>Checkout</strong>: Clonar repositorio</li>
<li><strong>Build</strong>: Construir imagen Docker</li>
<li><strong>Test</strong>: Ejecutar tests</li>
<li><strong>Package</strong>: Crear paquete Debian</li>
<li><strong>Deploy</strong>: Desplegar en servidor</li>
</ol>
<h3 data-number="1.16.3" id="paquete-debian"><span
class="header-section-number">1.16.3</span> 15.3 Paquete Debian</h3>
<p>El proyecto puede empaquetarse como <code>.deb</code>:</p>
<div class="sourceCode" id="cb65"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb65-1"><a href="#cb65-1" aria-hidden="true" tabindex="-1"></a><span class="ex">./package.sh</span></span></code></pre></div>
<p>Estructura del paquete en <code>debian/</code>: - Control files -
Postinst/preinst scripts - Systemd service file - Configuración</p>
<h3 data-number="1.16.4" id="configuración-de-producción"><span
class="header-section-number">1.16.4</span> 15.4 Configuración de
Producción</h3>
<h4 data-number="1.16.4.1" id="variables-de-entorno-1"><span
class="header-section-number">1.16.4.1</span> 15.4.1 Variables de
Entorno</h4>
<p>Crear <code>.env.local</code> con configuración de producción:</p>
<div class="sourceCode" id="cb66"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb66-1"><a href="#cb66-1" aria-hidden="true" tabindex="-1"></a><span class="va">APP_ENV</span><span class="op">=</span>prod</span>
<span id="cb66-2"><a href="#cb66-2" aria-hidden="true" tabindex="-1"></a><span class="va">APP_DEBUG</span><span class="op">=</span>0</span>
<span id="cb66-3"><a href="#cb66-3" aria-hidden="true" tabindex="-1"></a><span class="va">DATABASE_URL</span><span class="op">=</span><span class="st">&quot;mysql://user:pass@localhost:3306/ogcore&quot;</span></span>
<span id="cb66-4"><a href="#cb66-4" aria-hidden="true" tabindex="-1"></a><span class="co"># ... más configuración</span></span></code></pre></div>
<h4 data-number="1.16.4.2" id="optimizaciones"><span
class="header-section-number">1.16.4.2</span> 15.4.2 Optimizaciones</h4>
<div class="sourceCode" id="cb67"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb67-1"><a href="#cb67-1" aria-hidden="true" tabindex="-1"></a><span class="co"># Limpiar caché</span></span>
<span id="cb67-2"><a href="#cb67-2" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console cache:clear <span class="at">--env</span><span class="op">=</span>prod</span>
<span id="cb67-3"><a href="#cb67-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb67-4"><a href="#cb67-4" aria-hidden="true" tabindex="-1"></a><span class="co"># Calentar caché</span></span>
<span id="cb67-5"><a href="#cb67-5" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console cache:warmup <span class="at">--env</span><span class="op">=</span>prod</span>
<span id="cb67-6"><a href="#cb67-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb67-7"><a href="#cb67-7" aria-hidden="true" tabindex="-1"></a><span class="co"># Optimizar autoloader</span></span>
<span id="cb67-8"><a href="#cb67-8" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php composer dump-autoload <span class="at">--optimize</span> <span class="at">--classmap-authoritative</span></span></code></pre></div>
<h3 data-number="1.16.5" id="monitoreo"><span
class="header-section-number">1.16.5</span> 15.5 Monitoreo</h3>
<h4 data-number="1.16.5.1" id="logs"><span
class="header-section-number">1.16.5.1</span> 15.5.1 Logs</h4>
<p>Logs ubicados en <code>var/log/</code>: - <code>dev.log</code> /
<code>prod.log</code>: Logs de aplicación -
<code>nginx/access.log</code>: Accesos a nginx -
<code>nginx/error.log</code>: Errores de nginx</p>
<h4 data-number="1.16.5.2" id="syslog"><span
class="header-section-number">1.16.5.2</span> 15.5.2 Syslog</h4>
<p>Los logs también se envían a syslog para centralización.</p>
<h3 data-number="1.16.6" id="escalabilidad"><span
class="header-section-number">1.16.6</span> 15.6 Escalabilidad</h3>
<p>Para escalar horizontalmente:</p>
<ol type="1">
<li><strong>Base de datos</strong>: Usar MariaDB con replicación
master-slave</li>
<li><strong>PHP</strong>: Aumentar réplicas de contenedor PHP</li>
<li><strong>Load Balancer</strong>: Usar nginx como balanceador de
carga</li>
<li><strong>Caché</strong>: Implementar Redis para sesiones y caché</li>
<li><strong>Mercure</strong>: Escalar hub de Mercure</li>
</ol>
<hr />
<h2 data-number="1.17" id="mantenimiento-y-operaciones"><span
class="header-section-number">1.17</span> 16. Mantenimiento y
Operaciones</h2>
<h3 data-number="1.17.1" id="reiniciar-base-de-datos"><span
class="header-section-number">1.17.1</span> 16.1 Reiniciar Base de
Datos</h3>
<div class="sourceCode" id="cb68"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb68-1"><a href="#cb68-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:database:drop <span class="at">--force</span></span>
<span id="cb68-2"><a href="#cb68-2" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:database:create</span>
<span id="cb68-3"><a href="#cb68-3" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:migrations:migrate <span class="at">--no-interaction</span></span>
<span id="cb68-4"><a href="#cb68-4" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console doctrine:fixtures:load <span class="at">--no-interaction</span></span></code></pre></div>
<h3 data-number="1.17.2" id="limpiar-caché"><span
class="header-section-number">1.17.2</span> 16.2 Limpiar Caché</h3>
<div class="sourceCode" id="cb69"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb69-1"><a href="#cb69-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console cache:clear</span>
<span id="cb69-2"><a href="#cb69-2" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console cache:warmup</span></code></pre></div>
<h3 data-number="1.17.3" id="actualizar-dependencias"><span
class="header-section-number">1.17.3</span> 16.3 Actualizar
Dependencias</h3>
<div class="sourceCode" id="cb70"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb70-1"><a href="#cb70-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php composer update</span></code></pre></div>
<h3 data-number="1.17.4" id="regenerar-claves-jwt"><span
class="header-section-number">1.17.4</span> 16.4 Regenerar Claves
JWT</h3>
<div class="sourceCode" id="cb71"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb71-1"><a href="#cb71-1" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php bin/console lexik:jwt:generate-keypair <span class="at">--overwrite</span></span></code></pre></div>
<h3 data-number="1.17.5" id="backups-automáticos"><span
class="header-section-number">1.17.5</span> 16.5 Backups
Automáticos</h3>
<p>Script ejemplo para backup automático:</p>
<div class="sourceCode" id="cb72"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb72-1"><a href="#cb72-1" aria-hidden="true" tabindex="-1"></a><span class="co">#!/bin/bash</span></span>
<span id="cb72-2"><a href="#cb72-2" aria-hidden="true" tabindex="-1"></a><span class="va">DATE</span><span class="op">=</span><span class="va">$(</span><span class="fu">date</span> +%Y%m%d_%H%M%S<span class="va">)</span></span>
<span id="cb72-3"><a href="#cb72-3" aria-hidden="true" tabindex="-1"></a><span class="va">BACKUP_DIR</span><span class="op">=</span><span class="st">&quot;/backups&quot;</span></span>
<span id="cb72-4"><a href="#cb72-4" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb72-5"><a href="#cb72-5" aria-hidden="true" tabindex="-1"></a><span class="co"># Backup de base de datos</span></span>
<span id="cb72-6"><a href="#cb72-6" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-database mysqldump <span class="at">-u</span> user <span class="at">-p</span> password ogcore <span class="op">&gt;</span> <span class="va">$BACKUP_DIR</span>/db_<span class="va">$DATE</span>.sql</span>
<span id="cb72-7"><a href="#cb72-7" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb72-8"><a href="#cb72-8" aria-hidden="true" tabindex="-1"></a><span class="co"># Backup de archivos</span></span>
<span id="cb72-9"><a href="#cb72-9" aria-hidden="true" tabindex="-1"></a><span class="fu">tar</span> <span class="at">-czf</span> <span class="va">$BACKUP_DIR</span>/files_<span class="va">$DATE</span>.tar.gz /var/www/html/ogcore/var</span>
<span id="cb72-10"><a href="#cb72-10" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb72-11"><a href="#cb72-11" aria-hidden="true" tabindex="-1"></a><span class="co"># Limpiar backups antiguos (&gt;30 días)</span></span>
<span id="cb72-12"><a href="#cb72-12" aria-hidden="true" tabindex="-1"></a><span class="fu">find</span> <span class="va">$BACKUP_DIR</span> <span class="at">-name</span> <span class="st">&quot;*.sql&quot;</span> <span class="at">-mtime</span> +30 <span class="at">-delete</span></span>
<span id="cb72-13"><a href="#cb72-13" aria-hidden="true" tabindex="-1"></a><span class="fu">find</span> <span class="va">$BACKUP_DIR</span> <span class="at">-name</span> <span class="st">&quot;*.tar.gz&quot;</span> <span class="at">-mtime</span> +30 <span class="at">-delete</span></span></code></pre></div>
<h3 data-number="1.17.6" id="monitoreo-de-salud"><span
class="header-section-number">1.17.6</span> 16.6 Monitoreo de Salud</h3>
<h4 data-number="1.17.6.1" id="health-check-endpoint"><span
class="header-section-number">1.17.6.1</span> Health Check Endpoint</h4>
<div class="sourceCode" id="cb73"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb73-1"><a href="#cb73-1" aria-hidden="true" tabindex="-1"></a><span class="ex">GET</span> /health</span></code></pre></div>
<h4 data-number="1.17.6.2" id="verificar-estado-de-servicios"><span
class="header-section-number">1.17.6.2</span> Verificar Estado de
Servicios</h4>
<div class="sourceCode" id="cb74"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb74-1"><a href="#cb74-1" aria-hidden="true" tabindex="-1"></a><span class="co"># PHP</span></span>
<span id="cb74-2"><a href="#cb74-2" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-php php <span class="at">-v</span></span>
<span id="cb74-3"><a href="#cb74-3" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb74-4"><a href="#cb74-4" aria-hidden="true" tabindex="-1"></a><span class="co"># Nginx</span></span>
<span id="cb74-5"><a href="#cb74-5" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-nginx nginx <span class="at">-t</span></span>
<span id="cb74-6"><a href="#cb74-6" aria-hidden="true" tabindex="-1"></a></span>
<span id="cb74-7"><a href="#cb74-7" aria-hidden="true" tabindex="-1"></a><span class="co"># MariaDB</span></span>
<span id="cb74-8"><a href="#cb74-8" aria-hidden="true" tabindex="-1"></a><span class="ex">docker</span> exec ogcore-database mysqladmin <span class="at">-u</span> user <span class="at">-p</span> status</span></code></pre></div>
<h3 data-number="1.17.7" id="rotación-de-logs"><span
class="header-section-number">1.17.7</span> 16.7 Rotación de Logs</h3>
<p>Configurar logrotate:</p>
<div class="sourceCode" id="cb75"><pre
class="sourceCode bash"><code class="sourceCode bash"><span id="cb75-1"><a href="#cb75-1" aria-hidden="true" tabindex="-1"></a><span class="ex">/var/www/html/ogcore/var/log/*.log</span> {</span>
<span id="cb75-2"><a href="#cb75-2" aria-hidden="true" tabindex="-1"></a> <span class="ex">daily</span></span>
<span id="cb75-3"><a href="#cb75-3" aria-hidden="true" tabindex="-1"></a> <span class="ex">rotate</span> 14</span>
<span id="cb75-4"><a href="#cb75-4" aria-hidden="true" tabindex="-1"></a> <span class="ex">compress</span></span>
<span id="cb75-5"><a href="#cb75-5" aria-hidden="true" tabindex="-1"></a> <span class="ex">delaycompress</span></span>
<span id="cb75-6"><a href="#cb75-6" aria-hidden="true" tabindex="-1"></a> <span class="ex">notifempty</span></span>
<span id="cb75-7"><a href="#cb75-7" aria-hidden="true" tabindex="-1"></a> <span class="ex">create</span> 0640 www-data www-data</span>
<span id="cb75-8"><a href="#cb75-8" aria-hidden="true" tabindex="-1"></a> <span class="ex">sharedscripts</span></span>
<span id="cb75-9"><a href="#cb75-9" aria-hidden="true" tabindex="-1"></a><span class="er">}</span></span></code></pre></div>
<hr />
<h2 data-number="1.18" id="integración-con-otros-servicios"><span
class="header-section-number">1.18</span> 17. Integración con Otros
Servicios</h2>
<h3 data-number="1.18.1" id="ogrepository"><span
class="header-section-number">1.18.1</span> 17.1 ogRepository</h3>
<p><strong>Propósito</strong>: Gestión de repositorios de imágenes.</p>
<p><strong>Endpoints integrados</strong>: - Crear imagen - Desplegar
imagen - Backup imagen - Eliminar imagen - Convertir a imagen virtual -
Importar imagen externa - Verificar integridad - Imagen global</p>
<p><strong>Webhook</strong>: <code>/og-repository/webhook</code></p>
<h3 data-number="1.18.2" id="ogdhcp"><span
class="header-section-number">1.18.2</span> 17.2 ogDhcp</h3>
<p><strong>Propósito</strong>: Gestión de DHCP dinámico.</p>
<p><strong>Funcionalidades</strong>: - Agregar clientes a DHCP -
Eliminar clientes de DHCP - Actualizar configuración - Gestión de
subredes</p>
<h3 data-number="1.18.3" id="ogboot"><span
class="header-section-number">1.18.3</span> 17.3 ogBoot</h3>
<p><strong>Propósito</strong>: Gestión de archivos de arranque PXE.</p>
<p><strong>Funcionalidades</strong>: - Crear archivos de arranque -
Actualizar plantillas PXE - Eliminar configuraciones - Sincronización de
menús</p>
<h3 data-number="1.18.4" id="ogagent"><span
class="header-section-number">1.18.4</span> 17.4 ogAgent</h3>
<p><strong>Propósito</strong>: Agente instalado en clientes para
ejecutar comandos.</p>
<p><strong>Operaciones</strong>: - Power on/off/reboot - Crear/desplegar
imágenes - Particionar discos - Ejecutar scripts - Obtener inventario
hardware - Verificar tamaño de particiones - Kill jobs</p>
<h3 data-number="1.18.5" id="uds-universal-desktop-services"><span
class="header-section-number">1.18.5</span> 17.5 UDS (Universal Desktop
Services)</h3>
<p><strong>Propósito</strong>: Integración con sistema de escritorios
remotos.</p>
<p><strong>Funcionalidades</strong>: - Autenticación - Obtener service
pools - Calcular disponibilidad - Gestión de reservas</p>
<h3 data-number="1.18.6" id="git-versionado-de-imágenes"><span
class="header-section-number">1.18.6</span> 17.6 Git (Versionado de
Imágenes)</h3>
<p><strong>Propósito</strong>: Versionado de imágenes con Git.</p>
<p><strong>Funcionalidades</strong>: - Backup a repositorio Git -
Versionado automático - Recuperación de versiones - Sincronización</p>
<h3 data-number="1.18.7"
id="mercure-notificaciones-en-tiempo-real"><span
class="header-section-number">1.18.7</span> 17.7 Mercure (Notificaciones
en Tiempo Real)</h3>
<p><strong>Propósito</strong>: Notificaciones push en tiempo real.</p>
<p><strong>Eventos publicados</strong>: - Cambio de estado de clientes -
Actualización de trazas - Cambios en comandos - Alertas y
notificaciones</p>
<p><strong>Suscripción del cliente</strong>:</p>
<div class="sourceCode" id="cb76"><pre
class="sourceCode javascript"><code class="sourceCode javascript"><span id="cb76-1"><a href="#cb76-1" aria-hidden="true" tabindex="-1"></a><span class="kw">const</span> eventSource <span class="op">=</span> <span class="kw">new</span> <span class="bu">EventSource</span>(<span class="st">&#39;http://localhost:8080/.well-known/mercure?topic=/clients/{id}&#39;</span>)<span class="op">;</span></span>
<span id="cb76-2"><a href="#cb76-2" aria-hidden="true" tabindex="-1"></a>eventSource<span class="op">.</span><span class="at">onmessage</span> <span class="op">=</span> <span class="bu">event</span> <span class="kw">=&gt;</span> {</span>
<span id="cb76-3"><a href="#cb76-3" aria-hidden="true" tabindex="-1"></a> <span class="kw">const</span> data <span class="op">=</span> <span class="bu">JSON</span><span class="op">.</span><span class="fu">parse</span>(<span class="bu">event</span><span class="op">.</span><span class="at">data</span>)<span class="op">;</span></span>
<span id="cb76-4"><a href="#cb76-4" aria-hidden="true" tabindex="-1"></a> <span class="bu">console</span><span class="op">.</span><span class="fu">log</span>(<span class="st">&#39;Client updated:&#39;</span><span class="op">,</span> data)<span class="op">;</span></span>
<span id="cb76-5"><a href="#cb76-5" aria-hidden="true" tabindex="-1"></a>}<span class="op">;</span></span></code></pre></div>
<hr />
<h2 data-number="1.19" id="roadmap-y-changelog"><span
class="header-section-number">1.19</span> 18. Roadmap y Changelog</h2>
<h3 data-number="1.19.1" id="versión-actual-0.5.0"><span
class="header-section-number">1.19.1</span> 18.1 Versión Actual:
0.5.0</h3>
<h3 data-number="1.19.2"
id="últimas-características-v0.25.1---octubre-2025"><span
class="header-section-number">1.19.2</span> 18.2 Últimas Características
(v0.25.1 - Octubre 2025)</h3>
<ul>
<li><strong>Tareas programadas</strong>: Sistema completo de colas y
scheduling</li>
<li><strong>Inventario hardware</strong>: Obtención automática de
inventario</li>
<li><strong>Clonado de imágenes</strong>: Mejoras en el servicio de
clonado</li>
<li><strong>Repositorios Git</strong>: Backup y gestión de
repositorios</li>
<li><strong>Particionado</strong>: Integración con agente para scripts
de particionado</li>
<li><strong>Gestión de trazas</strong>: Marcar como completadas,
cancelación</li>
<li><strong>Estados de cliente</strong>: Nuevo estado “enviado” para
Windows/Linux</li>
<li><strong>Validación de particiones</strong>: Comprobación de
tamaños</li>
<li><strong>Imagen versionada</strong>: Sistema de versionado de
imágenes</li>
<li><strong>Calendario remoto</strong>: Integración con UDS</li>
<li><strong>Mercure</strong>: Notificaciones en tiempo real</li>
<li><strong>Despliegue multicast</strong>: Modos torrent y UDPCAST</li>
</ul>
<h3 data-number="1.19.3" id="próximas-características-roadmap"><span
class="header-section-number">1.19.3</span> 18.3 Próximas
Características (Roadmap)</h3>
<h4 data-number="1.19.3.1" id="v0.6.0-q4-2025"><span
class="header-section-number">1.19.3.1</span> v0.6.0 (Q4 2025)</h4>
<ul class="task-list">
<li><label><input type="checkbox" />Dashboard de administración
mejorado</label></li>
<li><label><input type="checkbox" />Reportes y estadísticas
avanzadas</label></li>
<li><label><input type="checkbox" />API GraphQL
complementaria</label></li>
<li><label><input type="checkbox" />Mejoras en rendimiento de
queries</label></li>
</ul>
<h4 data-number="1.19.3.2" id="v0.7.0-q1-2026"><span
class="header-section-number">1.19.3.2</span> v0.7.0 (Q1 2026)</h4>
<ul class="task-list">
<li><label><input type="checkbox" />Soporte para múltiples lenguajes
(i18n completo)</label></li>
<li><label><input type="checkbox" />Sistema de plugins</label></li>
<li><label><input type="checkbox" />Mejoras en clustering</label></li>
<li><label><input type="checkbox" />API de webhooks
salientes</label></li>
</ul>
<h4 data-number="1.19.3.3" id="v1.0.0-q2-2026"><span
class="header-section-number">1.19.3.3</span> v1.0.0 (Q2 2026)</h4>
<ul class="task-list">
<li><label><input type="checkbox" />Versión estable de
producción</label></li>
<li><label><input type="checkbox" />Documentación completa de
API</label></li>
<li><label><input type="checkbox" />Guías de migración
finalizadas</label></li>
<li><label><input type="checkbox" />Certificación de
seguridad</label></li>
</ul>
<h3 data-number="1.19.4" id="changelog-resumido"><span
class="header-section-number">1.19.4</span> 18.4 Changelog Resumido</h3>
<p>Ver <code>CHANGELOG.md</code> para el historial completo de
cambios.</p>
<p><strong>Versiones destacadas</strong>:</p>
<ul>
<li><strong>0.25.1</strong> (2025-10-01): Correcciones en tareas
programadas</li>
<li><strong>0.25.0</strong> (2025-09-23): Inventario hardware</li>
<li><strong>0.24.0</strong> (2025-09-09): Servicio de eliminación de
repositorios Git</li>
<li><strong>0.23.0</strong> (2025-09-08): Backups a repositorios
Git</li>
<li><strong>0.20.0</strong> (2025-08-25): Sistema de colas y tareas</li>
<li><strong>0.15.0</strong> (2025-06-26): Integración ogGit y sistema de
cola</li>
<li><strong>0.14.0</strong> (2025-06-02): Mover equipos, imagen cache,
inicio sesión</li>
<li><strong>0.13.0</strong> (2025-05-20): Comunicación TLS con
agente</li>
<li><strong>0.12.0</strong> (2025-05-13): Tareas programadas,
integración ogGit</li>
<li><strong>0.11.0</strong> (2025-04-11): Versionado de imágenes,
ejecución de scripts</li>
<li><strong>0.10.0</strong> (2025-03-25): Imagen virtual, importar
imágenes</li>
<li><strong>0.9.0</strong> (2025-03-04): Mercure, notificaciones en
tiempo real</li>
<li><strong>0.8.0</strong> (2025-01-10): Imagen global, jerarquía de
aulas</li>
<li><strong>0.7.3</strong> (2025-01-03): Multiselección, import/export,
torrent/udpcast</li>
</ul>
<hr />
<h2 data-number="1.20" id="contribución"><span
class="header-section-number">1.20</span> 19. Contribución</h2>
<h3 data-number="1.20.1" id="guía-de-contribución"><span
class="header-section-number">1.20.1</span> 19.1 Guía de
Contribución</h3>
<p>Para contribuir al proyecto:</p>
<ol type="1">
<li><strong>Fork</strong> el repositorio</li>
<li>Crea una <strong>rama</strong> para tu feature:
<code>git checkout -b feature/nueva-funcionalidad</code></li>
<li><strong>Commit</strong> tus cambios:
<code>git commit -am 'Añade nueva funcionalidad'</code></li>
<li><strong>Push</strong> a la rama:
<code>git push origin feature/nueva-funcionalidad</code></li>
<li>Crea un <strong>Pull Request</strong></li>
</ol>
<h3 data-number="1.20.2" id="estándares-de-código"><span
class="header-section-number">1.20.2</span> 19.2 Estándares de
Código</h3>
<ul>
<li>Seguir <strong>PSR-12</strong> para PHP</li>
<li>Usar <strong>Type Hints</strong> en PHP 8.3</li>
<li>Documentar con <strong>PHPDoc</strong></li>
<li>Tests para nuevas funcionalidades</li>
<li>Commits descriptivos en español</li>
</ul>
<h3 data-number="1.20.3" id="proceso-de-revisión"><span
class="header-section-number">1.20.3</span> 19.3 Proceso de
Revisión</h3>
<ol type="1">
<li>CI/CD ejecuta tests automáticamente</li>
<li>Revisión de código por maintainers</li>
<li>Aprobación requerida antes de merge</li>
<li>Merge a rama develop</li>
<li>Release periódicos a main</li>
</ol>
<h3 data-number="1.20.4" id="reportar-bugs"><span
class="header-section-number">1.20.4</span> 19.4 Reportar Bugs</h3>
<p>Usar el sistema de Issues del repositorio:</p>
<p><strong>Template de Bug</strong>:</p>
<pre><code>**Descripción del bug**
Descripción clara y concisa del bug.
**Pasos para reproducir**
1. Ir a &#39;...&#39;
2. Hacer clic en &#39;...&#39;
3. Ver error
**Comportamiento esperado**
Lo que esperabas que sucediera.
**Screenshots**
Si aplica, añadir screenshots.
**Entorno**
- OS: [ej. Ubuntu 22.04]
- Versión: [ej. 0.5.0]
- Browser: [ej. Firefox 118]</code></pre>
<hr />
<h2 data-number="1.21" id="soporte-y-contacto"><span
class="header-section-number">1.21</span> 20. Soporte y Contacto</h2>
<h3 data-number="1.21.1" id="documentación-adicional"><span
class="header-section-number">1.21.1</span> 20.1 Documentación
Adicional</h3>
<ul>
<li><strong>API Docs</strong>: http://localhost:8080/docs</li>
<li><strong>Postman Collection</strong>:
<code>swagger-assets/ogCore.postman_collection.zip</code></li>
<li><strong>Diagramas</strong>:
<code>swagger-assets/img_bbdd.png</code></li>
</ul>
<h3 data-number="1.21.2" id="recursos"><span
class="header-section-number">1.21.2</span> 20.2 Recursos</h3>
<ul>
<li><strong>Repositorio</strong>: [URL del repositorio]</li>
<li><strong>Wiki</strong>: [URL de la wiki]</li>
<li><strong>Issues</strong>: [URL de issues]</li>
</ul>
<h3 data-number="1.21.3" id="equipo-de-desarrollo"><span
class="header-section-number">1.21.3</span> 20.3 Equipo de
Desarrollo</h3>
<p>Proyecto desarrollado por el equipo de OpenGnsys en colaboración con
universidades participantes.</p>
<h3 data-number="1.21.4" id="licencia"><span
class="header-section-number">1.21.4</span> 20.4 Licencia</h3>
<p>Proyecto propietario. Ver archivo <code>LICENSE</code> para más
información.</p>
<hr />
<h2 data-number="1.22" id="apéndices"><span
class="header-section-number">1.22</span> Apéndices</h2>
<h3 data-number="1.22.1" id="apéndice-a-glosario-de-términos"><span
class="header-section-number">1.22.1</span> Apéndice A: Glosario de
Términos</h3>
<ul>
<li><strong>Cliente</strong>: Equipo físico gestionado por el
sistema</li>
<li><strong>Imagen</strong>: Copia bit a bit de una partición de
disco</li>
<li><strong>Traza</strong>: Registro de ejecución de un comando</li>
<li><strong>Unidad Organizativa</strong>: Agrupación lógica de clientes
(aula, grupo)</li>
<li><strong>PXE</strong>: Preboot Execution Environment, arranque por
red</li>
<li><strong>ogLive</strong>: Imagen Live de arranque de OpenGnsys</li>
<li><strong>Partición</strong>: División lógica de un disco duro</li>
<li><strong>Repositorio</strong>: Servidor de almacenamiento de
imágenes</li>
</ul>
<h3 data-number="1.22.2" id="apéndice-b-puertos-y-servicios"><span
class="header-section-number">1.22.2</span> Apéndice B: Puertos y
Servicios</h3>
<table>
<thead>
<tr class="header">
<th>Puerto</th>
<th>Servicio</th>
<th>Protocolo</th>
<th>Descripción</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td>8080</td>
<td>nginx</td>
<td>HTTP</td>
<td>API y docs</td>
</tr>
<tr class="even">
<td>3306</td>
<td>MariaDB</td>
<td>MySQL</td>
<td>Base de datos</td>
</tr>
<tr class="odd">
<td>9000</td>
<td>PHP-FPM</td>
<td>FastCGI</td>
<td>Procesador PHP</td>
</tr>
<tr class="even">
<td>3000</td>
<td>Mercure</td>
<td>HTTP/SSE</td>
<td>Notificaciones</td>
</tr>
</tbody>
</table>
<h3 data-number="1.22.3" id="apéndice-c-estructura-de-directorios"><span
class="header-section-number">1.22.3</span> Apéndice C: Estructura de
Directorios</h3>
<pre><code>ogcore/
├── bin/ # Ejecutables (console, phpunit)
├── config/ # Configuración de Symfony
│ ├── api_platform/ # Configuración de entidades API
│ ├── packages/ # Configuración de bundles
│ └── routes/ # Rutas
├── migrations/ # Migraciones de base de datos
├── public/ # Punto de entrada web
├── src/ # Código fuente
│ ├── Command/ # Comandos de consola
│ ├── Controller/ # Controladores
│ ├── Dto/ # Data Transfer Objects
│ ├── Entity/ # Entidades Doctrine
│ ├── EventListener/# Event Listeners
│ ├── EventSubscriber/ # Event Subscribers
│ ├── Factory/ # Factories para testing
│ ├── Filter/ # Filtros de API Platform
│ ├── Repository/ # Repositorios Doctrine
│ ├── Security/ # Seguridad y autenticación
│ ├── Service/ # Servicios de negocio
│ ├── State/ # States de API Platform
│ └── Validator/ # Validadores personalizados
├── tests/ # Tests
├── translations/ # Traducciones
├── var/ # Archivos variables (cache, logs)
└── vendor/ # Dependencias
</code></pre>
<h3 data-number="1.22.4"
id="apéndice-d-variables-de-entorno-completas"><span
class="header-section-number">1.22.4</span> Apéndice D: Variables de
Entorno Completas</h3>
<p>Ver archivo <code>.env</code> para todas las variables de entorno
disponibles.</p>
<hr />
<p><strong>Fecha de actualización</strong>: Octubre 2025<br />
<strong>Versión del documento</strong>: 1.0<br />
<strong>Mantenedor</strong>: Equipo OpenGnsys</p>
</body>
</html>