Agent Skills by ALSEL
Anthropic Claudeソフトウェア開発⭐ リポ 0品質スコア 50/100

deployment-patterns

デプロイワークフロー、CI/CDパイプラインのパターン、Dockerコンテナ化、ヘルスチェック、ロールバック戦略、Webアプリケーションの本番リリース準備チェックリストを提供します。デプロイインフラの構築やリリース計画を立てる際に活用してください。

description の原文を見る

> Deployment workflows, CI/CD pipeline patterns, Docker containerization, health checks, rollback strategies, and production readiness checklists for web applications. Use when setting up deployment infrastructure or planning releases.

SKILL.md 本文

デプロイメントパターン

本番環境へのデプロイメントワークフローと CI/CD のベストプラクティス。

活性化するタイミング

  • CI/CD パイプラインの構築
  • アプリケーションの Docker 化
  • デプロイメント戦略の計画 (ブルーグリーン、カナリア、ローリング)
  • ヘルスチェックとレディネスプローブの実装
  • 本番リリースの準備
  • 環境別設定の構成

デプロイメント戦略

ローリングデプロイメント (デフォルト)

インスタンスを段階的に置き換えます。ロールアウト中、旧バージョンと新バージョンが同時に実行されます。

Instance 1: v1 → v2  (最初に更新)
Instance 2: v1        (まだ v1 で実行中)
Instance 3: v1        (まだ v1 で実行中)

Instance 1: v2
Instance 2: v1 → v2  (2番目に更新)
Instance 3: v1

Instance 1: v2
Instance 2: v2
Instance 3: v1 → v2  (最後に更新)

利点: ダウンタイムなし、段階的なロールアウト 欠点: 2つのバージョンが同時に実行される。後方互換性のある変更が必要 使用場面: 標準的なデプロイメント、後方互換性のある変更

ブルーグリーンデプロイメント

2つの同一の環境を実行してトラフィックをアトミックに切り替えます。

Blue  (v1) ← トラフィック
Green (v2)   アイドル、新バージョン実行中

# 検証後:
Blue  (v1)   アイドル (スタンバイになる)
Green (v2) ← トラフィック

利点: インスタント ロールバック (ブルーに戻す)、クリーンなカットオーバー 欠点: デプロイメント中に 2倍のインフラストラクチャが必要 使用場面: 重要なサービス、問題の許容度ゼロ

カナリアデプロイメント

まず新バージョンにトラフィックの小さい割合をルーティングします。

v1: 95% のトラフィック
v2:  5% のトラフィック  (カナリア)

# メトリクスが良好な場合:
v1: 50% のトラフィック
v2: 50% のトラフィック

# 最終:
v2: 100% のトラフィック

利点: 完全なロールアウト前に実際のトラフィックで問題を検出 欠点: トラフィック分割インフラストラクチャとモニタリングが必要 使用場面: トラフィック量の多いサービス、リスクのある変更、機能フラグ

Docker

マルチステージ Dockerfile (Node.js)

# ステージ 1: 依存関係をインストール
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production=false

# ステージ 2: ビルド
FROM node:22-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
RUN npm prune --production

# ステージ 3: 本番イメージ
FROM node:22-alpine AS runner
WORKDIR /app

RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
USER appuser

COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/package.json ./

ENV NODE_ENV=production
EXPOSE 3000

HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
  CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1

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

マルチステージ Dockerfile (Go)

FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server

FROM alpine:3.19 AS runner
RUN apk --no-cache add ca-certificates
RUN adduser -D -u 1001 appuser
USER appuser

COPY --from=builder /server /server

EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:8080/health || exit 1
CMD ["/server"]

マルチステージ Dockerfile (Python/Django)

FROM python:3.12-slim AS builder
WORKDIR /app
RUN pip install --no-cache-dir uv
COPY requirements.txt .
RUN uv pip install --system --no-cache -r requirements.txt

FROM python:3.12-slim AS runner
WORKDIR /app

RUN useradd -r -u 1001 appuser
USER appuser

COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY . .

ENV PYTHONUNBUFFERED=1
EXPOSE 8000

HEALTHCHECK --interval=30s --timeout=3s CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health/')" || exit 1
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "4"]

Docker のベストプラクティス

# 良い実践
- 特定のバージョンタグを使用する (node:latest ではなく node:22-alpine)
- マルチステージビルドでイメージサイズを最小化する
- 非 root ユーザーとして実行する
- 依存関係ファイルを先にコピーする (レイヤーキャッシング)
- .dockerignore を使用して node_modules、.git、テストを除外する
- HEALTHCHECK 命令を追加する
- docker-compose または k8s でリソースリミットを設定する

# 悪い実践
- root として実行する
- :latest タグを使用する
- 1つの COPY レイヤーでリポジトリ全体をコピーする
- 本番イメージに開発用依存関係をインストールする
- イメージにシークレットを保存する (環境変数またはシークレットマネージャーを使用)

CI/CD パイプライン

GitHub Actions (標準パイプライン)

name: CI/CD

on:
  push:
    branches: [main]
  pull_request:
    branches: [main]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: 22
          cache: npm
      - run: npm ci
      - run: npm run lint
      - run: npm run typecheck
      - run: npm test -- --coverage
      - uses: actions/upload-artifact@v4
        if: always()
        with:
          name: coverage
          path: coverage/

  build:
    needs: test
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - uses: docker/setup-buildx-action@v3
      - uses: docker/login-action@v3
        with:
          registry: ghcr.io
          username: ${{ github.actor }}
          password: ${{ secrets.GITHUB_TOKEN }}
      - uses: docker/build-push-action@v5
        with:
          push: true
          tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
          cache-from: type=gha
          cache-to: type=gha,mode=max

  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    environment: production
    steps:
      - name: Deploy to production
        run: |
          # プラットフォーム固有のデプロイメントコマンド
          # Railway: railway up
          # Vercel: vercel --prod
          # K8s: kubectl set image deployment/app app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          echo "Deploying ${{ github.sha }}"

パイプラインステージ

PR オープン:
  lint → typecheck → ユニットテスト → 統合テスト → プレビュー デプロイ

main にマージ:
  lint → typecheck → ユニットテスト → 統合テスト → イメージビルド → ステージングにデプロイ → スモークテスト → 本番にデプロイ

ヘルスチェック

ヘルスチェックエンドポイント

// シンプルなヘルスチェック
app.get("/health", (req, res) => {
  res.status(200).json({ status: "ok" });
});

// 詳細なヘルスチェック (内部モニタリング用)
app.get("/health/detailed", async (req, res) => {
  const checks = {
    database: await checkDatabase(),
    redis: await checkRedis(),
    externalApi: await checkExternalApi(),
  };

  const allHealthy = Object.values(checks).every(c => c.status === "ok");

  res.status(allHealthy ? 200 : 503).json({
    status: allHealthy ? "ok" : "degraded",
    timestamp: new Date().toISOString(),
    version: process.env.APP_VERSION || "unknown",
    uptime: process.uptime(),
    checks,
  });
});

async function checkDatabase(): Promise<HealthCheck> {
  try {
    await db.query("SELECT 1");
    return { status: "ok", latency_ms: 2 };
  } catch (err) {
    return { status: "error", message: "Database unreachable" };
  }
}

Kubernetes プローブ

livenessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 10
  periodSeconds: 30
  failureThreshold: 3

readinessProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 5
  periodSeconds: 10
  failureThreshold: 2

startupProbe:
  httpGet:
    path: /health
    port: 3000
  initialDelaySeconds: 0
  periodSeconds: 5
  failureThreshold: 30    # 30 * 5s = 最大起動時間 150s

環境設定

Twelve-Factor App パターン

# すべての設定は環境変数経由 — コードには絶対に含めない
DATABASE_URL=postgres://user:pass@host:5432/db
REDIS_URL=redis://host:6379/0
API_KEY=${API_KEY}           # シークレットマネージャーが注入
LOG_LEVEL=info
PORT=3000

# 環境別の動作
NODE_ENV=production          # または staging、development
APP_ENV=production           # 明示的なアプリ環境

設定の検証

import { z } from "zod";

const envSchema = z.object({
  NODE_ENV: z.enum(["development", "staging", "production"]),
  PORT: z.coerce.number().default(3000),
  DATABASE_URL: z.string().url(),
  REDIS_URL: z.string().url(),
  JWT_SECRET: z.string().min(32),
  LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
});

// 起動時に検証 — 設定が不正な場合は早期に失敗
export const env = envSchema.parse(process.env);

ロールバック戦略

インスタントロールバック

# Docker/Kubernetes: 前のイメージをポイントする
kubectl rollout undo deployment/app

# Vercel: 前のデプロイメントを昇格
vercel rollback

# Railway: 前のコミットを再デプロイ
railway up --commit <previous-sha>

# データベース: マイグレーションをロールバック (可逆的な場合)
npx prisma migrate resolve --rolled-back <migration-name>

ロールバックチェックリスト

  • 前のイメージ/アーティファクトが利用可能でタグ付けされている
  • データベースマイグレーションが後方互換性を持つ (破壊的な変更なし)
  • 機能フラグはデプロイなしで新機能を無効にできる
  • エラー率スパイク用のモニタリングアラートが設定されている
  • ロールバックが本番リリース前にステージングで確認されている

本番環境準備チェックリスト

本番環境へのデプロイメント前に:

アプリケーション

  • すべてのテストが成功している (ユニット、統合、E2E)
  • コードや設定ファイルにハードコードされたシークレットがない
  • エラーハンドリングがすべてのエッジケースをカバーしている
  • ログは構造化されている (JSON) で PII を含まない
  • ヘルスチェックエンドポイントが意味のあるステータスを返す

インフラストラクチャ

  • Docker イメージが再現可能にビルドされる (バージョン固定)
  • 環境変数がドキュメント化され、起動時に検証される
  • リソースリミットが設定されている (CPU、メモリ)
  • 水平スケーリングが設定されている (最小/最大インスタンス)
  • すべてのエンドポイントで SSL/TLS が有効

モニタリング

  • アプリケーションメトリクスがエクスポートされている (要求レート、レイテンシ、エラー)
  • エラー率がしきい値を超えたときのアラートが設定されている
  • ログ集約が設定されている (構造化ログ、検索可能)
  • ヘルスエンドポイントの稼働時間モニタリング

セキュリティ

  • 依存関係が CVE でスキャンされている
  • CORS が許可されたオリジンのみに設定されている
  • レート制限が公開エンドポイントで有効
  • 認証と認可が確認されている
  • セキュリティヘッダーが設定されている (CSP、HSTS、X-Frame-Options)

運用

  • ロールバック計画がドキュメント化され、テストされている
  • データベースマイグレーションが本番規模のデータに対してテストされている
  • 一般的な障害シナリオの実行ガイド
  • オンコール順番とエスカレーションパスが定義されている

このスキルを使用するタイミング

  • CI/CD パイプラインの構築
  • アプリケーションの Docker 化
  • デプロイメント戦略の計画
  • ヘルスチェックの実装
  • 本番リリースの準備
  • デプロイメント問題のトラブルシューティング

ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ

詳細情報

作者
affaan-m
リポジトリ
affaan-m/everything-claude-code
ライセンス
MIT
最終更新
不明

Source: https://github.com/affaan-m/everything-claude-code / ライセンス: MIT

関連スキル

汎用ソフトウェア開発⭐ リポ 39,967

doubt-driven-development

重要な判断はすべて、本番環境への展開前に新しい視点から対抗的レビューを実施します。速度より正確性が重要な場合、不慣れなコードを扱う場合、本番環境・セキュリティに関わるロジック・取り消し不可の操作など影響度が高い場合、または後でバグを修正するよりも今検証する方が効率的な場合に活用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 1,175

apprun-skills

TypeScriptを使用したAppRunアプリケーションのMVU設計に関する総合的なガイダンスが得られます。コンポーネントパターン、イベントハンドリング、状態管理(非同期ジェネレータを含む)、パラメータと保護機能を備えたルーティング・ナビゲーション、vistestを使用したテストに対応しています。AppRunコンポーネントの設計・レビュー、ルートの配線、状態フローの管理、AppRunテストの作成時に活用してください。

by yysun
OpenAIソフトウェア開発⭐ リポ 797

desloppify

コードベースのヘルスチェックと技術負債の追跡ツールです。コード品質、技術負債、デッドコード、大規模ファイル、ゴッドクラス、重複関数、コードスメル、命名規則の問題、インポートサイクル、結合度の問題についてユーザーが質問した場合に使用してください。また、ヘルススコアの確認、次の改善項目の提案、クリーンアップ計画の作成をリクエストされた際にも対応します。29言語に対応しています。

by Git-on-my-level
汎用ソフトウェア開発⭐ リポ 39,967

debugging-and-error-recovery

テストが失敗したり、ビルドが壊れたり、動作が期待と異なったり、予期しないエラーが発生したりした場合に、体系的な根本原因デバッグをガイドします。推測ではなく、根本原因を見つけて修正するための体系的なアプローチが必要な場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

test-driven-development

テスト駆動開発により実装を進めます。ロジックの実装、バグの修正、動作の変更など、あらゆる場面で活用できます。コードが正常に動作することを証明する必要がある場合、バグ報告を受けた場合、既存機能を修正する予定がある場合に使用してください。

by addyosmani
汎用ソフトウェア開発⭐ リポ 39,967

incremental-implementation

変更を段階的に実施します。複数のファイルに影響する機能や変更を実装する場合に使用してください。大量のコードを一度に書こうとしている場合や、タスクが一度では完結できないほど大きい場合に活用します。

by addyosmani
本サイトは GitHub 上で公開されているオープンソースの SKILL.md ファイルをクロール・インデックス化したものです。 各スキルの著作権は原作者に帰属します。掲載に問題がある場合は info@alsel.co.jp または /takedown フォームよりご連絡ください。
原作者: affaan-m · affaan-m/everything-claude-code · ライセンス: MIT