Node.JS na Umbler
Sejam bem-vindos ao HUB de ajuda sobre Node.js da Umbler
Aqui você vai encontrar todos os tutoriais sobre Node.JS na Umbler: do setup ao deploy, veja os principais passos para hospedar seu site/app em Node.JS.
Quer saber mais sobre nossa hospedagem Node.JS? Clique aqui.
Como fazer deploy da sua aplicação via FTP?
Uma das formas de realizar o deploy da sua aplicação Node.js é simplesmente enviar os arquivos via FTP. Essa forma é a mais simples, porém requer que a preparação e compilação da sua aplicação seja feita antes de enviar os arquivos.
Um dos passos mais comuns em ambiente Node.js é a execução do comando npm install. Esse passo baixará as dependencias do seu projeto para dentro da pasta node_modules, permitindo a correta execução da sua aplicação. Esse passo também é necessário para quem usa Yarn ao invés de npm.
Alguns frameworks contém um fluxo de build, que cria um pasta de saída com os arquivos que devem ser publicados (por exemplo: ./dist), mas outros não, sendo necessário subir a node_modules. Ou seja, quando se usa o FTP como forma de deploy é necessário enviar a pasta node_modules junto com os arquivos de sua aplicação caso não haja uma pasta de distribuição especifica. Isso é diferente quando se faz o deploy via git, como apresentado abaixo. Quando se executa o deploy via git, a Umbler executa esse passo de compilação em um de nossos ambientes de CI, não sendo necessário versionar ou enviar a pasta node_modules.
Cuidados com o package.json
Para fazer o deploy da sua aplicação em Node.JS é preciso tomar cuidado com um arquivo chamado package.json
O que você precisa cuidar é de ter certeza que dentro das configurações de scripts, terá o script de start, como mostra nesse exemplo de package.json
{
"name": "umbler-node",
"version": "1.0.0",
"description": "",
"main": "app.js",
"scripts": {
"start": "node app"
},
"author": "",
"license": "ISC",
"dependencies": {
"check-node-version": "^2.1.0",
"cluster": "^0.7.7",
"express": "^4.15.2",
"os": "^0.1.1"
}
}
Como mostra no exemplo, o "start":"node app" ou "start":"seu arquivo de inicialização" precisa existir para a aplicação rodar aqui com a Umbler
Nosso ambiente usa a plataforma Linux, então vale lembrar que se você desenvolveu a sua aplicação em ambiente Windows, utilizando pacotes com nome Case-Sensitive, como por exemplo:
" Express" : "^4.15.2"
O Windows ignora o case-sensitive e procura no NPM esses pacotes sem a letra maiúscula, mas o Linux por padrão usa case-sensitive e não ignora, então se você for fazer o deploy conosco com as dependências com a primeira letra maiúscula, não vai funcionar, por isso recomendamos que altere tudo para não case-sensitive.
Como fazer deploy da sua aplicação via GIT?
git init
git add .
git commit -m "Meu deploy em Node.JS na Umbler"
git remote add umbler SUA_GIT_URL
git push umbler master
remote: Build OK
remote: Umbler: Build completed successfully! Your application will be updated and published soon.
remote: Umbler: Temp address: http://node-na-umbler-com.umbler.net
To https://tatooine.deploy.umbler.com/7e8vlyok/node-na-umbler-com.git
var express = require('express');
var app = express();
//... your code here ...
var port = process.env.PORT || 3000;
app.listen(port, function () {
console.log('Umbler listening on port %s', port);
});
Como verificar logs do seu deploy
Para verificar os logs do deploy da sua aplicação você precisa acessar o Painel de controle da Umbler > Deploy e clicar em ver logs, como mostra a imagem a seguir:
Depois de clicar em ver logs vai aparecer os seus logs, como nessa imagem:
Como verificar logs da sua aplicação em Node.JS
Para verificar os logs da sua aplicação, primeiro você precisa ativá-los.
Um detalhe importante é que os logs só ficarão ativos por 24 horas. Para ativa-los você precisa acessar o Painel de controle > Seu domínio > Logs, após isso é só clicar em Habilitar por 24H como informa a imagem abaixo:
Depois de habilitado, sua tela ficará assim:
Variáveis de ambiente no Node.JS
Através do painel de controle é possível definir variáveis de ambiente que podem ser acessadas pela sua aplicação. Por padrão o sistema já possui algumas variáveis predefinidas (PORT, TZ, LANG e LANGUAGE) que não podem ser alteradas através desta tela, mas que estão visíveis para fim de informação.
Para acessar as variáveis de ambiente acesse: painel de controle > Depois clicando em Site > Configurações > Variáveis de ambiente Node.JS
Segue uma imagem de exemplo para te auxiliar:
Agora você poderá ver todas as suas variáveis de ambientes. Por padrão, a variável PORT é criada, como o nosso Node.JS roda na porta 3000, já criamos essa variável de ambiente PORT para te auxiliar.
Para criar uma nova variável de ambiente é só clicar em "Criar variável de ambiente" (marcado com o quadrado vermelho) e utilizá-la em sua aplicação através do seguinte código:
E aqui um exemplo de como chamar a variável de ambiente em sua aplicação
process.env.NOME_DA_VARIAVEL
Escalabilidade no Node.JS
É bem simples fazer um upgrade no seu plano, basta acessar o painel de controle > Site > E depois clicar no botão marcado em laranja e depois no botão em vermelho:
Agora você estará nessa tela:
Agora é só selecionar como você deseja escalar a sua aplicação, quantos processos você deseja que o Node.JS tenha disponível para utilizar e qual o tamanho deles.
Erros no Node.JS
O erro 503 indica que sua aplicação não está disponível. Este erro pode ocorrer devido a falha no deploy ou por algum erro interno que acontece em seu container.
Recomendamos que verifique o log de erros e também verifique se o seu Package.json está configurado conforme as indicações da Umbler.
O erro 500 está relacionado à problemas com a sua aplicação.
Para resolvê-lo, recomendamos que consulte seus logs de deploy e verifique qual o erro acusado.
O erro 404 indica que alguma requisição em sua aplicação não foi encontrada.
Normalmente este erro é informado nos casos em que uma URL (de imagens, páginas, etc) informada em seu código não está no local onde você informou.
Para resolver este erro, recomendamos que rode a aplicação localmente e verifique se o erro persiste. Se acontecer, é só checar onde a requisição está localizada realmente e pegar o caminho exato, atualizando sua aplicação.
O erro 403 significa que o seu usuário atual não tem permissão para fazer requisição.
Geralmente acontece quando você tem algum sistema de autenticação e um usuário não autenticado tenta fazer algo que ele não pode.
Transpiladores
Para rodar o babel é preciso tomar cuidado com um parâmetro "postinstall": "babel-node index.js" dentro do seu package.json. Como os arquivos escritos com o Babel precisam ser compilados, é preciso fazer essa configuração. Veja abaixo um exemplo de package.json configurado da forma correta.
{
"name": "babelandnode",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1",
"start": "node index",
"postinstall": "babel-node index.js"
},
"author": "",
"license": "ISC",
"devDependencies": {
"babel-cli": "^6.24.1",
"babel-preset-latest": "^6.24.1"
}
}
Para rodar o TypeScript é preciso tomar cuidado com um parâmetro dentro do seu package.json. A configuração que você deve se atentar é a "postinstall": "grunt".
Essa configuração é feita para que o TypeScript seja compilado antes de começar a ser executado pelo Node.JS . Segue um exemplo de package.json configurado da forma correta
{
"name": "heros",
"description": "The tour of heros",
"version": "1.0.0",
"private": true,
"author": "Brian Love",
"scripts": {
"dev": "NODE_ENV=development nodemon ./bin/www",
"grunt": "grunt",
"start": "node ./bin/www",
"postinstall": "grunt"
},
"dependencies": {
"body-parser": "^1.15.2",
"cookie-parser": "^1.4.3",
"errorhandler": "^1.4.3",
"express": "^4.14.0",
"method-override": "^2.3.6",
"morgan": "^1.7.0",
"pug": "^2.0.0-beta6"
},
"devDependencies": {
"@types/body-parser": "0.0.33",
"@types/cookie-parser": "^1.3.30",
"@types/errorhandler": "0.0.30",
"@types/method-override": "0.0.29",
"@types/morgan": "^1.7.32",
"grunt": "^1.0.1",
"grunt-contrib-copy": "^1.0.0",
"grunt-contrib-watch": "^1.0.0",
"grunt-ts": "^6.0.0-beta.3",
"nodemon": "^1.11.0",
"typescript": "^2.0.8"
}
}
Para rodar o Webpack é preciso tomar cuidado com um parâmetro dentro do seu package.json, segue um exemplo de package.json configurado da forma correta
{
"name": "webpack-demo",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"start": "webpack-dev-server --inline --hot --port 3000",
"build": "webpack -p --port 3000"
},
"keywords": [],
"author": "",
"license": "ISC",
"devDependencies": {
"babel-core": "^6.21.0",
"babel-loader": "^6.2.10",
"babel-preset-es2015": "^6.18.0",
"css-loader": "^0.26.1",
"extract-text-webpack-plugin": "^2.0.0-beta.4",
"file-loader": "^0.9.0",
"node-sass": "^4.1.0",
"sass-loader": "^4.1.0",
"style-loader": "^0.13.1",
"url-loader": "^0.5.7",
"webpack": "^2.1.0-beta.28",
"webpack-dev-server": "^2.2.0-rc.0"
},
"dependencies": {
"d3": "^4.4.0",
"lodash": "^4.17.2"
}
}
A configuração que tomar cuidado é a "start": "webpack-dev-server --inline --hot --port 3000", essa configuração é feita para que o Webpack rode e fique rodando na porta 3000
Ghost na Umbler
Para rodar o Ghost com o Node.JS é preciso ter atenção em algumas configurações no arquivo config.js, são elas:
Elas são, cuidar para a sua aplicação ficar exposta na porta 3000 e também o host ficar configurado para 0.0.0.0, como mostra no seguinte exemplo:
var path = require('path'),
config;
config = {
production: {
url: 'http://localhost:3000',
mail: {},
database: {
client: 'sqlite3',
connection: {
filename: path.join(__dirname, '/content/data/ghost.db')
},
debug: false
},
server: {
port: '3000',
host: '0.0.0.0'
}
}
...
AdonisJS na Umbler
Para usar AdonisJS na Umbler você precisa prestar especial atenção à configuração do arquivo .env
O que você precisa cuidar é de ter certeza que dentro das configurações dele, estará definida a porta 3000 como nesse exemplo:
HOST=0.0.0.0
PORT=3000
Para ver um exemplo geral de um arquivo .env clique aqui.
Configurando a New Relic
O primeiro passo para configurar a New Relic é se cadastrar no site New Relic e depois criar a sua aplicação em Node.JS lá, assim você vai receber uma chave para continuar com a sua configuração.
Para configurar a New Relic em sua aplicação é necessário instalar o pacote da New Relic, para isso basta abrir o seu Git Bash ou qualquer terminar e executar o seguinte comando:
npm install newrelic --save
Após instalar o módulo você vai acessar a pasta node_modules > newrelic e depois copiar o arquivo newrelic.js para a raiz da sua aplicação.
Depois de mover para a raiz, abra o arquivo newrelic.js no editor de texto que você preferir e insira a sua chave e o nome da sua aplicação dentro dele.
Aqui um exemplo de arquivo configurado:
'use strict'
exports.config = {
app_name: ['Teste Umbler'],
license_key: '94f417a76a019a3de38285a589c97631ec955eb5',
logging: {
level: 'info'
}
}
E depois de configurar o newrelic.js é só adicionar o require('newrelic') no topo do seu arquivo que inicia a sua aplicação, geralmente é o index.js ou app.js, segue um exemplo de um arquivo:
require('newrelic')
const express = require('express')
const app = express()
app.get('/', (req, res) => {
res.send('teste')
})
app.listen(3000, () => {
console.log('rodando na 3000 ')
})
Depois disso é só aguardar uns 5 minutos de acesso em sua aplicação e logs irão aparecer em seu painel na New Relic.
Bower
Para utilizar o Bower basta fazer o envio da sua node_modules junto no seu git push
Uma forma de fazer isso é é renomear o seu arquivo chamado .gitignore para qualquer outra coisa e fazer o push novamente.
Vale lembrar que para isso você precisa antes ter executado o npm install em seu computador local.
Nodemon
Não é preciso utilizar o Nodemon, pois quando o seu container entra em produção, qualquer erro que aconteça com a sua aplicação, o container será reiniciado de forma automática. E por questões de segurança não permitimos a instalação do Nodemon, pois para instala-lo rodar o comando npm install nodemon -g, e esse comando você não tem permissão para utilizar.
Para subir o seu servidor conosco basta configurar o seu package.json com o start com o comando node
Redirect HTTPS no Node.JS
Existem várias formas de analisar o protocolo de uma requisição em Node.js, mas nem todas funcionam em arquiteturas que usam proxy reverso. O proxy reverso age como intermediário entre a requisição do cliente e o servidor web, sendo ele o responsável por escutar requisições externas e abrir a conexão com a aplicação de fato para repassar essa requisição. Dessa forma, o servidor web só consegue saber o protocolo usado pela requisição originada do proxy reverso, que sempre será HTTP, independente da requisição original.
Como essa informação é importante para que a aplicação decida se precisa redirecionar para HTTPS, a Umbler configura seus proxies reversos para armazenar o protocolo da requisição no cabeçalho X-Forwarded-Proto. Em seu código é possível recuperar essa informação contida no cabeçalho, e caso o valor seja "http", redirecionar para uma URL que use o protocolo HTTPS, do contrário, seguir com o fluxo normal da aplicação.
Para deixar mais claro, temos um exemplo usando o framework Express:
app.use((req, res, next) => { //Cria um middleware onde todas as requests passam por ele
if ((req.headers["x-forwarded-proto"] || "").endsWith("http")) //Checa se o protocolo informado nos headers é HTTP
res.redirect(`https://${req.headers.host}${req.url}`); //Redireciona pra HTTPS
else //Se a requisição já é HTTPS
next(); //Não precisa redirecionar, passa para os próximos middlewares que servirão com o conteúdo desejado
});
Note que esse middleware precisa ser inserido logo após a linha que instancia o app do express.
var app = express();
//Código de redirecionamento acima
Isso é necessário pois quaisquer middlewares declarados antes do middleware de redirecionamento poderão ser acessados por HTTP também. Já que o código de redirecionamento não será executado, pois um middleware declarado antes dele já conseguiu lidar com a request e não necessita de mais nenhum seguinte. Exemplo:
const express = require("express");
const app = express()
app.get("/teste1", (req, res) => res.send("Essa mensagem pode ser vista por HTTP também D:"));
//Código de redirecionamento acima
app.get("/teste2", (req, res) => res.send("Você só consegue ver isso por HTTPS :D"));
app.listen(process.env.PORT || 3000, () => console.log("Escutando!"));
Qualquer dúvida que você tiver é só clicar no balãozinho azul no canto inferior direito, estamos prontos para ajudar!