Saltar al contenido

Implemente su aplicación NodeJS en un servidor con Docker – Comunidad DEV

¡Hola! Bienvenido a mi breve curso intensivo sobre cómo implementar su aplicación NodeJS en un VPS de DigitalOcean usando Docker y NGINX

Introducción y comparación con Heroku

Si hubiera querido implementar sus aplicaciones web fácilmente, se habría encontrado con algo llamado Heroku. Heroku es una PaaS, o plataforma como servicio, que le permite implementar sus aplicaciones sin preocuparse por los servidores, el escalado, el equilibrio de carga, el mantenimiento ni nada de eso. Tiene un nivel gratuito, lo cual es bueno para comenzar, pero una vez que tenga algún tipo de ingresos de su aplicación, es hora de que actualice

¿Por qué actualizar?

El nivel gratuito de Heroku tiene algo llamado aplicaciones para dormir. Las aplicaciones para dormir se “suspenderán”, es decir, se cerrarán después de 30 minutos de inactividad, es decir, 30 minutos sin que nadie visite su sitio web. Después de que duerme, se necesitan entre 15 y 30 segundos para volver a comenzar, y esto es MUY MAL para una API. Debido a que su API está inactiva, puede hacer que el rendimiento de las aplicaciones que usan su API se vea afectado, haciendo que se muevan a otras API. Si solo desea eliminar las aplicaciones para dormir, le costaría $ 7 al mes, POR APLICACIÓN. Su aplicación obtendrá 512 MB de RAM. Si comparamos este precio con algo como DigitalOcean, puede ver que obtenemos una instancia de RAM de 1GB por solo $ 5 al mes.

Estoy usando DigitalOcean porque me queda un poco de crédito gratis 😛

Crear y configurar una gota

Creemos una gota de DigitalOcean. Una gota es la forma en que DigitalOcean dice VPS o Servidor Privado Virtual. Un VPS suele ser un servidor Linux, pero también puede tener el sistema operativo Windows. Trabajará con Linux la mayor parte del tiempo cuando desee implementar. Si desea seguir la ruta de Windows, ¡prepárese para mucha frustración!

Crearé una nueva gota de Ubuntu 20.04 LTS. Ubuntu es una distribución de Linux, y también es la más utilizada. Elijo la versión LTS (Long Time Support). Iré con el plan de $ 5 / mes y elegiré mi ubicación para ser Bangalore. Para el método de autenticación, agregaré una contraseña de root y el nombre de host será el dominio en el que me gustaría que se alojara mi aplicación, es decir test.arnu515.gq en mi caso.

¡Conseguí este dominio de Freenom, que te da DOMINIOS GRATIS!

Mientras se crea la gota, agregaré un registro a mi dominio, arnu515.gq, usando la administración de DNS incorporada. Agregaré un A registro llamado test (que se asignará a test.arnu515.gq) con la IP de mi máquina. Recuerde establecer el TTL (Tiempo de vida) en un número pequeño, como 300 segundos (5 minutos), para que su dominio se propague más rápido.

SSH en nuestra gota y asegurándola

¡Ahora viene la parte divertida! Iniciemos sesión en nuestro droplet desde la terminal de nuestra propia computadora usando SSH. Abra un nuevo caparazón y escriba:

ssh root@IP_OF_YOUR_MACHINE

Si tiene Windows, lo más probable es que necesite utilizar un cliente SSH externo o WSL. No voy a cubrir eso, así que estás solo.

Ingrese su contraseña de root que estableció anteriormente y ¡ahora podemos comenzar!

Primero, ejecute siempre estos dos comandos cada vez que cree un nuevo VPS:

Estos comandos obtienen las últimas versiones de los repositorios de paquetes y actualizan sus aplicaciones existentes.

Instalación de Docker

Diríjase a los documentos de instalación de Docker e instale la ventana acoplable utilizando los comandos que se le dieron, a saber:

apt install apt-transport-https ca-certificates curl gnupg-agent software-properties-common

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add -

add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

apt update

apt install docker-ce docker-ce-cli containerd.io

Y la ventana acoplable debería estar instalada. Correr docker -v para verificar.

Instalando docker-compose

Instalando docker-compose es más fácil que instalar la ventana acoplable, pero primero deberá instalar la última.

Todo lo que tienes que hacer es descargar docker-compose, guárdalo en /usr/local/bin y hacerlo ejecutable.

curl -L "https://github.com/docker/compose/releases/download/1.28.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

Y docker-compose debe estar instalado! Correr docker-compose -v para verificar.

Instalación de NGINX

¡Yo diría que instalar NGINX es aún más fácil! Todo lo que tienes que hacer es:

¡Y eso es! NGINX está instalado. Puede visitar la dirección IP de su máquina o incluso visitar el nombre de dominio que estableció, en mi caso, test.arnu515.gq y debería ver el sitio web predeterminado de NGINX.

Si tu IP funciona pero no el dominio, tendrás que esperar un poco más. Si olvidó configurar el TTL, tendrá que esperar una hora hasta que su dominio funcione.

Creando un nuevo usuario

Creemos un nuevo usuario, porque al iniciar sesión como root usuario nos permitirá hacer CUALQUIER COSA que queramos sin tener que dar ningún permiso. Esto puede ser malo porque es posible que eliminemos ciertos directorios que generalmente no podemos eliminar porque no tenemos permisos, pero que serán omitidos por root, dañando o destruyendo nuestro servidor.

Para crear un nuevo usuario,

Proporcione la contraseña para el usuario y puede aceptar los valores predeterminados para todo lo demás presionando Enter un montón de veces.

Para mayor seguridad, asegúrese de que su nueva contraseña de usuario no coincida con su contraseña de root.

Permitamos que nuestro nuevo usuario ejecute comandos como root, pero solo cuando el comando tenga el prefijo sudo. Esto nos permitirá ejecutar algún comando que necesite acceso de root, como apt, mientras ejecutan otros que no, como cd, sin raíz:

usermod -aG sudo USERNAME

Iniciar sesión en nuestro usuario

Podemos iniciar sesión con nuestro usuario escribiendo:

Notará que el mensaje cambia. Podemos cerrar la sesión del usuario escribiendo:

Regresaremos al usuario root. Cierre la conexión escribiendo exit.

Iniciemos sesión en nuestro usuario directamente desde ssh. Usaremos nuestro nombre de dominio en lugar de la IP, porque probablemente ya se haya propagado.

Para mí, el comando sería:

ssh arnu515@test.arnu515.gq

Debería haber iniciado sesión con su usuario ahora.

Asegurando nuestro servidor

Trabajemos para proteger nuestro servidor para que algunos invitados no invitados no entren en su servidor.

Comencemos con SSH. En primer lugar, cambiemos el puerto SSH predeterminado. Los atacantes intentarán usar el puerto ssh predeterminado para entrar en su máquina. Si cambiamos este puerto, tendrán que hacer un método de prueba para iniciar sesión en su computadora. Entonces necesitamos deshabilitar el inicio de sesión como root. Luego, debemos deshabilitar el inicio de sesión con una contraseña. ¿Porque preguntas? Es porque los piratas informáticos pueden adivinar su contraseña si se esfuerzan lo suficiente, por lo que si no hay una contraseña que puedan adivinar, ¿cómo pueden iniciar sesión? Ahora puede estar pensando, ¿cómo podemos iniciar sesión? Usaremos algo llamado claves SSH. Estas claves nos identificarán, por lo que el servidor nos permitirá iniciar sesión.

Primero cambiemos nuestro archivo de configuración SSH.

sudo nano /etc/ssh/sshd_config

Si nano no está instalado, escriba sudo apt install nano

Esto abrirá un editor de texto basado en terminal. Podemos editar el archivo de configuración SSH aquí.

Sintaxis de la configuración de ssh

La configuración SSH contiene una clave y un valor separados por un espacio. Por ejemplo,

Si hay una libra#) delante de una declaración, se convierte en un comentario. Los comentarios se ignoran. Si un determinado campo no existe en su configuración SSH, agréguelo.

Cambiar el puerto

Encuentra / agrega la opción llamada Port y configúrelo desde cualquier número que no sea 22. usaré 3333.

Buscar / Agregar la opción PermitRootLogin y ponerlo en no

Finalmente, busque / agregue la opción PasswordAuthentication y ponerlo en no

PasswordAuthentication no

Si el campo PubkeyAuthentication se establece en no, por favor coméntelo o configúrelo en yes, de lo contrario NO PUEDE iniciar sesión en su máquina

Salga de la configuración presionando Ctrl+X, y y Enter.

La configuración no afectará automáticamente. Tenemos que reiniciar SSH, pero primero, agreguemos nuestra clave SSH a la máquina.

Agregar la clave SSH

Primero salga de SSH. En su máquina local, si no tiene una clave ssh, cree una con ssh-keygen. Debería recibir una ruta donde se almacenó la clave SSH. Puede aceptar los valores predeterminados. A continuación, agreguemos la clave ssh a nuestra máquina.

ssh-copy-id -i PATH_TO_YOUR_SSH_KEY USERNAME@DOMAIN

Para mí, la clave SSH está en /Users/arnu515/.ssh/id_rsa, por lo que el comando sería:

ssh-copy-id -i /Users/arnu515/.ssh/id_rsa arnu515@test.arnu515.gq

Se le pedirá que ingrese la contraseña. Una vez hecho esto, vuelva a iniciar sesión con ssh y verá que no tiene que ingresar una contraseña.

Finalmente, podemos reiniciar ssh en la gota escribiendo:

Salga de SSH e intente volver a iniciar sesión. El comando fallará porque todavía estamos conectando en el puerto 22, mientras que el nuevo puerto SSH fue 3333, al menos para mi. Cambie el puerto especificando el -p bandera:

bash
ssh USERNAME@DOMAIN -p PORT

For me, the command will be:
bash
ssh arnu515@test.arnu515.gq -p 3333

And congratulations! You’ve secured SSH!

By default, atleast on DigitalOcean, ALL PORTS are allowed. This is really bad, so let’s install a firewall called ufw.

bash
sudo apt install ufw

Once that’s done, let’s whitelist the port 3333 so that we can login to our machine.

bash
sudo ufw allow 3333

We can check the status of the firewall:
bash
sudo ufw status

If you get Status: inactive, necesitamos habilitar el firewall. Hagamos eso usando:

bash
sudo ufw enable

This MAY disrupt your ssh connection, so if that happens, log back in again.

If we visit our website at our domain, it will no longer work, because ufw lo bloquea. Para permitir que NGINX funcione,

sudo ufw enable "Nginx Full"

And we’re done with the security aspect. Let’s deploy our app!

I made an example application that uses Express with MongoDB and Redis, to show that we can have multiple services. I’ll be using docker-compose para conectar mongodb, redis y los contenedores de la aplicación.

Necesitamos poner este código en nuestra máquina, y la forma más fácil es usar Github. Envié mi código desde mi máquina local a Github, y podemos extraer el código de github a nuestra gota usando git clone. Una vez hecho esto, podemos compilar y ejecutar la aplicación usando docker-compose con:

bash
docker-compose up -d

You will get a PermissionDenied error. Esto sucede porque no tenemos acceso a la docker motor por defecto. Para solucionarlo, ejecute:

sudo usermod -aG docker USERNAME

You need to logout and log back in to SSH and now, if you run docker-compose, ¡deberia de funcionar! Mi aplicación está alojada en el puerto 5000. Podría permitir manualmente ese puerto en el firewall y todos ustedes podrían visitar mi aplicación en test.arnu515.gq:5000, pero si ve otros sitios web, ninguno de ellos tiene puerto. Ahí es donde entra en juego NGINX. Podemos crear un proxy_pass, que básicamente mapea todas las solicitudes que llegan al puerto 80, es decir, el puerto predeterminado al puerto 5000. Veamos cómo.

Configurando NGINX

En el puerto 80, ya existe el sitio web predeterminado de nginx. Podemos deshabilitar eso ejecutando:

sudo rm /etc/nginx/sites-enabled/default

And then, we can restart NGINX

sudo systemctl restart nginx

Now, let’s create our website. I’ll give it the name test.


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

This will open up the nano editor de texto, y aquí puedo escribir:

`nginx
server {
# Listens on port 80
listen 80;

# For all URLs on port 80,
location / {
    # Send them to port 5000
    proxy_pass http://localhost:5000;
    # Add some headers
    proxy_set_header Host $host;
}

¡No olvide el punto y coma (;)!

Ahora habilitemos este sitio web colocando el mismo archivo en sites-enabled:


sudo cp /etc/nginx/sites-available/test /etc/nginx/sites-enabled

Restart NGINX:

sudo systemctl restart NGINX

¡Y terminamos 🚀! Visite su aplicación en el puerto 80 y podrá ver la increíble aplicación que ha creado. ¡Felicitaciones 🥳, acaba de implementar su aplicación por una fracción del costo! Si tienes alguna duda, no dudes en preguntarlo aquí o en la sección de comentarios del video de youtube.

Este contenido se publicó originalmente aquí.