Page cover image

Deploy de Web Service NodeJS

Para o deploy de aplicações Web Node.js, é necessário manter o servidor Node.js em execução de forma contínua. Uma maneira eficaz de conseguir isso é através do uso do Docker, que permite encapsular o servidor Node.js e qualquer serviço relacionado, como bancos de dados, em containers isolados. Abaixo, detalhamos o processo de criação de um ambiente Docker com docker-compose, a construção de um Dockerfile para a aplicação Node.js, e a configuração de um servidor Nginx para gerenciar as requisições para a aplicação.

Criação do docker-compose.yml

O uso do docker-compose facilita o gerenciamento de múltiplos containers, permitindo definir e conectar um container Node.js a um banco de dados MySQL em um único arquivo de configuração. Aqui está um exemplo básico de como configurar esses serviços:

version: "3"

services:
  db:
    image: mysql:latest
    container_name: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: unless-stopped
    volumes:
      - mysql:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      TZ: America/Sao_Paulo
      MYSQL_DATABASE: App
      MYSQL_USER: mackleaps
      MYSQL_PASSWORD: ****
      MYSQL_ROOT_PASSWORD: *****
      SERVICE_TAGS: dev
      SERVICE_NAME: db
    networks:
      - internalnet

  nodeapp:
    container_name: nodeapp
    build: .
    image: nodeapp:v1
    restart: unless-stopped
    ports:
      - 4447:4447
    depends_on:
      - db
    networks:
      - internalnet

volumes:
  mysql:
    external: true

networks:
  internalnet:
    driver: bridge

Dockerfile para a aplicação Node.js

O Dockerfile define as instruções para construir a imagem Docker do servidor Node.js:

FROM node:alpine

WORKDIR /usr/src/app

COPY package*.json ./

RUN npm install

COPY . .

EXPOSE 4447

COPY docker-entrypoint.sh /usr/src/app
RUN chmod +x /usr/src/app/docker-entrypoint.sh

CMD ["/usr/src/app/docker-entrypoint.sh"]

Script docker-entrypoint.sh

Para garantir que o servidor Node.js inicie somente após o banco de dados estar pronto para conexões, utilizamos um script de entrypoint:

until nc -z -v -w30 db 3306
do
    echo "Aguardando a inicialização do MySQL..."
    sleep 30
done

exec npm start

Configuração do Nginx

Finalmente, para direcionar as requisições para o servidor Node.js rodando no container, configuramos um bloco location no Nginx:

location /myapp/ {
    proxy_pass http://localhost:4447/;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

Aqui está uma explicação detalhada para cada seção e diretiva utilizada no arquivo docker-compose.yml mencionado anteriormente. Esta explicação ajudará a entender como cada componente é configurado e como eles interagem dentro do ambiente Docker.

Docker Compose: Estrutura e Explicações

version: "3"

Versão: Define a versão do Docker Compose usada. A versão "3" é compatível com as versões mais recentes do Docker Engine e oferece recursos modernos de configuração.

Serviços

services:

Serviços: Inicia a definição dos containers que serão gerenciados pelo Docker Compose.

  db:
    image: mysql:latest
    container_name: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: unless-stopped
    volumes:
      - mysql:/var/lib/mysql
    ports:
      - 3306:3306
    environment:
      TZ: America/Sao_Paulo
      MYSQL_DATABASE: App
      MYSQL_USER: mackleaps
      MYSQL_PASSWORD: ****
      MYSQL_ROOT_PASSWORD: ****
      SERVICE_TAGS: dev
      SERVICE_NAME: db
    networks:
      - internalnet

DB: Configura um container MySQL.

  • image: Especifica a imagem Docker a ser usada, neste caso, a última versão do MySQL.

  • container_name: Define o nome do container.

  • command: Passa comandos adicionais para o servidor MySQL.

  • restart: Política de reinício do container.

  • volumes: Monta volumes para persistência de dados.

  • ports: Mapeia a porta 3306 do container para a mesma porta na máquina host.

  • environment: Define variáveis de ambiente necessárias para a configuração do MySQL.

  • networks: Especifica a rede a qual o container será conectado.

  nodeapp:
    container_name: nodeapp
    build: .
    image: nodeapp:v1
    restart: unless-stopped
    ports:
      - 4447:4447
    depends_on:
      - db
    networks:
      - internalnet

NodeApp: Configura um container para a aplicação Node.js.

  • container_name: Nome do container.

  • build: Diretório onde o Dockerfile está localizado, ponto (.) indica o diretório atual.

  • image: Nome e tag da imagem a ser construída.

  • restart: Política de reinício.

  • ports: Mapeia a porta 4447 do container para a mesma porta na máquina host.

  • depends_on: Garante que o container db seja iniciado antes deste.

  • networks: Conecta o container à rede especificada.

Volumes

volumes:
  mysql:
    external: true

Volumes: Define e gerencia volumes persistentes usados pelos containers, especificamente para o MySQL.

Redes

networks:
  internalnet:
    driver: bridge

Redes: Define uma rede chamada internalnet com o driver de rede bridge, facilitando a comunicação entre os containers definidos no mesmo Docker Compose.

Last updated