Nai-publish noong

Kumpletong Gabay sa Pag-deploy ng Isang Standalone Next.js Application Gamit ang Bun at Docker

Mga May-akda

Bakit Dapat Mong I-deploy ang Next.js Gamit ang Bun at Docker?

Nang maabot ng Bun ang matatag nitong bersyon 1 at sinimulan ng Vercel na suportahan ito bilang isang package manager (bagama't umaasa pa rin sa Node para sa runtime), na-intriga ako. Paano mo maa-simulate ang proseso ng pag-deploy ng Vercel sa lokal? Partikular, paano mo mai-deploy ang isang standalone na Next.js app gamit ang Bun at Docker? Ang gabay na ito ay naglalayong sagutin ang mga tanong na ito.

Mga Kinakailangan

  • Pangunahing kaalaman sa Docker, Next.js, at Bun

  • Na-install na Node.js

  • Na-install na Bun package manager

Hakbang-hakbang na Gabay

Hakbang 1: Pag-setup ng Dockerfile

Narito ang buong dockerfile na kakailanganin mo.

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

# Ginagamit ko ang Asia/Jakarta bilang aking time zone, maaari mo itong palitan sa iyong time zone
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

# I-install ang mga dependencies batay sa gustong package manager
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile

# I-build ang app
FROM deps AS builder
WORKDIR /app
COPY . .

RUN bun run build


# Production image, kopyahin ang lahat ng mga file at patakbuhin ang next
FROM node:18-slim AS runner
WORKDIR /app

ARG CONFIG_FILE
COPY $CONFIG_FILE /app/.env
ENV NODE_ENV production
# I-uncomment ang sumusunod na linya kung gusto mong huwag paganahin ang telemetry habang tumatakbo.
# ENV NEXT_TELEMETRY_DISABLED 1

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

EXPOSE 3001

ENV PORT 3001

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

Hakbang 2: Pasadyang Shell Script

Gumawa ng isang pasadyang shell script ./build.sh.

#!/bin/bash
set -e

# Patakbuhin ang Next.js build gamit ang mga ipinasa na argumento
next build "$@"

# Kopyahin ang mga file kung hindi sa isang CI environment
if [ -z "$CI" ]; then
  cp -r ./public ./.next/standalone/public
  cp -r ./.next/static ./.next/standalone/.next/static
fi

Karaniwang Mga Error at Pag-troubleshoot

Nakaranas ako ng ilang mga problema sa aking unang pagtatangka, lalo na ang mga error na may prefix na node:. Naayos ko ang mga ito sa pamamagitan ng paggamit ng imbios/bun-node sa halip na oven/bun bilang base image. Dahil kailangan namin ng Node.js fallback para sa mga hindi pa naipatutupad na tampok ng Bun.

Konklusyon

Sa pamamagitan ng pagsunod sa gabay na ito, dapat kang magkaroon ng isang Next.js app na na-deploy, na ginagaya ang proseso ng pag-deploy ng Vercel, gamit ang Bun at Docker. Huwag mag-atubiling ayusin at i-optimize ang setup ayon sa mga pangangailangan ng iyong proyekto.

Ano ang Susunod?

Ibahagi ang gabay na ito kung nakita mong kapaki-pakinabang at mag-iwan ng komento kung mayroon kang anumang mga katanungan o mga pagpapabuti. Manatiling nakatutok para sa higit pa!