Configurando CI/CD en un VPS con Debian y HestiaCP
En este post, te mostraré cómo configurar un flujo de Continuous Integration (CI) y Continuous Deployment (CD) en tu VPS que corre Debian, utilizando HestiaCP y GitHub. Este método te permitirá desplegar automáticamente los cambios de la rama deploy
de tu repositorio de GitHub en tu servidor. Sigue los pasos a continuación.
1. Configuraciones iniciales
Asegúrate de tener HestiaCP instalado y funcionando en tu VPS. Crea una cuenta de usuario y dominio en HestiaCP para el proyecto donde se hará el despliegue. También, instala las dependencias necesarias, como git
.
2. Habilitar funciones de ejecución en PHP
Para ejecutar comandos de shell desde PHP, necesitas habilitar shell_exec
y exec
en el archivo php.ini
. Busca las siguientes líneas y asegúrate de que no estén comentadas:
disable_functions =
Esto permitirá que tus scripts PHP ejecuten comandos de shell, lo cual es esencial para nuestro flujo de trabajo de despliegue.
3. Configurar claves SSH
Genera una clave SSH en tu VPS y agrégala tanto al usuario admin
de HestiaCP como al usuario root
:
ssh-keygen -t ed25519 -C "tu_email@example.com"
Agrega la clave pública a tu cuenta de GitHub en "Settings" > "SSH and GPG keys". Esto permitirá que tu VPS se conecte a GitHub sin necesidad de ingresar credenciales cada vez que se realice un despliegue.
Si ya tienes una clave SSH generada para el usuario root
y deseas copiarla para el usuario admin
, sigue estos pasos:
- Inicia sesión como
root
y copia las claves SSH: - Ajusta los permisos para que sean correctos:
- Asegúrate de que la clave de host de GitHub esté en el archivo
known_hosts
: - Prueba la conexión SSH como el usuario
admin
:
cp /root/.ssh/id_rsa /home/admin/.ssh/
cp /root/.ssh/id_rsa.pub /home/admin/.ssh/
chown admin:admin /home/admin/.ssh/id_rsa
chown admin:admin /home/admin/.ssh/id_rsa.pub
chmod 600 /home/admin/.ssh/id_rsa
chmod 644 /home/admin/.ssh/id_rsa.pub
chmod 700 /home/admin/.ssh
sudo -u admin ssh-keyscan -H github.com >> /home/admin/.ssh/known_hosts
sudo -u admin ssh -T git@github.com
4. Crear el script de despliegue
Crea un archivo git-deploy.sh
en tu servidor que contendrá los comandos para actualizar tu proyecto:
#!/bin/bash
{
echo "========================================"
echo "Running deploy script..."
echo "Execution time: $(date)"
echo "Current user: $(whoami)"
echo "Current directory: $(pwd)"
cd /home/admin/web/pfinteractive.net.pe/public_html || { echo "Failed to change directory"; exit 1; }
git fetch origin || { echo "Failed to fetch changes"; exit 1; }
git reset --hard origin/deploy || { echo "Failed to reset"; exit 1; }
git clean -fd || { echo "Failed to clean"; exit 1; }
echo "Deployment completed at: $(date)"
echo "========================================"
} >> /home/admin/web/pfinteractive.net.pe/deploy/deploy.log 2>&1
No olvides hacer el script ejecutable:
chmod +x git-deploy.sh
5. Configurar el webhook en GitHub
Ve a tu repositorio en GitHub, en "Settings" > "Webhooks", agrega un nuevo webhook que apunte a un archivo PHP que crearás en tu servidor. Este archivo será responsable de recibir el evento de push
y ejecutar el script de despliegue.
6. Crear el archivo PHP para recibir el webhook
Crea un archivo git-deploy.php
en tu servidor:
<?php
$secret = 'tu_secreto_webhook';
$payload = file_get_contents('php://input');
$sig_header = $_SERVER['HTTP_X_HUB_SIGNATURE_256'];
$hash = 'sha256=' . hash_hmac('sha256', $payload, $secret);
if (hash_equals($hash, $sig_header)) {
$output = shell_exec('sh /home/admin/web/pfinteractive.net.pe/public_html/git-deploy.sh 2>&1');
file_put_contents('/home/admin/web/pfinteractive.net.pe/public_html/deploy.log', $output, FILE_APPEND);
if ($output === null) {
echo "Error: Failed to execute shell command.";
} else {
echo "Success";
}
} else {
http_response_code(403);
}
?>
Define $secret
con una cadena aleatoria y agrégala al webhook en GitHub para validar la autenticidad del evento.
7. Probar el flujo de trabajo
Finalmente, realiza un push
a la rama deploy
de tu repositorio y verifica que el VPS actualice automáticamente tu proyecto. Puedes revisar el archivo de log para verificar el estado del despliegue:
cat /home/admin/web/pfinteractive.net.pe/public_html/deploy.log
Con esta configuración, tendrás un flujo de trabajo CI/CD eficiente que te permitirá gestionar tus despliegues de manera sencilla y rápida. ¡Feliz codificación!