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:

  1. Inicia sesión como root y copia las claves SSH:
  2. cp /root/.ssh/id_rsa /home/admin/.ssh/
    cp /root/.ssh/id_rsa.pub /home/admin/.ssh/
  3. Ajusta los permisos para que sean correctos:
  4. 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
  5. Asegúrate de que la clave de host de GitHub esté en el archivo known_hosts:
  6. sudo -u admin ssh-keyscan -H github.com >> /home/admin/.ssh/known_hosts
  7. Prueba la conexión SSH como el usuario admin:
  8. 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!

Next Post Previous Post
No Comment
Add Comment
comment url