Publicado el

Guía completa para implementar Next.js independiente con Bun y Docker

Autores

¿Por qué desplegar Next.js con Bun y Docker?

Cuando Bun alcanzó su versión estable 1 y Vercel comenzó a admitirlo como administrador de paquetes (aunque todavía depende de Node para el tiempo de ejecución), me intrigó. ¿Cómo se puede simular el proceso de despliegue de Vercel localmente? Específicamente, ¿cómo se puede desplegar una aplicación Next.js independiente con Bun y Docker? Esta guía tiene como objetivo responder a estas preguntas.

Requisitos previos

  • Comprensión básica de Docker, Next.js y Bun

  • Node.js instalado

  • Administrador de paquetes Bun instalado

Guía paso a paso

Paso 1: Configurar Dockerfile

Aquí tienes el dockerfile completo que necesitarás.

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

# Utilizo Asia/Jakarta como mi zona horaria, puedes cambiarla a tu zona horaria
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

# Instala las dependencias en función del administrador de paquetes preferido
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile

# Construye la aplicación
FROM deps AS builder
WORKDIR /app
COPY . .

RUN bun run build


# Imagen de producción, copia todos los archivos y ejecuta next
FROM node:18-slim AS runner
WORKDIR /app

ARG CONFIG_FILE
COPY $CONFIG_FILE /app/.env
ENV NODE_ENV production
# Descomenta la siguiente línea en caso de que quieras desactivar la telemetría durante el tiempo de ejecución.
# ENV NEXT_TELEMETRY_DISABLED 1

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

EXPOSE 3001

ENV PORT 3001

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

Paso 2: Script de shell personalizado

Crea un script de shell personalizado ./build.sh.

#!/bin/bash
set -e

# Ejecuta la compilación de Next.js con los argumentos pasados
next build "$@"

# Copia los archivos solo si no estás en un entorno de CI
if [ -z "$CI" ]; then
  cp -r ./public ./.next/standalone/public
  cp -r ./.next/static ./.next/standalone/.next/static
fi

Errores comunes y solución de problemas

Tuve algunos problemas durante mi primer intento, especialmente errores con el prefijo node:. Los arreglé usando imbios/bun-node en lugar de oven/bun como imagen base. Porque necesitamos una solución alternativa de Node.js para las funciones que aún no se han implementado en Bun.

Conclusión

Siguiendo esta guía, deberías tener una aplicación Next.js desplegada, imitando el proceso de despliegue de Vercel, con Bun y Docker. No dudes en modificar y optimizar la configuración de acuerdo con las necesidades de tu proyecto.

¿Qué sigue?

Comparte esta guía si te ha resultado útil y deja un comentario si tienes alguna pregunta o mejora. ¡Mantente atento para más!