diff --git a/.github/workflows/pipeline.yml b/.github/workflows/pipeline.yml new file mode 100644 index 0000000..dc5229c --- /dev/null +++ b/.github/workflows/pipeline.yml @@ -0,0 +1,61 @@ +name: Backend CI/CD Pipeline + +on: + pull_request: + branches: ['*'] + paths: + - 'backend/**' # Solo se ejecuta cuando hay cambios en la carpeta backend + +jobs: + test-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + cache: 'npm' + cache-dependency-path: backend/package-lock.json + + - name: Install Dependencies + working-directory: backend + run: npm ci + + - name: Run Tests + working-directory: backend + run: npm test + + - name: Build Application + working-directory: backend + run: npm run build + + - name: Configure SSH + run: | + mkdir -p ~/.ssh/ + echo "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/deploy_key + chmod 600 ~/.ssh/deploy_key + ssh-keyscan -H ${{ secrets.EC2_INSTANCE }} >> ~/.ssh/known_hosts + + - name: Deploy to EC2 + run: | + # Crear directorio si no existe y establecer permisos + ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.EC2_INSTANCE }} ' + mkdir -p ~/backend + ' + + # Copiar archivos necesarios + scp -i ~/.ssh/deploy_key -r backend/dist backend/package*.json backend/prisma ubuntu@${{ secrets.EC2_INSTANCE }}:~/backend/ + + # Instalar dependencias y reiniciar aplicación + ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.EC2_INSTANCE }} ' + cd ~/backend && + rm -rf node_modules && # Eliminar node_modules existente + npm install && # Cambiar npm ci por npm install + npm run prisma:generate && + pm2 delete backend || true && + pm2 start dist/index.js --name backend + ' diff --git a/prompts/prompts-rgm.md b/prompts/prompts-rgm.md new file mode 100644 index 0000000..d7d35d7 --- /dev/null +++ b/prompts/prompts-rgm.md @@ -0,0 +1,1247 @@ +## Prompts + +Usé cursor con la última versión de claude-3.5-sonnet. + +### Prompt 1 + +Queremos configurar un workflow de github actions en el archivo @pipeline.yml . Dicho workflow deberá tener los pasos necesarios para: +- Ejecutar los tests de backend +- Generar la build del backend +- Desplegar el backend en EC2 + +Antes de indicarme los pasos o darme el código revisa que tengas el contexto adecuado y pregunta cualquier duda. + +### Answer 1 + +Voy a analizar el contexto proporcionado para asegurarme de que tenemos toda la información necesaria para crear el workflow de GitHub Actions. +Del contexto proporcionado, puedo ver: +1. Configuración de Backend: +Usa TypeScript y Jest para tests +Tiene scripts definidos en package.json: + "scripts": { + "start": "node dist/index.js", + "dev": "ts-node-dev --respawn --transpile-only src/index.ts", + "build": "tsc", + "test": "jest", + "prisma:init": "npx prisma init", + "prisma:generate": "npx prisma generate", + "start:prod": "npm run build && npm start" + }, + + +2. **Configuración de EC2**: + +## Configuración de EC2 y GitHub Actions + +Para ejecutar este proyecto en una instancia EC2 y asegurarte de que GitHub Actions funcione correctamente, sigue estos pasos: + +### Configuración de EC2 + +1. **Crear una Instancia EC2**: + - Inicia sesión en la consola de AWS y navega a EC2. + - Lanza una nueva instancia utilizando una AMI de Amazon Linux 2 o Ubuntu. + - Asegúrate de seleccionar un tipo de instancia adecuado (por ejemplo, `t2.micro` para pruebas). + +2. **Configurar el Grupo de Seguridad**: + - Asegúrate de que el grupo de seguridad asociado a tu instancia permita el tráfico en los siguientes puertos: + - **22**: Para SSH (acceso remoto). + - **80**: Para HTTP (si estás usando Nginx o un servidor web). + - **8080**: Para el backend (puerto donde se ejecuta tu aplicación). + - Puedes agregar reglas de entrada en el grupo de seguridad para permitir el acceso desde cualquier IP (0.0.0.0/0) para propósitos de desarrollo, pero considera restringirlo en producción. + +3. **Instalar Dependencias en EC2**: + - Conéctate a tu instancia EC2 a través de SSH: + ``` + ssh -i your-key.pem ec2-user@your-ec2-public-ip + ``` + - Instala Node.js y npm: + ``` + curl -sL https://rpm.nodesource.com/setup_16.x | sudo bash - + sudo yum install -y nodejs + ``` + - Instala PM2 para gestionar tu aplicación: + ``` + sudo npm install -g pm2 + ``` + - Instala Nginx si lo necesitas: + ``` + sudo yum install -y nginx + ``` + +4. **Configurar Variables de Entorno**: + - Crea un archivo `.env` en el directorio raíz del backend con las siguientes variables: + ``` + DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase + ``` + - Asegúrate de reemplazar `user`, `password` y `mydatabase` con los valores correctos. + +### Variables en GitHub Actions + +Para que el flujo de trabajo de GitHub Actions funcione correctamente, debes configurar las siguientes variables en los secretos de tu repositorio: + +1. **AWS_ACCESS_ID**: Tu ID de clave de acceso de AWS. +2. **AWS_ACCESS_KEY**: Tu clave de acceso secreta de AWS. +3. **EC2_INSTANCE**: La dirección IP pública o el nombre DNS de tu instancia EC2. + +Antes de proceder con el workflow, necesito confirmar algunas cosas: +¿Se ha configurado ya la instancia EC2 siguiendo las instrucciones del README? +¿Se han configurado los secretos necesarios (AWS_ACCESS_ID, AWS_ACCESS_KEY, EC2_INSTANCE) en el repositorio de GitHub? +¿Hay algún requisito específico sobre cuándo debe ejecutarse el workflow (por ejemplo, solo en push a main, en pull requests, etc.)? +¿Podrías confirmar estos puntos antes de proceder con la configuración del workflow? + +### Prompt 2 + +En respuestas a las preguntas 1 y 2 aún no he configurado nada. En respuesta a la 3 quiero que se ejecute cuando se haga push a una rama con un pull request abierto. + +Dicho esto, si no tienes más dudas, guíame paso a paso en cómo configurar los puntos 1 y 2. + +### Answer 2 + +Perfecto, vamos a configurar todo paso a paso. +1. Configuración de la instancia EC2 +1. Crear la instancia EC2: +Ve a la consola de AWS → EC2 → Launch Instance +Configura: +Name: backend-instance (o el nombre que prefieras) +AMI: Ubuntu Server 22.04 LTS +Instance type: t2.micro (capa gratuita) +Key pair: Crea un nuevo par de claves y guarda el archivo .pem +Network settings: +Crear un nuevo Security Group con estas reglas: +0 +- Click en "Launch Instance" +Conectarse a la instancia y configurar: +Bash + + # Dar permisos al archivo .pem + chmod 400 tu-archivo.pem + + # Conectarse por SSH (reemplaza la IP con la de tu instancia) + ssh -i "tu-archivo.pem" ubuntu@tu-ip-publica + +3. Instalar dependencias: +Bash + # Actualizar sistema + sudo apt update && sudo apt upgrade -y + + # Instalar Node.js y npm + curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - + sudo apt install -y nodejs + + # Verificar instalación + node --version + npm --version + + # Instalar PM2 + sudo npm install -g pm2 + +2. Configurar los Secretos en GitHub +Ve a tu repositorio en GitHub +Click en "Settings" → "Secrets and variables" → "Actions" +Click en "New repository secret" +Añade los siguientes secretos: +AWS_ACCESS_KEY_ID: +1. Ve a AWS Console → IAM +Crea un nuevo usuario IAM o usa uno existente +Añade la política AmazonEC2FullAccess +Genera nuevas credenciales de acceso +Copia el "Access Key ID" y guárdalo en GitHub +AWS_SECRET_ACCESS_KEY: +Copia la "Secret Access Key" generada en el paso anterior +Guárdala en GitHub +EC2_INSTANCE: +Copia la IP pública de tu instancia EC2 +Guárdala en GitHub +EC2_SSH_KEY: +Abre el archivo .pem que descargaste +Copia todo su contenido +Guárdalo en GitHub +3. Verificación +Para verificar que todo está configurado correctamente: +Verifica la conexión SSH a EC2: + + ssh -i tu-archivo.pem ubuntu@tu-ip-publica echo "Conexión exitosa" + +Verifica los secretos en GitHub: +Ve a Settings → Secrets +Deberías ver los 4 secretos listados (sin poder ver sus valores) +¿Has podido completar estos pasos? ¿Tienes alguna duda o error en alguno de ellos? Una vez confirmemos que todo está correctamente configurado, procederemos a crear el workflow de GitHub Actions. + +### Prompt 3 + +soy nuevo en amazon webservices. Estoy en la página de inicio de la consola, pero no veo la opción EC2 que indicas. Tengo la interfaz en español, esto es lo que veo: + +### Answer 3 + +Para acceder a EC2 desde la consola de AWS en español, puedes hacerlo de dos formas: +Usando el menú de Servicios: +Haz clic en el icono de 9 puntos ☰ (donde dice "Servicios") en la parte superior izquierda +En el menú desplegable, busca la sección "Computación" o "Compute" +Ahí encontrarás "EC2" +Usando la barra de búsqueda: +En la barra de búsqueda superior (donde dice "Buscar [Opción+S]") +Escribe "EC2" +Selecciona EC2 de los resultados +Si aún no puedes verlo, es posible que: +1. Tu cuenta AWS sea muy nueva y aún no esté completamente activada (puede tardar hasta 24 horas) +Tu usuario IAM no tenga permisos para ver/acceder a EC2 +¿Podrías intentar alguno de estos métodos y decirme si puedes ver EC2 ahora? + +### Prompt 4 + +cuando conexto con el comando 'sudo ssh -i "claves-pem.pem" 13.61.22.215' me muestra lo siguiente y se cierra la conexión: +""" +raul@RG701701 aws % sudo ssh -i "claves-pem.pem" 13.61.22.215 +Please login as the user "ubuntu" rather than the user "root". + + +Connection to 13.61.22.215 closed. +""" + +### Answer 4 + +Ah, este es un mensaje común. El error ocurre porque: +1. Estás usando sudo (que intenta conectar como root) +No estás especificando el usuario correcto (ubuntu) +Para conectarte correctamente a una instancia EC2 con Ubuntu, usa este comando: +Bash +ssh -i "claves-pem.pem" ubuntu@13.61.22.215 + +Los cambios son: +1. Eliminar sudo (no es necesario) +Añadir ubuntu@ antes de la IP +Si aún tienes problemas para conectarte, asegúrate de que: +El archivo .pem tiene los permisos correctos: +Bash + chmod 400 claves-pem.pem + +2. Estás en el directorio correcto donde está el archivo .pem +Intenta con estos cambios y dime si ahora puedes conectarte correctamente. + +### Prompt 5 + +parece que npm no se instaló correctamente con las instrucciones que me diste en el paso 3. Lanzar npm --version me devuelve: +""" +ubuntu@ip-172-31-36-124:~$ npm --version +Command 'npm' not found, but can be installed with: +sudo apt install npm +""" + +### Answer 5 + +Ah, tienes razón. Vamos a instalar Node.js y npm correctamente. Ejecuta estos comandos en orden: +Bash +# 1. Actualizar los repositorios +sudo apt update + +# 2. Instalar curl si no está instalado +sudo apt install -y curl + +# 3. Añadir el repositorio NodeSource (para Node.js 18) +curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - + +# 4. Instalar Node.js Y npm +sudo apt install -y nodejs + +# 5. Verificar las instalaciones +node --version +npm --version + +Si después de ejecutar estos comandos sigues sin tener npm, podemos instalarlo directamente: + +sudo apt install -y npm + +Después de la instalación, verifica de nuevo con: +Bash + +npm --version + +¿Podrías ejecutar estos comandos y decirme si ahora funciona correctamente? + +### Prompt 6 + +en mi cuenta de github, en settings no veo la opción de "Secrets and variables". Esto es lo que veo: + +### Answer 6 + +Los secretos de GitHub no se configuran en los ajustes de tu perfil personal, sino en los ajustes del repositorio específico. Sigue estos pasos: +Ve a tu repositorio donde quieres configurar GitHub Actions +Haz clic en la pestaña "Settings" del repositorio (no los settings de tu perfil) +En el menú lateral izquierdo, busca "Security" o "Seguridad" +4. Haz clic en "Secrets and variables" → "Actions" +5. Ahí podrás añadir los secretos necesarios usando el botón "New repository secret" +La ruta completa sería algo así: + +tu-repositorio > Settings > Secrets and variables > Actions > New repository secret + +¿Podrías navegar a tu repositorio e intentar seguir estos pasos? + +### Prompt 7 + +He añadido la nueva política AmazonEC2FullAccess a un nuevo usuario, pero no se bien cómo hacer el sub paso 4 "Genera nuevas credenciales de acceso". Esto es lo que veo: + +### Answer 7 + +Para generar las credenciales de acceso para el usuario IAM, sigue estos pasos: +En la página del usuario (donde estás ahora), ve a la pestaña "Credenciales de seguridad" +Busca la sección "Claves de acceso" y haz clic en "Crear clave de acceso" +AWS te mostrará una advertencia/recomendación sobre el uso de las claves. Selecciona el caso de uso (probablemente "Aplicación ejecutándose fuera de AWS") y continúa +En la siguiente pantalla, verás: +Access key ID (AWS_ACCESS_KEY_ID) +Secret access key (AWS_SECRET_ACCESS_KEY) +5. IMPORTANTE: Esta es la ÚNICA vez que podrás ver la Secret Access Key completa. Asegúrate de: +Descargar el archivo .csv con las credenciales +O copiar ambos valores inmediatamente y guardarlos de forma segura +Estos son los valores que necesitarás para configurar los secretos en GitHub: +El "Access key ID" será el valor para AWS_ACCESS_KEY_ID +El "Secret access key" será el valor para AWS_SECRET_ACCESS_KEY +¿Puedes ver la pestaña "Credenciales de seguridad" en tu pantalla? + +### Prompt 8 + +Si, añadí los dos secretos al proyecto en github, explícame bien lo que hay que hacer en "EC2_INSTANCE" + +### Answer 8 + +El secreto EC2_INSTANCE debe contener la dirección IP pública de tu instancia EC2. En tu caso, basado en la conexión SSH anterior, sería 13.61.22.215. +Para encontrar/verificar esta IP: +Ve a la consola de AWS +Navega a EC2 +En el panel izquierdo, haz clic en "Instancias" +Selecciona tu instancia +En el panel de detalles inferior, busca "Dirección IPv4 pública" +Importante tener en cuenta: +Esta IP puede cambiar si detienes y vuelves a iniciar la instancia +Para tener una IP fija, podrías: +1. Usar una IP elástica (recomendado para producción) +2. O actualizar el secreto en GitHub cada vez que la IP cambie +¿Quieres que te explique cómo configurar una IP elástica para evitar este problema en el futuro? + +### Prompt 9 + +para el secreto EC2_SSH_KEY, al abrir el archivo .pem veo que empieza por "-----BEGIN RSA PRIVATE KEY-----", ¿tengo que copiar eso también en el secreto de github? + +### Answer 9 + +Sí, exactamente. Debes copiar TODO el contenido del archivo .pem, incluyendo: +La línea -----BEGIN RSA PRIVATE KEY----- +Todo el contenido codificado en base64 del medio +La línea -----END RSA PRIVATE KEY----- +El formato completo debería ser algo así: +-----BEGIN RSA PRIVATE KEY----- +MIIEpAIBAAKCAQEAn5zB3zMjylw ... (muchas líneas de caracteres) +... más líneas ... +(última línea de caracteres) ... +-----END RSA PRIVATE KEY----- +Es importante copiar el contenido completo sin modificar nada, ya que estas líneas son parte del formato estándar de una clave RSA privada y son necesarias para que funcione correctamente la autenticación SSH desde GitHub Actions. + +### Prompt 10 + +al lanzar el comando "ssh -i claves-pem.pem unbuntu@13.61.22.215 echo "Conexión exitosa"" obtengo: +""" +raul@RG701701 aws % ssh -i claves-pem.pem unbuntu@13.61.22.215 echo "Conexión exitosa" +unbuntu@13.61.22.215: Permission denied (publickey). +""" + +### Answer 10 + +El error se debe a un typo en el nombre de usuario: has escrito "unbuntu" en lugar de "ubuntu" (te falta una 'u'). +El comando correcto es: +ssh -i claves-pem.pem ubuntu@13.61.22.215 echo "Conexión exitosa" +Los cambios son: +unbuntu ❌ (incorrecto) +ubuntu ✅ (correcto) +Este es un error común porque es fácil escribir mal "ubuntu". Intenta con el comando corregido y debería funcionar. Si aún tienes problemas, asegúrate de que: +1. Los permisos del archivo .pem son correctos: +Bash +chmod 400 claves-pem.pem +Estás usando la IP correcta y actualizada de tu instancia EC2 +El grupo de seguridad de la instancia permite conexiones SSH (puerto 22) + +### Prompt 11 + +ok, ya creo que está todo configurado, en github tenemos los 4 secretos y el comando 'ssh -i claves-pem.pem ubuntu@13.61.22.215 echo "Conexión exitosa"' devolvió "conexión exitosa. Procedamos al crear el workflow de github actions + +### Answer 11 + +Perfecto, vamos a crear el workflow de GitHub Actions. Crearé un archivo pipeline.yml que se ejecutará en pull requests. + + +name: Backend CI/CD Pipeline + +on: + pull_request: + branches: ['*'] + paths: + - 'backend/**' # Solo se ejecuta cuando hay cambios en la carpeta backend + +jobs: + test-and-deploy: + runs-on: ubuntu-latest + + steps: + - name: Checkout code + uses: actions/checkout@v3 + + - name: Setup Node.js + uses: actions/setup-node@v3 + with: + node-version: '18' + cache: 'npm' + cache-dependency-path: backend/package-lock.json + + - name: Install Dependencies + working-directory: backend + run: npm ci + + - name: Run Tests + working-directory: backend + run: npm test + + - name: Build Application + working-directory: backend + run: npm run build + + - name: Configure SSH + run: | + mkdir -p ~/.ssh/ + echo "${{ secrets.EC2_SSH_KEY }}" > ~/.ssh/deploy_key + chmod 600 ~/.ssh/deploy_key + ssh-keyscan -H ${{ secrets.EC2_INSTANCE }} >> ~/.ssh/known_hosts + + - name: Deploy to EC2 + run: | + # Crear directorio si no existe y establecer permisos + ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.EC2_INSTANCE }} ' + mkdir -p ~/backend + ' + + # Copiar archivos necesarios + scp -i ~/.ssh/deploy_key -r backend/dist backend/package*.json backend/prisma ubuntu@${{ secrets.EC2_INSTANCE }}:~/backend/ + + # Instalar dependencias y reiniciar aplicación + ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.EC2_INSTANCE }} ' + cd ~/backend && + npm ci --production && + npm run prisma:generate && + pm2 delete backend || true && + pm2 start dist/index.js --name backend + ' + +Este workflow: +Se ejecuta cuando: +Se abre o actualiza un pull request +Solo si hay cambios en la carpeta backend +Pasos: +Checkout del código +Configura Node.js +Instala dependencias +Ejecuta tests +Genera el build +Configura SSH para el despliegue +Despliega a EC2 usando PM2 +Notas importantes: +Usa PM2 para gestionar el proceso Node.js +Incluye la generación de Prisma +Maneja la cache de npm para builds más rápidas +Antes de hacer el primer push, necesitamos: +Instalar PM2 en la instancia EC2: + +ssh -i claves-pem.pem ubuntu@13.61.22.215 +sudo npm install -g pm2 + +Asegurarnos de que el archivo .env está configurado en EC2: + +ssh -i claves-pem.pem ubuntu@13.61.22.215 +echo "DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase" > ~/backend/.env + +¿Quieres que procedamos con estos pasos? + +### Prompt 12 + +al lanzar el comando 'echo "DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase" > ~/backend/.env' obtengo lo siguiente: + +ubuntu@ip-172-31-36-124:~$ echo "DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase" > ~/backend/.env +-bash: /home/ubuntu/backend/.env: No such file or directory + +### Answer 12 + +Ah, claro. El error ocurre porque el directorio backend aún no existe. Necesitamos crear primero el directorio. Aquí están los comandos en orden: + +# 1. Crear el directorio backend +mkdir -p ~/backend + +# 2. Crear el archivo .env +echo "DATABASE_URL=postgresql://user:password@localhost:5432/mydatabase" > ~/backend/.env + +# 3. Verificar que se creó correctamente +cat ~/backend/.env + +También, necesitaremos asegurarnos de que PostgreSQL está instalado y configurado en la instancia EC2. ¿Quieres que procedamos con la instalación y configuración de PostgreSQL también? Esto incluiría: +1. Instalar PostgreSQL +Crear la base de datos +3. Crear el usuario +Configurar la contraseña +Actualizar el archivo .env con las credenciales correctas +¿Procedemos con estos pasos? + +### Prompt 13 + +si porfa, procede + +### Answer 13 + +Vale, vamos a configurar PostgreSQL paso a paso: + +# 1. Actualizar los repositorios e instalar PostgreSQL +sudo apt update +sudo apt install -y postgresql postgresql-contrib + +# 2. Verificar que PostgreSQL está corriendo +sudo systemctl status postgresql + +# 3. Cambiar al usuario postgres para crear la base de datos y el usuario +sudo -i -u postgres + +Ahora, dentro del shell de postgres, ejecuta estos comandos (copia uno por uno): + +# Crear usuario (reemplaza 'myuser' y 'mypassword' con los valores que prefieras) +createuser --interactive --pwprompt myuser +# Cuando pregunte si es superuser, responde 'n' +# Cuando pregunte si puede crear bases de datos, responde 'y' +# Cuando pregunte si puede crear roles, responde 'n' + +# Crear base de datos +createdb -O myuser mydatabase + +# Salir del usuario postgres +exit + +Ahora, actualicemos el archivo .env con las credenciales correctas: + +# Actualizar el archivo .env (reemplaza myuser y mypassword con los valores que usaste) +echo "DATABASE_URL=postgresql://myuser:mypassword@localhost:5432/mydatabase" > ~/backend/.env + +# Verificar el contenido +cat ~/backend/.env + +Por último, necesitamos permitir la autenticación con contraseña en PostgreSQL: + +# Editar el archivo de configuración +sudo nano /etc/postgresql/14/main/pg_hba.conf + +Busca la línea que dice: +peer +Y cámbiala a: +md5 +Guarda los cambios (Ctrl+O, Enter, Ctrl+X) y reinicia PostgreSQL: +Bash + +sudo systemctl restart postgresql + +Para verificar que todo funciona: +Bash + +# Intentar conectarse a la base de datos +psql -h localhost -U myuser -d mydatabase +# Debería pedirte la contraseña que configuraste + +¿Quieres que ejecutemos estos comandos paso a paso? Así puedo ayudarte si surge algún error en el proceso. + +### Prompt 14 + +no, seguí todos los pasos y todo parece correcto. ¿qué siguientes pasos deberíamos hacer para seguir probando que funcione bien el nuevo pipeline? + +### Answer 14 + +Perfecto. Ahora vamos a probar el pipeline completo. Para esto, necesitamos: +1. Crear una nueva rama y hacer cambios: + +# En tu máquina local +git checkout -b feature/test-pipeline + +# Hacer un cambio pequeño en el backend, por ejemplo en el README.md +echo "# Test Pipeline" >> backend/README.md + +# Commit y push +git add backend/README.md +git commit -m "test: adding test commit to verify pipeline" +git push origin feature/test-pipeline + +2. Crear un Pull Request: +Ve a GitHub +Crea un nuevo Pull Request desde la rama feature/test-pipeline a main +Esto debería activar automáticamente el pipeline +Verificar el pipeline: +En GitHub, ve a la pestaña "Actions" +Deberías ver el workflow ejecutándose +Verifica que todos los pasos se ejecuten correctamente +Verificar el despliegue: + +# Conectarse a EC2 y verificar que los archivos se desplegaron +ssh -i claves-pem.pem ubuntu@13.61.22.215 +ls -la ~/backend +pm2 status # Verificar que la aplicación está corriendo + +¿Procedemos con estos pasos? Así podremos identificar y solucionar cualquier problema que surja durante el proceso. + +### Prompt 15 + +antes de empezar, de momento no he subido el fichero del pipeline. Estoy en la rama "feature/practica" pero aún no he commiteado ni pusheado ningún cambio + +### Answer 15 + +Ah, perfecto. Entonces primero vamos a subir el archivo del pipeline: +1. Crear el directorio y el archivo del pipeline: + +# Crear el directorio .github/workflows si no existe +mkdir -p .github/workflows + +# Crear el archivo pipeline.yml +# Puedes usar tu editor favorito para crear y pegar el contenido que te proporcioné anteriormente + +Commit y push de los cambios: + +# Añadir los cambios +git add .github/workflows/pipeline.yml + +# Commit +git commit -m "ci: add backend pipeline configuration" + +# Push (asumiendo que estás en la rama feature/practica) +git push origin feature/practica + +Verificar en GitHub: +Ve a tu repositorio en GitHub +Navega a la rama feature/practica +Verifica que el archivo .github/workflows/pipeline.yml se ha subido correctamente +Una vez que confirmemos que el archivo está correctamente subido, procederemos con los pasos de prueba que mencioné anteriormente. +¿Procedemos con estos pasos? + +### Prompt 16 + +si, está subido, procedamos + +### Answer 16 + +Perfecto. Ahora vamos a probar el pipeline haciendo un cambio pequeño en el backend: +Hacer un cambio de prueba: +Bash + +# Asegúrate de estar en la rama feature/practica +git checkout feature/practica + +# Hacer un cambio pequeño en el README del backend +echo "# Test Pipeline" >> backend/README.md + +# Commit y push +git add backend/README.md +git commit -m "test: adding test commit to verify pipeline" +git push origin feature/practica + +Crear un Pull Request: +Ve a GitHub +Crea un nuevo Pull Request desde feature/practica a main +Esto debería activar el pipeline automáticamente +Verificar el pipeline: +Ve a la pestaña "Actions" en GitHub +Deberías ver el workflow ejecutándose +Observa cada paso y verifica si hay errores +Si todo es exitoso, verifica en EC2: + +# Conectarse a EC2 +ssh -i claves-pem.pem ubuntu@13.61.22.215 + +# Verificar que los archivos se desplegaron +ls -la ~/backend + +# Verificar que la aplicación está corriendo +pm2 status + +¿Procedemos con estos pasos? Así podemos identificar y solucionar cualquier problema que surja durante el proceso. + + +### Prompt 17 + +No veo error en el pipeline, pero al lanzar pm2 status se muestra status errored: + +ubuntu@ip-172-31-36-124:~$ ls -la ~/backend +total 280 +drwxrwxr-x 4 ubuntu ubuntu 4096 Oct 27 14:38 . +drwxr-x--- 7 ubuntu ubuntu 4096 Oct 27 14:38 .. +-rw-rw-r-- 1 ubuntu ubuntu 71 Oct 27 14:25 .env +drwxr-xr-x 6 ubuntu ubuntu 4096 Oct 27 14:38 dist +-rw-r--r-- 1 ubuntu ubuntu 260688 Oct 27 14:38 package-lock.json +-rw-r--r-- 1 ubuntu ubuntu 1280 Oct 27 14:38 package.json +drwxr-xr-x 3 ubuntu ubuntu 4096 Oct 27 14:38 prisma +ubuntu@ip-172-31-36-124:~$ pm2 status +┌────┬────────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ +│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ +├────┼────────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ +│ 0 │ backend │ default │ 1.0.0 │ fork │ 0 │ 0 │ 15 │ errored │ 0% │ 0b │ ubuntu │ disabled │ +└────┴────────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘ + +### Answer 17 + + +Vamos a investigar el error. PM2 mantiene logs que nos pueden ayudar a identificar el problema: + +# Ver los logs de la aplicación +pm2 logs backend --lines 100 + +# O si prefieres ver los logs directamente del archivo +cat ~/.pm2/logs/backend-error.log +cat ~/.pm2/logs/backend-out.log + +También, podemos intentar iniciar la aplicación directamente con Node.js para ver el error más claramente: +# Ir al directorio backend +cd ~/backend + +# Intentar iniciar la aplicación directamente +node dist/index.js + +¿Podrías ejecutar estos comandos y mostrarme los errores que aparecen? Esto nos ayudará a identificar exactamente qué está fallando. +Algunas causas comunes podrían ser: +1. Problemas con la conexión a la base de datos +Variables de entorno faltantes +Problemas con los permisos de archivos +Puerto ya en uso +Una vez que veamos el error específico, podremos solucionarlo. + +### Prompt 18 + +al lanzar pm2 logs backend --lines 100 observo: + +ubuntu@ip-172-31-36-124:~$ pm2 logs backend --lines 100 +[TAILING] Tailing last 100 lines for [backend] process (change the value with --lines option) +/home/ubuntu/.pm2/logs/backend-out.log last 100 lines: +/home/ubuntu/.pm2/logs/backend-error.log last 100 lines: +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) { +0|backend | code: 'MODULE_NOT_FOUND', +0|backend | requireStack: [ '/home/ubuntu/backend/dist/index.js' ] +0|backend | } +0|backend | Error: Cannot find module 'express' +0|backend | Require stack: +0|backend | - /home/ubuntu/backend/dist/index.js +0|backend | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15) +0|backend | at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:81:25) +0|backend | at require (internal/modules/cjs/helpers.js:85:18) +0|backend | at Object. (/home/ubuntu/backend/dist/index.js:7:33) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) +0|backend | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) +0|backend | at Module.load (internal/modules/cjs/loader.js:863:32) +0|backend | at Function.Module._load (internal/modules/cjs/loader.js:708:14) +0|backend | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) { +0|backend | code: 'MODULE_NOT_FOUND', +0|backend | requireStack: [ '/home/ubuntu/backend/dist/index.js' ] +0|backend | } +0|backend | Error: Cannot find module 'express' +0|backend | Require stack: +0|backend | - /home/ubuntu/backend/dist/index.js +0|backend | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15) +0|backend | at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:81:25) +0|backend | at require (internal/modules/cjs/helpers.js:85:18) +0|backend | at Object. (/home/ubuntu/backend/dist/index.js:7:33) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) +0|backend | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) +0|backend | at Module.load (internal/modules/cjs/loader.js:863:32) +0|backend | at Function.Module._load (internal/modules/cjs/loader.js:708:14) +0|backend | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) { +0|backend | code: 'MODULE_NOT_FOUND', +0|backend | requireStack: [ '/home/ubuntu/backend/dist/index.js' ] +0|backend | } +0|backend | Error: Cannot find module 'express' +0|backend | Require stack: +0|backend | - /home/ubuntu/backend/dist/index.js +0|backend | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15) +0|backend | at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:81:25) +0|backend | at require (internal/modules/cjs/helpers.js:85:18) +0|backend | at Object. (/home/ubuntu/backend/dist/index.js:7:33) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) +0|backend | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) +0|backend | at Module.load (internal/modules/cjs/loader.js:863:32) +0|backend | at Function.Module._load (internal/modules/cjs/loader.js:708:14) +0|backend | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) { +0|backend | code: 'MODULE_NOT_FOUND', +0|backend | requireStack: [ '/home/ubuntu/backend/dist/index.js' ] +0|backend | } +0|backend | Error: Cannot find module 'express' +0|backend | Require stack: +0|backend | - /home/ubuntu/backend/dist/index.js +0|backend | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15) +0|backend | at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:81:25) +0|backend | at require (internal/modules/cjs/helpers.js:85:18) +0|backend | at Object. (/home/ubuntu/backend/dist/index.js:7:33) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) +0|backend | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) +0|backend | at Module.load (internal/modules/cjs/loader.js:863:32) +0|backend | at Function.Module._load (internal/modules/cjs/loader.js:708:14) +0|backend | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) { +0|backend | code: 'MODULE_NOT_FOUND', +0|backend | requireStack: [ '/home/ubuntu/backend/dist/index.js' ] +0|backend | } +0|backend | Error: Cannot find module 'express' +0|backend | Require stack: +0|backend | - /home/ubuntu/backend/dist/index.js +0|backend | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15) +0|backend | at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:81:25) +0|backend | at require (internal/modules/cjs/helpers.js:85:18) +0|backend | at Object. (/home/ubuntu/backend/dist/index.js:7:33) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) +0|backend | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) +0|backend | at Module.load (internal/modules/cjs/loader.js:863:32) +0|backend | at Function.Module._load (internal/modules/cjs/loader.js:708:14) +0|backend | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) { +0|backend | code: 'MODULE_NOT_FOUND', +0|backend | requireStack: [ '/home/ubuntu/backend/dist/index.js' ] +0|backend | } +0|backend | Error: Cannot find module 'express' +0|backend | Require stack: +0|backend | - /home/ubuntu/backend/dist/index.js +0|backend | at Function.Module._resolveFilename (internal/modules/cjs/loader.js:815:15) +0|backend | at Module.Hook._require.Module.require (/usr/local/lib/node_modules/pm2/node_modules/require-in-the-middle/index.js:81:25) +0|backend | at require (internal/modules/cjs/helpers.js:85:18) +0|backend | at Object. (/home/ubuntu/backend/dist/index.js:7:33) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) +0|backend | at Object.Module._extensions..js (internal/modules/cjs/loader.js:1027:10) +0|backend | at Module.load (internal/modules/cjs/loader.js:863:32) +0|backend | at Function.Module._load (internal/modules/cjs/loader.js:708:14) +0|backend | at Object. (/usr/local/lib/node_modules/pm2/lib/ProcessContainerFork.js:33:23) +0|backend | at Module._compile (internal/modules/cjs/loader.js:999:30) { +0|backend | code: 'MODULE_NOT_FOUND', +0|backend | requireStack: [ '/home/ubuntu/backend/dist/index.js' ] +0|backend | } + +### Answer 18 + +El error es claro: Cannot find module 'express'. Esto significa que las dependencias no se instalaron correctamente. El problema está en el pipeline, específicamente en la parte donde instalamos las dependencias en EC2. +Vamos a modificar el paso de despliegue en el pipeline. Necesitamos actualizar el archivo .github/workflows/pipeline.yml: + + - name: Deploy to EC2 + run: | + # Crear directorio si no existe y establecer permisos + ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.EC2_INSTANCE }} ' + mkdir -p ~/backend + ' + + # Copiar archivos necesarios + scp -i ~/.ssh/deploy_key -r backend/dist backend/package*.json backend/prisma ubuntu@${{ secrets.EC2_INSTANCE }}:~/backend/ + + # Instalar dependencias y reiniciar aplicación + ssh -i ~/.ssh/deploy_key ubuntu@${{ secrets.EC2_INSTANCE }} ' + cd ~/backend && + rm -rf node_modules && # Eliminar node_modules existente + npm install && # Cambiar npm ci por npm install + npm run prisma:generate && + pm2 delete backend || true && + pm2 start dist/index.js --name backend + ' + +Los cambios principales son: +1. Eliminamos node_modules existente +Cambiamos npm ci por npm install +Mientras tanto, podemos probar manualmente en EC2: + +# En la instancia EC2 +cd ~/backend +rm -rf node_modules +npm install +npm run prisma:generate +pm2 restart backend + +¿Quieres que: +1. Primero probemos manualmente los comandos en EC2 para verificar que funcionan? +O prefieres que actualicemos directamente el pipeline y hagamos un nuevo push? + +### Prompt 19 + +al lanzar npm install en la instancia EC2 obtengo: + +npm WARN EBADENGINE current: { node: 'v12.22.9', npm: '8.5.1' } +npm WARN EBADENGINE } +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: 'synckit@0.8.8', +npm WARN EBADENGINE required: { node: '^14.18.0 || >=16.0.0' }, +npm WARN EBADENGINE current: { node: 'v12.22.9', npm: '8.5.1' } +npm WARN EBADENGINE } +npm WARN EBADENGINE Unsupported engine { +npm WARN EBADENGINE package: 'ts-jest@29.1.3', +npm WARN EBADENGINE required: { node: '^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0' }, +npm WARN EBADENGINE current: { node: 'v12.22.9', npm: '8.5.1' } +npm WARN EBADENGINE } +npm ERR! code 1 +npm ERR! path /home/ubuntu/backend/node_modules/prisma +npm ERR! command failed +npm ERR! command sh -c node scripts/preinstall-entry.js +npm ERR! ┌──────────────────────────────────────────────┐ +npm ERR! │ Prisma only supports Node.js >= 16.13. │ +npm ERR! │ Please upgrade your Node.js version. │ +npm ERR! └──────────────────────────────────────────────┘ + +npm ERR! A complete log of this run can be found in: +npm ERR! /home/ubuntu/.npm/_logs/2024-10-27T14_44_06_334Z-debug-0.log + +### Answer 19 + +Ah, el problema es que la versión de Node.js en EC2 es muy antigua (v12.22.9). Necesitamos actualizar a Node.js 18 como tenemos en el pipeline. +Ejecuta estos comandos en EC2: + +# Eliminar versión antigua de Node.js +sudo apt-get remove nodejs + +# Actualizar los repositorios +sudo apt update + +# Instalar curl si no está instalado +sudo apt install -y curl + +# Añadir el repositorio de Node.js 18 +curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - + +# Instalar Node.js 18 +sudo apt install -y nodejs + +# Verificar la versión +node --version # Debería mostrar v18.x.x +npm --version + +Una vez que Node.js esté actualizado, intentemos de nuevo: + + +cd ~/backend +rm -rf node_modules +npm install +npm run prisma:generate +pm2 restart backend + +¿Ejecutamos estos comandos? + +### Prompt 20 + +al lanzar sudo apt install -y nodejs obtengo: +ubuntu@ip-172-31-36-124:~/backend$ sudo apt install -y nodejs +Reading package lists... Done +Building dependency tree... Done +Reading state information... Done +The following packages were automatically installed and are no longer required: + adwaita-icon-theme at-spi2-core dconf-gsettings-backend dconf-service fontconfig gsettings-desktop-schemas gtk-update-icon-cache gyp hicolor-icon-theme humanity-icon-theme javascript-common + libatk-bridge2.0-0 libatk1.0-0 libatk1.0-data libatspi2.0-0 libauthen-sasl-perl libavahi-client3 libavahi-common-data libavahi-common3 libc-ares2 libcairo-gobject2 libcairo2 libclone-perl libcolord2 + libcups2 libdata-dump-perl libdatrie1 libdconf1 libdrm-amdgpu1 libdrm-intel1 libdrm-nouveau2 libdrm-radeon1 libencode-locale-perl libepoxy0 libfile-basedir-perl libfile-desktopentry-perl + libfile-listing-perl libfile-mimeinfo-perl libfont-afm-perl libfontenc1 libgl1 libgl1-amber-dri libgl1-mesa-dri libglapi-mesa libglvnd0 libglx-mesa0 libglx0 libgraphite2-3 libgtk-3-0 libgtk-3-bin + libgtk-3-common libgtkd-3-0 libharfbuzz0b libhtml-form-perl libhtml-format-perl libhtml-parser-perl libhtml-tagset-perl libhtml-tree-perl libhttp-cookies-perl libhttp-daemon-perl libhttp-date-perl + libhttp-message-perl libhttp-negotiate-perl libice6 libio-html-perl libio-socket-ssl-perl libio-stringy-perl libipc-system-simple-perl libjs-events libjs-highlight.js libjs-inherits + libjs-is-typedarray libjs-psl libjs-source-map libjs-sprintf-js libjs-typedarray-to-buffer liblcms2-2 libllvm11 libllvm15 liblwp-mediatypes-perl liblwp-protocol-https-perl libmailtools-perl + libnet-dbus-perl libnet-http-perl libnet-smtp-ssl-perl libnet-ssleay-perl libnode-dev libnode72 libpango-1.0-0 libpangocairo-1.0-0 libpangoft2-1.0-0 libpciaccess0 libphobos2-ldc-shared98 + libpixman-1-0 librsvg2-2 librsvg2-common libsm6 libssl-dev libthai-data libthai0 libtie-ixhash-perl libtimedate-perl libtry-tiny-perl liburi-perl libuv1-dev libvte-2.91-0 libvte-2.91-common + libvted-3-0 libwayland-client0 libwayland-cursor0 libwayland-egl1 libwww-perl libwww-robotrules-perl libx11-protocol-perl libx11-xcb1 libxaw7 libxcb-dri2-0 libxcb-dri3-0 libxcb-glx0 libxcb-present0 + libxcb-randr0 libxcb-render0 libxcb-shape0 libxcb-shm0 libxcb-sync1 libxcb-xfixes0 libxcomposite1 libxcursor1 libxdamage1 libxfixes3 libxft2 libxi6 libxinerama1 libxkbcommon0 libxkbfile1 + libxml-parser-perl libxml-twig-perl libxml-xpathengine-perl libxmu6 libxrandr2 libxrender1 libxshmfence1 libxt6 libxtst6 libxv1 libxxf86dga1 libxxf86vm1 node-abbrev node-ansi-regex node-ansi-styles + node-ansistyles node-are-we-there-yet node-arrify node-asap node-asynckit node-balanced-match node-brace-expansion node-chownr node-clean-yaml-object node-color-convert node-color-name + node-commander node-core-util-is node-decompress-response node-delayed-stream node-delegates node-depd node-diff node-encoding node-end-of-stream node-err-code node-escape-string-regexp + node-fancy-log node-foreground-child node-fs.realpath node-function-bind node-get-stream node-glob node-growl node-has-flag node-has-unicode node-hosted-git-info node-iconv-lite node-iferr + node-imurmurhash node-indent-string node-inflight node-inherits node-ini node-ip node-ip-regex node-is-buffer node-is-plain-obj node-is-typedarray node-isarray node-isexe + node-json-parse-better-errors node-jsonparse node-kind-of node-lodash-packages node-lowercase-keys node-lru-cache node-mimic-response node-minimatch node-minimist node-minipass node-mute-stream + node-negotiator node-npm-bundled node-once node-osenv node-p-cancelable node-p-map node-path-is-absolute node-process-nextick-args node-promise-inflight node-promise-retry node-promzard node-pump + node-quick-lru node-read node-readable-stream node-resolve node-retry node-safe-buffer node-set-blocking node-signal-exit node-slash node-slice-ansi node-source-map node-spdx-correct + node-spdx-exceptions node-spdx-expression-parse node-spdx-license-ids node-sprintf-js node-stealthy-require node-string-decoder node-supports-color node-text-table node-time-stamp node-tmatch + node-typedarray-to-buffer node-universalify node-util-deprecate node-validate-npm-package-license node-webidl-conversions node-whatwg-fetch node-wrappy node-yallist perl-openssl-defaults + session-migration tilix tilix-common ubuntu-mono x11-common x11-utils x11-xserver-utils xdg-utils +Use 'sudo apt autoremove' to remove them. +The following NEW packages will be installed: + nodejs +0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. +Need to get 0 B/29.6 MB of archives. +After this operation, 187 MB of additional disk space will be used. +Selecting previously unselected package nodejs. +(Reading database ... 124241 files and directories currently installed.) +Preparing to unpack .../nodejs_18.20.4-1nodesource1_amd64.deb ... +Unpacking nodejs (18.20.4-1nodesource1) ... +dpkg: error processing archive /var/cache/apt/archives/nodejs_18.20.4-1nodesource1_amd64.deb (--unpack): + trying to overwrite '/usr/include/node/common.gypi', which is also in package libnode-dev 12.22.9~dfsg-1ubuntu3.6 +dpkg-deb: error: paste subprocess was killed by signal (Broken pipe) +Errors were encountered while processing: + /var/cache/apt/archives/nodejs_18.20.4-1nodesource1_amd64.deb +E: Sub-process /usr/bin/dpkg returned an error code (1) + +### Answer 20 + +# Eliminar Node.js y npm completamente +sudo apt-get remove -y nodejs npm node +sudo apt-get remove -y libnode-dev +sudo apt-get autoremove -y +sudo apt clean +sudo apt autoclean + +# Eliminar cualquier configuración residual +sudo rm -rf /usr/local/bin/npm +sudo rm -rf /usr/local/share/man/man1/node* +sudo rm -rf /usr/local/lib/dtrace/node.d +sudo rm -rf ~/.npm +sudo rm -rf ~/.node-gyp +sudo rm -rf /opt/local/bin/node +sudo rm -rf /opt/local/include/node +sudo rm -rf /opt/local/lib/node_modules +sudo rm -rf /usr/local/lib/node* +sudo rm -rf /usr/local/include/node* +sudo rm -rf /usr/local/bin/node* + +# Actualizar los repositorios +sudo apt update + +# Volver a añadir el repositorio de Node.js 18 +curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash - + +# Ahora sí, instalar Node.js +sudo apt install -y nodejs + +# Verificar la instalación +node --version +npm --version + +### Prompt 21 + +si, ahora se instaló bien, también ejecuté npm install y parece que lo hizo bien + +### Answer 21 + +Perfecto. Ahora vamos a completar la configuración y arrancar la aplicación: + +# 1. Generar los archivos de Prisma +npm run prisma:generate + +# 2. Detener cualquier instancia anterior de la aplicación +pm2 delete backend || true + +# 3. Iniciar la aplicación con PM2 +pm2 start dist/index.js --name backend + +# 4. Verificar el estado +pm2 status + +# 5. Si todo está corriendo, ver los logs para asegurarnos que no hay errores +pm2 logs backend --lines 50 + +Una vez que ejecutes estos comandos, deberíamos ver la aplicación corriendo sin errores. +Si todo funciona correctamente, podemos: +1. Hacer un commit con los cambios en el pipeline (si es necesario) +Probar el pipeline completo haciendo un cambio en el código +¿Ejecutamos estos comandos y vemos cómo va? + +### Prompt 22 + +el comando "pm2 delete backend || true" me devuelve lo siguiente: + +ubuntu@ip-172-31-36-124:~/backend$ pm2 delete backend || true +-bash: /usr/local/bin/pm2: No such file or directory + +### Answer 22 + +Ah, claro, necesitamos instalar PM2 globalmente. Ejecuta estos comandos: + +# Instalar PM2 globalmente +sudo npm install -g pm2 + +# Verificar la instalación +pm2 --version + +# Ahora sí, intentemos iniciar la aplicación +pm2 delete backend || true +pm2 start dist/index.js --name backend + +# Verificar el estado +pm2 status + +# Ver los logs +pm2 logs backend --lines 50 + +Esto debería instalar PM2 y permitirnos gestionar nuestra aplicación. ¿Ejecutamos estos comandos? + +### Prompt 23 + +lancé el comando sudo npm install -g pm2, pero pm2 --version me indica que no existe: + +ubuntu@ip-172-31-36-124:~/backend$ sudo npm install -g pm2 + +added 138 packages in 13s + +13 packages are looking for funding + run `npm fund` for details +ubuntu@ip-172-31-36-124:~/backend$ pm2 --version +-bash: /usr/local/bin/pm2: No such file or directory + +### Answer 23 + +Este error suele ocurrir por un problema con las rutas de npm. Vamos a solucionarlo: + +# 1. Primero, veamos dónde se instaló pm2 +which pm2 + +# 2. Si no lo encuentra, busquemos el archivo pm2 +sudo find / -name pm2 2>/dev/null + +# 3. Como alternativa, instalemos pm2 de otra manera +sudo npm install -g pm2@latest --force + +# 4. Creemos un enlace simbólico manualmente +sudo ln -s $(which pm2) /usr/local/bin/pm2 + +# 5. Actualizar la sesión de bash +source ~/.bashrc + +# 6. Verificar la instalación +pm2 --version + +Si aún así no funciona, podemos intentar: + +# Reinstalar npm globalmente +sudo npm install -g npm + +# Limpiar la caché de npm +sudo npm cache clean -f + +# Instalar n (gestor de versiones de Node.js) +sudo npm install -g n + +# Reinstalar PM2 +sudo npm install -g pm2@latest + +### Prompt 24 + +which pm2 devuelve: +ubuntu@ip-172-31-36-124:~/backend$ which pm2 +/usr/bin/pm2 + +### Answer 24 + +Ah, entonces PM2 está instalado en /usr/bin/pm2 en lugar de /usr/local/bin/pm2. Vamos a intentar usarlo directamente y crear los enlaces simbólicos necesarios: +Bash + +# Crear el enlace simbólico necesario +sudo ln -sf /usr/bin/pm2 /usr/local/bin/pm2 + +# Reiniciar la sesión de bash +source ~/.bashrc + +# Probar PM2 +/usr/bin/pm2 --version + +# Ahora intentemos iniciar la aplicación usando la ruta completa +/usr/bin/pm2 delete backend || true +/usr/bin/pm2 start dist/index.js --name backend + +# Verificar el estado +/usr/bin/pm2 status + +# Ver los logs +/usr/bin/pm2 logs backend --lines 50 + +### Prompt 25 + +ya parece que todo está correcto, al lanzar pm2 logs backend --lines 50 obtengo: + +ubuntu@ip-172-31-36-124:~/backend$ pm2 logs backend --lines 50 +[TAILING] Tailing last 50 lines for [backend] process (change the value with --lines option) +/home/ubuntu/.pm2/logs/backend-error.log last 50 lines: +/home/ubuntu/.pm2/logs/backend-out.log last 50 lines: +0|backend | Server is running at http://localhost:3010 + +### Answer 25 + +¡Excelente! La aplicación está corriendo correctamente en el puerto 3010. Ahora podemos probar si es accesible desde fuera. +Primero, verifica que el puerto 3010 está abierto en el Security Group de EC2: +Ve a la consola de AWS → EC2 → Security Groups +Selecciona el security group de tu instancia +En "Inbound rules", añade una regla: +Type: Custom TCP +Port range: 3010 +Source: 0.0.0.0/0 (o tu IP específica para más seguridad) +Prueba el acceso: +Usa curl desde tu máquina local o un navegador web +La URL sería: http://13.61.22.215:3010 +3. Si todo funciona, podemos probar el pipeline completo: +Hacer un pequeño cambio en el código +Crear un PR +Verificar que el pipeline se ejecuta correctamente +Comprobar que los cambios se despliegan +¿Quieres que procedamos con alguno de estos pasos? + +### Prompt 26 + +veo 2 grupos de seguridad y no se cuál es el correcto: + + +### Answer 26 + +Necesitamos modificar el grupo de seguridad correcto. Por los nombres que veo: +launch-wizard-1: Este es el que se creó al lanzar la instancia +default: Este es el grupo de seguridad por defecto de la VPC +El que debemos modificar es launch-wizard-1 ya que es el que está asociado a tu instancia EC2. +Para añadir la regla: +Selecciona el grupo launch-wizard-1 +Ve a la pestaña "Inbound rules" (Reglas de entrada) +3. Click en "Edit inbound rules" (Editar reglas de entrada) +Click en "Add rule" (Añadir regla) +5. Configura la nueva regla: +Type: Custom TCP +Port range: 3010 +Source: 0.0.0.0/0 +Description (opcional): Backend API port +Una vez añadida la regla, podrás acceder a tu aplicación a través de: +http://13.61.22.215:3010 +¿Quieres que procedamos con estos pasos? + +### Prompt 27 + +al pulsar en gaurdar reglas me pide especificar un bloque cidr + +### Answer 27 + +Sí, el bloque CIDR es el formato para especificar el rango de IPs permitidas. Para permitir el acceso desde cualquier IP (lo cual es común en desarrollo, aunque no recomendado para producción), usa: +0.0.0.0/0 +Este es el formato CIDR que significa "todas las IPs". +Entonces, en la regla: +1. Type: Custom TCP +2. Port range: 3010 +Source: Custom +En el campo CIDR: 0.0.0.0/0 +Description (opcional): Backend API port +Alternativas más seguras serían: +Tu IP específica: tu.ip.actual/32 +Un rango específico de IPs de tu organización +¿Quieres que te ayude a encontrar tu IP específica para una configuración más segura, o procedemos con 0.0.0.0/0? + +### Prompt 28 + +vale, al lanzar @http://13.61.22.215:3010 obtuve "Hola LTI!" por lo que entiendo que es correcto, ahora procedamos a subir los cambios del archivo @pipeline.yml y volver a probar el pipeline + +### Answer 28 + +Perfecto, veo que la aplicación está respondiendo correctamente en http://13.61.22.215:3010 con el mensaje "Hola LTI!". +Vamos a probar el pipeline completo: +Commit y push del pipeline actualizado: + +git add .github/workflows/pipeline.yml +git commit -m "ci: update pipeline configuration with correct node installation" +git push origin feature/practica + +Hacer un cambio de prueba para verificar que el pipeline funciona: + +# Por ejemplo, modificar el mensaje en el backend +cd backend +# Hacer un cambio en el código +git add . +git commit -m "test: update welcome message to test pipeline" +git push origin feature/practica + + +practica +Verificar el pipeline: +Ve a la pestaña "Actions" en GitHub +Observa que el workflow se ejecute correctamente +Una vez completado, verifica que los cambios se reflejen en http://13.61.22.215:3010 +¿Procedemos con estos pasos? \ No newline at end of file