<?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: Cássio Gamarra</title>
    <description>The latest articles on DEV Community by Cássio Gamarra (@cassiogamarra).</description>
    <link>https://dev.to/cassiogamarra</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%2F508667%2F39d859fc-ac84-4c3a-95cc-d23a013d0341.jpeg</url>
      <title>DEV Community: Cássio Gamarra</title>
      <link>https://dev.to/cassiogamarra</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/cassiogamarra"/>
    <language>en</language>
    <item>
      <title>Preparando um ambiente Linux para aplicações com NodeJS, MySQL e ReactJS.</title>
      <dc:creator>Cássio Gamarra</dc:creator>
      <pubDate>Thu, 05 Nov 2020 13:20:11 +0000</pubDate>
      <link>https://dev.to/cassiogamarra/preparando-um-ambiente-linux-para-aplicacoes-com-nodejs-mysql-e-reactjs-jk4</link>
      <guid>https://dev.to/cassiogamarra/preparando-um-ambiente-linux-para-aplicacoes-com-nodejs-mysql-e-reactjs-jk4</guid>
      <description>&lt;p&gt;Recentemente tive a necessidade de subir uma aplicação com o seguinte stack: NodeJS e Mysql no backend e ReactJS no frontend. Como não tinha conhecimento prévio dessas tecnologias, foi um grande desafio desenvolver a aplicação e ainda mais desafiador montar um ambiente para receber tudo isso. Depois de diversas tentativas, fiz um mini-tutorial para facilitar a vida de quem precisa de um ambiente Linux com essas características.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma dica antes de iniciar, é verificar se o fuso horário do ambiente está como desejado, é possível utilizar o seguinte comando para resolver isso:&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo dpkg-reconfigure tzdata
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  1 - Instalando o MySQL:
&lt;/h1&gt;

&lt;p&gt;Primeiramente, vamos realizar a instalação e configuração do MySQL, que vai ser nosso SGBD.&lt;br&gt;
&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 mysql-server
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após executar esses dois comandos, inicia a configuração inicial do MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo mysql_secure_installation
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  2 - Configuração do MySQL:
&lt;/h1&gt;

&lt;p&gt;Após a instalação, vamos configurar o MySQL, acessando o mesmo através do seguinte comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo mysql -u root -p
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Obs.: no primeiro acesso, não é necessário digitar nenhuma senha&lt;br&gt;
Definimos a senha para o usuário:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; ALTER USER root@'localhost' IDENTIFIED WITH mysql_native_password BY 'SUA_SENHA';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Importante: o uso do mysql_native_password é necessário para evitar que drivers de conexão mais antigos tenham incompatibilidade na hora de realizar acesso a base de dados&lt;br&gt;
Criamos um usuário para acesso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; CREATE USER 'SEU_USUARIO'@'localhost' IDENTIFIED WITH mysql_native_password BY 'SUA_SENHA';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Definimos os privilégios de acesso para o usuário criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; GRANT ALL PRIVILEGES ON *.* TO 'database_user'@'localhost';
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos definir uma base específica para o usuário, nesse caso ele terá acesso a todas as bases no MySQL.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;mysql&amp;gt; FLUSH PRIVILEGES;
mysql&amp;gt; EXIT;

Atualiza os privilégios de acesso dos usuários e saímos do console do MySQL.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para não ocorrer erros em algumas consultas em formato "antigo", é necessário configurar o modo SQL que o MySQL trabalha, alterando o arquivo mysqld.cnf:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adicionamos no final do arquivo a linha:&lt;br&gt;
&lt;/p&gt;

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

&lt;/div&gt;



&lt;p&gt;Após todas as alterações, é necessário reiniciar o serviço do MySQL:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo service mysql restart
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Acessamos novamente o MySQL e criamos a base de dados desejada:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysql -u root -p
mysql&amp;gt; CREATE DATABASE NOME_DESEJADO
mysql&amp;gt; EXIT;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso necessário, podemos restaurar uma base já existente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ mysql -u usuario -p 'nomebase' &amp;lt; NOMEBACKUP.sql
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto, temos o MySQL instalado e configurado, agora vamos para a configuração do nosso proxy reverso, o Nginx.&lt;/p&gt;




&lt;h1&gt;
  
  
  3 - Instalando o Nginx:
&lt;/h1&gt;

&lt;p&gt;NGINX, pronunciado "engine-ex", é um dos servidores web mais populares no mundo e é responsável por hospedar alguns dos maiores e mais acessados sites na internet. Pode ser utilizado como servidor web ou proxy reverso.&lt;br&gt;
&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;h1&gt;
  
  
  4 - Ajustando o firewall
&lt;/h1&gt;

&lt;p&gt;O Nginx se registra como um serviço com o ufw após a instalação, tornando bem fácil permitir o acesso ao Nginx.&lt;br&gt;
Podemos listar as configurações das aplicações com as quais o ufw sabe como trabalhar digitando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo ufw app list
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você deve obter uma listagem dos perfis de aplicativo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora vamos permitir algumas aplicações:&lt;br&gt;
&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' //Permite o Nginx
$ sudo ufw allow 'OpenSSH' //Permite o OpenSSH
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso deseje adicionar mais de uma aplicação na mesma máquina, utilize o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo ufw allow [porta/protocolo]
$ sudo ufw enable //Ativa o firewall
$ sudo ufw status //Verifica o status
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para verificar se o Nginx está rodando, basta digitar:&lt;br&gt;
&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;h1&gt;
  
  
  5 - Instalar o NodeJS
&lt;/h1&gt;

&lt;p&gt;Para facilitar o gerenciamento de pacotes, vamos utilizar o Yarn, que é um gerenciador de pacotes Javascript da empresa Facebook&lt;/p&gt;

&lt;p&gt;Instalando o NodeJS&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt install nodejs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalando o gerenciador de pacotes, NPM&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo apt install npm
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Instalando o Yarn:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo npm install yarn -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso ocorram problemas ao instalar o Yarn dessa forma, a possível solução é:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sudo apt remove cmdtest
sudo apt remove yarn
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt-get update
sudo apt-get install yarn
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Antes de realizar a cópia dos arquivos para o servidor, recomendo realizar a build da aplicação frontend, diminuindo o trabalho do servidor para instalar e compilar todos os arquivos necessários:&lt;br&gt;
Na sua pasta do frontend, rode o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ yarn run build
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para realizar a cópia dos arquivos, recomendo uma visita no link:&lt;br&gt;
&lt;a href="https://viniciussousa88.wordpress.com/2012/07/31/enviar-e-receber-arquivos-via-ssh/"&gt;https://viniciussousa88.wordpress.com/2012/07/31/enviar-e-receber-arquivos-via-ssh/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após copiar os arquivos do backend e do frontend para o servidor, acessamos a pasta do backend e realizamos a instalação das dependências:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ yarn install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os arquivos do frontend para a pasta var/www/NOME_APP:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ cd pasta_app
$ sudo cp -r * /var/www/NOME_APP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  6 - Configurar o Nginx
&lt;/h1&gt;

&lt;p&gt;Para configurar o Nginx, vamos começar alterando o arquivo default, que fica na pasta /etc/nginx/sites-available:&lt;br&gt;
&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/default
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Essa é uma configuração bem enxuta, caso necessário, você pode complementar da maneira que lhe atender:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;server {
  listen 80 default_server;
  listen [::]:80 default_server;

  root /var/www/NOME_APP;
  server_name _; 

  #Aponta para a pasta onde fica o frontend
  location / {
    root /var/www/NOME_APP/;
    try_files $uri /index.html;
  }
  #Localização da aplicação backend, nesse caso nomeamos como api
  #A PORTA é a que está configurada na aplicação backend
  location /api/ {
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-NginX-Proxy true;
    proxy_pass http://localhost:PORTA/;
    proxy_ssl_session_reuse off;
    proxy_set_header Host $http_host;
    proxy_cache_bypass $http_upgrade;
    proxy_redirect off;
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após configurar e salvar o arquivo, verificamos se está tudo certo e reiniciamos o serviço:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo nginx -t
$ sudo systemctl reload nginx
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h1&gt;
  
  
  7 - PM2
&lt;/h1&gt;

&lt;p&gt;O PM2 é um gerenciador de processos e com ele lidar com variáveis ambientes, fazer log, saber o estado da aplicação se tornam tarefas simples. Vamos utilizar ele para manter a aplicação rodando ao invés de utilizar apenas o node.&lt;br&gt;
Instalando o PM2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ sudo npm install pm2@latest -g
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após instalar o PM2, acessamos a pasta onde está nossa aplicação backend e rodamos o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pm2 start index.js --name MEUAPP
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O comando acima, executa o index.js que ficará rodando em background e nomeia o processo aberto para MEUAPP, caso deseje também é possível manipular o processo através do ID, que inicia em zero.&lt;/p&gt;

&lt;p&gt;Podemos também configurar o PM2 para iniciar juntamente com o sistema, em caso de reinicializações:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pm2 startup systemd
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para salvar a lista de processos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pm2 save
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O PM2 facilita muito o gerenciamento das aplicações, eis alguns comandos úteis para o mesmo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ pm2 list  //Lista de aplicações rodando
$ pm2 info app_nome //Infos do app
$ pm2 stop app_name_or_id //Para o app
$ pm2 restart app_name_or_id //Restarta o app
Caso deseje visualizar os logs da aplicação, eles ficam na pasta:
/home/usuario/.pm2/logs
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Após realizar essas configurações, seu ambiente vai estar pronto para rodar sua aplicação.&lt;/p&gt;




&lt;p&gt;Considerações finais:&lt;/p&gt;

&lt;p&gt;Fiz esse tutorial pois encontrei muitos materiais disponíveis, porém senti falta de algum exemplo que fizesse todo o processo. Após ter feito essa configuração uma primeira vez e anotado todos os comandos, ficou bem mais rápido e prático criar uma ambiente para aplicações com NodeJS e MySQL. Espero que gostem, críticas e sugestões são muito bem-vindas.&lt;/p&gt;




&lt;p&gt;Links úteis:&lt;/p&gt;

&lt;p&gt;Criando uma máquina virtual na Azure (utilizei para realizar os primeiros testes): &lt;a href="https://docs.microsoft.com/pt-br/azure/virtual-machines/linux/quick-create-portal"&gt;https://docs.microsoft.com/pt-br/azure/virtual-machines/linux/quick-create-portal&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Copiando arquivos via SSH: &lt;a href="https://viniciussousa88.wordpress.com/2012/07/31/enviar-e-receber-arquivos-via-ssh/"&gt;https://viniciussousa88.wordpress.com/2012/07/31/enviar-e-receber-arquivos-via-ssh/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Alterando o fuso horário no Linux: &lt;a href="https://www.vivaolinux.com.br/dica/Alterando-o-fuso-horario-no-Linux"&gt;https://www.vivaolinux.com.br/dica/Alterando-o-fuso-horario-no-Linux&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Configurando um servidor Ubuntu, instalando o Nginx e configurando aplicações NodeJS: &lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04"&gt;https://www.digitalocean.com/community/tutorials/initial-server-setup-with-ubuntu-18-04&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04"&gt;https://www.digitalocean.com/community/tutorials/how-to-install-nginx-on-ubuntu-18-04&lt;/a&gt;&lt;/p&gt;

</description>
      <category>linux</category>
      <category>node</category>
      <category>mysql</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
