Publicado em

Guia Completo para Implantar um Aplicativo Next.js Autônomo com Bun e Docker

Autores

Por que Implementar o Next.js com Bun e Docker?

Quando o Bun atingiu sua versão estável 1 e a Vercel começou a suportá-lo como um gerenciador de pacotes (embora ainda dependendo do Node para o tempo de execução), fiquei intrigado. Como você poderia simular o processo de implantação da Vercel localmente? Especificamente, como você pode implantar um aplicativo Next.js autônomo com Bun e Docker? Este guia tem como objetivo responder a essas perguntas.

Pré-requisitos

  • Compreensão básica de Docker, Next.js e Bun

  • Node.js instalado

  • Gerenciador de pacotes Bun instalado

Guia Passo a Passo

Passo 1: Configurando o Dockerfile

Aqui está o dockerfile completo que você precisará.

FROM imbios/bun-node:18-slim AS deps
ARG DEBIAN_FRONTEND=noninteractive

# Eu uso Asia/Jakarta como meu fuso horário, você pode alterá-lo para seu fuso horário
RUN apt-get -y update && \
  apt-get install -yq openssl git ca-certificates tzdata && \
  ln -fs /usr/share/zoneinfo/Asia/Jakarta /etc/localtime && \
  dpkg-reconfigure -f noninteractive tzdata
WORKDIR /app

# Instale as dependências com base no gerenciador de pacotes preferido
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile

# Crie o aplicativo
FROM deps AS builder
WORKDIR /app
COPY . .

RUN bun run build


# Imagem de produção, copie todos os arquivos e execute o próximo
FROM node:18-slim AS runner
WORKDIR /app

ARG CONFIG_FILE
COPY $CONFIG_FILE /app/.env
ENV NODE_ENV production
# Descomente a linha a seguir caso você queira desabilitar a telemetria durante o tempo de execução.
# ENV NEXT_TELEMETRY_DISABLED 1

COPY --from=builder  /app/.next/standalone ./

EXPOSE 3001

ENV PORT 3001

CMD ["node", "server.js"]

Passo 2: Script de Shell Personalizado

Crie um script de shell personalizado ./build.sh.

#!/bin/bash
set -e

# Execute a construção do Next.js com os argumentos passados
next build "$@"

# Copie os arquivos apenas se não estiver em um ambiente CI
if [ -z "$CI" ]; then
  cp -r ./public ./.next/standalone/public
  cp -r ./.next/static ./.next/standalone/.next/static
fi

Erros Comuns e Solução de Problemas

Encontrei alguns problemas durante minha primeira tentativa, especialmente erros com o prefixo node:. Eu os corrigi usando imbios/bun-node em vez de oven/bun como a imagem base. Porque precisamos do Node.js de fallback para os recursos ainda não implementados do Bun.

Conclusão

Seguindo este guia, você deve ter um aplicativo Next.js implantado, imitando o processo de implantação da Vercel, com Bun e Docker. Sinta-se à vontade para ajustar e otimizar a configuração de acordo com as necessidades do seu projeto.

O que vem a seguir?

Compartilhe este guia se você o achou útil e deixe um comentário se tiver alguma dúvida ou melhoria. Fiquem ligados para mais!