Saltar al contenido

Cómo automatizar el despliegue de sitios estáticos con Git y VPS

8 min de lectura Infraestructura
  • git
  • deploy
  • vps
  • automatización
  • web estática
  • infraestructura
  • producción

El despliegue manual de una web estática en un VPS es una tarea que consume tiempo y es propensa a errores. Si subes los archivos por SFTP o rsync a mano cada vez que haces un cambio, estás perdiendo eficiencia. La solución no es complicada: se llama automatización con Git.

Mi regla es simple: cualquier tarea repetitiva que no aporta valor directo al negocio debería estar automatizada. Subir los cambios de una web estática es un caso de libro en el pilar de infraestructura.

El problema de los deploys manuales

Cuando gestionas una web estática, ya sea un blog, una landing page o la documentación de un proyecto, los cambios son frecuentes. Cada corrección tipográfica o ajuste de diseño implica el mismo proceso: compilar, conectar al servidor, subir archivos. Si hay que hacer un rollback porque algo falla, la prisa puede llevar a más errores.

Lo que sí: necesitas un proceso que sea rápido, consistente y que te permita volver a una versión anterior con la misma facilidad. Lo que no: depender de la memoria o la atención de una persona para cada paso de deploy.

Automatizando el despliegue con Git hooks

La clave para automatizar el deploy de tu web estática es usar un post-receive hook de Git en el VPS. Este hook es un script que se ejecuta automáticamente en el servidor cada vez que recibes un push en un repositorio Git.

El flujo es este: haces git push a un repositorio bare en tu VPS. Tras recibir los cambios, el hook se encarga de extraer la última versión del código, compilar si es necesario, y copiar los archivos al directorio donde Nginx o Caddy los sirve. Esto significa que tu código está en producción en segundos, sin intervención manual.

# Ejemplo de estructura de directorios en el VPS
# /home/git/mi-proyecto.git (repositorio bare)
# /var/www/mi-proyecto/html (directorio donde Nginx sirve los archivos)

Preparando el VPS para el deploy

Antes de configurar el hook, tu VPS necesita algunas cosas. Primero, un usuario git con acceso SSH pero sin login interactivo, solo para recibir pushes. Segundo, un repositorio bare para tu proyecto. Y tercero, el servidor web (Nginx o Caddy) configurado para servir los archivos desde el directorio de destino. Si no tienes claro cómo securizar tu VPS, te recomiendo revisar UFW vs iptables: cuál usar en tu VPS y por qué.

# En tu VPS, como root o con sudo:
# Crear usuario git (si no existe)
sudo adduser --system --shell /usr/bin/git-shell --group git

# Crear directorio para repositorios
sudo mkdir -p /home/git/repos
sudo chown git:git /home/git/repos

# Inicializar un repositorio bare para tu proyecto
sudo mkdir /home/git/repos/mi-proyecto.git
sudo chown git:git /home/git/repos/mi-proyecto.git
cd /home/git/repos/mi-proyecto.git
sudo -u git git init --bare

# Configurar tu máquina local para hacer push a este repo
# git remote add production git@your_vps_ip:/home/git/repos/mi-proyecto.git

Una vez que puedes hacer git push production master (o main) y ves que los cambios llegan al repositorio bare en el VPS, es hora de montar el hook.

El script post-receive

Dentro de /home/git/repos/mi-proyecto.git/hooks/, crea un archivo llamado post-receive y dale permisos de ejecución (chmod +x post-receive). Este script es el corazón de la automatización.

#!/bin/bash
TARGET="/var/www/mi-proyecto/html" # Asegúrate de que este directorio existe y tiene permisos adecuados
GIT_DIR="/home/git/repos/mi-proyecto.git"
WEB_USER="www-data" # O el usuario de tu servidor web (nginx, caddy)

unset GIT_DIR
cd $TARGET || exit

# Resetear el directorio de destino y sacar los archivos
git --work-tree=$TARGET --git-dir=$GIT_DIR checkout -f

# Si tu web estática necesita compilación (ej. Astro, Next.js estático, SvelteKit)
# Esto asume que tienes Node.js y npm/yarn instalados en el VPS
# cd $TARGET
# npm install
# npm run build # o tu comando de build

# Asegurar que los permisos son correctos para el servidor web
sudo chown -R $WEB_USER:$WEB_USER $TARGET

Este script se ejecuta con los permisos del usuario git. Si necesitas ejecutar comandos como sudo chown o npm install, el usuario git debe tener permisos para hacerlo sin contraseña. Esto se configura en /etc/sudoers. Asegurar estos permisos es clave. Para gestionar entornos de desarrollo y producción con estrategias de despliegue claras, te será útil leer sobre cómo hacer deploys sin miedo con estrategias de rollback claras.

Ventajas y desventajas de la automatización

Lo que ganas:

  • Consistencia: Cada deploy sigue exactamente los mismos pasos. Se eliminan los errores humanos.
  • Velocidad: Los cambios están en producción en cuestión de segundos tras un git push.
  • Simplicidad: El flujo de trabajo del desarrollador no cambia: hace git push y listo.
  • Control de versiones: Cada versión desplegada corresponde a un commit de Git, facilitando rollbacks.

Lo que complicas:

  • Configuración inicial: Requiere configurar el VPS, Git y el servidor web correctamente la primera vez.
  • Gestión de dependencias: Si tu web estática necesita un paso de build (ej. Node.js), tendrás que instalar y mantener esas dependencias en el VPS.
  • Seguridad: El usuario git que ejecuta el hook necesita ciertos permisos. Es crucial asegurarlos.

Este método es robusto y escalable para la mayoría de los sitios estáticos. La clave no es la magia, sino un proceso definido y automatizado.

Si estás evaluando el tipo de alojamiento para tu web, entender las diferencias es importante. Te puede interesar mi comparativa entre hosting compartido y VPS para tomar una decisión informada. Además, un VPS sin una estrategia de copias de seguridad es un riesgo innecesario. Aprende a implementar backups automáticos en un VPS: por qué la mayoría lo hace mal para proteger tus datos. Finalmente, para añadir una capa de seguridad y gestionar certificados SSL automáticamente, considera cómo gestionar certificados SSL automáticos: Let’s Encrypt y Traefik.

Lucas Juárez
Lucas Juárez

Técnico freelance especializado en desarrollo a medida, automatizaciones con IA y gestión técnica para negocios en España. Más sobre mí →

Compartir:

¿Necesitas que alguien se ocupe de tu web?

Me encargo de que tu web funcione, esté segura y actualizada. Backups, actualizaciones y soporte directo. Planes desde 49 €/mes.

Chat