Automatizar el despliegue de tus proyectos puede ahorrarte tiempo y reducir errores. En esta guía, te explico cómo configurar un despliegue automático utilizando llaves SSH y GitHub Actions.
Generación de llaves SSH en el servidor
El primer paso es generar un par de llaves SSH específicas para GitHub Actions en tu servidor.
ssh-keygen -t rsa -b 4096 -C "github-actions-deployment"
Cuando te pregunte dónde guardar la llave, especifica un nombre diferente:
~/.ssh/id_rsa_github_actions
Agrega la nueva llave privada al agente SSH:
eval “$(ssh-agent -s)”
ssh-add ~/.ssh/id_rsa_github_actions
Autoriza la nueva llave pública en el servidor:
Para que el servidor acepte conexiones autenticadas con tu nueva llave, debes registrar la llave pública.
cat ~/.ssh/id_rsa_github_actions.pub >> ~/.ssh/authorized_keys
Configuración en GitHub Actions
Configura los siguientes datos en tu repositorio.
- Navega a Settings > Secrets and variables > Actions en tu repositorio de GitHub.
- En la pestaña Variables, agrega las siguientes variables para nuevos repositorios:
HOST
(ej: tu-dominio.com)USERNAME
(ej: deploy-user)PORT
(ej: 22)
- En la pestaña Secrets, agrega el siguiente secreto crucial:
SSHKEY
: Aquí debes pegar el contenido completo de tu llave privada. Se obtiene ejecutandocat ~/.ssh/id_rsa_github_actions
en tu servidor.
Configuración del workflow de GitHub Actions
Crea el archivo .github/workflows/deploy-prod.yml
con el siguiente contenido:
name: Deploy
# Trigger the workflow on push and
# pull request events on the main branch
on:
push:
branches:
- main
pull_request:
branches:
- main
# Authenticate to the the server via ssh
# and run our deployment script
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Deploy a Demo
uses: appleboy/ssh-action@master
with:
host: ${{ vars.HOST }}
username: ${{ vars.USERNAME }}
port: ${{ vars.PORT }}
key: ${{ secrets.SSHKEY }}
script: "cd ~/project_demo && docker compose up -d --build"
Con esta configuración completa, tu flujo de trabajo de GitHub Actions podrá autenticarse de forma segura en tu servidor y ejecutar comandos para desplegar tu aplicación automáticamente con cada push a la rama principal.