Guias por framework

Publicar Next.js na Zenifra

O Next.js roda na Zenifra como um servidor Node.js completo: renderização no servidor, rotas de API, Server Actions, middleware e otimização de imagens funcionam sem adaptadores.

Pré-requisitos

  • Repositório no GitHub com o projeto Next.js
  • package.json e package-lock.json versionados na raiz do repositório
  • Conta GitHub conectada à Zenifra
  • Projeto rodando localmente com npm ci && npm run build && npm start

pnpm e Yarn

A instalação usa npm ci. Se o projeto usa pnpm ou Yarn, gere e versione um package-lock.json compatível ou publique por Imagem OCI.

Configuração no console

Crie o projeto

No console, clique em Criar Projeto e escolha Repositório GitHub. Selecione o repositório e a branch.

Escolha o runtime

Selecione Node.js e a mesma versão principal que você usa localmente (20, 22 ou 24). Confira o campo engines do package.json e a versão mínima exigida pela sua versão do Next.js.

Preencha porta e comandos

CampoValor
Porta3000
pre-buildvazio
buildnpm run build
startnpx next start -H 0.0.0.0 -p 3000

Adicione as variáveis

Cadastre as variáveis de ambiente antes de criar o projeto, incluindo as NEXT_PUBLIC_*. Veja a próxima seção.

Crie e acompanhe

Clique em Criar Projeto e acompanhe a aba Logs de Build. Quando o projeto ficar Executando, abra a URL *.clients.zenifra.com.

Variáveis de ambiente no Next.js

O Next.js trata dois tipos de variável de forma diferente:

TipoExemploQuando é lida
ServidorDATABASE_URL, AUTH_SECRETDurante a execução
PúblicaNEXT_PUBLIC_API_URLDurante a build, embutida no JavaScript do navegador

Na Zenifra, as variáveis do projeto ficam disponíveis durante a build, então NEXT_PUBLIC_* funciona normalmente.

Mudou uma NEXT_PUBLIC_? Faça uma nova build

Salvar variáveis reinicia as instâncias, mas não recompila o código. Valores NEXT_PUBLIC_* já embutidos no navegador só mudam depois de uma nova publicação: faça um push ou dispare um deploy manual.

Nunca coloque segredos em variáveis NEXT_PUBLIC_*: elas ficam visíveis para qualquer visitante.

Health check

Crie uma rota leve para o health check:

app/api/health/route.ts
export const dynamic = 'force-dynamic';

export function GET() {
  return Response.json({ status: 'ok' });
}

Configure o caminho /api/health no projeto. Se usar middleware.ts com autenticação, libere essa rota no matcher para que a verificação não receba redirecionamento.

Banco de dados com Prisma ou Drizzle

  1. Crie um banco gerenciado e copie a URL de conexão.
  2. Adicione DATABASE_URL nas variáveis do projeto.
  3. Garanta que o cliente do ORM seja gerado na build. Com Prisma, o comando prisma generate costuma estar no postinstall; se não estiver, use build = npx prisma generate && npm run build.
  4. Aplique migrations no início da execução, quando a aplicação já tem acesso à rede do projeto:
start: npx prisma migrate deploy && npx next start -H 0.0.0.0 -p 3000

Várias instâncias

Com mais de uma instância, todas executam o start. O Prisma serializa migrate deploy com um bloqueio no banco, mas migrations longas atrasam a subida. Para mudanças grandes, aplique a migration antes, a partir de uma máquina com acesso ao banco.

Arquivos enviados por usuários

O sistema de arquivos da instância é efêmero. Uploads gravados em public/ ou em disco somem a cada publicação. Use armazenamento persistente com um diretório fora do código, como /app/uploads, ou um serviço de armazenamento de objetos.

Cache do Next.js e várias instâncias

O cache de dados e o ISR do Next.js ficam no disco de cada instância por padrão. Com mais de uma instância, cada uma mantém seu próprio cache, e revalidatePath afeta só a instância que recebeu a chamada. Se isso importa para você, use uma instância ou configure um cacheHandler compartilhado com o cache gerenciado.

Saída standalone (opcional)

output: 'standalone' reduz o tamanho da aplicação em execução. Se ativar, ajuste o start:

build: npm run build && cp -r public .next/standalone/ && cp -r .next/static .next/standalone/.next/
start: node .next/standalone/server.js

E defina as variáveis HOSTNAME=0.0.0.0 e PORT=3000 no projeto, que o server.js usa para escutar.

Problemas comuns

SintomaCausa provávelCorreção
Build falha com Cannot find module 'typescript'Dependências de build removidasConfirme que o campo build está preenchido e que o package-lock.json está sincronizado
npm ci falhaLockfile ausente ou fora de sincroniaRode npm install, versione o package-lock.json e publique de novo
URL pública não respondePorta diferente ou servidor em localhostUse -H 0.0.0.0 -p 3000 e Porta 3000
NEXT_PUBLIC_* com valor antigoValor embutido na build anteriorFaça uma nova publicação
Imagens com next/image retornam erroDomínio remoto não liberadoAdicione o domínio em images.remotePatterns
Build lenta ou sem memóriaProjeto grandeRevise o plano do projeto em Limites

Próximos passos

Última atualização em

Nessa página