Adios

Tutorial prático de Next.js

Crie um aplicativo Next.js e implante o código-fonte funcional.

Comece com uma pasta vazia. Termine com um aplicativo responsivo, uma verificação de saúde, rotas de metadados para busca, um manifesto de produção, uma versão saudável no Adios e um commit do Git a partir do qual você pode continuar criando.

Antes de começar

Instale Node.js 20 ou mais recente, npm, Git e a CLI do Adios. Você também precisará de uma conta Adios e de um repositório Git de destino se quiser fazer push do código-fonte concluído.

01

Crie o projeto Next.js

Este comando explicita as escolhas: TypeScript, Tailwind, ESLint, App Router, o diretório src , o alias padrão de importação e npm.

Terminal
npx create-next-app@latest ./my-project \
  --ts \
  --tailwind \
  --eslint \
  --app \
  --src-dir \
  --import-alias "@/*" \
  --use-npm

cd my-project
npm run dev

Aberto http://localhost:3000 e confirme que a página inicial carrega. Pare o servidor de desenvolvimento antes de continuar se quiser reutilizar o terminal.

02

Substitua a página inicial do projeto

Substituir src/app/page.tsx por uma pequena página renderizada no servidor. Manter os metadados na página torna o exemplo completo sem alterar o layout raiz gerado.

src/app/page.tsx
import type { Metadata } from "next";

export const metadata: Metadata = {
  title: "Northstar — A small app ready to ship",
  description:
    "A production-ready Next.js example with health and search metadata routes.",
};

const checks = [
  "Responsive App Router page",
  "Production health endpoint",
  "Sitemap and robots routes",
  "Repeatable Adios deployment",
];

export default function Home() {
  return (
    <main className="min-h-screen bg-slate-950 px-6 py-20 text-white">
      <div className="mx-auto max-w-5xl">
        <p className="text-sm font-semibold uppercase tracking-[0.18em] text-cyan-300">
          Next.js on Adios
        </p>
        <h1 className="mt-5 max-w-3xl text-5xl font-bold tracking-tight sm:text-7xl">
          Build the app. Keep the deployment clear.
        </h1>
        <p className="mt-6 max-w-2xl text-lg leading-8 text-slate-300">
          This project has the files a production release needs, from a health
          check to the runtime contract stored beside the source.
        </p>

        <div className="mt-12 grid gap-4 sm:grid-cols-2">
          {checks.map((check) => (
            <div
              key={check}
              className="rounded-xl border border-white/10 bg-white/5 p-5 text-base text-slate-200"
            >
              {check}
            </div>
          ))}
        </div>

        <a
          href="/api/health"
          className="mt-10 inline-flex rounded-lg bg-white px-5 py-3 font-semibold text-slate-950"
        >
          Check application health
        </a>
      </div>
    </main>
  );
}
03

Criar a rota de saúde

Adicionar src/app/api/health/route.ts. O Adios fará uma solicitação a essa rota antes de promover a versão candidata.

src/app/api/health/route.ts
export function GET() {
  return Response.json({ status: "ok" });
}

Mantenha essa rota rápida. Se o aplicativo não puder atender tráfego sem um banco de dados ou outro serviço obrigatório, decida se a verificação de prontidão também deve testar essa dependência.

04

Adicione rotas de sitemap e robots

Os arquivos de metadados do Next.js geram as respostas públicas de /sitemap.xmle /robots.txt . O fallback local mantém o desenvolvimento funcionando; a produção deve usar a URL pública final.

src/app/sitemap.ts
import type { MetadataRoute } from "next";

const siteUrl =
  process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000";

export default function sitemap(): MetadataRoute.Sitemap {
  return [
    {
      url: siteUrl + "/",
      lastModified: new Date(),
      changeFrequency: "weekly",
      priority: 1,
    },
  ];
}
src/app/robots.ts
import type { MetadataRoute } from "next";

const siteUrl =
  process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000";

export default function robots(): MetadataRoute.Robots {
  return {
    rules: {
      userAgent: "*",
      allow: "/",
    },
    sitemap: siteUrl + "/sitemap.xml",
  };
}
05

Criar adios.yaml na raiz do projeto

Este arquivo deve ficar junto a package.json. Ele registra como o Adios deve instalar, compilar, iniciar e verificar o projeto atual.

adios.yaml
name: my-nextjs-app
region: de
replicas: 1

build_cmd: npm ci && npm run build
start_cmd: npm start

env:
  NEXT_PUBLIC_SITE_URL: https://replace-with-your-route.adios.run

runtime:
  name: node@24
  port: 3000
  health_path: /api/health
  memory_mb: 1024

Mantenha o hostname provisório na primeira implantação. Quando o Adios retornar a rota gerada, substitua-o pela origem HTTPS real e implante novamente para que o sitemap contenha a URL correta.

06

Execute as verificações de produção localmente

Carregar uma página em desenvolvimento não basta. Execute o linter e a mesma compilação de produção que será usada na implantação.

Terminal
npm run lint
npm run build

Se algum comando falhar, corrija o primeiro erro e execute novamente as duas verificações antes de implantar.

07

Entre na conta e implante o código-fonte atual

Execute os comandos no diretório que contém adios.yaml. Revise todas as permissões solicitadas antes de permitir que a implantação continue.

Terminal
adios login
adios up

O Adios envia o código-fonte atual, executa a compilação, inicia o processo de produção, verifica /api/health, e retorna uma rota HTTPS gerada quando a versão está saudável.

08

Visite e verifique o aplicativo de produção

Abra o hostname gerado e verifique as quatro respostas:

  • / renderiza a nova página.
  • /api/health retorna {"status":"ok"}.
  • /robots.txt permite o rastreamento e indica o sitemap.
  • /sitemap.xml contém a URL de produção pública.

Substitua o valor provisório NEXT_PUBLIC_SITE_URL valor em adios.yaml pelo hostname gerado ou seu domínio personalizado, execute adios up novamente e repita as verificações. Use Domínios e Redirecionamentos ao vincular um hostname de produção.

09

Revise, faça commit e push do código-fonte funcional

Revise as alterações antes de registrá-las no histórico. O diff deve mostrar a página, a rota de saúde, as rotas de metadados para busca e o manifesto que você acabou de verificar.

Terminal
git status
git diff
git add src/app/page.tsx src/app/api/health/route.ts \
  src/app/sitemap.ts src/app/robots.ts adios.yaml
git diff --cached
git commit -m "Build and deploy the Next.js app"
git remote -v
git push -u origin main

Confirme o remote e a branch antes do comando final. Se git remote -v estiver vazio, crie primeiro o repositório remoto e adicione sua URL como origin.

Projeto concluído

Verifique os arquivos antes do próximo recurso.

Arquivos esperados
my-project/
├── adios.yaml
├── package.json
├── package-lock.json
└── src/
    └── app/
        ├── api/
        │   └── health/
        │       └── route.ts
        ├── page.tsx
        ├── robots.ts
        └── sitemap.ts

Problemas comuns

Por que o aplicativo Next.js precisa de uma rota de saúde?

O Adios usa a rota de saúde para confirmar que o processo de produção está pronto antes de promover a versão. Mantenha a resposta rápida e retorne um status de sucesso apenas quando o aplicativo puder atender tráfego.

Por que preciso substituir a URL do site após a primeira implantação?

Um sitemap precisa de URLs absolutas de produção. A primeira implantação no Adios cria o hostname gerado; substitua o valor provisório no adios.yaml por esse hostname e implante novamente antes de considerar o sitemap finalizado.

E se npm run build falhar?

Corrija a compilação local de produção antes de implantar. Comece pelo primeiro erro, confirme a versão do Node e o lockfile e não use o funcionamento do servidor de desenvolvimento como prova de que a compilação de produção funciona.

E se a versão iniciar, mas nunca ficar saudável?

Confirme que package.json tem um script de inicialização que executa next start, que o aplicativo escuta na porta 3000 e que adios.yaml usa a mesma porta e o caminho /api/health. Depois, consulte os logs do ambiente de execução e identifique o primeiro erro de inicialização ou de verificação de saúde antes de implantar novamente.

E se o projeto não tiver um remote Git?

Crie um repositório vazio no seu provedor Git, adicione-o como origin, confirme o nome da branch e faça push. Não execute o comando de push do exemplo antes que git remote -v mostre o destino esperado.

Continue criando

Use o mesmo contrato com um agente de programação com IA.

O guia de IA transforma exatamente esses arquivos e verificações em prompts para Codex, ChatGPT, Gemini e Claude.

Abra o fluxo de trabalho de IA

Já tem um repositório Next.js?

Revise os detalhes do ambiente de execução, os modelos oficiais, os preços e as verificações de produção na página de implantação.

Revise a implantação de Next.js