公開日

Bun と Docker を使用したスタンドアロン Next.js アプリケーションのデプロイに関する完全ガイド

著者

Bun と Docker を使用して Next.js をデプロイする理由

Bun が安定版 1.0 に到達し、Vercel が Bun をパッケージマネージャーとしてサポートし始めた(ランタイムは依然として Node に依存していますが)ことに私は興味を持ちました。どのようにして Vercel のデプロイプロセスをローカルでシミュレートできるでしょうか?特に、Bun と Docker を使用して Next.js スタンドアロンアプリをどのようにデプロイできるでしょうか?このガイドは、これらの質問に答えることを目的としています。

前提条件

  • Docker、Next.js、および Bun の基本的な理解
  • Node.js がインストールされていること
  • Bun パッケージマネージャーがインストールされていること

ステップバイステップガイド

ステップ 1: Dockerfile の設定

以下は必要な dockerfile です。

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

# タイムゾーンは Asia/Jakarta を使用しています。必要に応じて変更してください
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

# 好みのパッケージマネージャーに基づいて依存関係をインストールします
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile

# アプリケーションをビルドします
FROM deps AS builder
WORKDIR /app
COPY . .

RUN bun run build


# プロダクションイメージ、すべてのファイルをコピーして Next を実行します
FROM node:18-slim AS runner
WORKDIR /app

ARG CONFIG_FILE
COPY $CONFIG_FILE /app/.env
ENV NODE_ENV production
# 実行時にテレメトリを無効にする場合は、次の行のコメントを外してください。
# ENV NEXT_TELEMETRY_DISABLED 1

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

EXPOSE 3001

ENV PORT 3001

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

ステップ 2: カスタムシェルスクリプト

カスタムシェルスクリプト ./build.sh を作成します。

#!/bin/bash
set -e

# 渡された引数を使用して Next.js ビルドを実行します
next build "$@"

# CI 環境ではない場合にのみファイルをコピーします
if [ -z "$CI" ]; then
  cp -r ./public ./.next/standalone/public
  cp -r ./.next/static ./.next/standalone/.next/static
fi

よくあるエラーとトラブルシューティング

最初の試みでは、特に node: で始まるエラーが発生しました。ベースイメージとして oven/bun ではなく imbios/bun-node を使用することで、これらのエラーを修正しました。Bun にはまだ実装されていない機能のために、Node.js のフォールバックが必要です。

まとめ

このガイドに従うことで、Vercel のデプロイプロセスを模倣して、Bun と Docker を使用して Next.js アプリをデプロイできるはずです。プロジェクトのニーズに合わせて、このセットアップを調整および最適化してください。

次に何をするか?

このガイドが役に立った場合は共有し、質問や改善点があればコメントを残してください。今後の更新をお楽しみに!