# napi.qvd.tech — Retroalimentación a Estudiantes ## ✅ Estado: MVP FUNCIONAL (2026-02-22) --- ## Contexto Proyecto minimalista para proporcionar retroalimentación personalizada a los estudiantes de DDAW2, cerrando el bucle profesor → alumno. El profesor (Fénix) mantiene ficheros `notas.md` por alumno con: - Tabla resumen de todas las prácticas (nota + estado) - Feedback detallado por práctica - Próximos pasos concretos Los alumnos acceden desde cualquier dispositivo con su navegador, sin instalar nada. --- ## Arquitectura Final ``` aldebaran (local) zzz (qu3v3d0.tech) ───────────────── ────────────────── ~/napi-data/ sshfs /var/www/napi/data/ ├── anas/notas.md ←──────────→ ├── anas/notas.md ├── pablo/notas.md ├── pablo/notas.md ├── miguel/notas.md ├── miguel/notas.md └── .../ (19 alumnos) └── .../ (19 alumnos) /var/www/napi/ ├── viewer.html (app completa) └── marked.min.js (renderer local) Nginx + libnginx-mod-http-auth-pam → auth con credenciales SFTP del alumno → $remote_user → sirve /var/www/napi/data/$remote_user/notas.md → viewer.html renderiza el .md en el navegador (marked.js local) ``` ### Stack | Componente | Tecnología | Dónde | |:-----------|:-----------|:------| | **Datos** | Ficheros `notas.md` (Markdown) | `zzz:/var/www/napi/data/` | | **Transporte** | sshfs mount persistente | aldebaran → zzz | | **Servidor web** | Nginx | zzz | | **Autenticación** | `libnginx-mod-http-auth-pam` | zzz | | **Renderer** | `marked.min.js` (local, sin CDN) + `viewer.html` | zzz | | **Notificaciones** (watcher nginx) | Python + slixmpp → XMPP | zzz | **Sin backend. Sin Python para servir. Sin JSON. Sin Syncthing.** --- ## URL de Acceso ``` https://notas.qu3v3d0.tech ``` Una sola URL para todos los alumnos. Nginx usa `$remote_user` tras auth_pam para servir el `.md` correcto. - Alumno ingresa sus credenciales SFTP (mismas que FileZilla) - Ve únicamente sus propias notas - Refresco del navegador = actualización inmediata --- ## Ficheros Clave en zzz | Ruta | Descripción | |:-----|:------------| | `/var/www/napi/data/$alumno/notas.md` | Fuente de datos por alumno | | `/var/www/napi/viewer.html` | App completa (fetch + marked.js) | | `/var/www/napi/marked.min.js` | Renderer Markdown local | | `/etc/nginx/sites-enabled/napi` | Config Nginx del servicio | `www-data` está en grupo `shadow` (necesario para auth_pam). --- ## Ficheros Clave en aldebaran | Ruta | Descripción | |:-----|:------------| | `~/napi-data/` | Mount sshfs → `/var/www/napi/data/` en zzz | | `~/.config/systemd/user/home-fenix-napi\x2ddata.mount` | Unit systemd persistente | | `~/napi-data/_plantilla/notas.md` | Plantilla para alumnos nuevos | | `~/napi-data/README.md` | Documentación del proyecto | --- ## Workflow Emacs (edición) ``` 1. C-x C-f ~/napi-data/pablo/notas.md 2. Editar → C-x C-s 3. Alumno refresca navegador → cambios visibles al instante ``` El sshfs hace que guardar en aldebaran sea equivalente a escribir directamente en zzz. --- ## Formato notas.md ```markdown # Notas — NombreAlumno > 🏫 Módulo: DDAW2 > 📅 Última actualización: FECHA ## 📊 Resumen | Práctica | Título | Nota | Estado | | P2.3 | Nginx via SFTP | 7/10 | ✅ | ... ## P2.7 — Multi-sitio Web con Nginx **Nota: 9/10** [feedback personalizado] ### Criterios | Criterio | Puntos | Estado | ... ``` Ver `_plantilla/notas.md` y cualquier alumno como referencia. --- ## Alumnos Activos (19) — DDAW2 ``` anas, carlos, carlosv, daniel, danieln, erick, evelin, gianfranco, giorgio, joel, jorge, josue, juanan, juanjesus, kasandra, marius, miguel, pablo, patrick ``` Credenciales SFTP en `~/EducaMadrid/DDAW2/PRACTICA2.4-despliegue-web-HTTP-y-HTTPS/README.md`. --- ## SSH / Conexión a zzz ```bash ssh fenix@qu3v3d0.tech # clave sin -i ``` `fenix` tiene sudo en zzz. Alumnos: grupo `sftpusers`, chroot `/home/$user`. --- ## Añadir Alumno Nuevo ```bash # 1. En zzz: crear usuario SFTP (ver README de P2.4 para el script completo) sudo useradd -m -d /home/$USER -s /usr/sbin/nologin -G sftpusers,www-data $USER # 2. En aldebaran: crear carpeta de notas mkdir ~/napi-data/$USER cp ~/napi-data/_plantilla/notas.md ~/napi-data/$USER/notas.md # Editar con Emacs y personalizar ``` --- ## Prácticas Documentadas | Práctica | Directorio local | Descripción | |:---------|:-----------------|:------------| | P2.3 | `~/EducaMadrid/DDAW2/PRACTICA2.3-despliegue-nginx-via-sftp/` | Nginx config via SFTP + watcher inotify + XMPP | | P2.4 | `~/EducaMadrid/DDAW2/PRACTICA2.4-despliegue-web-HTTP-y-HTTPS/` | HTTP + HTTPS con cert wildcard autofirmado | | P2.5 | `~/EducaMadrid/DDAW2/PRACTICA2.5-despliegue-web-bloquear-CDN-JS+servir-MD/` | CSP + bloqueo CDN + marked.js local | | P2.6 | `~/EducaMadrid/DDAW2/PRACTICA2.6-Hextris-compresion-cache-y-mejora-de-rendimiento/` | Hextris + gzip + caché | | P2.7 | `~/EducaMadrid/DDAW2/PRACTICA2.7-MULTI-SITIO-WEB-NGINX@zzz/` | Multi-sitio: Hextris + App propia + CSP + cabeceras | --- ## Pendiente - [ ] Rellenar notas de pablo (P2.3 → P2.6 pendientes de detallar) - [ ] Considerar CSS más elaborado para viewer.html (opcional) - [ ] Renovar certificado SSL wildcard cuando expire (generado 2026-02-04, válido 365 días)