<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Oberg Agustin</title>
    <description>The latest articles on DEV Community by Oberg Agustin (@agustinoberg).</description>
    <link>https://dev.to/agustinoberg</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F766561%2Fea4906cc-5d47-45dc-84c0-5886d19ed4e4.png</url>
      <title>DEV Community: Oberg Agustin</title>
      <link>https://dev.to/agustinoberg</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/agustinoberg"/>
    <language>en</language>
    <item>
      <title>Subir backend NodeJS a AWS - EC2</title>
      <dc:creator>Oberg Agustin</dc:creator>
      <pubDate>Fri, 28 Oct 2022 17:46:08 +0000</pubDate>
      <link>https://dev.to/agustinoberg/subir-backend-nodejs-a-aws-ec2-4nd5</link>
      <guid>https://dev.to/agustinoberg/subir-backend-nodejs-a-aws-ec2-4nd5</guid>
      <description>&lt;p&gt;Subir un backend de NodeJS a AWS puede ser un verdadero problema si no se tiene un concepto general de los distintos servicios que posee el servidor de Amazon, pero en esta ocasión te voy a mostrar como yo alojo mis servidores de &lt;strong&gt;NodeJS en AWS sin morir en el intento&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  ¿Qué se busca hacer?
&lt;/h2&gt;

&lt;p&gt;Al igual que todo en programación, existen varias maneras de llegar a un resultado similar pero con caminos distintos. A la hora de alojar un servidor de NodeJS tenemos dos alternativas fuertes que debemos tener en cuenta: deployar utilizando &lt;em&gt;Serverless&lt;/em&gt; o hacerlo mediante &lt;em&gt;EC2&lt;/em&gt;. En esta guía lo haré sobre un EC2 pero te explicaré rapidamente el por qué de mi decisión y un resumen de la diferencia que hay entre hacerlo de una forma y de otra.&lt;/p&gt;

&lt;h2&gt;
  
  
  Serverless vs EC2
&lt;/h2&gt;

&lt;p&gt;Primero que nada, te recomiendo leer más acerca de &lt;a href="https://www.serverless.com/" rel="noopener noreferrer"&gt;Serverless framework&lt;/a&gt; y &lt;a href="https://aws.amazon.com/es/ec2/" rel="noopener noreferrer"&gt;EC2&lt;/a&gt; en sus perspectivos sitios oficiales.&lt;br&gt;
Esta guía no se enfoca en este tema, sin embargo, de manera resumida se puede decir que Serverless lo utilizaría para proyectos que estén en constante crecimiento y necesite una curva de gastos de manera &lt;code&gt;+demanda +precio&lt;/code&gt; (este no es el caso). En cambio, EC2 en mi opinión lo usaría cuando necesito tener un gasto fijo mensual con un servidor altamente configurable de acuerdo a mis necesidades. Por ese motivo, en esta oportunidad usaré EC2 aunque no descarto hacer una guía de deploy de NodeJS - AWS utilizando Serverless en un futuro.&lt;/p&gt;

&lt;h2&gt;
  
  
  Requisitos previos
&lt;/h2&gt;

&lt;p&gt;Esta guía está enfocada a levantar la app de 0 a 100% por ende se deberá tener :&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Cuenta de AWS creada y con acceso.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Dominio configurado en Route53.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Permisos necesarios en usuario de AWS para manipular dicho sistema.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;APP de NodeJS (preferentemente subida a github)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  #1 - Lanzar instancia EC2
&lt;/h2&gt;

&lt;p&gt;Lo primero que debemos hacer es lanzar la instancia de EC2. Para eso, una vez estemos en la región que querramos lanzar la instancia (en mi caso, Ohio), vamos al panel de EC2 y seleccionamos &lt;strong&gt;Lanzar la instancia&lt;/strong&gt;. Estando en el panel de creación de una nueva instancia, configuraremos nuestro EC2.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxm955vi7exq4u5smn2n.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fhxm955vi7exq4u5smn2n.png" alt="EC2 Config"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En mi caso seleccionaré Ubuntu (puesto que es más sencillo de configurar) y le pondré de nombre NodeJS-Backend-DEV. También seleccionaré las siguientes propiedades de mi EC2 que se adaptan a mis necesidades.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4udzvz2awng1sbbt59x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw4udzvz2awng1sbbt59x.png" alt="AMI"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkaldq61gtvvk14duguu0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkaldq61gtvvk14duguu0.png" alt="EC2 Type"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En el apartado Par de claves es importante que creemos un nuevo par de claves (el cual nos servirá para conectarnos por  terminal al EC2. En mi caso, uso &lt;strong&gt;RSA&lt;/strong&gt; en formato &lt;strong&gt;.pem&lt;/strong&gt;. Por último, la memoria varía dependiendo las necesidades de cada backend, y el grupo de seguridad lo veremos más adelante en esta guía.&lt;br&gt;
Con todo esto configurado, ya tendremos nuestro EC2 creado correctamente: Felicidades!&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqgch5s614dr44xjn1og.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flqgch5s614dr44xjn1og.png" alt="Success EC2 Creation"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #2 - Grupo de seguridad
&lt;/h2&gt;

&lt;p&gt;Una vez con la instancia creada correctamente, podremos crear nuestro grupo de seguridad para indicar los puertos bajo los cuales se podrá entrar y salir de nuestro EC2. En el mismo panel (home) de EC2 presionamos sobre &lt;strong&gt;Grupos de seguridad&lt;/strong&gt; y &lt;strong&gt;Crear grupo de seguridad&lt;/strong&gt;&lt;br&gt;
Nuestro nuevo grupo de seguridad tendrá que tener la siguiente configuración&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Entrada&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IPv4 | SSH | TCP | 22 | 0.0.0.0/0 (puerto que usaremos para la terminal)&lt;/li&gt;
&lt;li&gt;IPv4 | HTTP | TCP | 80 | 0.0.0.0/0 (puerto HTTP)&lt;/li&gt;
&lt;li&gt;IPv4 | HTTPS | TCP | 443 | 0.0.0.0/0 (puerto HTTPS)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Una vez con el grupo de seguridad, vamos hacia nuestro EC2 y le ponemos dicho grupo&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvc3mcxa3ce70cuixfjo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvc3mcxa3ce70cuixfjo.png" alt="Update security group"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #3 - IP Elástica
&lt;/h2&gt;

&lt;p&gt;Lo siguiente será configurar una dirección de ip elástica para tener una ip fija en nuestro backend. Para hacer eso, vamos a &lt;strong&gt;Direcciones IP elásticas&lt;/strong&gt; (home de EC2) y asignamos una nueva IP elástica. Para asignar dicha IP vamos a &lt;strong&gt;Asociar la dirección IP elástica&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3p1yofgs3q3bksx2arl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fr3p1yofgs3q3bksx2arl.png" alt="Assign elastic IP"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;y simplemente seleccionamos nuestra instancia EC2&lt;/p&gt;

&lt;h2&gt;
  
  
  #4 - Crear un subdominio a nuestra IP Elástica
&lt;/h2&gt;

&lt;p&gt;Debemos crear un subdominio de tipo A a nuestra ip elástica en Route53&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvucdnklva8i4pp785bkd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvucdnklva8i4pp785bkd.png" alt="Route53"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #5 - Conectarse al EC2
&lt;/h2&gt;

&lt;p&gt;Con nuestro .pem descargado, abrimos una terminal en el mismo directorio donde esté dicho archivo y escribimos lo siguiente&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

ssh -i "NOMBRE-DE-MI-PEM.pem" ubuntu@ELASTIC-IP


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;y con esto estaremos dentro de nuestra instancia EC2 a través de la terminal. Felicidades&lt;br&gt;
Aclaración : Si llega a fallar la conexión, intentar dar permisos al .pem&lt;br&gt;
&lt;code&gt;chmod 400 NOMBRE-DE-MI-PEM.pem&lt;/code&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #6 A - Instalaciones - NODE JS
&lt;/h2&gt;

&lt;p&gt;Seguir los sientes comandos para instalar todo lo necesario para correr nuestro servidor de NodeJS&lt;/p&gt;

&lt;p&gt;nvm (NodeJS pero con switch de versiones)&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.2/install.sh | bash



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Una vez instalado, ejecutar &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

source ~/.bashrc 


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Con todo esto, si ejetutamos &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;nvm ls&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;veremos una respuesta.&lt;br&gt;
Posteriormente, para instalar una versión de NodeJS usaremos&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

nvm install VERSION


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;en mi caso, la v16.15.0. Al ejecutar otra vez nvm ls se observará la versión de node elegida&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwt14kjh86kpkztbbq7l9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fwt14kjh86kpkztbbq7l9.png" alt="NVM"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #6 B - Instalaciones - GIT
&lt;/h2&gt;

&lt;p&gt;Ejecutar &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo apt-get install git


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
  
  
  #7 GITHUB LOGIN
&lt;/h2&gt;

&lt;p&gt;Normalmente nuestro repo será privado, por ende, habrá que iniciar sesión en Github (en mi caso) para poder clonar dicho repositorio. Desde la terminal esto no es tan sencillo, por ende, lo explicaré también en esta guía. (Simplemente explicaré como hacerlo, NO la teoría que hay detrás. En el caso de ser necesario, pedime un post sobre ese tema 🐵)&lt;br&gt;
Primero, ejecutar &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

ssh-keygen


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;para generar nuestra clave encriptada. La terminal pedirá varias instrucciones para lo cual no tendremos que rellenar ninguna. Simplementer presionar ENTER en todo lo que nos pregunte.&lt;br&gt;
Posteriormente ejecutar &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

cat ~/.ssh/id_rsa.pub


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;para así poder ver nuestra clave &lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxpaywb5rtmiblptqtrl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdxpaywb5rtmiblptqtrl.png" alt="GITHUB KEY"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;copiar TODO el contenido para luego dirigirse a &lt;a href="//github.com"&gt;github&lt;/a&gt; y en settings crear una nueva key SSH&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0k2ieobr3eosn8m75hl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fm0k2ieobr3eosn8m75hl.png" alt="Github ssh key"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Una vez la clave esté en github, en nuestra terminal podremos hacer un &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

ssh git@github.com


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;terminando así, nuestro login con GITHUB&lt;/p&gt;

&lt;h2&gt;
  
  
  #8 Configurando proyecto
&lt;/h2&gt;

&lt;p&gt;Este es el paso más facil y amigable de todos puesto que necesitamos configurar nuestro proyecto. Para esto, tendremos que crear todos los .env necesarios así como también instalar todas las dependencias del proyecto. El objetivo es poder ejecutar nuestro proyecto sin errores. También, necesitamos saber en que puerto está corriendo nuestro proyecto&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxjo6i8fl96azrllmkdt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzxjo6i8fl96azrllmkdt.png" alt="Node JS app running"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;En mi caso, el proyecto está corriendo bajo el puerto &lt;strong&gt;8082&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #9 Configurando PM2
&lt;/h2&gt;

&lt;p&gt;Ahora mismo nuestro servidor está corriendo y podría usarse en cualquier parte del mundo. Sin embargo, nos interesa tener el servidor ejecutandose por más que la terminal se cierre. A demás, es conveniente tener un monitor para saber tanto los recursos como logs ordenados de nuestra app. Todo esto y más hace por nosotros pm2.&lt;br&gt;
Para instalar pm2 ejecutar&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

npm install pm2 -g


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;y ya tendremos instalado pm2. Para ejecutarlo, nos paramos en nuestra carpeta del proyecto y ejecutamos&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

pm2 start puntoDeEntradaDeMiApp.js


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;y podremos ver nuestra app corriendo &lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1mkuv9lts9rzfd1vxvz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ff1mkuv9lts9rzfd1vxvz.png" alt="Pm2 started"&gt;&lt;/a&gt;&lt;br&gt;
PM2 Es muy útil, recomiendo 100% leer más sobre él en su &lt;a href="https://pm2.keymetrics.io/" rel="noopener noreferrer"&gt;web oficial&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #10 NGINX como Reverse-Proxy
&lt;/h2&gt;

&lt;p&gt;Usaremos NgninX para poder así exponer nuestro servidor usandolo de reverse-proxy para posteriormente poder colocarle certificado e ingresar a través de https 🐵 ¿Suena complejo? No lo es!&lt;br&gt;
A este punto, se tendrá que tener en claro cual será el subdominio que se desee utilizar.&lt;br&gt;
Primero instalaremos nginx utilizando &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo apt update
sudo apt install nginx


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;En el caso de que usemos firewall ufw darle permisos a través de &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo ufw allow 'Nginx HTTP'



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;¡Listo! está instalado. Podremos confirmar que se esté ejecutando con &lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

systemctl status nginx


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;A lo que tendremos una respuesta similar a esta:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

 nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Fri 2022-10-28 17:06:52 UTC; 4min 30s ago
       Docs: man:nginx(8)
   Main PID: 31570 (nginx)
      Tasks: 2 (limit: 1143)
     Memory: 3.2M
     CGroup: /system.slice/nginx.service
             ├─31570 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
             └─31571 nginx: worker process

Oct 28 17:06:52 ip-XXXXXXXX systemd[1]: Starting A high performance web server and a reverse proxy server...
Oct 28 17:06:52 ip-XXXXXXXX systemd[1]: Started A high performance web server and a reverse proxy server.


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Posteriormente, configuraremos nginx utilizando el comando&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo nano /etc/nginx/sites-available/TU_SUBDOMINIO


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;dentro de este archivo colocaremos lo siguiente&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

server {
    listen 80;
    listen [::]:80;

    server_name TU_SUB_DOMINIO;

    location / {
        proxy_pass http://127.0.0.1:PUERTO_DE_MI_APP/;
        include proxy_params;
    }
}


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Por último, linkearemos el archivo que creamos directamente con nginx utilizando los comandos&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo ln -s /etc/nginx/sites-available/TU_SUBDOMINIO /etc/nginx/sites-enabled/
sudo nginx -t (opcional - checkea sintaxis)
sudo systemctl restart nginx


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Con todo esto hecho, podremos ya ver nuestro backend en la url &lt;a href="http://misubdominio.com" rel="noopener noreferrer"&gt;http://misubdominio.com&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  #11 Configurando un certificado TLS/SSL
&lt;/h2&gt;

&lt;p&gt;Generalmente nos interesará que nuestro backend esté bajo el protocolo HTTPS. Para configurar dicho certificado, la opción más fácil y rápida es a través de &lt;strong&gt;Certbot&lt;/strong&gt; para lo cual &lt;br&gt;
lo instalaremos ejecutaremos los siguientes comandos&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo snap install core; sudo snap refresh core
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Por último, para obtener el certificado utilizaremos el siguiente comando&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo certbot --nginx -d MI-SUBDOMINIO 



&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Nos pedirá un mail para mandarnos publicidad 🐵 y aceptar todos los términos. Una vez aceptado todo tendremos nuestro certificado.&lt;br&gt;
También, nos interesará que se renueve automaticamente para lo cual utilizaremos el comando&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

sudo systemctl status snap.certbot.renew.service


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;




&lt;h2&gt;
  
  
  Notas finales
&lt;/h2&gt;

&lt;p&gt;Realmente muy interesante todo lo que hicimos a lo largo de esta guía. Espero que les haya sido útil. Todo está hecho en base a mi experiencia lo cual quiere decir que &lt;strong&gt;NO&lt;/strong&gt; aseguro que sea la mejor forma de hacer lo que propuse. De todas maneras, estoy abierto a sugerencias... ¿Crees que podes aportar algo más a la explicación? Dejalo en comentarios!&lt;br&gt;
Si querés contactarme, mi linkedin es : &lt;a href="https://www.linkedin.com/in/oberg-agustin/" rel="noopener noreferrer"&gt;https://www.linkedin.com/in/oberg-agustin/&lt;/a&gt;&lt;/p&gt;

</description>
      <category>aws</category>
      <category>javascript</category>
      <category>node</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Dockerize Vite+ReactJS application</title>
      <dc:creator>Oberg Agustin</dc:creator>
      <pubDate>Thu, 02 Dec 2021 11:08:01 +0000</pubDate>
      <link>https://dev.to/agustinoberg/dockerize-vitereactjs-application-6e1</link>
      <guid>https://dev.to/agustinoberg/dockerize-vitereactjs-application-6e1</guid>
      <description>&lt;p&gt;This post shows how to dockerize a ReactJS app created with Vite using &lt;code&gt;react-typescript&lt;/code&gt; template. &lt;/p&gt;

&lt;h2&gt;
  
  
  Implementation
&lt;/h2&gt;

&lt;p&gt;In my opinion, the best way to do this goal, is using &lt;strong&gt;nginx&lt;/strong&gt; image&lt;/p&gt;

&lt;h2&gt;
  
  
  Project config
&lt;/h2&gt;

&lt;p&gt;&lt;em&gt;package.json&lt;/em&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt; "scripts":  {
 "dev":  "vite",
 "build":  "tsc &amp;amp;&amp;amp; vite build",
 "serve":  "vite preview"
 },
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;Folders structure&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;   | --dist
   | --src
   | --.dockerignore
   | --Dockerfile
   | --package.json
   | --package-lock.json
   | --deploy 
   ----| --nginx
   --------| --nginx.config
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;&lt;em&gt;nginx.config&lt;/em&gt; file in folder &lt;code&gt;deploy/nginx&lt;/code&gt;&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;map $sent_http_content_type $expires {&lt;br&gt;
 default                    off;&lt;br&gt;
 text/html                  15m;&lt;br&gt;
 text/css                   15m;&lt;br&gt;
 application/javascript     15m;&lt;br&gt;
 ~image/                    15m;&lt;br&gt;
}&lt;br&gt;
server {

&lt;p&gt;listen 80;&lt;br&gt;
 root   /usr/share/nginx/html;&lt;br&gt;
 index  index.html;&lt;br&gt;
 etag on;&lt;br&gt;
 expires $expires;&lt;br&gt;
 location / {&lt;br&gt;
 try_files $uri @prerender;&lt;br&gt;
 }&lt;br&gt;
 location @prerender {&lt;br&gt;
 proxy_set_header X-Prerender-Token GsMLRmorzgxywljuDowD;&lt;/p&gt;

&lt;p&gt;set $prerender 0;&lt;br&gt;
 if ($http_user_agent ~* "googlebot|bingbot|yandex|baiduspider|twitterbot|facebookexternalhit|rogerbot|linkedinbot|embedly|quora link preview|showyoubot|outbrain|pinterest\/0.|pinterestbot|slackbot|vkShare|W3C_Validator|whatsapp|Screaming Frog SEO Spider") {&lt;br&gt;
 set $prerender 1;&lt;br&gt;
 }&lt;br&gt;
 if ($args ~ "&lt;em&gt;escaped_fragment&lt;/em&gt;") {&lt;br&gt;
 set $prerender 1;&lt;br&gt;
 }&lt;br&gt;
 if ($http_user_agent ~ "Prerender") {&lt;br&gt;
 set $prerender 0;&lt;br&gt;
 }&lt;br&gt;
 if ($uri ~* ".(js|css|xml|less|png|jpg|jpeg|gif|pdf|doc|txt|ico|rss|zip|mp3|rar|exe|wmv|doc|avi|ppt|mpg|mpeg|tif|wav|mov|psd|ai|xls|mp4|m4a|swf|dat|dmg|iso|flv|m4v|torrent|ttf|woff|svg|eot)") {&lt;br&gt;
 set $prerender 0;&lt;br&gt;
 }&lt;/p&gt;

&lt;p&gt;#resolve using Google's DNS server to force DNS resolution and prevent caching of IPs&lt;br&gt;
 resolver 8.8.8.8;&lt;/p&gt;

&lt;p&gt;if ($prerender = 1) {&lt;/p&gt;

&lt;p&gt;#setting prerender as a variable forces DNS resolution since nginx caches IPs and doesnt play well with load balancing&lt;br&gt;
 set $prerender "service.prerender.io";&lt;br&gt;
 rewrite .* /$scheme://$host$request_uri? break;&lt;br&gt;
 proxy_pass http://$prerender;&lt;br&gt;
 }&lt;br&gt;
 if ($prerender = 0) {&lt;br&gt;
 rewrite .* /index.html break;&lt;br&gt;
 }&lt;br&gt;
 }&lt;br&gt;
 error_page   500 502 503 504  /50x.html;&lt;br&gt;
 location = /50x.html {&lt;br&gt;
 root   /usr/share/nginx/html;&lt;br&gt;
 }&lt;br&gt;
}&lt;br&gt;
&lt;/p&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Dockerfile&lt;br&gt;
&lt;/h2&gt;
&lt;br&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;FROM mhart/alpine-node:12 AS builder&lt;br&gt;
WORKDIR /app&lt;br&gt;
COPY . .&lt;br&gt;
RUN yarn install&lt;br&gt;
RUN yarn run build&lt;br&gt;
FROM nginx:1.16.0-alpine&lt;br&gt;
COPY --from=builder /app/dist /usr/share/nginx/html&lt;br&gt;
RUN rm /etc/nginx/conf.d/default.conf&lt;br&gt;
COPY deploy/nginx/nginx.conf /etc/nginx/conf.d&lt;br&gt;
EXPOSE 80&lt;br&gt;
CMD ["nginx", "-g", "daemon off;"]&lt;br&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Documentation&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://www.docker.com/"&gt;Docker&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.nginx.com/"&gt;NGINX&lt;/a&gt;&lt;br&gt;
&lt;a href="https://vitejs.dev/"&gt;Vite JS&lt;/a&gt;&lt;/p&gt;

</description>
      <category>vite</category>
      <category>react</category>
      <category>docker</category>
      <category>typescript</category>
    </item>
  </channel>
</rss>
