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.jsonepackage-lock.jsonversionados 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
| Campo | Valor |
|---|---|
| Porta | 3000 |
pre-build | vazio |
build | npm run build |
start | npx 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:
| Tipo | Exemplo | Quando é lida |
|---|---|---|
| Servidor | DATABASE_URL, AUTH_SECRET | Durante a execução |
| Pública | NEXT_PUBLIC_API_URL | Durante 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:
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
- Crie um banco gerenciado e copie a URL de conexão.
- Adicione
DATABASE_URLnas variáveis do projeto. - Garanta que o cliente do ORM seja gerado na build. Com Prisma, o comando
prisma generatecostuma estar nopostinstall; se não estiver, usebuild=npx prisma generate && npm run build. - 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 3000Vá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.jsE defina as variáveis HOSTNAME=0.0.0.0 e PORT=3000 no projeto, que o server.js usa para escutar.
Problemas comuns
| Sintoma | Causa provável | Correção |
|---|---|---|
Build falha com Cannot find module 'typescript' | Dependências de build removidas | Confirme que o campo build está preenchido e que o package-lock.json está sincronizado |
npm ci falha | Lockfile ausente ou fora de sincronia | Rode npm install, versione o package-lock.json e publique de novo |
| URL pública não responde | Porta diferente ou servidor em localhost | Use -H 0.0.0.0 -p 3000 e Porta 3000 |
NEXT_PUBLIC_* com valor antigo | Valor embutido na build anterior | Faça uma nova publicação |
Imagens com next/image retornam erro | Domínio remoto não liberado | Adicione o domínio em images.remotePatterns |
| Build lenta ou sem memória | Projeto grande | Revise o plano do projeto em Limites |
Próximos passos
Última atualização em
Guias por framework
Escolha seu framework e veja runtime, porta, comandos de build e start e o caminho recomendado para publicar na Zenifra, via GitHub ou imagem OCI.
APIs Node.js com Express, Fastify e NestJS
Configure APIs Node.js na Zenifra com Express, Fastify ou NestJS: porta, comandos, TypeScript, migrations, WebSockets, health check e erros comuns.