Introdução: do servidor local à solução pronta para produção
Você criou uma poderosa aplicação JavaScript em Node.js, testou-a localmente e agora é hora de mostrá-la ao mundo. Simplesmente enviar arquivos para a VPS e executar node app.js é o caminho do iniciante. No nível avançado, a implantação inclui a configuração de um proxy reverso, um gerenciador de processos, renovação automática de certificados SSL, um sistema de integração e entrega contínuas (CI/CD), além de monitoramento e registro de logs adequados.
Neste artigo, abordaremos o processo passo a passo de implantação de uma aplicação Node.js em uma VPS (Ubuntu 22.04) em nível avançado. Configuraremos Nginx como proxy reverso, PM2 para gerenciamento de processos, Let's Encrypt para HTTPS, GitHub Actions para implantação automática ao fazer push no repositório e adicionaremos monitoramento básico.
Pré-requisitos
- Servidor VPS (Ubuntu 22.04) com acesso SSH.
- Domínio apontado para o IP do seu servidor (exemplo:
myapp.example.com). - Node.js (v18+) e npm instalados no servidor.
- Git instalado no servidor.
- Repositório da sua aplicação no GitHub.
1. Configuração do servidor e do gerenciador de processos PM2
Começaremos com a preparação básica do ambiente. Após conectar-se ao servidor via SSH, atualize os pacotes e instale os utilitários necessários:
sudo apt update && sudo apt upgrade -ysudo apt install nginx git curl -yVerifique se o Node.js está instalado. Caso contrário, instale-o via NodeSource:
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -sudo apt install -y nodejsnode -vnpm -vAgora, instale globalmente o PM2 — um gerenciador de processos avançado para Node.js que reinicia automaticamente a aplicação em caso de falha, gerencia logs e clustering:
sudo npm install -g pm2Clone o repositório da sua aplicação e instale as dependências:
git clone https://github.com/seu-usuario/seu-repositorio.git /var/www/myappcd /var/www/myappnpm install --productionCrie um arquivo de ecossistema do PM2 (ecosystem.config.js) para configuração refinada:
// ecosystem.config.jsmodule.exports = { apps: [{ name: 'myapp', script: 'app.js', // ou server.js instances: 'max', // usa todos os núcleos da CPU exec_mode: 'cluster', env: { NODE_ENV: 'production', PORT: 3000 }, error_file: '/var/log/node-app/err.log', out_file: '/var/log/node-app/out.log', log_date_format: 'YYYY-MM-DD HH:mm Z' }]};Crie o diretório para logs e inicie a aplicação via PM2:
sudo mkdir -p /var/log/node-appsudo chown -R $USER:$USER /var/log/node-apppm2 start ecosystem.config.jspm2 savepm2 startup systemdO comando pm2 startup criará um serviço systemd que iniciará o PM2 na inicialização do sistema. Agora sua aplicação está rodando na porta 3000, mas o acesso direto a ela não é seguro. Vamos para a configuração do Nginx.
2. Configuração do Nginx como proxy reverso e SSL via Let's Encrypt
O Nginx receberá as requisições de entrada nas portas 80 (HTTP) e 443 (HTTPS), fará o proxy para o seu processo Node.js rodando na porta 3000 e também servirá arquivos estáticos diretamente — isso reduz a carga no Node.js.
Crie um arquivo de configuração para o seu domínio:
sudo nano /etc/nginx/sites-available/myappInsira a seguinte configuração (substitua myapp.example.com pelo seu domínio):
server { listen 80; server_name myapp.example.com; return 301 https://$server_name$request_uri; # redireciona para HTTPS}
server { listen 443 ssl http2; server_name myapp.example.com;
# SSL ser