📘 Módulo 12: CSS + JavaScript – Animaciones interactivas

📘 Módulo 12: CSS + JavaScript – Animaciones interactivas

Aprender a controlar animaciones CSS con JavaScript. Usar clases dinámicas para disparar transiciones y animaciones.

Objetivos

  • Aprender a controlar animaciones CSS con JavaScript.
  • Crear efectos que respondan a la interacción del usuario (clic, scroll, hover avanzado).
  • Usar clases dinámicas para disparar transiciones y animaciones.
  • Integrar CSS y JS para experiencias más inmersivas.

🔹 1. Activar animaciones con clases dinámicas

css

/* Animación CSS */
@keyframes aparecer {
  from { opacity: 0; transform: translateY(20px); }
  to { opacity: 1; transform: translateY(0); }
}

.caja {
  opacity: 0;
}

.caja.activa {
  animation: aparecer 0.6s ease forwards;
}

js

// JS para añadir la clase al hacer clic
document.querySelector("#boton").addEventListener("click", () => {
  document.querySelector(".caja").classList.add("activa");
});

👉 El elemento .caja se anima solo cuando recibe la clase activa.

🔹 2. Animaciones al hacer scroll

js

window.addEventListener("scroll", () => {
  const elemento = document.querySelector(".animar-scroll");
  const posicion = elemento.getBoundingClientRect().top;
  if (posicion < window.innerHeight) {
    elemento.classList.add("visible");
  }
});

css

.animar-scroll {
  opacity: 0;
  transform: translateY(50px);
  transition: all 0.6s ease;
}

.animar-scroll.visible {
  opacity: 1;
  transform: translateY(0);
}

👉 El elemento aparece suavemente cuando entra en el viewport.

🔹 3. Hover avanzado con JavaScript

js

const boton = document.querySelector(".boton");
boton.addEventListener("mouseenter", () => {
  boton.classList.add("hover-activo");
});
boton.addEventListener("mouseleave", () => {
  boton.classList.remove("hover-activo");
});

css

.boton.hover-activo {
  transform: scale(1.1);
  box-shadow: 0 0 15px #ff6600;
  transition: all 0.3s ease;
}

🔹 4. Animaciones sincronizadas

Puedes combinar varias animaciones CSS y dispararlas con JS para crear secuencias (ej. modal que aparece con fade-in y botones que entran con delay).

📝 Actividad práctica

  1. Crea un botón que al hacer clic muestre una tarjeta con animación fade-in.
  2. Implementa un efecto de scroll que haga aparecer secciones de tu página progresivamente.
  3. Diseña un hover avanzado que combine escala + sombra dinámica activada con JS.

MÓDULO 13 CSS Layouts completos con Grid y flexbox

BOTON HTML CON ICONO Y ENLACE
Poco Rendimiento en AdSense

Poco Rendimiento en AdSense

Si el sitio tiene poco tráfico o contenido nuevo, AdSense no genera impresiones suficientes. 👉 Solución: mejorar SEO y frecuencia de publicación. Falta de tráfico o contenido indexado.

b. Contenido no apto o escaso

AdSense penaliza páginas con:

  • Texto muy corto o duplicado
  • Temas legales o sensibles sin contexto educativo
  • Páginas sin valor añadido

👉 Solución: redactar artículos informativos, guías legales o comparativas con enfoque educativo.

c. Bloqueo por políticas

Si el dominio tuvo rechazos previos, puede estar en revisión o con limitación temporal. 👉 Solución: revisar el panel de AdSense → “Políticas” → “Problemas de sitio”.

d. Errores técnicos

  • Código mal insertado
  • Bloques dentro de etiquetas <script> o <noscript>
  • Conflictos con plugins de caché o privacidad

👉 Solución: usar el bloque estándar de AdSense y probar sin plugins de optimización.

Estrategia general para mejorar rendimiento

ÁreaAcción recomendadaImpacto
ContenidoPublicar artículos útiles y originalesAlto
Ubicación de anunciosColocar bloques visibles (inicio, sidebar, entre párrafos)Alto
Velocidad webOptimizar caché y compresiónMedio
Diseño responsiveAsegurar que los anuncios se adaptan a móvilAlto
SEOMejorar indexación y palabras claveAlto

La mejor forma de potenciar ambos sitios es reforzar contenido, estructura y visibilidad de los bloques publicitarios.

Cuando AdSense muestra ingresos muy bajos, hay un conjunto de indicadores clave dentro de la propia plataforma que te dicen exactamente qué está fallando y qué debes mejorar. Aquí tienes la información más importante que AdSense ofrece para diagnosticar y potenciar la monetización, explicada de forma clara y accionable.

RPM (Ingresos por cada 1000 visitas)

Es el indicador más importante cuando los ingresos son bajos.

  • Si el RPM es bajo, significa que:
    • Los anunciantes pagan poco por tu tráfico
    • O tus páginas no están optimizadas para mostrar anuncios
    • O el contenido no es atractivo para anunciantes

Puedes profundizar en: Mejorar RPM

CTR (Porcentaje de clics)

Si el CTR es bajo, AdSense te está diciendo:

  • Los anuncios no están bien colocados
  • El diseño no invita al clic
  • El contenido no coincide con la intención del usuario

Puedes ver más en: Optimizar CTR

Visibilidad de anuncios (Active View)

AdSense mide cuántos anuncios realmente se ven.

  • Si el Active View es bajo:
    • Los anuncios están demasiado abajo
    • El usuario hace scroll rápido
    • El diseño no favorece la visibilidad

Puedes revisar: Mejorar visibilidad

Bloques de anuncios con bajo rendimiento

AdSense te muestra:

  • Qué bloques generan ingresos
  • Cuáles no generan nada
  • Cuáles tienen errores

Esto te permite eliminar los que no funcionan y reforzar los que sí.

Puedes ver: Diagnóstico de bloques

Políticas y restricciones del sitio

Si un sitio tiene:

  • Contenido insuficiente
  • Contenido no apto
  • Problemas de navegación
  • Errores técnicos

AdSense limita o bloquea la monetización.

Puedes revisar: Problemas de políticas

Análisis de páginas con más ingresos

AdSense te muestra:

  • Qué páginas generan dinero
  • Cuáles no generan nada
  • Qué tipo de contenido atrae mejores anuncios

Esto te permite replicar lo que funciona.

Puedes ver: Páginas de alto rendimiento

Países que generan ingresos

Si tu tráfico viene de países con bajo CPC:

  • España → CPC medio
  • Latinoamérica → CPC bajo
  • India → CPC muy bajo

Esto afecta directamente a tus ingresos.

Puedes revisar: CPC por país

Análisis de dispositivos (móvil vs escritorio)

AdSense te muestra si:

  • El móvil no está mostrando anuncios
  • El diseño responsive falla
  • Los anuncios se cortan o no cargan

Puedes ver: Optimizar anuncios en móvil

Velocidad de carga (PageSpeed)

AdSense detecta si:

  • La página carga lenta
  • Los anuncios tardan en aparecer
  • El usuario abandona antes de verlos

Puedes revisar: Mejorar velocidad

Resumen claro

Los datos más importantes que AdSense te da para entender por qué ganas poco son:

  • RPM
  • CTR
  • Active View
  • Rendimiento por bloque
  • Políticas y restricciones
  • Páginas que generan ingresos
  • Países del tráfico
  • Rendimiento en móvil
  • Velocidad de carga

Si uno de estos indicadores está mal, los ingresos se desploman.

Mantenimiento Mensual VPS

Mantenimiento Mensual VPS

Lee las instrucciones para un mantenimiento mensual seguro para tu VPS Debian, pensado para que lo ejecutes rápido y mantengas siempre el sistema ligero y bajo control:

Revisar espacio en disco

df -h
  • Comprueba que la partición / no supere el 80% de uso.
  • Si ves que se acerca al límite, pasa al siguiente paso de limpieza.

Analizar qué ocupa más espacio

sudo du -h --max-depth=1 /var | sort -h
  • Localiza directorios pesados (/var/log/var/lib/var/www).
  • Si /var/log/journal vuelve a crecer, haz limpieza.

Limpiar logs del sistema

sudo journalctl --vacuum-size=500M
  • Mantiene los logs binarios de systemd por debajo de 500 MB.
  • Si ya configuraste el límite en journald.conf, este comando asegura la limpieza manual.

Rotar y vaciar logs de Apache/Nginx

sudo truncate -s 0 /var/log/apache2/access.log
sudo truncate -s 0 /var/log/apache2/error.log
  • Vacía los logs sin borrar los archivos.
  • Útil si tu web genera mucho tráfico.

Limpiar cachés de paquetes

sudo apt-get clean
sudo apt-get autoremove --purge
  • Estob orra paquetes descargados y dependencias que ya no se usan.
  • Recupera espacio en /var/cache/apt y /var/lib/apt.

Revisar bases de datos (si usas MariaDB/MySQL)

sudo du -h --max-depth=1 /var/lib/mysql | sort -h
  • Identifica tablas grandes.
  • Ejecuta OPTIMIZE TABLE en las que más ocupen para liberar espacio.

Comprobar procesos y servicios activos

htop
  • Revisa consumo de CPU y RAM.
  • Asegúrate de que no haya procesos zombis o servicios innecesarios.

Backup rápido

  • Haz copia de seguridad de /var/www y de tus bases de datos:
tar -czf backup-www-$(date +%F).tar.gz /var/www
mysqldump -u root -p --all-databases > backup-db-$(date +%F).sql
  • A continuación guarda los backups fuera del VPS si es posible.

✅ Resultado esperado

  • VPS siempre con espacio libre > 50%.
  • Logs controlados y nunca superiores a 500 MB.
  • Cachés y paquetes limpios.
  • Bases de datos optimizadas.
  • Backups recientes y listos para restaurar.

SCRIPT DE MANTENIMIENTO MENSUAL

Aquí tienes tu script de mantenimiento mensual para el VPS. Lo puedes guardar como vps-maintenance.sh, darle permisos de ejecución y lanzarlo cada vez que quieras revisar y limpiar tu servidor:

#!/bin/bash
# VPS Maintenance Script - Edition 
# Ejecutar con: sudo ./vps-maintenance.sh

echo "=====  Estado del disco ====="
df -h

echo ""
echo "===== 📂 Uso en /var ====="
du -h --max-depth=1 /var | sort -h

echo ""
echo "=====  Limpiando logs del sistema (máx 500MB) ====="
journalctl --vacuum-size=500M

echo ""
echo "=====  Limpiando logs de Apache ====="
truncate -s 0 /var/log/apache2/access.log 2>/dev/null
truncate -s 0 /var/log/apache2/error.log 2>/dev/null

echo ""
echo "=====  Limpiando cachés de paquetes ====="
apt-get clean
apt-get autoremove --purge -y

echo ""
echo "=====  Espacio en bases de datos ====="
du -h --max-depth=1 /var/lib/mysql | sort -h

echo ""
echo "===== ✅ Mantenimiento completado ====="
echo "Revisa arriba el estado del disco y bases de datos."

Pasos en tu VPS

  1. Entrar al editor y crear el archivo:
sudo nano /root/vps-maintenance.sh
  1. Pega dentro el contenido del script avanzado de mantenimiento.
  1. Guardar y salir de nano:
  • Pulsa CTRL + O → Enter para guardar.
  • Pulsa CTRL + X para salir.
  1. Dar permisos de ejecución al script:
sudo chmod +x /root/vps-maintenance.sh
  1. Probarlo manualmente:
sudo /root/vps-maintenance.sh

Cómo usarlo

1. Copia el contenido en un archivo:

nano vps-maintenance.sh

2. Dale permisos de ejecución:

chmod +x vps-maintenance.sh

3. Ejecútalo con privilegios:

sudo ./vps-maintenance.sh

✅ Resultado esperado

  • Verás un informe con el estado del disco y /var.
  • Los logs del sistema y Apache quedarán reducidos.
  • Cachés y paquetes sobrantes se eliminarán.
  • Tendrás un vistazo rápido al tamaño de tus bases de datos.

VERSION AVANZADA DEL SCRIPT DE MANTENIMIENTO

Aquí tienes la versión avanzada del script de mantenimiento que además de ejecutar las limpiezas y comprobaciones, guarda un informe con fecha en un archivo dentro de tu VPS (por ejemplo report-2025-12-06.txt). Con esto tendrás un histórico de cada mantenimiento mensual.

Script vps-maintenance.sh

#!/bin/bash
# VPS Maintenance Script -  Edition 
# Ejecutar con: sudo ./vps-maintenance.sh

# Nombre del informe con fecha actual
REPORT="/root/vps-report-$(date +%F).txt"

echo "===== 📊 Estado del disco =====" | tee $REPORT
df -h | tee -a $REPORT

echo "" | tee -a $REPORT
echo "===== 📂 Uso en /var =====" | tee -a $REPORT
du -h --max-depth=1 /var | sort -h | tee -a $REPORT

echo "" | tee -a $REPORT
echo "=====  Limpiando logs del sistema (máx 500MB) =====" | tee -a $REPORT
journalctl --vacuum-size=500M | tee -a $REPORT

echo "" | tee -a $REPORT
echo "=====  Limpiando logs de Apache =====" | tee -a $REPORT
truncate -s 0 /var/log/apache2/access.log 2>/dev/null
truncate -s 0 /var/log/apache2/error.log 2>/dev/null
echo "Logs de Apache vaciados" | tee -a $REPORT

echo "" | tee -a $REPORT
echo "=====  Limpiando cachés de paquetes =====" | tee -a $REPORT
apt-get clean
apt-get autoremove --purge -y | tee -a $REPORT

echo "" | tee -a $REPORT
echo "===== 📊 Espacio en bases de datos =====" | tee -a $REPORT
du -h --max-depth=1 /var/lib/mysql | sort -h | tee -a $REPORT

echo "" | tee -a $REPORT
echo "===== ✅ Mantenimiento completado =====" | tee -a $REPORT
echo "Informe guardado en $REPORT" | tee -a $REPORT

Cómo usarlo

COMANDOS EN NEGRITA

  1. Copia el contenido en un archivo: nano vps-maintenance.sh
  2. Dale permisos de ejecución: chmod +x vps-maintenance.sh
  3. Ejecútalo con privilegios: sudo ./vps-maintenance.sh

✅ Resultado esperado

  • Se ejecutan todas las limpiezas y comprobaciones.
  • Se genera un archivo de informe en /root/ con nombre tipo vps-report-2025-12-06.txt.
  • Cada mes tendrás un histórico con fecha, para comparar evolución del espacio y detectar crecimientos anómalos.

Configuración con cron

  1. Edita el cron del sistema:
sudo crontab -e
  1. Agrega esta línea al final:
0 3 1 * * /root/vps-maintenance.sh

Explicación:

  • 0 3 1 * * → se ejecuta a las 03:00 AM del día 1 de cada mes.
  • /root/vps-maintenance.sh → ruta completa al script que creaste.
  • El script ya genera un informe con fecha (/root/vps-report-YYYY-MM-DD.txt), así tendrás histórico mensual.

📂 Dónde ver los informes

Cada mes se guardará un archivo en /root/ con nombre tipo:

vps-report-2025-12-01.txt
vps-report-2026-01-01.txt

Puedes revisarlos con:

less /root/vps-report-2025-12-01.txt

✅ Resultado esperado

  • El mantenimiento se ejecuta automáticamente cada mes.
  • Los informes quedan archivados con fecha.
  • Tu VPS se mantiene limpio y controlado sin intervención manual.

Instrucciones para habilitar el envío por email

1. Instalar un agente de correo ligero

En Debian lo más sencillo es mailutils (usa postfix o exim como backend):

sudo apt-get update
sudo apt-get install mailutils -y

Durante la instalación te pedirá configurar postfix. En el caso de que solo quieres enviar correos (no recibir), selecciona «Internet Site» y pon tu dominio o hostname del VPS.

2. Modificar el script vps-maintenance.sh

Agrega al final del script, las siguientes líneas de código:

# Dirección de destino
EMAIL="tu-correo@ejemplo.com"

# Enviar el informe por email
mail -s "Informe VPS $(date +%F)" $EMAIL < $REPORT

3. Configuración con cron (ya lo tienes)

Tu cron quedaría así, ejecutando el script el día 1 de cada mes a las 03:00:

0 3 1 * * /root/vps-maintenance.sh

✅ Resultado esperado

  • Cada mes, el script se ejecuta automáticamente.
  • Se genera el informe en /root/vps-report-YYYY-MM-DD.txt.
  • Se envía un email con el informe adjunto al destinatario que configures.

Comandos para revisar espacio en el VPS

  • Espacio general en todas las particiones:
df -h

Muestra tamaño total, usado, disponible y porcentaje de uso en cada sistema de archivos.

  • Uso detallado en /var (donde suelen crecer logs, bases de datos y webs):
sudo du -h --max-depth=1 /var | sort -h

Lista los subdirectorios de /var ordenados por tamaño.

  • Uso detallado en /var/www (tus sitios web):
sudo du -h --max-depth=1 /var/www | sort -h

Te dice cuánto ocupa cada proyecto web.

  • Uso detallado en /var/log (logs del sistema y Apache):
sudo du -h --max-depth=1 /var/log | sort -h

Localiza qué servicio genera más registros.

  • Uso detallado en /var/lib (bases de datos, librerías, contenedores):
sudo du -h --max-depth=1 /var/lib | sort -h

Analiza si MySQL, apt o Docker están ocupando demasiado espacio.

✅ Recomendación

Si lo vas a anotar en tu informe, puedes dejarlo como bloque final:

# Comandos de comprobación de espacio en el VPS
df -h
sudo du -h --max-depth=1 /var | sort -h
sudo du -h --max-depth=1 /var/www | sort -h
sudo du -h --max-depth=1 /var/log | sort -h
sudo du -h --max-depth=1 /var/lib | sort -h
Debian 12

Debian 12

Debian 12 “Bookworm” es una distribución GNU/Linux reconocida por su estabilidad, seguridad y versatilidad. Requiere entre 1 y 2 GB de RAM y entre 4 y 10 GB de espacio en disco según la instalación, con un sistema base que ocupa alrededor de 1,2 GB. Sus prestaciones incluyen compatibilidad con múltiples arquitecturas, gran variedad de entornos de escritorio, mejoras en seguridad y soporte ampliado de hardware reciente.

📦 Tamaño del software y requisitos

  • Instalación mínima (sin utilidades estándar): ~1,0 GB en disco
  • Instalación estándar (amd64 con utilidades): ~1,2 GB en disco
  • Requisitos mínimos de hardware:
    • RAM: 512 MB (mínimo), 1 GB recomendado
    • Espacio en disco: 4 GB sin escritorio, 10 GB con escritorio
  • Requisitos recomendados:
    • Procesador: Pentium 4 a 1 GHz o superior
    • RAM: 2 GB para un entorno gráfico fluido

Características principales

Nombre en clave: Bookworm

Entornos de escritorio disponibles: GNOME, KDE Plasma, Xfce, LXQt, Cinnamon, MATE, entre otros

Gestión de paquetes: Más de 59.000 paquetes disponibles en repositorios oficiales

Soporte de idiomas: Extenso, con traducciones para la mayoría de lenguas

Firmware no libre incluido: Mejora la compatibilidad con hardware moderno (tarjetas Wi-Fi, gráficas, etc.)

Seguridad: Actualizaciones constantes y sistema de parches rápido

Compatibilidad: Funciona en múltiples arquitecturas (amd64, arm64, s390x, etc.)

Opciones de instalación: Instalador gráfico y en modo texto, imágenes para nube y contenedores

Prestaciones destacadas

  • Estabilidad y fiabilidad: Debian es referencia en servidores y entornos críticos
  • Rendimiento optimizado: Mejoras en velocidad de ejecución y gestión de recursos en Debian 12.10
  • Compatibilidad ampliada: Drivers actualizados para hardware reciente
  • Soporte a largo plazo (LTS): Garantiza actualizaciones de seguridad durante años
  • Versatilidad de uso:
    • Servidores web, bases de datos y entornos corporativos.
    • Escritorios personales con múltiples interfaces gráficas.
    • Imágenes para nube y virtualización.

Debian 12 combina ligereza en instalación (1–1,2 GB base) con robustez y seguridad, ofreciendo un sistema adaptable tanto para usuarios domésticos como para infraestructuras profesionales. Su soporte de hardware moderno, amplia gama de escritorios y miles de paquetes lo convierten en una de las distribuciones más completas y confiables del ecosistema Linux.

Puedes descargar Debian 12 “Bookworm” directamente desde la página oficial de Debian en este enlace: 👉 Descarga oficial de Debian 12

📥 Opciones de descarga

En la página oficial encontrarás distintas imágenes de instalación:

  • Netinst (instalador mínimo): Ideal para instalaciones ligeras, descarga solo lo esencial y el resto desde internet.
  • Imágenes completas (CD/DVD): Incluyen todos los paquetes, útiles para sistemas sin conexión.
  • Arquitecturas soportadas: amd64, arm64, i386, mips64el, mipsel, ppc64el, s390x, entre otras.
  • Métodos de descarga:
    • HTTP/FTP directo
    • BitTorrent
    • Jigdo (descarga eficiente de imágenes grandes)

Si trabajas con servidores VPS y proyectos web, lo más práctico es usar la imagen netinst amd64, ya que ocupa poco espacio (~300 MB) y te permite personalizar la instalación con solo los paquetes que necesitas.

👉 Debian 12 netinst amd64 ISO

📥 Detalles de esta descarga

  • Tamaño aproximado: ~300 MB
  • Uso recomendado: Instalación mínima con descarga de paquetes desde internet
  • Arquitectura: amd64 (64 bits, la más común en servidores y PCs modernos)
  • Versión: 12.6.0 (última actualización estable de Bookworm)

Si prefieres imágenes completas (DVD con todos los paquetes incluidos), también están disponibles en la misma carpeta oficial: 👉 Imágenes completas de Debian 12

Comandos SSH para instalar Debian 12 en un VPS

Aquí tienes una guía práctica con los comandos SSH para instalar Debian 12 en un VPS desde cero, suponiendo que estás accediendo a un servidor con consola KVM o instalación remota (como en Proxmox, Hetzner, OVH, etc.).

Supuestos previos

  • Tienes acceso SSH o consola al VPS (modo rescate o instalación manual).
  • El VPS está vacío o en modo de instalación.
  • Usarás el instalador oficial de Debian 12 (netinst).

Instalación manual vía SSH (modo avanzado)

1. Conéctate al VPS

bash

ssh root@IP_DEL_VPS

2. Descarga el instalador de Debian 12 netinst

bash

wget https://cdimage.debian.org/debian-cd/current/amd64/iso-cd/debian-12.6.0-amd64-netinst.iso -O debian12.iso

3. Monta la ISO (si el VPS lo permite)

bash

mkdir /mnt/debian12
mount -o loop debian12.iso /mnt/debian12

4. Inicia instalación desde la ISO (requiere consola KVM o reinicio con ISO montada)

Este paso depende del proveedor. En muchos VPS, debes:

  • Usar el panel para montar la ISO como CD-ROM
  • Reiniciar el VPS en modo instalación
  • Seguir el instalador gráfico o en modo texto

🧪 Alternativa: instalación automatizada con debootstrap

Si el VPS ya tiene un sistema base (ej. modo rescate), puedes instalar Debian 12 manualmente:

1. Instala debootstrap

bash

apt update && apt install debootstrap

2. Crea el sistema base

bash

debootstrap --arch=amd64 bookworm /mnt/debian http://deb.debian.org/debian

3. Chroot al nuevo sistema

bash

mount --bind /dev /mnt/debian/dev
mount --bind /proc /mnt/debian/proc
mount --bind /sys /mnt/debian/sys
chroot /mnt/debian

4. Configura el sistema

bash

echo "debian-vps" > /etc/hostname
apt update && apt install linux-image-amd64 grub-pc systemd

5. Instala GRUB y reinicia

bash

grub-install /dev/sda
update-grub
exit
reboot

✅ Resultado

Tu VPS arrancará con Debian 12 limpio, listo para instalar Apache, Nginx, PHP, WordPress o lo que necesites.

Script cloud-init para Debian 12

yaml

#cloud-config
hostname: debian-vps
timezone: Europe/Madrid
locale: es_ES.UTF-8

users:
  - name: franciscus
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAA...tu_clave_ssh...

package_update: true
package_upgrade: true
packages:
  - curl
  - wget
  - git
  - htop
  - ufw
  - fail2ban
  - nginx

runcmd:
  - ufw allow OpenSSH
  - ufw allow 'Nginx Full'
  - ufw enable
  - systemctl enable fail2ban
  - echo "Instalación completa en Debian 12 VPS"

¿Cómo usarlo?

  1. En Hetzner Cloud o Contabo VPS:
    • Al crear el VPS, selecciona Debian 12 como imagen base.
    • En el campo “cloud-init” o “custom script”, pega el YAML anterior.
    • Asegúrate de incluir tu clave SSH pública en el campo correspondiente.
  2. Resultado:
    • VPS con Debian 12, usuario franciscus, acceso SSH, firewall activo, Nginx instalado y Fail2Ban protegiendo.

SCRIPT Cloud-Init

Script cloud-init para LAMP + WordPress en Debian 12

yaml

#cloud-config
hostname: debian-vps
timezone: Europe/Madrid
locale: es_ES.UTF-8

users:
  - name: franciscus
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAA...tu_clave_ssh...

package_update: true
package_upgrade: true
packages:
  - apache2
  - mariadb-server
  - php
  - php-mysql
  - libapache2-mod-php
  - curl
  - wget
  - unzip
  - ufw
  - fail2ban

runcmd:
  # Configuración básica de firewall
  - ufw allow OpenSSH
  - ufw allow 'Apache Full'
  - ufw enable

  # Configuración de MariaDB segura
  - mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'TuPasswordSeguro';"
  - mysql -e "DELETE FROM mysql.user WHERE User='';"
  - mysql -e "DROP DATABASE IF EXISTS test;"
  - mysql -e "FLUSH PRIVILEGES;"

  # Crear base de datos para WordPress
  - mysql -uroot -pTuPasswordSeguro -e "CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  - mysql -uroot -pTuPasswordSeguro -e "CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'WpPasswordSeguro';"
  - mysql -uroot -pTuPasswordSeguro -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';"
  - mysql -uroot -pTuPasswordSeguro -e "FLUSH PRIVILEGES;"

  # Descargar e instalar WordPress
  - wget https://wordpress.org/latest.tar.gz -O /tmp/wordpress.tar.gz
  - tar -xzf /tmp/wordpress.tar.gz -C /var/www/html/
  - chown -R www-data:www-data /var/www/html/wordpress
  - chmod -R 755 /var/www/html/wordpress

  # Configuración de Apache
  - echo "<VirtualHost *:80>
      ServerAdmin admin@localhost
      DocumentRoot /var/www/html/wordpress
      <Directory /var/www/html/wordpress>
          AllowOverride All
      </Directory>
      ErrorLog \${APACHE_LOG_DIR}/error.log
      CustomLog \${APACHE_LOG_DIR}/access.log combined
    </VirtualHost>" > /etc/apache2/sites-available/wordpress.conf

  - a2ensite wordpress.conf
  - a2enmod rewrite
  - systemctl reload apache2

Resultado

  • VPS con Debian 12
  • Apache + PHP + MariaDB configurados
  • WordPress descargado y listo en /var/www/html/wordpress
  • Firewall activo y Fail2Ban protegiendo

👉 Este script lo pegas en el campo cloud-init al crear tu VPS en Hetzner, Contabo o cualquier proveedor que lo soporte.

script cloud-init optimizado para un VPS con Debian 12 + Nginx + PHP-FPM + MariaDB + WordPress, pensado para rendimiento y estabilidad:

Script cloud-init (Nginx + PHP-FPM + WordPress)

yaml

#cloud-config
hostname: debian-vps
timezone: Europe/Madrid
locale: es_ES.UTF-8

users:
  - name: franciscus
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAA...tu_clave_ssh...

package_update: true
package_upgrade: true
packages:
  - nginx
  - mariadb-server
  - php-fpm
  - php-mysql
  - php-cli
  - php-curl
  - php-xml
  - php-zip
  - php-gd
  - php-mbstring
  - curl
  - wget
  - unzip
  - ufw
  - fail2ban

runcmd:
  # Configuración de firewall
  - ufw allow OpenSSH
  - ufw allow 'Nginx Full'
  - ufw enable

  # Configuración segura de MariaDB
  - mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'TuPasswordSeguro';"
  - mysql -e "DELETE FROM mysql.user WHERE User='';"
  - mysql -e "DROP DATABASE IF EXISTS test;"
  - mysql -e "FLUSH PRIVILEGES;"

  # Crear base de datos para WordPress
  - mysql -uroot -pTuPasswordSeguro -e "CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  - mysql -uroot -pTuPasswordSeguro -e "CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'WpPasswordSeguro';"
  - mysql -uroot -pTuPasswordSeguro -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';"
  - mysql -uroot -pTuPasswordSeguro -e "FLUSH PRIVILEGES;"

  # Descargar e instalar WordPress
  - wget https://wordpress.org/latest.tar.gz -O /tmp/wordpress.tar.gz
  - tar -xzf /tmp/wordpress.tar.gz -C /var/www/html/
  - chown -R www-data:www-data /var/www/html/wordpress
  - chmod -R 755 /var/www/html/wordpress

  # Configuración de Nginx para WordPress
  - echo "server {
      listen 80;
      server_name _;
      root /var/www/html/wordpress;

      index index.php index.html index.htm;

      location / {
          try_files \$uri \$uri/ /index.php?\$args;
      }

      location ~ \.php\$ {
          include snippets/fastcgi-php.conf;
          fastcgi_pass unix:/run/php/php8.2-fpm.sock;
          fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
          include fastcgi_params;
      }

      location ~ /\.ht {
          deny all;
      }
    }" > /etc/nginx/sites-available/wordpress

  - ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
  - nginx -t
  - systemctl reload nginx

Resultado

  • VPS con Debian 12
  • Nginx + PHP-FPM (más rápido que Apache para WordPress)
  • MariaDB configurado con base de datos y usuario para WordPress
  • WordPress instalado en /var/www/html/wordpress
  • Firewall activo y Fail2Ban protegiendo

Este script lo pegas en el campo cloud-init al crear tu VPS en Hetzner, Contabo o cualquier proveedor que lo soporte.

script cloud-init avanzado para tu VPS con Debian 12 + Nginx + PHP-FPM + MariaDB + WordPress, incluyendo optimización de rendimiento con Redis cache, PHP-FPM tunning y HTTPS con Let’s Encrypt.

Script cloud-init optimizado

yaml

#cloud-config
hostname: debian-vps
timezone: Europe/Madrid
locale: es_ES.UTF-8

users:
  - name: franciscus
    groups: sudo
    shell: /bin/bash
    sudo: ['ALL=(ALL) NOPASSWD:ALL']
    ssh-authorized-keys:
      - ssh-rsa AAAA...tu_clave_ssh...

package_update: true
package_upgrade: true
packages:
  - nginx
  - mariadb-server
  - php-fpm
  - php-mysql
  - php-cli
  - php-curl
  - php-xml
  - php-zip
  - php-gd
  - php-mbstring
  - redis-server
  - php-redis
  - certbot
  - python3-certbot-nginx
  - curl
  - wget
  - unzip
  - ufw
  - fail2ban

runcmd:
  # Firewall
  - ufw allow OpenSSH
  - ufw allow 'Nginx Full'
  - ufw enable

  # Configuración segura de MariaDB
  - mysql -e "ALTER USER 'root'@'localhost' IDENTIFIED BY 'TuPasswordSeguro';"
  - mysql -e "DELETE FROM mysql.user WHERE User='';"
  - mysql -e "DROP DATABASE IF EXISTS test;"
  - mysql -e "FLUSH PRIVILEGES;"

  # Crear base de datos para WordPress
  - mysql -uroot -pTuPasswordSeguro -e "CREATE DATABASE wordpress DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
  - mysql -uroot -pTuPasswordSeguro -e "CREATE USER 'wpuser'@'localhost' IDENTIFIED BY 'WpPasswordSeguro';"
  - mysql -uroot -pTuPasswordSeguro -e "GRANT ALL PRIVILEGES ON wordpress.* TO 'wpuser'@'localhost';"
  - mysql -uroot -pTuPasswordSeguro -e "FLUSH PRIVILEGES;"

  # Descargar e instalar WordPress
  - wget https://wordpress.org/latest.tar.gz -O /tmp/wordpress.tar.gz
  - tar -xzf /tmp/wordpress.tar.gz -C /var/www/html/
  - chown -R www-data:www-data /var/www/html/wordpress
  - chmod -R 755 /var/www/html/wordpress

  # Configuración Nginx optimizada
  - echo "server {
      listen 80;
      server_name _;
      root /var/www/html/wordpress;

      index index.php index.html index.htm;

      location / {
          try_files \$uri \$uri/ /index.php?\$args;
      }

      location ~ \.php\$ {
          include snippets/fastcgi-php.conf;
          fastcgi_pass unix:/run/php/php8.2-fpm.sock;
          fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
          include fastcgi_params;
      }

      location ~ /\.ht {
          deny all;
      }
    }" > /etc/nginx/sites-available/wordpress

  - ln -s /etc/nginx/sites-available/wordpress /etc/nginx/sites-enabled/
  - nginx -t
  - systemctl reload nginx

  # Optimización PHP-FPM
  - sed -i 's/pm = .*/pm = dynamic/' /etc/php/8.2/fpm/pool.d/www.conf
  - sed -i 's/pm.max_children = .*/pm.max_children = 20/' /etc/php/8.2/fpm/pool.d/www.conf
  - sed -i 's/pm.start_servers = .*/pm.start_servers = 5/' /etc/php/8.2/fpm/pool.d/www.conf
  - sed -i 's/pm.min_spare_servers = .*/pm.min_spare_servers = 3/' /etc/php/8.2/fpm/pool.d/www.conf
  - sed -i 's/pm.max_spare_servers = .*/pm.max_spare_servers = 10/' /etc/php/8.2/fpm/pool.d/www.conf
  - systemctl restart php8.2-fpm

  # Configuración HTTPS con Let's Encrypt
  - certbot --nginx -d tu-dominio.com --non-interactive --agree-tos -m admin@tu-dominio.com

Resultado

  • VPS con Debian 12
  • Nginx + PHP-FPM optimizado para WordPress
  • MariaDB configurado con base de datos y usuario
  • Redis cache instalado y listo para usar con plugins de WordPress
  • Firewall + Fail2Ban activos
  • HTTPS automático con Let’s Encrypt
Guía Avanzada de Ciberseguridad y Privacidad Elemental+

Guía Avanzada de Ciberseguridad y Privacidad Elemental+

Una verdadera y auténtica Guía Avanzada de Ciberseguridad que puedes consultar y estudiar, para preservar una Privacidad Elemental.

Identidad digital y trazabilidad 👤

  • Correo desechable y alias: usa alias de correo para registros en webs y evita exponer tu dirección principal.
  • Separación de identidades: mantén perfiles diferenciados (personal, profesional, pruebas) para reducir riesgos de filtración cruzada.
  • Monitorización de filtraciones: activa alertas en servicios como Have I Been Pwned para saber si tus credenciales han sido expuestas.

Navegación y comunicaciones seguras

  • DNS seguro: configura tu equipo con DNS cifrado (ej. Cloudflare 1.1.1.1 con DoH/DoT).
  • VPN con auditorías públicas: evita VPN gratuitas; usa proveedores con transparencia y auditorías externas.
  • Correo cifrado: considera PGP/GPG para comunicaciones sensibles.

Dispositivos y entorno físico 💻📱

  • Arranque seguro y cifrado de disco: activa BitLocker (Windows) o FileVault (Mac) para proteger datos en caso de robo.
  • Firmware y BIOS: mantén actualizados, ya que son vectores de ataque poco atendidos.
  • USB y periféricos: desconfía de memorias USB desconocidas; usa bloqueadores de datos (USB condom) en lugares públicos.

Privacidad avanzada 🔒

  • Navegadores endurecidos: Firefox con extensiones de privacidad (NoScript, Privacy Badger, uBlock).
  • Sandboxing: ejecuta apps sospechosas en entornos aislados (máquinas virtuales o contenedores).
  • Metadatos invisibles: elimina metadatos de fotos y documentos antes de compartirlos (herramientas como ExifTool).

Seguridad en redes sociales 📱

  • Control de API y apps conectadas: revisa qué aplicaciones tienen acceso a tu cuenta.
  • Publicaciones diferidas: evita publicar en tiempo real tu ubicación; hazlo con retraso.
  • Ingeniería social inversa: recuerda que el mayor riesgo no es técnico, sino lo que otros pueden deducir de tu actividad.

Resiliencia y respuesta

  • Plan de contingencia personal: define qué hacer si pierdes acceso a tus cuentas (contactos de recuperación, copias offline de contraseñas).
  • Simulación de ataque: prueba periódicamente cómo reaccionarías ante un phishing o pérdida de dispositivo.
  • Redundancia: mantén copias de seguridad en al menos dos medios distintos (ej. nube + disco externo cifrado).

Esto ya no es la típica lista de “contraseñas largas y antivirus”, sino un manual de supervivencia digital que combina prácticas técnicas y de comportamiento. Con esto, un ciudadano pasa de ser “usuario protegido” a convertirse en alguien difícil de rastrear, atacar o manipular.

DOBLE FACTOR – Usuario Común (lo básico)

  • Contraseñas seguras: mínimo 12 caracteres, mezcla de letras, números y símbolos.
  • Doble factor (2FA): activa siempre que sea posible.
  • Actualizaciones: mantén sistema y apps al día.
  • Navegación segura: busca siempre el candado HTTPS.
  • Copias de seguridad: al menos una en la nube y otra en disco externo.

ALIAS DE CORREO – Usuario Consciente (privacidad avanzada)

  • Gestores de contraseñas: Bitwarden, KeePass o similares para no repetir claves.
  • Alias de correo: usa correos desechables para registros y protege tu dirección principal.
  • DNS seguro: configura DoH/DoT (ej. Cloudflare 1.1.1.1).
  • VPN confiable: evita gratuitas, busca proveedores con auditorías externas.
  • Metadatos invisibles: elimina datos ocultos de fotos y documentos antes de compartirlos.
  • Redes sociales: publica con retraso tu ubicación y revisa apps conectadas a tu cuenta.

Nivel 3 – Creador/Desarrollador (seguridad técnica)

  • Cifrado de disco: activa BitLocker (Windows) o FileVault (Mac).
  • Sandboxing: prueba apps sospechosas en máquinas virtuales o contenedores.
  • Firmware y BIOS: actualiza periódicamente, son vectores de ataque olvidados.
  • Entornos aislados: usa navegadores endurecidos (Firefox + NoScript, Privacy Badger, uBlock).
  • Plan de contingencia: define qué hacer si pierdes acceso a tus cuentas (copias offline de contraseñas, contactos de recuperación).
  • Simulación de ataque: prueba cómo reaccionarías ante phishing o pérdida de dispositivo.

CIBERSEGURIDAD PRÁCTICA

CONTRASEÑAS – Usuario Común (lo básico)

  • Contraseñas seguras Ejemplo: en vez de juan123, usa Sol!2025_Montaña. Fácil de recordar si piensas en una frase personal.
  • Doble factor (2FA) Ejemplo: al entrar en Gmail, además de la contraseña, recibes un código en tu móvil.
  • Copias de seguridad Ejemplo: cada domingo copia tus fotos al disco externo y a Google Drive.

PRIVACIDAD – Usuario Consciente (privacidad avanzada)

  • Alias de correo Ejemplo: para registrarte en una tienda online, usa compras.alias@proton.me en vez de tu correo principal.
  • DNS seguro Ejemplo: en tu móvil Android, cambia DNS a 1.1.1.1 (Cloudflare) para evitar rastreos del proveedor.
  • Metadatos invisibles Ejemplo: antes de subir una foto a Instagram, pásala por ExifTool para borrar ubicación GPS.
  • Redes sociales Ejemplo: publicas la foto de tu ruta en moto al día siguiente, no en tiempo real, para evitar que sepan dónde estás.

Nivel 3 – Creador/Desarrollador (seguridad técnica)

  • Cifrado de disco Ejemplo: si te roban el portátil, con BitLocker activado los datos quedan ilegibles sin tu clave.
  • Sandboxing Ejemplo: descargas un plugin dudoso de WordPress → lo pruebas primero en una máquina virtual, no en tu servidor real.
  • Firmware y BIOS Ejemplo: actualizas la BIOS de tu PC cada 6 meses para cerrar vulnerabilidades que un atacante podría explotar.
  • Plan de contingencia Ejemplo: guardas un archivo en papel con tus códigos de recuperación de cuentas críticas en una caja fuerte.
  • Simulación de ataque Ejemplo: envías a ti mismo un correo falso tipo phishing y compruebas si tu familia detecta el engaño.

EL PLAN DE CONTINGENCIA

Plan de Contingencia para Bases de Datos

Prevención (antes del incidente)

  • Copias de seguridad programadas:
    • Diarias (incrementales).
    • Semanales (completas).
    • Almacenadas en dos ubicaciones distintas (servidor + nube o disco externo).
  • Entorno de pruebas: nunca aplicar actualizaciones directamente en producción; primero en un entorno de staging.
  • Versionado de esquemas y datos: usar herramientas como Liquibase o Flyway para controlar cambios en la estructura.
  • Documentación clara: registrar qué cambios se aplican, cuándo y por quién.

Detección (cuando ocurre el problema)

  • Monitorización activa: alertas automáticas si la base de datos deja de responder o si hay errores masivos.
  • Logs detallados: revisar registros de errores para identificar si fue una actualización fallida, corrupción de datos o borrado accidental.
  • Verificación rápida: comprobar si el fallo afecta a toda la base o solo a tablas concretas.

Respuesta inmediata

  • Aislar el sistema: detener procesos que puedan seguir dañando la base.
  • Restaurar copia reciente:
    • Si la pérdida es total → restaurar la última copia completa.
    • Si es parcial → aplicar copia incremental + logs de transacciones.
  • Rollback de actualización: si el error viene de un cambio en el esquema, revertir a la versión anterior con el sistema de versionado.

Recuperación

  • Validar integridad: comprobar que los datos restaurados son consistentes (ej. claves primarias, relaciones).
  • Pruebas funcionales: verificar que la aplicación funciona correctamente con la base restaurada.
  • Comunicación: informar a usuarios/cliente del incidente y del tiempo estimado de recuperación.

Mejora continua (post‑incidente)

  • Análisis de causa raíz: documentar qué provocó la pérdida o el fallo.
  • Refuerzo de medidas: ajustar frecuencia de backups, mejorar pruebas de actualización, añadir redundancia.
  • Simulacros periódicos: probar restauraciones en entornos controlados para asegurar que el plan funciona en la práctica.

Ejemplo práctico

Imagina que actualizas tu base de datos MySQL y un script borra accidentalmente la tabla usuarios:

  1. El sistema de monitorización detecta errores de login.
  2. Se detienen los servicios para evitar más daños.
  3. Se restaura la copia incremental de la noche anterior + los logs de transacciones hasta el momento del fallo.
  4. Se valida que los usuarios recuperan acceso.
  5. Se documenta el error y se ajusta el procedimiento de actualización para que siempre pase por staging.

Plan de Contingencia ante Actualizaciones Erróneas

Prevención (antes de actualizar)

  • Entorno de pruebas (staging): nunca aplicar cambios directamente en producción.
  • Copias de seguridad completas:
    • Base de datos + archivos del sitio.
    • Guardar en dos ubicaciones (servidor y nube).
  • Versionado de código: usar Git o similar para poder hacer rollback inmediato.
  • Checklist previo: verificar compatibilidad de plugins, temas y dependencias antes de actualizar.

Ejecución controlada (durante la actualización)

  • Modo mantenimiento: activar para evitar que usuarios interactúen mientras se aplican cambios.
  • Registro de cambios: documentar qué se actualiza (plugin X, versión Y).
  • Monitorización en tiempo real: revisar logs de errores y rendimiento durante la actualización.

Respuesta inmediata (si falla la actualización)

  • Rollback rápido:
    • Restaurar la versión anterior desde Git o backup.
    • Si es un plugin/tema → reinstalar la versión estable previa.
  • Aislar el problema: desactivar el componente actualizado para comprobar si el fallo desaparece.
  • Comunicación interna: informar al equipo/usuarios de que se está aplicando contingencia.

Recuperación

  • Validar integridad: comprobar que el sitio funciona y que no hay pérdida de datos.
  • Pruebas funcionales: login, formularios, pagos, navegación.
  • Reapertura del servicio: desactivar modo mantenimiento y monitorizar durante unas horas.

Mejora continua (post‑incidente)

  • Análisis de causa raíz: ¿fue incompatibilidad, error en el código, falta de pruebas?
  • Documentación: registrar el incidente y la solución aplicada.
  • Refuerzo: ajustar el procedimiento de actualización (ej. probar siempre en staging, ampliar checklist).
  • Simulacros periódicos: practicar restauraciones y rollbacks para asegurar rapidez real.

Ejemplo práctico

Imagina que actualizas un plugin de seguridad en WordPress y tras la actualización el sitio muestra error 500:

  1. Activas modo mantenimiento.
  2. Restauras el backup de archivos y base de datos de la noche anterior.
  3. Desactivas el plugin actualizado y reinstalas la versión anterior.
  4. Validación: el sitio vuelve a funcionar.
  5. Documentas el error y decides probar futuras actualizaciones en staging antes de producción.

Con este plan, cualquier actualización errónea deja de ser un desastre y se convierte en un incidente controlado con recuperación rápida.

Guía Certificada por IA COPILOT

https://copilot.microsoft.com