mcpField
B
bun-deploy

bun-deploy

github.com/daleseoクラウド・DevOps451 回インストール40 週間前に更新
リポジトリ

bun-deploy について

Bun アプリを Docker にデプロイする手順を案内するスキルです。イメージ方式の選択からコンテナのテストまで扱い、Kubernetes、CI/CD、マルチプラットフォームビルドの資料も含みます。

主な機能

  1. 01マルチステージとバイナリのイメージ構成
  2. 02各種プロジェクト向け Dockerfile テンプレート
  3. 03ヘルスチェックと非 root 設定
  4. 04Kubernetes デプロイのガイド
  5. 05CI/CD とマルチプラットフォームビルドの資料

活用シーン

  1. 01Bun の Web サーバーや API をパッケージ化
  2. 02小さな本番コンテナを作成
  3. 03Kubernetes のデプロイファイルを準備
  4. 04ARM64 と AMD64 向けのイメージをビルド

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/daleseo/bun-skills --skill bun-deploy

インストール後、Claude Code で/bun-deployを入力して読み込まれたか確認します。

同梱ファイル

SKILL.md と一緒にインストールされる参考資料やスクリプト。

references/
ci-cd.md
dockerfile-templates.md
kubernetes.md
multi-platform.md

詳細

Bun Docker デプロイ

Bun アプリケーション向けに最適化された Docker イメージを作成します。Bun の軽量なランタイムとバイナリコンパイルにより、Node.js と比較してイメージサイズを 88MB 以上削減できます。

クイックリファレンス

詳しいパターンについては、以下を参照してください。

  • Dockerfile テンプレート:dockerfile-templates.md - 最適化されたテンプレートを 12 種類以上掲載
  • Kubernetes:kubernetes.md - K8s マニフェスト、HPA、Ingress
  • CI/CD:ci-cd.md - GitHub Actions、GitLab CI、ビルドスクリプト
  • マルチプラットフォーム:multi-platform.md - ARM64/AMD64 ビルド

基本的なワークフロー

1. 前提条件を確認する
# Verify Docker is installed
docker --version

# Verify Bun is installed locally
bun --version

# Check if project is ready for deployment
ls -la package.json bun.lockb
2. デプロイ戦略を決定する

必要な内容をユーザーに確認します。

  • アプリケーションの種類:Web サーバー、API、ワーカー、CLI
  • イメージサイズの優先度:最小サイズ(40MB のバイナリ)またはデバッグツール(90MB の Alpine)
  • プラットフォーム:単一プラットフォームまたはマルチプラットフォーム(AMD64 + ARM64)
  • オーケストレーション:Docker Compose、Kubernetes、またはスタンドアロンコンテナ
3. 本番用 Dockerfile を作成する

ニーズに応じた適切なテンプレートを選択します。

標準的なマルチステージ構成(推奨)

# syntax=docker/dockerfile:1

FROM oven/bun:1-alpine AS deps
WORKDIR /app
COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile --production

FROM oven/bun:1-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN bun run build

FROM oven/bun:1-alpine AS runtime
WORKDIR /app

RUN addgroup --system --gid 1001 bunuser && \
    adduser --system --uid 1001 bunuser

COPY --from=deps --chown=bunuser:bunuser /app/node_modules ./node_modules
COPY --from=builder --chown=bunuser:bunuser /app/dist ./dist
COPY --from=builder --chown=bunuser:bunuser /app/package.json ./

USER bunuser
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD bun run healthcheck.ts || exit 1

CMD ["bun", "run", "dist/index.js"]

最小バイナリ(40MB)

可能な限り小さいイメージにする場合:

FROM oven/bun:1-alpine AS builder
WORKDIR /app

COPY package.json bun.lockb ./
RUN bun install --frozen-lockfile

COPY . .
RUN bun build ./src/index.ts --compile --outfile server

FROM gcr.io/distroless/base-debian12
COPY --from=builder /app/server /server
EXPOSE 3000
ENTRYPOINT ["/server"]

その他のシナリオ(モノレポ、データベースアプリ、CLI ツールなど)については、dockerfile-templates.md を参照してください。

4. .dockerignore を作成する
node_modules
bun.lockb
dist
*.log
.git
.env
.env.local
tests/
*.test.ts
coverage/
.vscode/
.DS_Store
Dockerfile
docker-compose.yml
5. ヘルスチェック用スクリプトを作成する

healthcheck.ts を作成します。

#!/usr/bin/env bun

const port = process.env.PORT || 3000;
const healthEndpoint = process.env.HEALTH_ENDPOINT || '/health';

try {
  const response = await fetch(`http://localhost:${port}${healthEndpoint}`, {
    method: 'GET',
    timeout: 2000,
  });

  if (response.ok) {
    process.exit(0);
  } else {
    console.error(`Health check failed: ${response.status}`);
    process.exit(1);
  }
} catch (error) {
  console.error('Health check error:', error);
  process.exit(1);
}

サーバーにヘルスチェック用エンドポイントを追加します。

app.get('/health', (req, res) => {
  res.json({
    status: 'ok',
    timestamp: Date.now(),
    uptime: process.uptime(),
  });
});
6. イメージをビルドしてテストする
# Build image
docker build -t myapp:latest .

# Check image size
docker images myapp:latest

# Run container
docker run -p 3000:3000 myapp:latest

# Test health endpoint
curl http://localhost:3000/health
7. 環境に合わせて設定する

Docker Compose を使ったローカル開発の場合:

docker-compose.yml を作成します。

version: '3.8'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    ports:
      - "3000:3000"
    volumes:
      - .:/app
      - /app/node_modules
    environment:
      - NODE_ENV=development
    depends_on:
      - db
      - redis

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
      POSTGRES_DB: mydb
    ports:
      - "5432:5432"

  redis:
    image: redis:7-alpine
    ports:
      - "6379:6379"

次のコマンドで実行します:docker-compose up

Kubernetes へのデプロイの場合:

以下を含む完全なマニフェストについては、kubernetes.md を参照してください。

  • Deployment の設定
  • Service と Ingress
  • Secrets と ConfigMaps
  • 水平 Pod オートスケーリング
  • Bun 向けに最適化されたリソース制限

CI/CD の場合:

以下については、ci-cd.md を参照してください。

  • GitHub Actions のワークフロー
  • GitLab CI の設定
  • ビルドおよびプッシュ用スクリプト
  • 自動デプロイ

マルチプラットフォーム(ARM64 + AMD64)の場合:

以下については、multi-platform.md を参照してください。

  • マルチプラットフォーム対応の Dockerfile
  • Buildx の設定
  • 異なるアーキテクチャでのテスト
8. package.json を更新する

Docker 用スクリプトを追加します。

{
  "scripts": {
    "docker:build": "docker build -t myapp:latest .",
    "docker:run": "docker run -p 3000:3000 myapp:latest",
    "docker:dev": "docker-compose up",
    "docker:clean": "docker system prune -af"
  }
}

イメージサイズの比較

Bun では、イメージサイズを大幅に小さくできます。

構成サイズ用途
Bun バイナリ(distroless)~40 MB本番環境(最小構成)
Bun Alpine~90 MB本番環境(標準構成)
Node.js Alpine~180 MB比較基準

Bun なら 88MB 以上削減できます!

セキュリティのベストプラクティス

  1. 非 root ユーザーを使用する(上記の Dockerfile に含まれています)
  2. 脆弱性をスキャンする:docker scan myapp:latest
  3. 公式のベースイメージを使用する:oven/bun は公式イメージです
  4. イメージを最新の状態に保つ:最新の Bun で定期的に再ビルドします
  5. シークレットをハードコードしない:環境変数またはシークレットマネージャーを使用します

最適化のヒント

レイヤーキャッシュ:

# Copy dependencies first (changes less often)
COPY package.json bun.lockb ./
RUN bun install

# Copy source code last (changes more often)
COPY . .
RUN bun run build

レイヤー数の削減:

# Combine RUN commands
RUN bun install && \
    bun run build && \
    rm -rf tests/

最終イメージの最小化:

# Only copy what's needed in runtime
COPY --from=builder /app/dist ./dist
# Don't copy: src/, tests/, .git/, node_modules (if using binary)

完了チェックリスト

  • ✅ Dockerfile を作成済み(マルチステージまたはバイナリ)
  • ✅ .dockerignore を設定済み
  • ✅ ヘルスチェックを実装済み
  • ✅ 非 root ユーザーを設定済み
  • ✅ イメージをビルドし、ローカルでテスト済み
  • ✅ イメージサイズを確認済み(Alpine は <100MB、バイナリは <50MB)
  • ✅ 環境設定を準備済み(docker-compose または K8s)
  • ✅ CI/CD パイプラインを設定済み(必要な場合)

次のステップ

基本的なデプロイの後に、以下を行います。

  1. モニタリング:Prometheus のメトリクスエンドポイントを追加する
  2. ロギング:構造化ロギングを設定する
  3. シークレット:適切なシークレット管理を設定する
  4. スケーリング:水平 Pod オートスケーリングを設定する(K8s)
  5. CI/CD:ビルドとデプロイを自動化する
  6. マルチリージョン:冗長性のために複数のリージョンにデプロイする

詳しい実装については、上記のリンク先にあるリファレンスファイルを参照してください。

コメント