Ir para o conteúdo
Guias

Hospedagem Node.js: como publicar um app com o seu domínio e SSL

Atualizado em

Você tem um app em Node.js (feito com Express, por exemplo) e quer vê-lo em https://seu-dominio.com, com cadeado e sem montar um servidor por conta própria. Este guia leva você da pasta ao domínio, seguindo o funcionamento do NodeApp no nosso servidor: seu app fica em uma pasta, o PM2 o mantém rodando, o nginx conecta o seu domínio a ele e o SSL do Let’s Encrypt é gratuito. Se antes você quiser ver o que o serviço inclui, o resumo está em hospedagem Node.js.

O que você precisa antes de começar

Três coisas: um plano que inclua apps Node.js, um domínio e o seu código.

Item Cloud Startup
Apps Node.js Incluídos
Acesso SSH Sim (shell restrito)
Sites Sem limite
Disco 100 GB SSD
Memória e núcleos 4 GB de RAM e 4 núcleos
Bancos de dados 300 (MySQL/MariaDB)
Preço de lançamento US$ 9,99 por mês no primeiro ano, com pagamento anual
Renovação US$ 311,88 por ano (US$ 25,99 por mês)
Mês a mês US$ 27,99
  • Plano. Um shell restrito é um terminal limitado à sua própria conta: você executa comandos, mas não mexe no resto do servidor. O pagamento é com cartão de crédito ou débito pela Stripe, em US$. Se você usa um cartão emitido no Brasil ou na Bolívia, confirme com o seu banco que ele está habilitado para compras internacionais.
  • Domínio. Se você já tem um, aponte-o para ns1.quimeracloud.com e ns2.quimeracloud.com no seu registrador; os passos estão no guia como apontar um domínio .com ou .bo para a sua hospedagem. Se precisa de um novo, o registro de domínio é feito automaticamente quando o pagamento é confirmado: .com e .net custam US$ 20 no primeiro ano e US$ 25 por ano na renovação, e o .org custa US$ 16 no primeiro ano e US$ 20 de renovação anual (mais detalhes em domínios). Não vendemos domínios .bo.
  • Seu código. Um projeto com o seu package.json.

Como o NodeApp funciona, em quatro peças

O NodeApp é o plugin HCPP-NodeApp (v2.0.3 no nosso servidor) do HestiaCP, o painel de controle que usamos. Segundo o README do plugin, ele permite hospedar aplicações Node.js com controle via PM2.

Peça O que faz por você
Pasta nodeapp Seu app fica em web/<domínio>/nodeapp.
PM2 É um gerenciador de processos: um programa que inicia o seu app e ajuda a mantê-lo no ar, segundo a documentação dele. Se o app cair, ele o reinicia.
Porta automática O sistema atribui a porta e a entrega ao seu app quando ele inicia.
nginx Recebe as visitas ao seu domínio e as repassa ao seu app, com suporte a WebSocket.

Passo a passo

1. Ative o NodeApp no seu domínio

  1. Entre no painel (disponível em português, espanhol, francês, italiano, alemão e inglês).
  2. Na aba Web, edite o seu domínio e abra as opções avançadas (Advanced Options).
  3. Escolha NodeApp na lista de modelos de proxy (Proxy Template), como indica a documentação do plugin, e salve.

O plugin também exige que o seu usuário tenha acesso SSH; na QuimeraCloud, o Cloud Startup já traz isso. Se você não vir o NodeApp entre os modelos ou se o seu usuário ainda não tiver SSH, escreva para a gente pelo WhatsApp.

2. Veja o exemplo que já vem pronto

Na pasta web/<domínio>/nodeapp você encontra um exemplo com Express: app.js e app.config.js. Abra os dois antes de escrever qualquer coisa, porque eles mostram como um app recebe a porta neste servidor.

O app.js de exemplo não lê uma variável de ambiente: ele recebe a porta como argumento -p. Esta é uma versão resumida do arquivo do plugin:

const express = require('express');
const app = express();

// O plugin inicia o app com: -p <porta>
const argv = require('minimist')(process.argv.slice(2));
const port = argv.p || 0;
if (port == 0) {
  console.log('Port number is not specified');
  process.exit(1);
}

app.get('*', (req, res) => res.send('Hello World!'));
app.listen(port, () => console.log(`Escutando na porta ${port}`));

O exemplo usa express e minimist como dependências. E o app.config.js é o arquivo que o PM2 lê para iniciar o app:

module.exports = {
  apps: (function () {
    let nodeapp = require('/usr/local/hestia/plugins/nodeapp/nodeapp.js')(__filename);
    return [nodeapp];
  })()
}

Não precisa mexer nele. Segundo o próprio comentário, esse módulo do plugin dá suporte automático ao .nvmrc e à atribuição de porta. Sua pasta traz uma cópia própria desses arquivos: use-a como referência se notar alguma diferença em relação ao que está acima.

3. Escolha a versão do Node com o .nvmrc

Crie (ou edite) um arquivo chamado .nvmrc dentro da pasta nodeapp. Ele só leva a versão:

v22

No nosso servidor há quatro versões instaladas com o NVM (o gerenciador de versões do Node): 16, 18, 20 e 22. O README do plugin explica que a configuração do PM2 seleciona a versão a partir desse arquivo. O README do repositório descreve a versão mais recente do plugin e pode citar outras versões do Node; para a sua conta vale a lista deste parágrafo.

4. Envie o seu próprio app

  1. Copie o seu código para a pasta nodeapp por SSH.
  2. Renomeie app.js e app.config.js com o nome do seu app, por exemplo loja.js e loja.config.js. O README indica trocar “app” pelo nome da sua aplicação.
  3. Abra o seu package.json e mude o campo main para o nome novo ("main": "loja.js").
  4. Faça o seu código ler a porta do mesmo jeito que o exemplo (-p) e escutar nela. Se ele escutar em outra, o nginx não vai encontrá-lo.
  5. Instale os seus pacotes com npm install dentro da pasta. Se o seu shell não encontrar o npm, escreva para a gente pelo WhatsApp.

5. Inicie e reinicie

O painel tem, na aba Web, uma lista de processos NodeApp com iniciar, parar, reiniciar e ver logs. Há mais duas formas, ambas por SSH e a partir da pasta nodeapp:

touch .restart/restart      # pede a reinicialização do app
pm2 start app.config.js     # inicia com o PM2 (use o nome do seu arquivo)

Toda vez que você mudar o código, reinicie o app para que ele pegue as alterações.

6. Leia os logs

Se algo falhar, comece pelos logs do processo: no painel, pela lista de processos NodeApp, ou por SSH com pm2 logs, que, segundo a documentação do PM2, mostra os logs em tempo real.

7. Ative o SSL e confira o domínio

O SSL do Let’s Encrypt é gratuito, se renova sozinho e vem em todos os planos. Para emiti-lo, o Let’s Encrypt verifica que você controla o domínio pedindo um arquivo por HTTP, na porta 80 (assim explica a documentação dele). Por isso o domínio já precisa chegar ao nosso servidor: se você o conectou pelos nameservers, a mudança pode demorar a propagar.

  1. Abra http://seu-dominio.com e confira se ele já mostra o seu app.
  2. No painel, abra as opções do seu domínio e marque as caixas de SSL e de Let’s Encrypt (em inglês, Enable SSL for this domain e Use Let’s Encrypt to obtain SSL certificate). Se já estiverem marcadas, não mude nada. Salve. Os passos seguem a documentação do HestiaCP.
  3. Abra https://seu-dominio.com e confira o cadeado.

Limites que convém conhecer

  • Um único servidor, em Seattle (EUA). Seus visitantes do Brasil e da América Latina se conectam a esse servidor. Não há réplicas em outras regiões.
  • Sem root. O shell restrito não permite instalar software do sistema. Se o seu app precisa disso, um VPS atende melhor: comparamos as opções em hospedagem compartilhada, cloud ou VPS.
  • Só MySQL/MariaDB como bancos de dados incluídos.
  • Endereço IPv4 compartilhado. Todas as contas usam o IPv4 do servidor.
  • Backup diário no mesmo servidor. Guardamos o mais recente.
  • Monitoramento a cada minuto, embora não publiquemos um número de disponibilidade.

Problemas frequentes

O que você vê Causa provável O que fazer
O log diz “Port number is not specified” O exemplo do plugin imprime isso quando inicia sem o argumento -p Inicie pelo painel ou com pm2 start app.config.js, não rodando node app.js na mão
Você mudou o código e a mudança não aparece O app continua com a versão anterior Reinicie-o
Não inicia depois de renomear os arquivos O nome do .config.js ou o main do package.json não bate com o seu arquivo Confira se os três nomes coincidem
O domínio não carrega Os nameservers ainda não propagaram Confira se apontam para ns1.quimeracloud.com e ns2.quimeracloud.com (como checar com nslookup está no guia de domínios)

Se algo não bater com o que você vê no seu painel, escreva para a gente pelo WhatsApp, no +591 773 14890: quem atende é uma pessoa da equipe da Quimera. E se ainda estiver escolhendo, compare os planos.

Perguntas frequentes

Posso usar Node.js se hoje tenho o plano Premium ou Unlimited?

Os apps Node.js e o acesso SSH vêm no plano Cloud Startup. Para trocar de plano, escreva para a gente pelo WhatsApp e fazemos a troca sem mover o seu site: seus arquivos, bancos de dados e e-mails ficam onde estão, sem que você precise movê-los.

Qual banco de dados posso usar com o meu app?

Os planos incluem bancos MySQL/MariaDB (300 no Cloud Startup). Outros tipos de banco de dados não estão incluídos. Se o seu app depende de um diferente, um VPS atende melhor, porque nele você instala o que precisar.

Existe backup do meu app?

Sim, há um backup diário automático. Guardamos o mais recente, no mesmo servidor, e você o restaura ou baixa pelo painel. Como garantia extra, baixe uma cópia de vez em quando e mantenha o seu código em um repositório próprio.

Quais versões do Node.js posso usar?

No servidor há quatro versões instaladas com o NVM: 16, 18, 20 e 22. Você escolhe uma com um arquivo .nvmrc dentro da pasta nodeapp do seu domínio, por exemplo com a linha v22.

Fontes

← Todos os guias

Publique o seu site esta semana

Escolha o seu plano, conecte o seu domínio e comece. Se tiver dúvidas antes de contratar, fale com a gente.