Notas de Luis

¡Esta es una revisión vieja del documento!


Tabla de Contenidos

PLAN DE MIGRACIÓN FARAMIR → GIMLI

INFORMACIÓN GENERAL

Servidores Involucrados

  • Origen: faramir (a eliminar al final)
  • Destino: gimli (permanece — ya actúa como reverse proxy con SSL para faramir y otras máquinas del grupo)
  • Gandalf: NO es origen de datos. Solo se migran ciertas tareas cron puntuales (ver Fase 7).

Situación de Partida (IMPORTANTE)

  • El DNS de ambos dominios ya apunta a gimli.
  • Gimli ya termina SSL y actúa como reverse proxy hacia faramir para ambos dominios: Internet → gimli (nginx, SSL) → proxy_pass → faramir.
  • El objetivo de esta migración es que gimli pase a servir el contenido localmente, eliminando el proxy_pass hacia faramir: Internet → gimli (nginx, SSL) → local (PHP-FPM / archivos).
  • Esto significa que el “corte” final NO es un cambio de DNS ni requiere parar nada en faramir de entrada — es simplemente cambiar la directiva proxy_pass por root/fastcgi_pass local en el vhost de gimli, una vez verificado que todo funciona. El rollback consiste en revertir esa línea.

Datos a Migrar

  • Dokuwiki: ~1.2 GB (archivos de texto)
  • WordPress: ~450 MB (incluye PDFs e imágenes) — estrategia: copia completa (no núcleo limpio + reinstalación de plugins)
  • Base de Datos: solo la(s) base(s) de datos de estos dos servicios (MariaDB 10.11.14) — NO –all-databases
  • PHP: 8.4.24

Dominios

  • pruebaewelinapmu.my.to (WordPress)
  • arocha.my.to (Dokuwiki)

Notas Importantes

  • ✅ Gimli ya es reverse proxy y ya gestiona certificados SSL para estos dominios (verificar en Fase 2, no asumir que faltan)
  • check_sites y scripts comunes ya existen en gimli
  • DNS ya configurado correctamente
  • ✅ Ambos servidores tienen la misma versión de Ubuntu
  • ⚠️ Nginx (no Apache)
  • ⚠️ Gimli aloja otros sitios: cualquier operación de base de datos o nginx debe ser específica a estos dos dominios, nunca global/destructiva

FASE 0: PREPARACIÓN Y BACKUP

0.1 Verificar Espacio en Gimli

# En gimli
df -h /var/www
df -h /tmp
df -h /home
 
# Espacio requerido: mínimo 3GB libres (datos + backups)

0.2 Verificar Versiones y Compatibilidad

# En faramir
lsb_release -a
php --version
mariadb --version
nginx -v
 
# En gimli
lsb_release -a
php --version
mariadb --version
nginx -v

0.3 Crear Directorios en Gimli

# En gimli
sudo mkdir -p /var/www/dokuwiki
sudo mkdir -p /var/www/pruebaewelinapmu
sudo chown -R www-data:www-data /var/www/dokuwiki /var/www/pruebaewelinapmu
sudo mkdir -p /tmp/migracion_backup/repos

0.4 Backup Completo en Faramir

# En faramir
mkdir -p ~/backup_migracion
cd ~/backup_migracion
 
# 1. Identificar y volcar SOLO las bases de datos relevantes (WordPress + Dokuwiki si usa BD)
sudo mysql -e "SHOW DATABASES;"
grep -i "DB_NAME" /var/www/pruebaewelinapmu/wp-config.php
 
sudo mysqldump --single-transaction --routines --triggers wordpress_db > wordpress_db.sql
gzip wordpress_db.sql
 
# 2. Backup de Dokuwiki
sudo tar -czf dokuwiki_backup.tar.gz -C /var/www dokuwiki
 
# 3. Backup de WordPress (completo)
sudo tar -czf wordpress_backup.tar.gz -C /var/www pruebaewelinapmu
 
# 4. Backup de configuración Nginx (solo referencia, no se copiará entera a gimli)
sudo tar -czf nginx_config_backup.tar.gz -C /etc nginx
 
# 5. Backup de crontabs
crontab -l > crontab_usuario.txt
sudo crontab -l > crontab_root.txt
 
# 6. Backup de listas de paquetes
dpkg -l | grep '^ii' | awk '{print $2}' > paquetes_instalados.txt
dpkg --get-selections > paquetes_selecciones.txt
apt-mark showmanual > paquetes_manuales.txt
 
# 7. Verificar backups
ls -lh
tar -tzf dokuwiki_backup.tar.gz | head -20
tar -tzf wordpress_backup.tar.gz | head -20
zcat wordpress_db.sql.gz | head -50
 
# 8. Copiar backups a gimli
scp *.tar.gz *.txt ubuntu@gimli:/tmp/migracion_backup/

0.5 Verificar Backups en Gimli

# En gimli
cd /tmp/migracion_backup
ls -lh
md5sum *.tar.gz *.txt  # Guardar checksums para verificar integridad

FASE 1: SINCRONIZACIÓN DE PAQUETES UBUNTU

1.1 Verificar Repositorios Adicionales

# En faramir
ls -la /etc/apt/sources.list.d/
scp /etc/apt/sources.list.d/* ubuntu@gimli:/tmp/migracion_backup/repos/
# En gimli
sudo cp /tmp/migracion_backup/repos/* /etc/apt/sources.list.d/ 2>/dev/null
sudo apt update

1.2 Sincronizar Paquetes

# En gimli
cd /tmp/migracion_backup
 
# Método recomendado: instalar solo lo que falte (NO usar dselect-upgrade,
# que podría desinstalar paquetes que gimli ya necesita para otros sitios)
comm -23 <(sort paquetes_instalados.txt) <(dpkg -l | grep '^ii' | awk '{print $2}' | sort) > paquetes_faltantes.txt
cat paquetes_faltantes.txt
sudo apt install -y $(cat paquetes_faltantes.txt) 2>&1 | tee instalacion_paquetes.log
 
grep "Unable to locate package" instalacion_paquetes.log
grep "dependency problems" instalacion_paquetes.log

1.3 Verificar Paquetes Críticos

# En gimli
for pkg in nginx php8.4-fpm php8.4-mysql php8.4-xml php8.4-gd \
  php8.4-mbstring php8.4-curl php8.4-zip php8.4-intl php8.4-imagick \
  php8.4-soap php8.4-bcmath mariadb-server mariadb-client certbot \
  python3-certbot-nginx rsync git curl wget unzip zip tar htop vim nano \
  tree ncdu fail2ban ufw composer wp-cli mycli; do
    if ! dpkg -l | grep -q "^ii.*$pkg"; then
        echo "❌ FALTA: $pkg - Instalando..."
        sudo apt install -y $pkg
    else
        echo "✅ OK: $pkg"
    fi
done
sudo systemctl restart php8.4-fpm

1.4 Verificar Servicios

# En gimli
sudo systemctl status nginx
sudo systemctl status php8.4-fpm
sudo systemctl status mariadb
sudo systemctl status fail2ban

FASE 2: CONFIGURACIÓN DE NGINX (sin tocar sitios existentes de gimli)

2.1 Localizar y Revisar los Vhosts Actuales en Gimli

# En gimli - estos vhosts YA EXISTEN (con proxy_pass a faramir). Localizarlos:
grep -rl "pruebaewelinapmu\|arocha" /etc/nginx/sites-available/
 
# Hacer backup de los vhosts actuales antes de tocarlos
sudo cp /etc/nginx/sites-available/pruebaewelinapmu /etc/nginx/sites-available/pruebaewelinapmu.bak.$(date +%Y%m%d)
sudo cp /etc/nginx/sites-available/arocha /etc/nginx/sites-available/arocha.bak.$(date +%Y%m%d)

2.2 Verificar Certificados SSL Existentes

# En gimli - lo normal es que YA existan, al ser gimli reverse proxy activo con SSL
sudo certbot certificates | grep -A5 "pruebaewelinapmu\|arocha"
 
# Solo si falta alguno de los dos:
# sudo certbot --nginx -d pruebaewelinapmu.my.to -d www.pruebaewelinapmu.my.to
# sudo certbot --nginx -d arocha.my.to

2.3 Preparar Vhosts Locales (SIN activar aún el corte de tráfico)

# En gimli - editar los vhosts para que apunten a local, pero dejar comentado
# el proxy_pass actual hasta la Fase 9 (corte). Ejemplo de bloques a preparar:
sudo nano /etc/nginx/sites-available/pruebaewelinapmu
# root /var/www/pruebaewelinapmu;
# index index.php;
# location ~ \.php$ { fastcgi_pass unix:/run/php/php8.4-fpm.sock; ... }
# ssl_certificate /etc/letsencrypt/live/pruebaewelinapmu.my.to/fullchain.pem;
# ssl_certificate_key /etc/letsencrypt/live/pruebaewelinapmu.my.to/privkey.pem;
 
sudo nano /etc/nginx/sites-available/arocha
# root /var/www/dokuwiki;
# ...
 
sudo nginx -t

2.4 Prueba en Paralelo (sin afectar producción)

# En gimli - probar el vhost local antes de activarlo en producción,
# usando el Host header directamente contra localhost (sin pasar por el proxy_pass):
curl -H "Host: pruebaewelinapmu.my.to" http://localhost/ -k -I
curl -H "Host: arocha.my.to" http://localhost/ -k -I

FASE 3: MIGRACIÓN DE BASE DE DATOS

3.1 Preparar MariaDB en Gimli

# En gimli
sudo systemctl start mariadb
sudo systemctl enable mariadb

3.2 Restaurar Base de Datos de WordPress (solo esta BD, no todas)

# En gimli
cd /tmp/migracion_backup
sudo gunzip wordpress_db.sql.gz
 
# Crear la BD si no existe (nombre real obtenido en 0.4)
sudo mysql -e "CREATE DATABASE IF NOT EXISTS wordpress_db CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
sudo mysql wordpress_db < wordpress_db.sql
 
sudo mysql -e "SHOW DATABASES;"

3.3 Crear Usuario para WordPress (si es necesario)

# En gimli - obtener credenciales exactas de faramir
ssh ubuntu@faramir "grep -E 'DB_NAME|DB_USER|DB_PASSWORD|DB_HOST' /var/www/pruebaewelinapmu/wp-config.php"
 
# Crear usuario en gimli SOLO si no existe ya (gimli aloja otras BD/usuarios)
sudo mysql -e "CREATE USER IF NOT EXISTS 'wordpress_user'@'localhost' IDENTIFIED BY 'contraseña_segura';"
sudo mysql -e "GRANT ALL PRIVILEGES ON wordpress_db.* TO 'wordpress_user'@'localhost';"
sudo mysql -e "FLUSH PRIVILEGES;"

FASE 4: MIGRACIÓN DE ARCHIVOS

4.1 Migrar Dokuwiki

# En gimli
cd /tmp/migracion_backup
sudo tar -xzf dokuwiki_backup.tar.gz -C /var/www/
ls -la /var/www/dokuwiki

4.2 Migrar WordPress (copia completa)

# En gimli - copia completa tal cual estaba en faramir
cd /tmp/migracion_backup
sudo rm -rf /var/www/pruebaewelinapmu
sudo tar -xzf wordpress_backup.tar.gz -C /var/www/
 
ls -la /var/www/pruebaewelinapmu

4.3 Ajustar wp-config.php

# En gimli - el wp-config.php ya viene incluido en la copia completa.
# Solo hay que revisar/actualizar credenciales de BD si difieren:
sudo nano /var/www/pruebaewelinapmu/wp-config.php
# Confirmar DB_HOST, DB_NAME, DB_USER, DB_PASSWORD

4.4 Ajustar Permisos

# En gimli
sudo chown -R www-data:www-data /var/www/pruebaewelinapmu /var/www/dokuwiki
 
sudo find /var/www/pruebaewelinapmu -type d -exec chmod 755 {} \;
sudo find /var/www/pruebaewelinapmu -type f -exec chmod 644 {} \;
sudo chmod 600 /var/www/pruebaewelinapmu/wp-config.php

4.5 Actualizar URLs en Base de Datos (si aplica)

# En gimli - solo si la URL almacenada en BD difiere de la de producción
cd /var/www/pruebaewelinapmu
sudo -u www-data wp option get siteurl
sudo -u www-data wp option get home
 
# Si hace falta corregir:
# sudo -u www-data wp search-replace "http://url-antigua" "https://pruebaewelinapmu.my.to"

FASE 5: CONFIGURACIÓN DE CRON JOBS

5.1 Crontab de Usuario (ubuntu) en Gimli

# En gimli
crontab -e
 
# ============================================
# CRONTAB DE USUARIO UBUNTU EN GIMLI
# ============================================
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/home/ubuntu/bin
 
# ========== DE GANDALF (a migrar — únicas confirmadas) ==========
12  * * * * check_sites
15 09 * * * check_sites Diario
 
# ========== NUEVAS, DE FARAMIR (Dokuwiki) ==========
01 00 * * * sudo find /var/www/dokuwiki -type d -exec chmod 775 {} \;
02 00 * * * sudo find /var/www/dokuwiki -type f -exec chmod 664 {} \;
08 00 * * * copias/backup
09 00 * * * copias/backup_data
08 01 * * * sudo chown www-data:www-data -R /var/www/dokuwiki
 
# ⚠️ NOTA: "copias/backup" a las 00:08 - confirmar si coincide con una tarea
# ya existente en gimli antes de fijar el horario definitivo (pendiente)
 
# ========== NO INCLUIDAS (no confirmadas por Luis) ==========
# report_fail2ban, "sudo apto update", check_reboot, notify @reboot y el
# "copias/backup" a las 00:30 aparecían en el borrador original bajo "gandalf"
# pero no han sido confirmadas como tareas a migrar. Si alguna de ellas ya
# vive en gimli, no requiere acción; si no, indicar cuáles añadir.

5.2 Crontab de Root en Gimli

# En gimli
sudo crontab -e
 
# ========== NUEVAS, DE FARAMIR (WordPress) ==========
*/15 * * * * find /var/www/pruebaewelinapmu -type d -exec chmod g+rwx {} \;
*/15 * * * * find /var/www/pruebaewelinapmu -type f -exec chmod g+rw {} \;

5.3 Verificar Scripts y Permisos

# En gimli
ls -la /home/ubuntu/bin/
which check_sites check_reboot notify
which copias/backup 2>/dev/null
 
/home/ubuntu/bin/check_sites
/home/ubuntu/bin/check_reboot

FASE 6: VERIFICACIÓN Y PRUEBAS (antes del corte)

6.1 Verificar Servicios y Puertos

# En gimli
sudo systemctl status nginx php8.4-fpm mariadb fail2ban
sudo netstat -tlnp | grep -E ':(80|443|3306)'

6.2 Probar Dokuwiki (vía Host header, sin tocar producción)

# En gimli
sudo -u www-data ls -la /var/www/dokuwiki/data/
curl -H "Host: arocha.my.to" -I http://localhost/
 
# Navegar manualmente y verificar:
# - Página de inicio, edición de página, archivos multimedia

6.3 Probar WordPress (vía Host header, sin tocar producción)

# En gimli
sudo -u www-data wp --path=/var/www/pruebaewelinapmu core verify-checksums
curl -H "Host: pruebaewelinapmu.my.to" -I http://localhost/
curl -H "Host: pruebaewelinapmu.my.to" -I http://localhost/wp-admin
 
sudo -u www-data wp --path=/var/www/pruebaewelinapmu plugin list
sudo -u www-data wp --path=/var/www/pruebaewelinapmu theme list
 
# Verificar manualmente: frontend, admin, PDFs, imágenes, plugins críticos

6.4 Verificar Logs

# En gimli
sudo tail -f /var/log/nginx/error.log
sudo tail -f /var/log/php8.4-fpm.log
sudo tail -f /var/log/mysql/error.log
 
sudo grep -i error /var/log/nginx/error.log | tail -20
sudo grep -i error /var/log/php8.4-fpm.log | tail -20

6.5 Probar Backups y Crons

copias/backup 2>&1 | head -20
copias/backup_data 2>&1 | head -20

FASE 7: CORTE (activar servicio local en gimli)

7.1 Última Sincronización desde Faramir

# En gimli - sincronizar cualquier cambio reciente ANTES del corte
# (excluyendo wp-config.php para no pisar credenciales ya ajustadas en gimli)
rsync -avz --delete ubuntu@faramir:/var/www/dokuwiki/ /var/www/dokuwiki/
 
rsync -avz --delete --exclude='wp-config.php' \
  ubuntu@faramir:/var/www/pruebaewelinapmu/ /var/www/pruebaewelinapmu/
 
# Última BD de WordPress
ssh ubuntu@faramir "sudo mysqldump --single-transaction wordpress_db" > /tmp/wordpress_final.sql
sudo mysql wordpress_db < /tmp/wordpress_final.sql

7.2 Activar los Vhosts Locales (el corte real)

# En gimli - sustituir proxy_pass por la configuración local preparada en 2.3
sudo nginx -t
sudo systemctl reload nginx
 
# Verificación inmediata en producción
curl -I https://pruebaewelinapmu.my.to
curl -I https://arocha.my.to

7.3 Rollback Inmediato (si algo falla)

# En gimli - basta con restaurar el vhost con proxy_pass a faramir
sudo cp /etc/nginx/sites-available/pruebaewelinapmu.bak.$(date +%Y%m%d) /etc/nginx/sites-available/pruebaewelinapmu
sudo cp /etc/nginx/sites-available/arocha.bak.$(date +%Y%m%d) /etc/nginx/sites-available/arocha
sudo nginx -t
sudo systemctl reload nginx
# Faramir no ha sido tocado, por lo que el tráfico vuelve a funcionar de inmediato

FASE 8: SEGUIMIENTO Y DESMANTELAMIENTO DE FARAMIR

8.1 Periodo de Observación (24–48h)

# En gimli - monitoreo, faramir se mantiene encendido e intacto como red de seguridad
watch -n 30 'curl -s -o /dev/null -w "%{http_code}" https://pruebaewelinapmu.my.to && echo " - WordPress OK"'
watch -n 30 'curl -s -o /dev/null -w "%{http_code}" https://arocha.my.to && echo " - Dokuwiki OK"'

8.2 Backup Final de Faramir

# En faramir - por precaución, antes de desmantelar
cd ~
sudo tar -czf faramir_final_backup_$(date +%Y%m%d).tar.gz \
  /var/www /etc/nginx /etc/mysql /var/lib/mysql
# Copiar este backup fuera de faramir (a gimli u otro almacenamiento) antes de purgar

8.3 Desactivar Servicios en Faramir

# En faramir - solo tras confirmar que gimli funciona correctamente sin incidencias
sudo systemctl stop nginx php8.4-fpm mariadb
sudo systemctl disable nginx php8.4-fpm mariadb

8.4 Limpieza de Faramir (opcional, cuando estés completamente seguro)

# En faramir - ADVERTENCIA: esto elimina datos de forma irreversible
sudo apt-get remove --purge nginx* php* mariadb* mysql* -y
sudo rm -rf /var/www/* /etc/nginx /var/lib/mysql /etc/letsencrypt

CHECKLIST FINAL

Preparación

  • ☐ Verificar espacio en gimli (mínimo 3GB libres)
  • ☐ Verificar versiones de Ubuntu, PHP, MariaDB, Nginx
  • ☐ Crear directorios en gimli
  • ☐ Backup completo en faramir (BD específica de WordPress, no –all-databases)
  • ☐ Copiar backups a gimli

Paquetes

  • ☐ Copiar repositorios adicionales
  • ☐ Instalar solo paquetes faltantes (sin dselect-upgrade)
  • ☐ Verificar paquetes críticos
  • ☐ Verificar servicios activos

Nginx y Certificados

  • ☐ Backup de vhosts actuales de gimli antes de tocarlos
  • ☐ Verificar certificados SSL existentes (probablemente ya emitidos)
  • ☐ Preparar configuración local en vhosts (sin activar aún)
  • ☐ Probar vhosts locales vía Host header, sin afectar producción

Datos

  • ☐ Restaurar BD específica de WordPress (no todas las BD)
  • ☐ Migrar Dokuwiki
  • ☐ Migrar WordPress (copia completa)
  • ☐ Ajustar wp-config.php y permisos
  • ☐ Verificar/actualizar URLs en BD

Cron

  • ☐ Configurar crontab de usuario en gimli
  • ☐ Configurar crontab de root en gimli
  • ☐ Resolver duplicado de copias/backup
  • ☑ Confirmado con Luis: de gandalf solo se migran check_sites y check_sites Diario
  • ☐ Verificar scripts y permisos

Pruebas Pre-Corte

  • ☐ Servicios activos sin errores
  • ☐ Dokuwiki funcional (Host header)
  • ☐ WordPress frontend y admin funcional (Host header)
  • ☐ Multimedia y plugins verificados
  • ☐ Logs sin errores
  • ☐ Backups y crons probados

Corte

  • ☐ Última sincronización desde faramir (excluyendo wp-config.php)
  • ☐ Activar vhosts locales en gimli (reemplazar proxy_pass)
  • ☐ Verificar en producción inmediatamente
  • ☐ Confirmar plan de rollback listo (vhosts .bak)

Post-Corte

  • ☐ Monitorizar 24–48h con faramir como red de seguridad intacta
  • ☐ Backup final de faramir
  • ☐ Desactivar servicios en faramir
  • ☐ (Opcional) Purgar faramir cuando haya total seguridad

NOTAS ADICIONALES

Horarios Recomendados

  • Backup y migración de datos: horario de bajo tráfico (ej. 2:00 AM)
  • Corte (Fase 7.2): bajo riesgo real gracias al rollback instantáneo, pero recomendable en horario de bajo tráfico igualmente

Contactos de Emergencia

  • Documentar accesos de soporte
  • Tener acceso a la consola de Oracle Cloud por si falla el SSH

Pendiente de Confirmar con Luis

  • Si el cron copias/backup duplicado (00:08 vs. existente en gimli) es la misma tarea
  • Confirmar si report_fail2ban, apto update, check_reboot o notify (marcadas como “no confirmadas”) ya existen en gimli o hay que añadirlas

FIN DEL PLAN DE MIGRACIÓN

computing/cloud/migracion_oracle.1785963238.txt.gz · Última modificación: por 127.0.0.1