Communitygithub.com

部署模式

部署工作流、CI/CD流水线模式、Docker容器化、健康检查、回滚策略以及Web应用的生产就绪清单。适用于设置CI/CD、容器化应用或发布前检查生产就绪状态。

部署模式 是什么?

此技能旨在为开发者提供一套全面的部署模式和实践指南,涵盖从CI/CD流水线配置到生产环境发布的全流程。它详细介绍了滚动部署、蓝绿部署和金丝雀部署三种主流策略的优缺点及适用场景,并提供了基于不同技术栈(Node.js、Go、Python/Django)的多阶段Dockerfile最佳实践。此外,技能还包含了GitHub Actions的标准流水线配置、多种健康检查端点的实现方式(简单与详细),以及Kubernetes探针的配置示例。最后,它提供了一个详尽的生产就绪检查清单,覆盖应用、基础设施、监控、安全和运维等多个维度,帮助确保每次发布的可靠性和稳定性。该技能支持在主流AI编程助手如Claude Code、Cursor和Codex中激活使用。

兼容平台~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/affaan-m/everything-claude-code/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:
  代码检查 → 类型检查 → 单元测试 → 集成测试 → 构建镜像 → 部署到staging → 冒烟测试 → 部署到生产

健康检查

健康检查端点

// 简单健康检查
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>

回滚检查清单

  • 之前的镜像/工件可用且已标记
  • 数据库迁移向后兼容(无破坏性更改)
  • 功能标志可以在不部署的情况下禁用新功能
  • 配置了错误率峰值监控警报
  • 在生产发布前在staging环境中测试了回滚

生产就绪检查清单

在任何生产部署之前:

应用程序

  • 所有测试通过(单元、集成、E2E)
  • 代码或配置文件中没有硬编码的机密
  • 错误处理覆盖所有边缘情况
  • 日志是结构化的(JSON)且不包含个人可识别信息
  • 健康检查端点返回有意义的状态

基础设施

  • Docker镜像可重现构建(固定版本)
  • 环境变量已记录并在启动时验证
  • 设置了资源限制(CPU、内存)
  • 配置了水平扩展(最小/最大实例数)
  • 在所有端点上启用了SSL/TLS

监控

  • 导出了应用程序指标(请求率、延迟、错误)
  • 配置了错误率超过阈值的警报
  • 设置了日志聚合(结构化日志、可搜索)
  • 对健康端点进行了正常运行时间监控

安全

  • 扫描了依赖项以查找常见漏洞与暴露
  • 仅针对允许的来源配置了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/claude-api

Anthropic Claude API patterns for Python and TypeScript. Covers Messages API, streaming, tool use, vision, extended thinking, batches, prompt caching, and Claude Agent SDK. Use when building applications with the Claude API or Anthropic SDKs.

affaan-m/everything-claude-code

End-to-end marketing campaign planning and execution. Covers audience research, positioning, campaign angle definition, landing page copy, email sequences, social posts, ad copy, short-form video scripts, and content calendars. Use as the orchestration layer for multi-channel product launches. Use when planning or executing a multi-channel product launch, or producing landing page, email, social, or ad copy.

affaan-m/everything-claude-code

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/everything-claude-code-conventions

Development conventions and patterns for everything-claude-code. JavaScript project with conventional commits.

affaan-m/frontend-design

Create distinctive, production-grade frontend interfaces with high design quality. Use when the user asks to build web components, pages, or applications and the visual direction matters as much as the code quality.

affaan-m/gget

gget CLI and Python workflow for quick genomic database queries, sequence lookup, BLAST-style searches, enrichment checks, and reproducible bioinformatics evidence logs.

affaan-m/literature-review

Systematic literature-review workflow for academic, biomedical, technical, and scientific topics, including search planning, source screening, synthesis, citation checks, and evidence logging.

affaan-m/motion-ui

Production-ready UI motion system for React/Next.js. Use when implementing animations, transitions, or motion patterns.

affaan-m/project-guidelines-example

Example project-specific skill template based on a real production application.

affaan-m/pubmed-database

Direct PubMed and NCBI E-utilities search workflows for biomedical literature, MeSH queries, PMID lookup, citation retrieval, and API-backed literature monitoring.

affaan-m/scholar-evaluation

Structured scholarly-work evaluation for papers, proposals, literature reviews, methods sections, evidence quality, citation support, and research-writing feedback.

affaan-m/uspto-database

USPTO patent and trademark data workflow for official record lookup, PatentSearch queries, TSDR checks, assignment data, and reproducible IP research logs.

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.

相关技能