Pular para o conteúdo
Publicar

Como fazer deploy de uma API Node.js no Hangar

Crie uma API Node.js executável, conecte o GitHub e acompanhe build, deploy, domínio e logs no Hangar. Um passo a passo com verificação local.

Uma API publicada precisa de um processo que escute na porta configurada, um comando de início e uma forma de verificar a resposta. Neste guia, você prepara uma API pequena em Node.js e segue o caminho do GitHub até o painel do Hangar.

O exemplo usa apenas módulos nativos. Ele não tem autenticação nem banco e serve para validar a publicação antes de acrescentar a lógica do seu produto.

Prepare três arquivos

Use Node.js 24 para executar o exemplo. Crie package.json:

{
  "name": "minha-api",
  "private": true,
  "type": "module",
  "engines": { "node": "24.x" },
  "scripts": {
    "start": "node server.mjs",
    "check": "node --check app.mjs && node --check server.mjs",
    "test": "node --test"
  }
}

Em app.mjs, separe a resposta HTTP da abertura da porta:

import { createServer } from "node:http";

export function createApp() {
  return createServer((request, response) => {
    const healthy = request.method === "GET" && request.url === "/health";
    response.writeHead(healthy ? 200 : 404, {
      "Content-Type": "application/json; charset=utf-8",
    });
    response.end(JSON.stringify(healthy ? { status: "ok" } : { error: "not_found" }));
  });
}

Em server.mjs, use a porta do ambiente e um endereço acessível pelo roteamento do container:

import { createApp } from "./app.mjs";

const port = Number(process.env.PORT ?? "3000");
if (!Number.isInteger(port) || port < 1 || port > 65535) {
  throw new Error("PORT deve ser uma porta válida entre 1 e 65535.");
}

const server = createApp();
server.listen(port, "0.0.0.0", () => {
  console.log(`API escutando na porta ${port}`);
});

function shutdown() {
  server.close(() => process.exit(0));
  setTimeout(() => process.exit(1), 10000).unref();
}

process.once("SIGTERM", shutdown);
process.once("SIGINT", shutdown);

O endereço explícito evita depender da configuração do framework. O Node, quando recebe uma porta e nenhum host, pode escutar em :: ou 0.0.0.0; omitir o host não significa necessariamente limitar o servidor a localhost. Veja a documentação de server.listen.

Verifique localmente antes de publicar

Na pasta do projeto, execute:

npm install --package-lock-only
npm run check
npm start

Abra http://localhost:3000/health: a resposta esperada é status HTTP 200 com {"status":"ok"}. Outra rota deve responder 404. Interrompa o processo com Ctrl+C depois da verificação.

Versione os três arquivos e o package-lock.json em seu repositório GitHub. Mantenha .env e credenciais fora do Git. Para acrescentar um teste automatizado à API, siga o guia de GitHub Actions.

Conecte o código ao Hangar

Crie sua conta e escolha um plano com capacidade para o projeto. Quando houver trial, duração e condições aparecem na contratação; não há plano gratuito permanente.

No workspace, crie um projeto e um ambiente. Adicione uma aplicação, autorize o repositório GitHub e confira a branch e a pasta que contém o package.json. Selecione o build por Railpack ou use o Dockerfile do guia Node.js.

Para esta API em JavaScript, não há compilação. O comando de início é npm start. Confira a versão do Node nos logs de build e configure PORT=3000 com a porta do serviço correspondente. Se o formulário já oferecer uma porta, mantenha o mesmo valor na aplicação e no serviço.

Publique e confirme o resultado

Inicie o deploy pelo painel. Acompanhe separadamente o build e o estado da aplicação: aceitar a solicitação de deploy ainda não confirma que a API está disponível.

Quando o serviço estiver ativo, use o endereço informado no painel e acesse /health. Verifique o status HTTP, o corpo da resposta e os logs. Um endpoint de saúde criado no código só participa das verificações da plataforma quando a configuração correspondente o utiliza.

SintomaPrimeira verificação
Build não encontra arquivosRepositório, branch e pasta de origem
Processo encerra ao iniciarComando de início, versão do Node e logs
Aplicação não respondePorta do serviço e endereço de escuta
/health retorna 404Caminho exato e versão publicada

Adicione domínio e dados quando precisar

Cadastre seu domínio no serviço, copie os registros DNS exibidos e aguarde a validação do domínio e do certificado. Teste o endereço HTTPS antes de divulgá-lo.

Se a aplicação precisar de PostgreSQL, crie o banco no ambiente e configure a conexão nas variáveis da aplicação. Credenciais, permissões, TLS e migrações precisam corresponder ao banco escolhido. Não acrescente comandos de migração ao build sem definir acesso, concorrência e recuperação.

O PostgreSQL do Hangar ainda não oferece backup, restauração ou recuperação pontual nativos. Para dados que precisam ser recuperáveis, prepare cópias externas e ensaie a restauração antes de usá-los em produção.

Depois do primeiro deploy, você pode ativar publicação por push na branch configurada, acompanhar logs e métricas e ajustar CPU, memória e réplicas manualmente dentro do plano. O guia inicial reúne o fluxo da plataforma para o próximo projeto.