# MIGRACIÓN Debian 11 → Debian 12 (Diciembre 2025)

## Cambios realizados:

### 1. **Sistema Operativo**
- Actualizado de Debian 11 (bullseye) a Debian 12 (bookworm)
- Todas las librerías del sistema actualizadas

### 2. **Servicios Web**
- **NGINX**: Actualizado y configurado con PHP 8.2
- **Apache2**: Removido (no se utilizaba)
- **PHP**: Actualizado de 7.4 a 8.2

### 3. **Shiny Server**
- Versión 1.5.20.0 funcionando
- Configurado en puerto 3838 con proxy NGINX
- URL: https://www2.dgeo.udec.cl/shiny/hw-monitor/

### 4. **Paquetes R - Cambios importantes**
- `tmap`: **COMENTADO** - Incompatible con nuevas librerías de Debian 12
  - Razón: Requiere compilación compleja (BayesX) que falla
  - Solución: La app NO usa funciones de tmap realmente
  - Archivos modificados: `server.R` y `ui.R` (línea `library(tmap)` comentada)
        /srv/shiny-server/hw-monitor/server.R:library(tmap)  
        /srv/shiny-server/hw-monitor/ui.R:library(tmap)

- **Paquetes recompilados/actualizados**:
  - `sf`, `terra`, `ncdf4`, `tidyverse`, `rgdal`, `raster`, `sp`
  - Todos compatibles con libgdal32, libproj25, libnetcdf19

### 5. **Para el desarrollador:**

#### Si necesitas tmap:
```r
# Opción 1: Instalar manualmente (puede fallar)
install.packages("tmap", dependencies=c("Depends", "Imports", "LinkingTo"))

# Opción 2: Reemplazar con alternativas:
# - Mapas estáticos: ggplot2 + sf
# - Mapas interactivos: leaflet
# - Mapas temáticos: cartography, mapsf



# MIGRACIÓN Debian 12 → Debian 13 (Diciembre 2025)

## **RESUMEN**
Migración exitosa de Debian 12 a Debian 13 con reparación completa de **todos los enlaces simbólicos rotos**. La migración incluyó parches críticos para shiny-server y conversión sistemática de rutas relativas (`../../`) a rutas absolutas.

## **PROBLEMA PRINCIPAL RESUELTO**
**Enlaces simbólicos relativos** que apuntaban con rutas `../` o `../../` dejaron de funcionar al copiar la aplicación del storage original a directorio local.

### **REPARACIÓN COMPLETA DE ENLACES:**

| Directorio | Rota Original → Ruta Reparada | Estado |
|------------|-------------------------------|---------|
| **`www/upload/`** | `../../ETI/upload/` → `/media/data/hw_dynamic/ETI/upload/` | ✅ **REPARADO** |
| **`www/figures/`** | `../../ETI/figures/` → `/media/data/hw_dynamic/ETI/figures/` | ✅ **REPARADO** |
| **`www/external_repository/JMA/`** | `../../../JMA/` → `/media/data/hw_dynamic/JMA/` | ✅ **REPARADO** |
| **`www/external_repository/mjo_repo/`** | `../../../MJO_REPO/` → `/media/data/hw_dynamic/MJO_REPO/` | ✅ **REPARADO** |
| **`www/external_repository/SERVIMET/`** | `../../../SERVIMET/` → `/media/data/hw_dynamic/SERVIMET/` | ✅ **REPARADO** |

### **Comandos aplicados:**
```bash
# 1. Datos SETI
rm -f /srv/shiny-server/hw-monitor/www/upload
ln -sf /media/data/hw_dynamic/ETI/upload/ /srv/shiny-server/hw-monitor/www/upload

# 2. Figuras SETI  
rm -f /srv/shiny-server/hw-monitor/www/figures
ln -sf /media/data/hw_dynamic/ETI/figures/ /srv/shiny-server/hw-monitor/www/figures

# 3. Repositorios externos
ln -sf /media/data/hw_dynamic/JMA/ /srv/shiny-server/hw-monitor/www/external_repository/JMA
ln -sf /media/data/hw_dynamic/MJO_REPO/ /srv/shiny-server/hw-monitor/www/external_repository/mjo_repo
ln -sf /media/data/hw_dynamic/SERVIMET/ /srv/shiny-server/hw-monitor/www/external_repository/SERVIMET
```

## **PROBLEMA TÉCNICO: Shiny-server en Debian 13**

### **Error:**
```bash
su: se ignora --preserve-environment; es mutuamente excluyente con --login
```

### **Solución: Parche con wrapper personalizado**
```bash
# Crear wrapper shiny-runuser
cat > /usr/local/bin/shiny-runuser << 'EOF'
#!/bin/bash
USER="$1"
shift
exec runuser -u "$USER" -- /bin/bash -c "$@"
EOF
chmod +x /usr/local/bin/shiny-runuser

# Parchear shiny-server
sed -i 's/var command = "su";/var command = "\/usr\/local\/bin\/shiny-runuser";/' \
       /usr/lib/shiny-server/lib/worker/app-worker.js
sed -i '/if (process.platform === "linux")/,/args.unshift("-");/s/^/\/\/ /' \
       /usr/lib/shiny-server/lib/worker/app-worker.js
```

## **ESTRUCTURA FINAL DE DIRECTORIOS**
```
/srv/shiny-server/hw-monitor/                    # Copia LOCAL de la aplicación
├── server.R                                     # Lógica principal
├── ui.R                                         # Interfaz de usuario
└── www/
    ├── upload -> /media/data/hw_dynamic/ETI/upload/          # Datos SETI
    ├── figures -> /media/data/hw_dynamic/ETI/figures/        # Imágenes SETI
    └── external_repository/
        ├── JMA -> /media/data/hw_dynamic/JMA/                # Datos JMA
        ├── mjo_repo -> /media/data/hw_dynamic/MJO_REPO/      # Datos MJO
        └── SERVIMET -> /media/data/hw_dynamic/SERVIMET/      # Datos SERVIMET
```

## **URLS DE ACCESO**
- **Aplicación principal**: https://www2.dgeo.udec.cl/shiny/hw-monitor/
- **Shiny Server directo**: http://localhost:3838/hw-monitor/
- **Logs**: `/var/log/shiny-server/`

## **INSTRUCCIONES PARA MANTENIMIENTO**

### **Para actualizar la aplicación:**
```bash
# Sincronizar solo código (excluir www/ para mantener enlaces)
rsync -av --exclude='www/' /media/data/hw_dynamic/hw-monitor/ \
      /srv/shiny-server/hw-monitor/

# Reaplicar permisos
chown -R www-data:shiny /srv/shiny-server/hw-monitor
chmod -R 750 /srv/shiny-server/hw-monitor
```

### **Para verificar integridad:**
```bash
# 1. Verificar enlaces
ls -la /srv/shiny-server/hw-monitor/www/*

# 2. Verificar datos
ls -la /media/data/hw_dynamic/ETI/upload/*.csv | head -3
ls -la /media/data/hw_dynamic/JMA/ | head -3

# 3. Verificar logs
tail -20 /var/log/shiny-server.log | grep -v "WARN"
```

### **Si reinstalas shiny-server:**
```bash
# REAPLICAR PARCHE después de reinstalar
apt-get install --reinstall shiny-server
cp /usr/local/bin/shiny-runuser /usr/local/bin/shiny-runuser.backup
# Reaplicar los comandos de parche del wrapper
```

## **LIMPIEZA POST-MIGRACIÓN**
```bash
# Remover paquetes residuales (estado 'rc')
dpkg -l | grep ^rc | awk '{print $2}' | xargs sudo dpkg --purge

# Limpiar sistema
apt-get autoremove
apt-get autoclean
```

## **VERIFICACIÓN DE FUNCIONAMIENTO**
```bash
# Comando de verificación completa
echo "=== VERIFICACIÓN MIGRACIÓN ==="
echo "1. App carga: $(curl -s http://localhost:3838/hw-monitor/ | grep -c 'shiny\|html')"
echo "2. Enlaces activos: $(find /srv/shiny-server/hw-monitor/www -type l | wc -l)"
echo "3. Shiny-server: $(systemctl is-active shiny-server)"
echo "4. Sin paquetes rc: $(dpkg -l | grep ^rc | wc -l)"
```

## **OBSERVACIONES**
1. **Enlaces simbólicos relativos** (`../../`) son frágiles en migraciones → **Usar rutas absolutas**
2. **Debian 13 cambió comportamiento de `su`** → **Requiere wrapper personalizado**
3. **Estrategia copia local + enlaces** → **Mejor rendimiento y estabilidad**
4. **Verificar TODOS los enlaces** → **No solo los evidentes**

## **ESTADO FINAL**
- ✅ **Sistema**: Debian 13 estable
- ✅ **Web**: NGINX + PHP 8.4 funcionando
- ✅ **Shiny-server**: Parcheado y estable
- ✅ **App hw-monitor**: 100% operativa con todos sus datos
- ✅ **Datos externos**: JMA, MJO, SERVIMET accesibles
- ✅ **Limpieza**: Sistema optimizado sin residuos

---

**MIGRACIÓN COMPLETADA**: 22 de Diciembre, 2025  
**RESPONSABLE**: Cristian Franco 
**ESTADO**: **PRODUCCIÓN - 100% FUNCIONAL**  
**URL PRODUCCIÓN**: https://www2.dgeo.udec.cl/shiny/hw-monitor/
