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:
- Arquitectura: contenedor de Proxmox → Ubuntu → Docker y Coolify → conexión con GitHub → aplicación.
- Variables del sistema: base de datos, sitio, administradores, correo, IA e infraestructura.
- 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 cosa | Qué contiene | Cómo se recupera |
|---|---|---|
Repositorio deltamontero/lms-moodle | Código, plugins, configuración del sitio, scripts | Se clona desde GitHub |
| Variables de Coolify | Claves y datos de conexión (tabla de la parte 2) | Desde el gestor de contraseñas |
Respaldo .tar | Base de datos y archivos subidos | Desde /var/backups/delta-lms o la copia externa |
| Se aplica solo en cada despliegue | Seguridad, correo, tema, roles, tours, reglas por defecto | No 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ón | Valor |
|---|---|
| Plantilla | Ubuntu (el contenedor actual usa Ubuntu 24.10) |
| CPU / RAM / Swap | 4 núcleos / 8 GB / 4 GB |
| Disco | 250 GB en local |
| Red | eth0 en vmbr0, IP fija /24, puerta de enlace 192.168.0.254 |
| Options → Features | nesting=1 y keyctl=1 (necesarios para Docker) |
| Options → Start at boot | Yes |
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 updateLuego, actualizar e instalar las herramientas base:
DEBIAN_FRONTEND=noninteractive apt upgrade -y && apt install -y curl wget git jqUbuntu 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 | bashComprobar:
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 443Lo normal es que el 22 dé timed out y el 443 succeeded.
- En Coolify: Keys & Tokens → Private Keys → + Add → Generate new ED25519 SSH Key. Copiar la llave pública.
- 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". - No borrar las llaves de otros servidores que sigan en uso.
Crear la aplicación en Coolify
-
Projects → proyecto → entorno
production→ + New resource → Private Git Repository (with Deploy Key). -
Elegir la llave creada en el paso anterior.
-
Datos del repositorio:
Campo Valor Repository URL ssh://git@ssh.github.com:443/deltamontero/lms-moodle.gitBranch mainBuild pack Docker Compose Compose file /docker-compose.yml -
Load compose: Coolify clona el repositorio y crea vacías las variables del compose.
-
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.
| Grupo | Variable | Qué poner |
|---|---|---|
| Base de datos | MYSQL_ROOT_PASSWORD, MYSQL_PASSWORD | Obligatorias. Pueden ser las del servidor original o nuevas (el respaldo trae los datos, no las claves) |
MYSQL_DATABASE, MYSQL_USER | Valores por defecto: moodle, moodleuser | |
| Sitio | MOODLE_WWWROOT | Obligatoria 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_SHORTNAME | Academia Deltamontero, AcademiaDM | |
| Administradores | MOODLE_ADMIN_USER, MOODLE_ADMIN_PASSWORD, MOODLE_ADMIN_EMAIL | Solo cuentan en una instalación vacía. Al restaurar un respaldo vuelven las cuentas originales |
MOODLE_BACKUP_ADMIN_PASSWORD | Crea una vez la cuenta de super administrador de respaldo | |
| Correo | MOODLE_SMTP_HOST, MOODLE_SMTP_PORT, MOODLE_SMTP_SECURE, MOODLE_SMTP_USER, MOODLE_SMTP_PASSWORD | Office 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_EMAIL | Remitente (vacío = la misma cuenta), dirección "no responder" y correo de soporte | |
MOODLE_MAIL_DIVERT_TO | Vacía en producción. En pruebas: un buzón propio (todos los correos van ahí) | |
| Inteligencia artificial | GROQ_API_KEY | Clave del chat de IA. Se aplica sola en cada despliegue |
GEMINI_API_KEY | Opcional | |
| Infraestructura | COMPOSE_PROJECT_NAME | delta-lms |
TRAEFIK_HOST | Solo 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>.tarSi 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.shQueda 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.