Academia Deltamontero · Documentación
Operación y mantenimiento

Levantar la Academia desde cero

Procedimiento completo y en orden para montar la arquitectura, cargar las variables del sistema (base de datos, correo, seguridad, IA) y restaurar un respaldo en un servidor nuevo.

Esta página reúne en un solo recorrido todo lo necesario para poner en marcha la Academia en un servidor vacío:

  1. Arquitectura: contenedor de Proxmox → Ubuntu → Docker y Coolify → conexión con GitHub → aplicación.
  2. Variables del sistema: base de datos, sitio, administradores, correo, IA e infraestructura.
  3. Datos: cargar un respaldo y activar el respaldo diario.

Está basada en la mudanza real del contenedor 172246 al 12030 (octubre de 2026). Los pasos marcados con ✅ ya se ejecutaron y comprobaron en esa mudanza.

Ninguna contraseña ni clave se escribe en esta documentación. Todas se guardan en el gestor de contraseñas y se cargan en Coolify. Antes de empezar, verifique que las tenga a mano (Accesos y cuentas).

Qué se va a construir

Red interna 192.168.0.0/24
└── Proxmox VE (nodo pve5-deltamontero)
    └── Contenedor LXC (Ubuntu)
        └── Docker
            ├── Coolify  ............ panel en http://<IP>:8000
            ├── Traefik (de Coolify)  puertos 80/443 → Moodle
            └── Aplicación "Academia" (docker-compose.yml del repositorio)
                ├── mariadb       base de datos (volumen mariadb_data)
                ├── moodle        la Academia (volumen moodledata)
                └── moodle-cron   tareas programadas
Dónde vive cada cosaQué contieneCómo se recupera
Repositorio deltamontero/lms-moodleCódigo, plugins, configuración del sitio, scriptsSe clona desde GitHub
Variables de CoolifyClaves y datos de conexión (tabla de la parte 2)Desde el gestor de contraseñas
Respaldo .tarBase de datos y archivos subidosDesde /var/backups/delta-lms o la copia externa
Se aplica solo en cada despliegueSeguridad, correo, tema, roles, tours, reglas por defectoNo hay que hacer nada: moodle-config.sh

Parte 1 — Arquitectura

Crear o preparar el contenedor en Proxmox ✅

Valores usados en la mudanza (contenedor 12030):

OpciónValor
PlantillaUbuntu (el contenedor actual usa Ubuntu 24.10)
CPU / RAM / Swap4 núcleos / 8 GB / 4 GB
Disco250 GB en local
Redeth0 en vmbr0, IP fija /24, puerta de enlace 192.168.0.254
Options → Featuresnesting=1 y keyctl=1 (necesarios para Docker)
Options → Start at bootYes

Cambie las Features con el contenedor apagado. El contenedor original (172246) es privilegiado; el 12030 es no privilegiado y Docker funciona igual con nesting y keyctl.

Preparar Ubuntu ✅

En la consola del contenedor (Proxmox → Console), como root.

Si es Ubuntu 24.10, sus repositorios ya no existen (apt update da 404 Not Found): hay que redirigirlos a old-releases, como en el contenedor original:

sed -i -e 's/archive.ubuntu.com/old-releases.ubuntu.com/g' -e 's/security.ubuntu.com/old-releases.ubuntu.com/g' /etc/apt/sources.list /etc/apt/sources.list.d/* 2>/dev/null
apt update

Luego, actualizar e instalar las herramientas base:

DEBIAN_FRONTEND=noninteractive apt upgrade -y && apt install -y curl wget git jq

Ubuntu 24.10 ya no recibe parches de seguridad. Funciona, pero conviene pasar a una versión LTS más adelante (ver Pendientes operativos).

Instalar Docker y Coolify ✅

Instalador oficial (instala Docker y Coolify; tarda de 3 a 10 minutos):

curl -fsSL https://cdn.coollabs.io/coolify/install.sh | bash

Comprobar:

docker --version; docker ps --format '{{.Names}}: {{.Status}}'

Deben aparecer coolify, coolify-db, coolify-redis, coolify-proxy y coolify-sentinel en estado healthy. Después, abrir http://<IP>:8000, crear la cuenta de administrador de Coolify (guardarla en el gestor de contraseñas) y, en el asistente, elegir This machine.

Conectar el repositorio de GitHub

El firewall de la oficina bloquea el puerto 22 hacia internet; GitHub se conecta por SSH sobre el puerto 443. Comprobarlo ✅:

nc -zv -w 5 github.com 22; nc -zv -w 5 ssh.github.com 443

Lo normal es que el 22 dé timed out y el 443 succeeded.

  1. En Coolify: Keys & Tokens → Private Keys → + Add → Generate new ED25519 SSH Key. Copiar la llave pública.
  2. En GitHub (requiere ser administrador del repositorio): deltamontero/lms-moodle → Settings → Deploy keys → Add deploy key, con un título que identifique al servidor y sin "Allow write access".
  3. No borrar las llaves de otros servidores que sigan en uso.

Crear la aplicación en Coolify

  1. Projects → proyecto → entorno production → + New resource → Private Git Repository (with Deploy Key).

  2. Elegir la llave creada en el paso anterior.

  3. Datos del repositorio:

    CampoValor
    Repository URLssh://git@ssh.github.com:443/deltamontero/lms-moodle.git
    Branchmain
    Build packDocker Compose
    Compose file/docker-compose.yml
  4. Load compose: Coolify clona el repositorio y crea vacías las variables del compose.

  5. Domains del servicio moodle: la dirección con la que entrarán los usuarios, sin / al final.

No use "Public Git Repository" (no autentica) ni "GitHub App" mientras Coolify no sea accesible desde internet.

Parte 2 — Variables del sistema

Se cargan en la aplicación → Environment Variables → Developer view (editor de texto), en modo literal (sin interpolar), copiándolas del gestor de contraseñas. Detalle de cada una: Variables de entorno.

GrupoVariableQué poner
Base de datosMYSQL_ROOT_PASSWORD, MYSQL_PASSWORDObligatorias. Pueden ser las del servidor original o nuevas (el respaldo trae los datos, no las claves)
MYSQL_DATABASE, MYSQL_USERValores por defecto: moodle, moodleuser
SitioMOODLE_WWWROOTObligatoria y exacta: la dirección con la que entran los usuarios (hoy, en la red interna). Un error aquí provoca bucles de redirección
MOODLE_SITE_NAME, MOODLE_SITE_SHORTNAMEAcademia Deltamontero, AcademiaDM
AdministradoresMOODLE_ADMIN_USER, MOODLE_ADMIN_PASSWORD, MOODLE_ADMIN_EMAILSolo cuentan en una instalación vacía. Al restaurar un respaldo vuelven las cuentas originales
MOODLE_BACKUP_ADMIN_PASSWORDCrea una vez la cuenta de super administrador de respaldo
CorreoMOODLE_SMTP_HOST, MOODLE_SMTP_PORT, MOODLE_SMTP_SECURE, MOODLE_SMTP_USER, MOODLE_SMTP_PASSWORDOffice 365: smtp.office365.com, 587, tls, la cuenta institucional y su clave. En una copia de prueba, vacías
MOODLE_SMTP_FROM, MOODLE_NOREPLY_EMAIL, MOODLE_SUPPORT_EMAILRemitente (vacío = la misma cuenta), dirección "no responder" y correo de soporte
MOODLE_MAIL_DIVERT_TOVacía en producción. En pruebas: un buzón propio (todos los correos van ahí)
Inteligencia artificialGROQ_API_KEYClave del chat de IA. Se aplica sola en cada despliegue
GEMINI_API_KEYOpcional
InfraestructuraCOMPOSE_PROJECT_NAMEdelta-lms
TRAEFIK_HOSTSolo para el modo sin Coolify

Seguridad y demás configuración: se aplica sola

No hay variables para la seguridad: cada despliegue la aplica moodle-config.sh desde el código, igual en todos los servidores. Entre otras cosas:

  • Contraseñas de al menos 10 caracteres, con letras minúsculas y números.
  • Sesión de 2 horas; bloqueo de la cuenta 30 minutos tras 10 contraseñas fallidas.
  • Cookies de sesión protegidas (marcadas como seguras y sin acceso desde JavaScript); sin acceso de invitados.
  • Verificación en dos pasos (MFA, código de app) para los super administradores, con 7 días de gracia.
  • Correo: remitente, desvío de pruebas y límites de envío, a partir de las variables de correo.
  • Tema, textos, roles y permisos, tours, chat de IA y reglas por defecto de la Academia.

Lo que la gente cambia desde la Academia (reglas de cada módulo, personal, módulos, correos en pausa, cuotas de IA) vive en la base de datos y viene en el respaldo.

Parte 3 — Desplegar y cargar el respaldo

Desplegar una vez

Deploy y seguir el registro de despliegue. La primera vez tarda de 5 a 15 minutos (construye la imagen). Esperar a que moodle y moodle-cron queden en verde.

Traer los scripts de respaldo al servidor

En Coolify → Terminal → localhost:

C=$(docker ps --filter label=com.docker.compose.service=moodle --format '{{.Names}}' | head -n1); mkdir -p /opt/delta-lms && docker cp "$C":/opt/delta-lms/. /opt/delta-lms/

Traer el respaldo

Copiar el .tar y su .sha256 a /var/backups/delta-lms/: desde el servidor original (scp) o desde la copia externa (rclone copy). Ver Recuperación.

Restaurar

/opt/delta-lms/infrastructure/scripts/restore.sh --dry-run /var/backups/delta-lms/<archivo>.tar
/opt/delta-lms/infrastructure/scripts/restore.sh /var/backups/delta-lms/<archivo>.tar

Si la dirección del sitio cambió respecto del servidor original, ejecutar el comando replace.php que muestra el script al final.

Activar el respaldo diario

bash /opt/delta-lms/infrastructure/scripts/setup-backup.sh

Queda todos los días a las 2:00 (hora de Ecuador). Ver Respaldos.

Verificar

Ingreso, módulos y avance, archivos, certificados, chat de IA, correo (Correos de la Academia → Diagnosticar la conexión) y el respaldo diario. Lista completa en Recuperación.

En esta página