Academia Deltamontero · Documentación
Arquitectura

Configuración automática

Qué pasa en cada arranque del contenedor moodle, desde la espera de la base de datos hasta el aviso de errores al super administrador.

La plataforma no se configura a mano desde la web: en cada arranque del contenedor moodle se reaplica toda la configuración desde el código. Así, un despliegue nuevo, un reinicio o una restauración terminan siempre en el mismo estado.

Flujo de arranque

entrypoint.sh
 ├─ [1-2/5] write-config.sh
 │     ├─ exige MOODLE_DB_PASSWORD (si falta, el contenedor no arranca)
 │     ├─ espera a MariaDB (cada 3 s, máximo 5 minutos)
 │     └─ genera config.php (valores escapados, solo lectura)
 ├─ [3/5] ¿hay tablas mdl_* en la base?
 │     ├─ no → exige MOODLE_ADMIN_PASSWORD → install_database.php (español)
 │     └─ sí → omite el instalador
 ├─ [4/5] admin/cli/upgrade.php --non-interactive
 │     ├─ si falla → el contenedor termina con error (el despliegue se detiene)
 │     └─ purge_caches.php
 ├─ [5/5] moodle-config.sh
 │     ├─ ajustes directos con admin/cli/cfg.php
 │     ├─ pasos "step critico|cosmetico" con scripts PHP
 │     └─ guarda los pasos fallidos en local_deltamodules/deploy_errors
 ├─ permisos: moodledata → www-data; config.php → 440
 └─ exec apache2-foreground

Base de datos y config.php

write-config.sh lo usan los dos contenedores (moodle y moodle-cron) para que su config.php sea siempre idéntico. No hay contraseñas por defecto: sin MOODLE_DB_PASSWORD el contenedor termina con un error visible en Coolify. Espera a la base hasta 100 intentos (unos 5 minutos).

El config.php generado contiene:

AjusteValorMotivo
dbtype / dblibrarymariadb / native
dbhost, dbname, dbuser, dbpassDesde las variables de entorno, escapados con var_exportUna comilla en la contraseña no rompe el archivo
prefixmdl_
dbcollationutf8mb4_unicode_ciIgual que el servidor
wwwrootMOODLE_WWWROOTDebe coincidir con la dirección que ven los usuarios (hoy http://192.168.0.192)
dataroot/var/www/moodledata
reverseproxyfalseTraefik no cambia el Host; con true Moodle falla con "reverseproxyabused"
sslproxytrue solo si wwwroot empieza por https://Con la publicación por dominio (planificada), el TLS lo terminan Cloudflare y el proxy. Hoy, con http://, queda en false
preventexecpathtrueNadie puede cambiar desde la web rutas de programas del servidor

El archivo queda con dueño root:www-data y permisos 440 (Apache lo lee pero no lo puede modificar).

Instalación solo si no hay tablas

El entrypoint.sh cuenta las tablas mdl_* con mysqli y SHOW TABLES. Si no hay ninguna, instala Moodle con install_database.php en español, con el nombre del sitio (MOODLE_SITE_NAME, por defecto "Academia Deltamontero"), el nombre corto (MOODLE_SITE_SHORTNAME, por defecto AcademiaDM) y la cuenta de administración inicial (MOODLE_ADMIN_USER, MOODLE_ADMIN_PASSWORD, MOODLE_ADMIN_EMAIL). Sin MOODLE_ADMIN_PASSWORD no instala.

Borrar moodledata no reinstala Moodle: solo se pierden los archivos. La reinstalación ocurre únicamente con la base vacía. Por eso restore.sh, si falla a medias, deja Moodle detenido a propósito: con la base vacía, el entrypoint reinstalaría.

Actualización

upgrade.php --non-interactive corre en cada arranque y aplica las actualizaciones de Moodle y de los plugins nuevos o modificados. Si falla, el contenedor termina con error y el sitio no arranca con la base a medio actualizar. Después se purgan las cachés, porque moodledata persiste entre despliegues y sin esa limpieza no se encuentran las clases nuevas de los plugins.

moodle-config.sh

Aplica la configuración del sitio. Todos los ajustes son idempotentes. Tiene dos tipos de instrucciones:

  • Ajustes directos con php admin/cli/cfg.php --name=... --set=....
  • Pasos con la función step <critico|cosmetico> "<descripción>" <comando>, que ejecuta un script PHP. Un paso que falla no detiene el arranque, pero tampoco falla en silencio: muestra las últimas 25 líneas de su salida en el registro, lo marca como error de seguridad (crítico) o como aviso (cosmético) y lo agrega a la lista de errores del despliegue.

Al terminar, guarda la lista en local_deltamodules/deploy_errors junto con la hora (deploy_time). El super administrador ve esos pasos fallidos como aviso en su Área personal y en Administración del sitio.

Permisos y Apache

Se ajusta el dueño de moodledata, se vuelve a fijar config.php en 440 y se arranca Apache en primer plano.

Qué configura moodle-config.sh

Ajustes directos

BloqueAjustes principales
Idioma y regiónlang=es, timezone=America/Guayaquil, country=EC, calendario gregoriano, dateformat="%d de %B de %Y"
Tematheme=boost_union, color de marca #1361A4, variables SCSS previas (colores, radios, barra de navegación), SCSS propio (fuente Century Gothic, tokens de color, barra superior, cajones laterales, páginas de login, políticas y certificados, chat de IA)
HTML adicionaladditionalhtmlhead con estilos y scripts globales: sin diálogos nativos del navegador, recorridos guiados, barra discreta con versión y hora, control de cambio de pantalla en exámenes, recarga de páginas restauradas desde la caché del historial, login, ojo de contraseña de "mantener presionado", validación de cédula, chat de IA en panel flotante, entre otros. Va en el encabezado y no en el pie porque Moodle omite el pie en las páginas de diseño embedded que usa el reproductor de video
SeguridadVer Seguridad: cron solo por consola, política de contraseñas, sesión, cookies, bloqueo de cuenta, sin invitados, IP real detrás de Cloudflare, MFA para super administradores
ArchivosMáximo de subida, por curso y cuota de usuario de 500 MB
CorreoVer Correo: soporte, ingreso con correo, SMTP desde variables, desvío de pruebas
RendimientoCaché de JS y plantillas activas, themedesignermode=0, estadísticas desactivadas, caché de registros activa
CursosFinalización y disponibilidad condicional activas; matriculación manual, self y cohort; página de inicio = Área personal; portada institucional propia (customfrontpageinclude → local/deltamodules/frontpage.php); copias automáticas por curso apagadas; 10 secciones por defecto
CalificacionesPorcentaje con 2 decimales, salvo que Talento Humano lo haya cambiado en Calificaciones de la Academia
Editor y H5PEditores tiny,plain; seguimiento de H5P activo
CertificadosURL de verificación de tool_certificate activa
VideosReproductor de mod_interactivevideo en modo sin distracciones por defecto
IAEntrada de navegación de local_ai_manager oculta (la administración está en Configuración IA)
Servicios webenablewebservices=1, protocolos rest,mcp

Pasos con scripts

PasoScriptTipo
Logos corporativos y fondoset-logos.phpcosmético
Servicio MCP (el token no se imprime completo)setup-mcp-service.phpcrítico
Corrección de marca (Delta Montero → Deltamontero)rename-brand.phpcosmético
Plantilla de certificadocreate-certificate-template.phpcosmético
Reparar opción de entrega de certificadoscomando PHP en líneacosmético
Completado automático de todos los videos (verlos hasta el final)enable-video-completion.phpcrítico
Cuestionarios: "Hecho" al rendirlos y candado hasta ver su videoconfigure-quiz-completion-gate.phpcrítico
Contenido parcial por cargo (Tesorería en Módulos 2 y 5)apply-partial-content-by-cargo.phpcrítico
Bloqueo de certificados por completadogate-certificates.phpcrítico
Seguridad de exámenesconfigure-exam-security.phpcrítico
Estándar de la Academia en todos los módulosnormalize-academy.phpcrítico
Curso de Introducción = manual de la Academiabuild-intro-manual.phpcrítico
"¿Olvidó su contraseña?" → recuperación con usuario y cédulaconfigure-forgot-password-url.phpcrítico
Textos en españolcustomize-strings.phpcosmético
Permisos de Gerencia según el manualalign-gerencia-to-manual.phpcrítico
Segundo super administrador de respaldocreate-second-superadmin.phpcrítico
Intentos reales en cuestionarios (sin previsualización)enforce-real-quiz-attempts.phpcrítico
Crear cursos: solo el Jefe de Talento Humanoenforce-course-creation-manual.phpcrítico
Perfiles de acceso y cohortes según el manualalign-access-profiles-to-manual.phpcrítico
Cursos, temas y objetivos según el manualalign-academy-to-manual.phpcosmético
Formatos de descarga Excel, Word y PDFconfigure-dataformats.phpcosmético
Responsables de actualizar contenidoapply-content-responsibilities.phpcrítico
Integrar Formación Complementaria al Módulo 6 (una vez)integrate-complementary-into-m6.phpcosmético
Matrículas del personal = ruta del manual (una vez)align-enrolments-to-manual.phpcrítico
Eliminar cursos fuera del manual (una vez)remove-courses-outside-manual.phpcrítico
Recalcular bloqueo de certificadosgate-certificates.phpcrítico
Chat de IA: proveedor Groq con la clave de GROQ_API_KEY (solo si la variable está definida)configure-ai-groq.phpcrítico
Cuotas de IA por perfil y persona del asistenteconfigure-ai-quotas-and-persona.phpcosmético
Condiciones de uso del Asistente de IAconfigure-ai-terms.phpcosmético
Aplicar correos pendientes de confirmarapply-pending-emails.phpcrítico
Nombres de usuario definitivos (por nombre de usuario anterior)rename-usernames.phpcrítico
Textos sin comillas angulares (una vez)clean-guillemets.phpcosmético
Pruebas técnicas con 1 intento (una vez)set-tests-one-attempt.phpcrítico
Correo: solo los correos de la Academiaconfigure-mail.phpcrítico
Editor de los módulosconfigure-course-editor.phpcosmético
Recorridos guiadosconfigure-tours.phpcosmético
Historial de contexto del chat de IA a 50 mensajescomando PHP en líneacosmético
Ocultar la categoría vacía por defectocomando PHP en líneacosmético

Los pasos marcados "una vez" guardan una bandera en la configuración y no se repiten en los siguientes arranques (algunos aceptan --force). El resto se recalcula en cada arranque y respeta lo que Talento Humano haya ajustado después desde la interfaz cuando así lo indica su propio script.

El orden importa: por ejemplo, rename-brand.php corre antes de create-certificate-template.php, y apply-partial-content-by-cargo.php antes de gate-certificates.php. El orden vigente es el del archivo moodle-config.sh.

Scripts que no corren en el arranque

En la imagen hay otros scripts de infrastructure/moodle/ que no llama moodle-config.sh. Son de aprovisionamiento inicial, de importación o de uso puntual, y se ejecutan a mano con docker exec <contenedor moodle> php /<script>.php:

GrupoScripts
Roles y permisosrebuild-roles-per-manual.php, fix-role-assign-matrix-v2.php, grant-reports-access.php, grant-policy-report-access.php
Cursos y rutascreate-courses.php, create-onboarding-course.php, restructure-courses-per-manual.php, create-training-paths.php, configure-course-completion.php, configure-module-metadata.php, create-annual-review-event.php
Personasimport-personnel.php, create-user-area-field.php (el antiguo assign-users-to-cohorts.php se eliminó: los cargos se asignan en Personal Deltamontero o con la importación de Excel)
Selección de personalcreate-selection-tests.php, import-selection-questions.php, configure-candidate-access.php, create-candidates-report.php
Informescreate-training-report.php, create-review-report.php
Políticasconfigure-site-policy.php
IAconfigure-ai-groq.php (también corre en el arranque cuando GROQ_API_KEY está definida), configure-ai-manager.php, configure-ai-chat-global.php, apply-default-ai-persona.php, import-rag-chunks.php
Contenido generadoimport-checkpoints.php
Utilidades Pythonparse-curriculum.py, parse-document.py, report-docx.py (las invoca el plugin)

Orden recomendado de ejecución de estos scripts en una instalación desde cero: Por confirmar. El repositorio solo deja pistas sueltas en los encabezados (por ejemplo, configure-ai-chat-global.php después de configure-ai-quotas-and-persona.php, o configure-candidate-access.php después de create-selection-tests.php). En una recuperación con respaldo no hace falta ejecutarlos: lo que crearon ya está en la base de datos.

Configuración que sigue siendo manual

  • Variables de entorno en Coolify (contraseñas, SMTP, claves de IA).
  • Dominio y HTTPS en Coolify y Cloudflare, cuando se publique con dominio (planificado; hoy se usa la red interna).
  • Respaldo diario en el host (setup-backup.sh) y su copia externa.
  • Cambios de contenido y reglas que Talento Humano hace desde la interfaz (se guardan como datos y van en el respaldo).

Procedimientos detallados: Operación y mantenimiento.

En esta página