# Bun

スタンドアロンの Bun サーバとしてデプロイするには、ビルトインの `bun` アダプタを使用します。このアダプタは Bun のネイティブ `Bun.serve()` API を使用し、エッジ互換の fetch ハンドラとゼロコピー静的ファイル配信を提供します。

## インストール

システムに [Bun](https://bun.sh) がインストールされている必要があります：

```sh
curl -fsSL https://bun.sh/install | bash
```

追加のパッケージは不要です — アダプタは `@lazarv/react-server` に組み込まれています。

Bun でプロダクションビルドを実行すると、`bun` アダプタが**自動的に検出・使用されます** — 設定は不要です。明示的に指定したい場合やオプションを渡したい場合は、`react-server.config.mjs` ファイルにアダプタを追加します：

```mjs
export default {
  adapter: "bun",
};
```

## 設定

オプションを渡してアダプタをカスタマイズできます：

```mjs
export default {
  adapter: [
    "bun",
    {
      name: "my-app", // アプリケーション名（生成される package.json で使用）
    },
  ],
};
```

### 設定オプション

- `name`: アプリケーション名。`package.json` の name（スコープなし）または "react-server-app" にフォールバックします。

### 環境変数

生成されたサーバは実行時に以下の環境変数をサポートします：

- `PORT`: サーバポート（デフォルト: `3000`）
- `HOST`: サーバホスト名（デフォルト: `0.0.0.0`）
- `ORIGIN`: サーバのオリジン URL を上書き

## 仕組み

Bun アダプタは**エッジビルド**モードを使用し、サーバ全体を単一のファイルにバンドルします。ビルド時に以下を行います：

1. サーバコードを `.bun/server/.react-server/server/edge.mjs` にバンドル
2. すべての静的アセットを `.bun/static/` にコピー
3. **ビルド時静的ルートマップ**を含む `start.mjs` スクリプトを生成し、`Bun.serve({ static })` でゼロコピー静的ファイル配信を実現
4. 簡単なデプロイのための `package.json` を作成

静的ファイル（HTML、CSS、JS、画像など）は fetch ハンドラを経由せず、Bun の最適化された静的ファイル処理で直接配信されるため、静的アセットに対して最高のパフォーマンスが得られます。

## ビルド

`react-server` CLI を使用してアプリケーションをビルドします：

```sh
pnpm react-server build [root]
```

これにより、以下の構造の `.bun/` ディレクトリが生成されます：

```
.bun/
├── start.mjs          # 静的ルートマップ付きエントリーポイント
├── package.json       # デプロイメタデータ
├── static/            # すべての静的アセット
│   ├── assets/        # ハッシュ付きビルドアセット（CSS、JS）
│   ├── client/        # クライアントサイドバンドル
│   └── ...            # 公開ファイル、プリレンダリング HTML
└── server/
    └── .react-server/
        └── server/
            └── edge.mjs  # バンドルされたサーバ
```

## デプロイ

CLIを使用して本番サーバを起動します：

```sh
bun --bun react-server start
```

ランタイムなしで直接起動することもできます：

```sh
bun --bun .bun/start.mjs
```

または `--deploy` フラグを使用してビルドと即時起動を行います：

```sh
pnpm react-server build [root] --deploy
```

生成された `package.json` のスクリプトを使用することもできます：

```sh
cd .bun
bun start
```

## デプロイ先

Bun アダプタは自己完結型のサーバを生成するため、Bun が動作する場所ならどこでもデプロイできます：

- **ベアメタル / VPS**: `.bun/` ディレクトリをコピーして `bun start.mjs` を実行
- **Docker**: [公式 Bun Docker イメージ](https://hub.docker.com/r/oven/bun)を使用
- **Fly.io**: Dockerfile を使用して `flyctl` でデプロイ
- **Railway、Render**: 起動コマンドを `bun .bun/start.mjs` に設定

### Dockerfile の例

```dockerfile
FROM oven/bun:latest
WORKDIR /app
COPY .bun/ .
EXPOSE 3000
CMD ["bun", "start.mjs"]
```