Communitygithub.com

部署模式

为Web应用提供部署工作流、CI/CD管道模式、Docker容器化、健康检查、回滚策略以及生产就绪检查清单。在设置CI/CD、容器化应用或发布前检查生产就绪度时使用。

部署模式 是什么?

该技能专为AI代理(如Claude Code、Cursor、Codex)设计,提供全面的生产级部署实践指南。它涵盖了三种主要部署策略:滚动部署(默认)、蓝绿部署和金丝雀部署,每种策略都有优缺点和适用场景。技能包含针对Node.js、Go和Python/Django的多阶段Dockerfile最佳实践,以及GitHub Actions的完整CI/CD管道配置。此外,还提供了健康检查端点实现(简单和详细)、Kubernetes探针配置、基于十二要素应用模式的环境配置(含Zod验证)、数据库迁移回滚策略以及详尽的生产就绪检查清单,涵盖应用、基础设施、监控、安全和运维方面。该技能适用于各种平台,包括Docker、Kubernetes、Vercel、Railway等。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/ECC/tree/main/skills/deployment-patterns

在你喜欢的 AI 中提问

打开一个已预加载此 Agent Skill 的新对话。

文档

部署模式 是做什么的?

生产部署工作流和CI/CD最佳实践。

何时激活

  • 设置CI/CD管道
  • Docker化应用程序
  • 规划部署策略(蓝绿、金丝雀、滚动)
  • 实现健康检查和就绪探针
  • 准备生产发布
  • 配置环境特定设置

部署策略

滚动部署(默认)

逐步替换实例——在推出过程中新旧版本同时运行。

实例1:v1 → v2  (首先更新)
实例2:v1        (仍在运行v1)
实例3:v1        (仍在运行v1)

实例1:v2
实例2:v1 → v2  (第二个更新)
实例3:v1

实例1:v2
实例2:v2
实例3:v1 → v2  (最后更新)

优点: 零停机、逐步推出
缺点: 两个版本同时运行——需要向后兼容的更改
使用场景: 标准部署、向后兼容的更改

蓝绿部署

运行两个相同的环境。原子切换流量。

蓝色  (v1)← 流量
绿色  (v2)空闲,运行新版本

# 验证后:
蓝色  (v1)空闲(成为备用)
绿色  (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:22-alpine,而不是node:latest)
- 多阶段构建以最小化镜像大小
- 以非root用户运行
- 首先复制依赖文件(层缓存)
- 使用.dockerignore排除node_modules、.git、测试文件
- 添加HEALTHCHECK指令
- 在docker-compose或k8s中设置资源限制

# 不好的实践
- 以root运行
- 使用:latest标签
- 在一个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: 部署到生产环境
        run: |
          # 特定平台的部署命令
          # Railway: railway up
          # Vercel: vercel --prod
          # K8s: kubectl set image deployment/app app=ghcr.io/${{ github.repository }}:${{ github.sha }}
          echo "部署 ${{ github.sha }}"

管道阶段

PR打开:
  代码检查 → 类型检查 → 单元测试 → 集成测试 → 预览部署

合并到main:
  代码检查 → 类型检查 → 单元测试 → 集成测试 → 构建镜像 → 部署暂存 → 烟雾测试 → 部署生产

健康检查

健康检查端点

// 简单健康检查
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: "数据库不可达" };
  }
}

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 最大启动时间

环境配置

十二要素应用模式

# 所有配置通过环境变量——从不硬编码
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)

运维

  • 回滚计划已记录并测试
  • 针对生产规模的数据测试了数据库迁移
  • 常见故障场景的操作手册
  • 定义了轮值班和升级路径

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

accessibility

Design, implement, and audit inclusive digital products using WCAG 2.2 Level AA. Use when building or auditing UI that must meet WCAG 2.2 Level AA, or when reviewing a change for keyboard, contrast, or screen-reader support.

affaan-m/content-engine

Create platform-native content systems for X, LinkedIn, TikTok, YouTube, newsletters, and repurposed multi-platform campaigns. Use when the user wants social posts, threads, scripts, content calendars, or one source asset adapted cleanly across platforms.

affaan-m/ECC

Multi-platform content distribution across X, LinkedIn, Threads, and Bluesky. Adapts content per platform using content-engine patterns. Never posts identical content cross-platform. Use when the user wants to distribute content across social platforms.

affaan-m/fal-ai-media

Unified media generation via fal.ai MCP — image, video, and audio. Covers text-to-image (Nano Banana), text/image-to-video (Seedance, Kling, Veo 3), text-to-speech (CSM-1B), and video-to-audio (ThinkSound). Use when the user wants to generate images, videos, or audio with AI.

affaan-m/manim-video

日本語翻訳:このファイルは manim-video 用の日本語翻訳が必要です

affaan-m/remotion-video-creation

Remotion のベストプラクティス - React で動画を作成する。3D、アニメーション、音声、字幕、チャート、トランジションなどをカバーするドメイン固有の29のルール。

affaan-m/video-editing

AI-assisted video editing workflows for cutting, structuring, and augmenting real footage. Covers the full pipeline from raw capture through FFmpeg, Remotion, ElevenLabs, fal.ai, and final polish in Descript or CapCut. Use when the user wants to edit video, cut footage, create vlogs, or build video content.

agent-architecture-audit

Full-stack diagnostic for agent and LLM applications. Audits the 12-layer agent stack for wrapper regression, memory pollution, tool discipline failures, hidden repair loops, and rendering corruption. Produces severity-ranked findings with code-first fixes. Essential for developers building agent applications, autonomous loops, or any LLM-powered feature. Use when an agent or LLM feature misbehaves and the failing layer is unknown, or before shipping an agent stack.

agent-eval

Head-to-head comparison of coding agents (Claude Code, Aider, Codex, etc.) on custom tasks with pass rate, cost, time, and consistency metrics. Use when choosing between coding agents, or when a change to an agent setup needs measured pass rate, cost, and time rather than an impression.

agent-harness-construction

Design and optimize AI agent action spaces, tool definitions, and observation formatting for higher completion rates. Use when defining or revising an agent

agentic-engineering

Operate as an agentic engineer using eval-first execution, decomposition, and cost-aware model routing. Use when planning or executing engineering work that agents will carry out end to end.

agentic-os

Build persistent multi-agent operating systems on Claude Code. Covers kernel architecture, specialist agents, slash commands, file-based memory, scheduled automation, and state management without external databases. Use when building a persistent multi-agent system on Claude Code with its own memory, commands, and scheduling.

agent-introspection-debugging

Structured self-debugging workflow for AI agent failures using capture, diagnosis, contained recovery, and introspection reports. Use when an agent run fails and you need a reproducible diagnosis instead of a retry.

agent-payment-x402

Add x402 payment execution to AI agents with per-task budgets, spending controls, and non-custodial wallets. Supports Base through agentwallet-sdk and X Layer through OKX Payments / OKX Agent Payments Protocol. Use when an agent must pay for something itself and needs per-task budgets, spending controls, and a non-custodial wallet.

agent-self-evaluation

Use after completing any non-trivial task. The agent self-rates its output on 5 axes — accuracy, completeness, clarity, actionability, conciseness — with concrete evidence per criterion. Produces a structured 1-5 scorecard with specific improvement suggestions.

agent-sort

Build an evidence-backed ECC install plan for a specific repo by sorting skills, commands, rules, hooks, and extras into DAILY vs LIBRARY buckets using parallel repo-aware review passes. Use when ECC should be trimmed to what a project actually needs instead of loading the full bundle.

ai-first-engineering

Engineering operating model for teams where AI agents generate a large share of implementation output. Use when setting team process, review gates, or ownership rules for a codebase largely written by agents.

ai-regression-testing

Regression testing strategies for AI-assisted development. Sandbox-mode API testing without database dependencies, automated bug-check workflows, and patterns to catch AI blind spots where the same model writes and reviews code. Use when adding regression coverage to AI-assisted code, or when the same model both wrote and reviewed a change.

android-clean-architecture

Clean Architecture patterns for Android and Kotlin Multiplatform projects — module structure, dependency rules, UseCases, Repositories, and data layer patterns. Use when structuring modules, layers, or data flow in an Android or KMP project.

angular-developer

Generates Angular code and provides architectural guidance. Trigger when creating projects, components, or services, or for best practices on reactivity (signals, linkedSignal, resource), forms, dependency injection, routing, SSR, accessibility (ARIA), animations, styling (component styles, Tailwind CSS), testing, or CLI tooling.

相关技能