# Guia de Deploy com Nginx
#### Requisitos
* Composer
* Laravel
* Node 10+
* PHP 7.3+
* MySQL 5.7+
* Git
* PM2
* Nginx
#### Introdução
Nesse guia utilizaremos o Nginx + Pm2 para subir o Back-end(Laravel) + Front-end(Vue.js) e no final será feito um proxy reverso para apontar o Nginx para o Pm2.
### 1. Instalação do Projeto
Assim como é feito localmente, será necessário fazer o setup do projeto, isso inclui criar o banco de dados e setar o back+front, para isso, o procedimento é o padrão, mas para agilidade os comandos estarão abaixo:
OBS: faça tudo no /var/www
#### Criação do Banco de Dados
```
$ sudo mysql (se já não estiver em sudo)
CREATE USER 'usuario'@'localhost' IDENTIFIED BY 'senha';
CREATE DATABASE BancodeDados;
GRANT ALL PRIVILEGES ON * . * TO 'usuario'@'localhost
FLUSH PRIVILEGES;
exit
```
#### Setup do back-end
```
$ git clone <url-do-projeto>
$ cd <projeto>
$ git checkout <branch-de-release>
$ cd back-end
$ cp .env.example .env
$ nano .env (para configurar o .env)
$ composer install
$ php artisan migrate:fresh --seed
$ php artisan passport:install
$ php artisan key:generate
```
#### Setup do front-end
```
$ cd front-end
$ npm install
```
### 2. Setando o Pm2(Servidor) para o front
O Pm2 servirá como o servidor para o front, ele servirá como um watcher permanente para os nossos arquivos do Javascript
#### 2.1 Script em json para o Pm2
Crie um arquivo em json na pasta do front-end para servir como script para o Pm2 e cole o conteúdo a seguir:
```
{
"apps": [
{
"name": "projeto",
"script": "npm",
"args" : "start"
}
]
}
```
#### 2.2 Ligando Pm2
Agora é preciso rodar o servidor, e para isso, apenas rode o seguinte comando na pasta que contem o arquivo.json
```
$ pm2 start <script.json>
```
### 3. Setando o Nginx para o Back-end
#### 3.1 Ativando sites-enabled
Vá para a pasta do Nginx(Normalmente fica em /etc/nginx/) e no bloco http cole o seguinte:
include /etc/nginx/sites-enabled/*;
#### 3.2 Configurando o arquivo do Nginx para o back-end
Entre na pasta sites-available e crie arquivo de texto padrão e utilize a seguinte configuração para projetos em Laravel:
```
server {
listen 80;
listen [::]:80;
server_name back-domínio.com;
# Log files for Debugging
access_log /var/log/nginx/laravel-access.log;
error_log /var/log/nginx/laravel-error.log;
# Webroot Directory for Laravel project
root /var/www/projeto/back-end/public;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
# PHP-FPM Configuration Nginx
location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass unix:/var/run/php/php7.3-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
}
```
Uma boa forma de checar se tudo está funcionando é sempre usar o:
```
$ nginx -t
$ systemctl restart nginx
```
#### 3.3 Linkando sites-available -> sites-enabled
Para expor o site para a web nós precisaremos linkar o arquivo da pasta sites-available na sites-enabled, para isso utilize o seguinte comando:
```
ln -s /etc/nginx/sites-available/projeto.conf-back /etc/nginx/sites-enable/
```
### 4. Setando o proxy-reverso no Nginx
Proxy reverso nada mais é do que ter um servidor a frente dos outros para guiar as requisições, a configuração que usaremos também será uma padrão, e segue o mesmo caminho do passo passado.
#### 4.1 Arquivo de conf do proxy-reverso
Entre novamente na pasta do sites-available e cole a seguinte configuração:
```
server{
listen 80 default_server;
listen [::]:80 default_server;
server_name domínio.com www.domínio.com;
index index.php index.html index.htm;
location / {
proxy_pass http://localhost:3000/;
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;
}
?
```
Novamente teste pra ver se tudo está OK
```
$ nginx -t
$ systemctl restart nginx
```
#### 4.2 Linkando novamente
Assim como feito no passo passado precisaremos linkar o arquivo de configuração na pasta sites-enabled para expor o site, para isso siga os comandos novamente:
```
$ ln -s /etc/nginx/sites-available/<projeto.conf-front> /etc/nginx/sites-enable/
```
### 5. Checando se tudo está funcionado
A melhor maneira de checar é na verdade com o site no ar, porém, para garantir que esteja tudo ok nós podemos utilizar alguns comandos que nos auxiliam:
```
$ netstat -ntlp | grep LISTEN (para checar as portas que estão sendo usadas)
$ wget localhost:<porta-escolhida> (para checar se o site está realmente no ar)
```
#### Observações
A parte do SSL não está inclusa nesse guia
### 6. Explicando o funcionamento
Esse espaço está destinado para futuramente explicar o funcionamento das devidas partes e remover um pouco da abstração no conteúdo geral.