Preparar servidor para deploy NodeJs
Tags: javascript, node, linux, nginx
Published: 2020-09-06 16:13:45

Vou apresentar como criar um servidor Ubuntu com NGINx para fazer deploy de aplicações escritas usando a plataforma NodeJs.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/ejkqrq5lznrrm73w3mnd.png)

### REQUISITO:

* Ubuntu 18.04

1 - CRIAR USUÁRIO UBUNTU

Para começar vamos ter que criar um novo usuário chamado **deploy**. 
Você pode fazer tudo com o usuário root porém não é recomendado.
```javascript
adduser deploy
```
Depois de executar o comando acima para criar um novo usuário será requisitado uma senha, informe da sua preferência.

Agora temos que adicionar uma permissão **sudo** ao novo usuário, para isso execute o comando abaixo:
```javascript
usermod -aG sudo deploy
```

2 - CONFIGURAR SSH

Caso você utilize **ssh** para acessar o servidor siga esse passo, entre no diretório **/home/deploy**:
```javascript
cd /home/deploy
```
No diretório **deploy** crie uma pasta chamada **.ssh**, como segue no comando abaixo:
```javascript
mkdir .ssh
```
Para mudar o dono da pasta **.ssh**, execute o comando:
```javascript
chown deploy:deploy .ssh/
```
Agora temos que copiar o **ssh** do root para o nosso usuário execute os comando:
```javascript
cp ~/.ssh/authorized_keys /home/deploy/.ssh/
```
Entre na pasta **.ssh** e execute o comando para mudar a permissão de **authorozed_keys**:
```javascript
chown deploy:deploy authorized_keys
```

3 - INSTALAR O NODEJS

Como nosso servidor não possui **nodejs** instalado vamos fazer isso, para essa demostração vou usar a versão **12.x do node**.
Primeiramente temos que adicionar o pacote na lista:
```javascript
curl -sl https://deb.nodesource.com/setup_12.x | sudo -E bash -
```
Agora podemos executar o comando para instalar o **node**:
```javascript
sudo apt-get install -y nodejs
```
Para verificar se a instalação foi bem bem sucedido, execute:
```javascript
node -v
npm -v
```

4 - INSTALAR YARN

O **yarn** é um gerenciador de pacotes criado pelo **Facebook**, para mais detalhes acesse [Yarn](https://yarnpkg.com/).
Para instalar o **yarn** no nosso servidor execute os comandos abaixo:
```javascript
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 update

sudo apt update && sudo apt install --no-install-recommends yarn
```
Para finalizar verifique a versão, se aparecer o número da versão significa instalação realizada com sucesso:
```javascript
yarn -v
```

5 - ADICIONAR A APLICAÇÃO AO SERVIDOR

Para fins de teste eu criei uma **API** simples que recebe uma requisição **get**, vou usa-la para demostrar o **deploy** no servidor.

Dentro do diretório **/home/deploy** crie um nova pasta chamada **app**.
```javascript
mkdir app
```
Vamos clonar a aplicação do **Github** dentro da pasta **app**.
```javascript
git clone https://github.com/wandealves/deploy.git
```

6 - PROXY REVERSO DO NGINX

No servidor vamos usar o**NGINx** para requisições [**HTTP**](https://pt.wikipedia.org/wiki/Hypertext_Transfer_Protocol). **Nginx** (lê-se “engine x”) é um servidor leve de **HTTP**, [**proxy reverso**](https://pt.wikipedia.org/wiki/Proxy_reverso), proxy de **e-mail IMAP/POP3**, feito por **Igor Sysoev em 2005**, sob licença [**BSD-like 2-clause**](https://pt.wikipedia.org/wiki/Licen%C3%A7a_BSD).
Para mais detalhes acesse [NGINx](https://www.nginx.com/).
Instalar **NGINx**, para isso executa o comando:
```javascript
sudo apt install nginx 
```
Para acessar de fora do servidor temos que liberar a porta **80**, para isso:
```javascript
sudo ufw allow 80
```
Se você acessar o **ip** do servidor vai ver a tela de boas vinda do **NGINx**.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/nxr0c8j8fa1cgm2el6qp.png)

Vamos configurar o **NGINx** para acessar nossa aplicação que roda na porta **3333**. 
Para isso vamos ter que criar um **proxy reverso**, ao invés de acessar **ip:3333** vamos usar **ip:80**, onde a porta **80** não precisa ser informada ,para isso siga os passos.
Entre no diretório **/etc/nginx/sites-available/** com o comando:
```javascript
cd /etc/nginx/sites-available/
```
Vamos fazer uma cópia do **default** para nossa nova configuração que vou chamar de **nodedeploy**.
```javascript
sudo cp default nodedeploy
```
Agora temos que editar o arquivo **nodedeploy** e deixa-lo com segue abaixo:
```javascript
server {
        listen 80 default_server;
        listen [::]:80 default_server;

        server_name _;

        location / {
                proxy_pass http://localhost:3333;
                proxy_http_version 1.1;
                proxy_set_header Upgrade $http_upgrade;
                proxy_set_header Connection 'upgrade';
                proxy_set_header Host $host;
                proxy_cache_bypass $http_upgrade;
        }
}
```
Agora acesse o diretório **/etc/nginx/sites-enabled/**.
```javascript
cd /etc/nginx/sites-enabled/
```
Dentro do diretório **sites-enabled** temos que criar um link simbólico para **nodedeploy** que criamos no passo acima.
```javascript
sudo ln -s /etc/nginx/sites-available/nodedeploy nodedeploy
```
No esqueça de deletar o arquivo default do diretório **sites-enabled**.
```javascript
sudo rm default
```
Para saber se nossa configuração funcionou execute:
```javascript
sudo nginx -t
```
Se o resultado for igual o listado abaixo, as configurações estão corretas:
```javascript
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is succes
```
Para finalizar a configuração do **NGINx** vamos reinicia-lo:
```javascript
sudo service nginx reload

sudo service nginx restart
```

7 - DEPLOY DA APLICAÇÃO

Se tentar acessar o ip do servidor vai receber uma mensagem de **Bad Gateway**, isso ocorre pois nossa aplicação encontra-se parada.

Acesse a pasta da aplicação em **/home/deploy/app** e vamos gerar o **build** da aplicação:
```javascript
yarn

yarn build

node dist/server.js
```
Ao executar o comando **node** a aplicação vai subir, agora se você acessar o **ip** do servidor vai ver o retorno da **api**.
![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/2itfyme6j00ttn9ratxi.png)