{"id":638,"date":"2024-10-16T19:15:00","date_gmt":"2024-10-16T17:15:00","guid":{"rendered":"https:\/\/blog.pirulug.com\/?p=638"},"modified":"2024-10-16T19:15:00","modified_gmt":"2024-10-16T17:15:00","slug":"configurando-ci-cd-en-un-vps-con-debian-y-hestiacp","status":"publish","type":"post","link":"https:\/\/blog.pirulug.com\/?p=638","title":{"rendered":"Configurando CI\/CD en un VPS con Debian y HestiaCP"},"content":{"rendered":"<p>En este post, te mostrar\u00e9 c\u00f3mo configurar un flujo de Continuous Integration (CI) y Continuous Deployment (CD) en tu VPS que corre Debian, utilizando HestiaCP y GitHub. Este m\u00e9todo te permitir\u00e1 desplegar autom\u00e1ticamente los cambios de la rama <code class=\"language-bash\">deploy<\/code> de tu repositorio de GitHub en tu servidor. Sigue los pasos a continuaci\u00f3n.<\/p>\n<h3>1. Configuraciones iniciales<\/h3>\n<p>Aseg\u00farate de tener HestiaCP instalado y funcionando en tu VPS. Crea una cuenta de usuario y dominio en HestiaCP para el proyecto donde se har\u00e1 el despliegue. Tambi\u00e9n, instala las dependencias necesarias, como <code class=\"language-bash\">git<\/code>.<\/p>\n<h3>2. Habilitar funciones de ejecuci\u00f3n en PHP<\/h3>\n<p>Para ejecutar comandos de shell desde PHP, necesitas habilitar <code class=\"language-ini\">shell_exec<\/code> y <code class=\"language-ini\">exec<\/code> en el archivo <code class=\"language-ini\">php.ini<\/code>. Busca las siguientes l\u00edneas y aseg\u00farate de que no est\u00e9n comentadas:<\/p>\n<pre><code class=\"language-ini\">disable_functions =<\/code><\/pre>\n<p>Esto permitir\u00e1 que tus scripts PHP ejecuten comandos de shell, lo cual es esencial para nuestro flujo de trabajo de despliegue.<\/p>\n<h3>3. Configurar claves SSH<\/h3>\n<p>Genera una clave SSH en tu VPS y agr\u00e9gala tanto al usuario <code class=\"language-bash\">admin<\/code> de HestiaCP como al usuario <code class=\"language-bash\">root<\/code>:<\/p>\n<pre><code class=\"language-bash\">ssh-keygen -t ed25519 -C &quot;tu_email@example.com&quot;<\/code><\/pre>\n<p>Agrega la clave p\u00fablica a tu cuenta de GitHub en \u00abSettings\u00bb &gt; \u00abSSH and GPG keys\u00bb. Esto permitir\u00e1 que tu VPS se conecte a GitHub sin necesidad de ingresar credenciales cada vez que se realice un despliegue.<\/p>\n<p>Si ya tienes una clave SSH generada para el usuario <code class=\"language-bash\">root<\/code> y deseas copiarla para el usuario <code class=\"language-bash\">admin<\/code>, sigue estos pasos:<\/p>\n<ol>\n<li>Inicia sesi\u00f3n como <code class=\"language-bash\">root<\/code> y copia las claves SSH:<\/li>\n<pre><code class=\"language-bash\">cp \/root\/.ssh\/id_rsa \/home\/admin\/.ssh\/<\/code><\/pre>\n<pre><code class=\"language-bash\">cp \/root\/.ssh\/id_rsa.pub \/home\/admin\/.ssh\/<\/code><\/pre>\n<li>Ajusta los permisos para que sean correctos:<\/li>\n<pre><code class=\"language-bash\">chown admin:admin \/home\/admin\/.ssh\/id_rsa<\/code><\/pre>\n<pre><code class=\"language-bash\">chown admin:admin \/home\/admin\/.ssh\/id_rsa.pub<\/code><\/pre>\n<pre><code class=\"language-bash\">chmod 600 \/home\/admin\/.ssh\/id_rsa<\/code><\/pre>\n<pre><code class=\"language-bash\">chmod 644 \/home\/admin\/.ssh\/id_rsa.pub<\/code><\/pre>\n<pre><code class=\"language-bash\">chmod 700 \/home\/admin\/.ssh<\/code><\/pre>\n<li>Aseg\u00farate de que la clave de host de GitHub est\u00e9 en el archivo <code class=\"language-bash\">known_hosts<\/code>:<\/li>\n<pre><code class=\"language-bash\">sudo -u admin ssh-keyscan -H github.com &gt;&gt; \/home\/admin\/.ssh\/known_hosts<\/code><\/pre>\n<li>Prueba la conexi\u00f3n SSH como el usuario <code class=\"language-bash\">admin<\/code>:<\/li>\n<pre><code class=\"language-bash\">sudo -u admin ssh -T git@github.com<\/code><\/pre>\n<\/ol>\n<h3>4. Crear el script de despliegue<\/h3>\n<p>Crea un archivo <code class=\"language-bash\">git-deploy.sh<\/code> en tu servidor que contendr\u00e1 los comandos para actualizar tu proyecto:<\/p>\n<pre><code class=\"language-bash\">#!\/bin\/bash\n{\n  echo &quot;========================================&quot;\n  echo &quot;Running deploy script...&quot;\n  echo &quot;Execution time: $(date)&quot;\n  echo &quot;Current user: $(whoami)&quot;\n  echo &quot;Current directory: $(pwd)&quot;\n\n  cd \/home\/admin\/web\/pfinteractive.net.pe\/public_html || { echo &quot;Failed to change directory&quot;; exit 1; }\n  git fetch origin || { echo &quot;Failed to fetch changes&quot;; exit 1; }\n  git reset --hard origin\/deploy || { echo &quot;Failed to reset&quot;; exit 1; }\n  git clean -fd || { echo &quot;Failed to clean&quot;; exit 1; }\n\n  echo &quot;Deployment completed at: $(date)&quot;\n  echo &quot;========================================&quot;\n} &gt;&gt; \/home\/admin\/web\/pfinteractive.net.pe\/deploy\/deploy.log 2&gt;&amp;1\n<\/code><\/pre>\n<p>No olvides hacer el script ejecutable:<\/p>\n<pre><code class=\"language-bash\">chmod +x git-deploy.sh<\/code><\/pre>\n<h3>5. Configurar el webhook en GitHub<\/h3>\n<p>Ve a tu repositorio en GitHub, en \u00abSettings\u00bb &gt; \u00abWebhooks\u00bb, agrega un nuevo webhook que apunte a un archivo PHP que crear\u00e1s en tu servidor. Este archivo ser\u00e1 responsable de recibir el evento de <code class=\"language-bash\">push<\/code> y ejecutar el script de despliegue.<\/p>\n<h3>6. Crear el archivo PHP para recibir el webhook<\/h3>\n<p>Crea un archivo <code class=\"language-php\">git-deploy.php<\/code> en tu servidor:<\/p>\n<pre><code class=\"language-php\">&lt;?php\n$secret = &#039;tu_secreto_webhook&#039;;\n$payload = file_get_contents(&#039;php:\/\/input&#039;);\n$sig_header = $_SERVER[&#039;HTTP_X_HUB_SIGNATURE_256&#039;];\n$hash = &#039;sha256=&#039; . hash_hmac(&#039;sha256&#039;, $payload, $secret);\n\nif (hash_equals($hash, $sig_header)) {\n    $output = shell_exec(&#039;sh \/home\/admin\/web\/pfinteractive.net.pe\/public_html\/git-deploy.sh 2&gt;&amp;1&#039;);\n    file_put_contents(&#039;\/home\/admin\/web\/pfinteractive.net.pe\/public_html\/deploy.log&#039;, $output, FILE_APPEND);\n    if ($output === null) {\n        echo &quot;Error: Failed to execute shell command.&quot;;\n    } else {\n        echo &quot;Success&quot;;\n    }\n} else {\n    http_response_code(403);\n}\n?&gt;<\/code><\/pre>\n<p>Define <code class=\"language-php\">$secret<\/code> con una cadena aleatoria y agr\u00e9gala al webhook en GitHub para validar la autenticidad del evento.<\/p>\n<h3>7. Probar el flujo de trabajo<\/h3>\n<p>Finalmente, realiza un <code class=\"language-bash\">push<\/code> a la rama <code class=\"language-bash\">deploy<\/code> de tu repositorio y verifica que el VPS actualice autom\u00e1ticamente tu proyecto. Puedes revisar el archivo de log para verificar el estado del despliegue:<\/p>\n<pre><code class=\"language-bash\">cat \/home\/admin\/web\/pfinteractive.net.pe\/public_html\/deploy.log<\/code><\/pre>\n<p>Con esta configuraci\u00f3n, tendr\u00e1s un flujo de trabajo CI\/CD eficiente que te permitir\u00e1 gestionar tus despliegues de manera sencilla y r\u00e1pida. \u00a1Feliz codificaci\u00f3n!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>En este post, te mostrar\u00e9 c\u00f3mo configurar un flujo de Continuous Integration (CI) y Continuous Deployment (CD) en tu VPS que corre Debian, utilizando HestiaCP y GitHub. Este m\u00e9todo te permitir\u00e1 desplegar autom\u00e1ticamente los cambios de la rama deploy de tu repositorio de GitHub en tu servidor. Sigue los pasos a continuaci\u00f3n. 1. Configuraciones iniciales [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[60],"class_list":["post-638","post","type-post","status-publish","format-standard","hentry","category-sin-categoria","tag-github"],"_links":{"self":[{"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=\/wp\/v2\/posts\/638","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=638"}],"version-history":[{"count":0,"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=\/wp\/v2\/posts\/638\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=638"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=638"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.pirulug.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=638"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}