[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6F0SMNRF1TPHWSSEBGV6XPF":3,"skill-same:01M6F0SMNRF1TPHWSSEBGV6XPF":90},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":26,"publishedAt":47,"linkOnly":48,"markdownContent":49,"markdownBody":50,"frontMatter":51,"refName":55,"commitSha":56,"skillDirectory":57,"forksCount":58,"repositoryHtmlUrl":59,"repositoryHomepageUrl":60,"ownerHtmlUrl":61,"ownerBlogUrl":6,"ownerDescription":62,"updatedAt":63,"install":64,"resources":77},"01M6F0SMNRF1TPHWSSEBGV6XPF","deployment-automation",null,"Automate application deployment to cloud platforms and servers. Use when setting up CI\u002FCD pipelines, deploying to Docker\u002FKubernetes, or configuring cloud infrastructure. Handles GitHub Actions, Docker, Kubernetes, AWS, Vercel, and deployment best practices.","ComeOnOliver\u002Fskillshub","ComeOnOliver","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F43215937?v=4","01M6E5JNFECJAAVFE0W7SMWWD2","Haoran Shu","01M6E5JNNDQS7AJZDYFQ8TPZCK",67,"MIT","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Fdeployment-automation\u002FSKILL.md",[18,23],{"categoryNo":19,"categoryName":20,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},"01JBSEEDCAT000000000000023","Skill与智能体开发",[27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46],"deployment automation","automation","deployment","ci","CI\u002FCD","cloud platforms","up","vercel","use","automate","github-actions","github actions","gemini","actions","chatgpt","best practices","infrastructure","kubernetes","docker","github","2026-11-10 10:12:30",false,"---\nname: deployment-automation\ndescription: Automate application deployment to cloud platforms and servers. Use when setting up CI\u002FCD pipelines, deploying to Docker\u002FKubernetes, or configuring cloud infrastructure. Handles GitHub Actions, Docker, Kubernetes, AWS, Vercel, and deployment best practices.\nmetadata:\n  tags: deployment, CI\u002FCD, Docker, Kubernetes, AWS, GitHub-Actions, automation\n  platforms: Claude, ChatGPT, Gemini\n---\n\n\n# Deployment Automation\n\n\n## When to use this skill\n\n- **New Projects**: Set up automated deployment from scratch\n- **Manual Deployment Improvement**: Automate repetitive manual tasks\n- **Multi-Environment**: Separate dev, staging, and production environments\n- **Scaling**: Introduce Kubernetes to handle traffic growth\n\n## Instructions\n\n### Step 1: Docker Containerization\n\nPackage the application as a Docker image.\n\n**Dockerfile** (Node.js app):\n```dockerfile\n# Multi-stage build for smaller image size\nFROM node:18-alpine AS builder\n\nWORKDIR \u002Fapp\n\n# Copy package files and install dependencies\nCOPY package*.json .\u002F\nRUN npm ci --only=production\n\n# Copy source code\nCOPY . .\n\n# Build application (if needed)\nRUN npm run build\n\n# Production stage\nFROM node:18-alpine\n\nWORKDIR \u002Fapp\n\n# Copy only necessary files from builder\nCOPY --from=builder \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY --from=builder \u002Fapp\u002Fdist .\u002Fdist\nCOPY --from=builder \u002Fapp\u002Fpackage.json .\u002F\n\n# Create non-root user for security\nRUN addgroup -g 1001 -S nodejs && \\\n    adduser -S nodejs -u 1001\nUSER nodejs\n\n# Expose port\nEXPOSE 3000\n\n# Health check\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\n  CMD node healthcheck.js\n\n# Start application\nCMD [\"node\", \"dist\u002Findex.js\"]\n```\n\n**.dockerignore**:\n```\nnode_modules\nnpm-debug.log\n.git\n.env\n.env.local\ndist\nbuild\ncoverage\n.DS_Store\n```\n\n**Build and Run**:\n```bash\n# Build image\ndocker build -t myapp:latest .\n\n# Run container\ndocker run -d -p 3000:3000 --name myapp-container myapp:latest\n\n# Check logs\ndocker logs myapp-container\n\n# Stop and remove\ndocker stop myapp-container\ndocker rm myapp-container\n```\n\n### Step 2: GitHub Actions CI\u002FCD\n\nAutomatically runs tests and deploys on code push.\n\n**.github\u002Fworkflows\u002Fdeploy.yml**:\n```yaml\nname: CI\u002FCD Pipeline\n\non:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main]\n\nenv:\n  NODE_VERSION: '18'\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Setup Node.js\n        uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n          cache: 'npm'\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Run linter\n        run: npm run lint\n\n      - name: Run tests\n        run: npm test -- --coverage\n\n      - name: Upload coverage\n        uses: codecov\u002Fcodecov-action@v3\n        with:\n          files: .\u002Fcoverage\u002Fcoverage-final.json\n\n  build:\n    needs: test\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push' && github.ref == 'refs\u002Fheads\u002Fmain'\n\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Set up Docker Buildx\n        uses: docker\u002Fsetup-buildx-action@v3\n\n      - name: Log in to Container Registry\n        uses: docker\u002Flogin-action@v3\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata\n        id: meta\n        uses: docker\u002Fmetadata-action@v5\n        with:\n          images: ${{ env.REGISTRY }}\u002F${{ env.IMAGE_NAME }}\n          tags: |\n            type=sha,prefix={{branch}}-\n            type=semver,pattern={{version}}\n            latest\n\n      - name: Build and push Docker image\n        uses: docker\u002Fbuild-push-action@v5\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    environment: production\n\n    steps:\n      - name: Deploy to production\n        uses: appleboy\u002Fssh-action@v1.0.0\n        with:\n          host: ${{ secrets.PROD_HOST }}\n          username: ${{ secrets.PROD_USER }}\n          key: ${{ secrets.PROD_SSH_KEY }}\n          script: |\n            cd \u002Fapp\n            docker pull ${{ env.REGISTRY }}\u002F${{ env.IMAGE_NAME }}:latest\n            docker-compose up -d --no-deps --build web\n            docker image prune -f\n```\n\n### Step 3: Kubernetes Deployment\n\nImplement scalable container orchestration.\n\n**k8s\u002Fdeployment.yaml**:\n```yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp\n  namespace: production\n  labels:\n    app: myapp\nspec:\n  replicas: 3\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  selector:\n    matchLabels:\n      app: myapp\n  template:\n    metadata:\n      labels:\n        app: myapp\n    spec:\n      containers:\n      - name: myapp\n        image: ghcr.io\u002Fusername\u002Fmyapp:latest\n        imagePullPolicy: Always\n        ports:\n        - containerPort: 3000\n        env:\n        - name: NODE_ENV\n          value: \"production\"\n        - name: DATABASE_URL\n          valueFrom:\n            secretKeyRef:\n              name: myapp-secrets\n              key: database-url\n        resources:\n          requests:\n            memory: \"128Mi\"\n            cpu: \"100m\"\n          limits:\n            memory: \"256Mi\"\n            cpu: \"200m\"\n        livenessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 3000\n          initialDelaySeconds: 30\n          periodSeconds: 10\n        readinessProbe:\n          httpGet:\n            path: \u002Fready\n            port: 3000\n          initialDelaySeconds: 5\n          periodSeconds: 5\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: myapp-service\n  namespace: production\nspec:\n  selector:\n    app: myapp\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 3000\n  type: LoadBalancer\n\n---\napiVersion: autoscaling\u002Fv2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: myapp-hpa\n  namespace: production\nspec:\n  scaleTargetRef:\n    apiVersion: apps\u002Fv1\n    kind: Deployment\n    name: myapp\n  minReplicas: 2\n  maxReplicas: 10\n  metrics:\n  - type: Resource\n    resource:\n      name: cpu\n      target:\n        type: Utilization\n        averageUtilization: 70\n  - type: Resource\n    resource:\n      name: memory\n      target:\n        type: Utilization\n        averageUtilization: 80\n```\n\n**Deployment Script** (deploy.sh):\n```bash\n#!\u002Fbin\u002Fbash\nset -e\n\n# Variables\nNAMESPACE=\"production\"\nIMAGE_TAG=\"${1:-latest}\"\n\necho \"Deploying myapp:${IMAGE_TAG} to ${NAMESPACE}...\"\n\n# Apply Kubernetes manifests\nkubectl apply -f k8s\u002Fnamespace.yaml\nkubectl apply -f k8s\u002Fsecrets.yaml\nkubectl apply -f k8s\u002Fdeployment.yaml\nkubectl apply -f k8s\u002Fservice.yaml\n\n# Update image\nkubectl set image deployment\u002Fmyapp myapp=ghcr.io\u002Fusername\u002Fmyapp:${IMAGE_TAG} -n ${NAMESPACE}\n\n# Wait for rollout\nkubectl rollout status deployment\u002Fmyapp -n ${NAMESPACE} --timeout=5m\n\n# Verify\nkubectl get pods -n ${NAMESPACE} -l app=myapp\n\necho \"Deployment completed successfully!\"\n```\n\n### Step 4: Vercel\u002FNetlify (Frontend)\n\nSimply deploy static sites and Next.js apps.\n\n**vercel.json**:\n```json\n{\n  \"version\": 2,\n  \"builds\": [\n    {\n      \"src\": \"package.json\",\n      \"use\": \"@vercel\u002Fnext\"\n    }\n  ],\n  \"env\": {\n    \"DATABASE_URL\": \"@database-url\",\n    \"API_KEY\": \"@api-key\"\n  },\n  \"regions\": [\"sin1\", \"icn1\"],\n  \"headers\": [\n    {\n      \"source\": \"\u002F(.*)\",\n      \"headers\": [\n        {\n          \"key\": \"X-Frame-Options\",\n          \"value\": \"DENY\"\n        },\n        {\n          \"key\": \"X-Content-Type-Options\",\n          \"value\": \"nosniff\"\n        }\n      ]\n    }\n  ],\n  \"redirects\": [\n    {\n      \"source\": \"\u002Fold-path\",\n      \"destination\": \"\u002Fnew-path\",\n      \"permanent\": true\n    }\n  ]\n}\n```\n\n**CLI Deployment**:\n```bash\n# Install Vercel CLI\nnpm i -g vercel\n\n# Login\nvercel login\n\n# Deploy to preview\nvercel\n\n# Deploy to production\nvercel --prod\n\n# Set environment variable\nvercel env add DATABASE_URL\n```\n\n### Step 5: Zero-Downtime Deployment Strategy\n\nDeploy new versions without service interruption.\n\n**Blue-Green Deployment** (docker-compose):\n```yaml\nversion: '3.8'\n\nservices:\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    volumes:\n      - .\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fnginx.conf:ro\n    depends_on:\n      - app-blue\n      - app-green\n\n  app-blue:\n    image: myapp:blue\n    environment:\n      - NODE_ENV=production\n      - COLOR=blue\n\n  app-green:\n    image: myapp:green\n    environment:\n      - NODE_ENV=production\n      - COLOR=green\n```\n\n**switch.sh** (Blue\u002FGreen Switch):\n```bash\n#!\u002Fbin\u002Fbash\n\nCURRENT_COLOR=$(cat current_color.txt)\nNEW_COLOR=$([[ \"$CURRENT_COLOR\" == \"blue\" ]] && echo \"green\" || echo \"blue\")\n\n# Deploy new version to inactive environment\ndocker-compose up -d app-${NEW_COLOR}\n\n# Wait for health check\nsleep 10\n\n# Health check\nif curl -f http:\u002F\u002Flocalhost:8080\u002Fhealth; then\n  # Update nginx to point to new environment\n  sed -i \"s\u002F${CURRENT_COLOR}\u002F${NEW_COLOR}\u002Fg\" nginx.conf\n  docker-compose exec nginx nginx -s reload\n\n  # Update current color\n  echo ${NEW_COLOR} > current_color.txt\n\n  # Stop old environment after 5 minutes (rollback window)\n  sleep 300\n  docker-compose stop app-${CURRENT_COLOR}\n\n  echo \"Deployment successful! Switched to ${NEW_COLOR}\"\nelse\n  echo \"Health check failed! Keeping ${CURRENT_COLOR}\"\n  docker-compose stop app-${NEW_COLOR}\n  exit 1\nfi\n```\n\n## Output format\n\n### Deployment Checklist\n\n```markdown\n## Deployment Checklist\n\n### Pre-Deployment\n- [ ] All tests passing (unit, integration, E2E)\n- [ ] Code review approved\n- [ ] Environment variables configured\n- [ ] Database migrations ready\n- [ ] Rollback plan documented\n\n### Deployment\n- [ ] Docker image built and tagged\n- [ ] Image pushed to container registry\n- [ ] Kubernetes manifests applied\n- [ ] Rolling update started\n- [ ] Pods healthy and ready\n\n### Post-Deployment\n- [ ] Health check endpoint responding\n- [ ] Metrics\u002Flogs monitoring active\n- [ ] Performance baseline established\n- [ ] Old pods terminated (after grace period)\n- [ ] Deployment documented in changelog\n```\n\n## Constraints\n\n### Required Rules (MUST)\n\n1. **Health Checks**: Health check endpoint for all services\n   ```typescript\n   app.get('\u002Fhealth', (req, res) => {\n     res.status(200).json({ status: 'ok' });\n   });\n   ```\n\n2. **Graceful Shutdown**: Handle SIGTERM signal\n   ```javascript\n   process.on('SIGTERM', async () => {\n     console.log('SIGTERM received, shutting down gracefully');\n     await server.close();\n     await db.close();\n     process.exit(0);\n   });\n   ```\n\n3. **Environment Variable Separation**: No hardcoding; use .env files\n\n### Prohibited Rules (MUST NOT)\n\n1. **No Committing Secrets**: Never commit API keys or passwords to Git\n2. **No Debug Mode in Production**: `NODE_ENV=production` is required\n3. **Avoid latest tag only**: Use version tags (v1.0.0, sha-abc123)\n\n## Best practices\n\n1. **Multi-stage Docker builds**: Minimize image size\n2. **Immutable infrastructure**: Redeploy instead of modifying servers\n3. **Blue-Green deployment**: Zero-downtime deployment and easy rollback\n4. **Monitoring required**: Prometheus, Grafana, Datadog\n\n## References\n\n- [Docker Docs](https:\u002F\u002Fdocs.docker.com\u002F)\n- [Kubernetes Docs](https:\u002F\u002Fkubernetes.io\u002Fdocs\u002F)\n- [GitHub Actions](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions)\n- [Vercel](https:\u002F\u002Fvercel.com\u002Fdocs)\n- [12 Factor App](https:\u002F\u002F12factor.net\u002F)\n\n## Metadata\n\n### Version\n- **Current Version**: 1.0.0\n- **Last Updated**: 2025-01-01\n- **Compatible Platforms**: Claude, ChatGPT, Gemini\n\n### Related Skills\n- [monitoring](..\u002Fmonitoring\u002FSKILL.md): Post-deployment monitoring\n- [security](..\u002Fsecurity\u002FSKILL.md): Deployment security\n\n### Tags\n`#deployment` `#CI\u002FCD` `#Docker` `#Kubernetes` `#automation` `#infrastructure`\n\n## Examples\n\n### Example 1: Basic usage\n\u003C!-- Add example content here -->\n\n### Example 2: Advanced usage\n\u003C!-- Add advanced example content here -->\n","# Deployment Automation\n\n\n## When to use this skill\n\n- **New Projects**: Set up automated deployment from scratch\n- **Manual Deployment Improvement**: Automate repetitive manual tasks\n- **Multi-Environment**: Separate dev, staging, and production environments\n- **Scaling**: Introduce Kubernetes to handle traffic growth\n\n## Instructions\n\n### Step 1: Docker Containerization\n\nPackage the application as a Docker image.\n\n**Dockerfile** (Node.js app):\n```dockerfile\n# Multi-stage build for smaller image size\nFROM node:18-alpine AS builder\n\nWORKDIR \u002Fapp\n\n# Copy package files and install dependencies\nCOPY package*.json .\u002F\nRUN npm ci --only=production\n\n# Copy source code\nCOPY . .\n\n# Build application (if needed)\nRUN npm run build\n\n# Production stage\nFROM node:18-alpine\n\nWORKDIR \u002Fapp\n\n# Copy only necessary files from builder\nCOPY --from=builder \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY --from=builder \u002Fapp\u002Fdist .\u002Fdist\nCOPY --from=builder \u002Fapp\u002Fpackage.json .\u002F\n\n# Create non-root user for security\nRUN addgroup -g 1001 -S nodejs && \\\n    adduser -S nodejs -u 1001\nUSER nodejs\n\n# Expose port\nEXPOSE 3000\n\n# Health check\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\n  CMD node healthcheck.js\n\n# Start application\nCMD [\"node\", \"dist\u002Findex.js\"]\n```\n\n**.dockerignore**:\n```\nnode_modules\nnpm-debug.log\n.git\n.env\n.env.local\ndist\nbuild\ncoverage\n.DS_Store\n```\n\n**Build and Run**:\n```bash\n# Build image\ndocker build -t myapp:latest .\n\n# Run container\ndocker run -d -p 3000:3000 --name myapp-container myapp:latest\n\n# Check logs\ndocker logs myapp-container\n\n# Stop and remove\ndocker stop myapp-container\ndocker rm myapp-container\n```\n\n### Step 2: GitHub Actions CI\u002FCD\n\nAutomatically runs tests and deploys on code push.\n\n**.github\u002Fworkflows\u002Fdeploy.yml**:\n```yaml\nname: CI\u002FCD Pipeline\n\non:\n  push:\n    branches: [main, develop]\n  pull_request:\n    branches: [main]\n\nenv:\n  NODE_VERSION: '18'\n  REGISTRY: ghcr.io\n  IMAGE_NAME: ${{ github.repository }}\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Setup Node.js\n        uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: ${{ env.NODE_VERSION }}\n          cache: 'npm'\n\n      - name: Install dependencies\n        run: npm ci\n\n      - name: Run linter\n        run: npm run lint\n\n      - name: Run tests\n        run: npm test -- --coverage\n\n      - name: Upload coverage\n        uses: codecov\u002Fcodecov-action@v3\n        with:\n          files: .\u002Fcoverage\u002Fcoverage-final.json\n\n  build:\n    needs: test\n    runs-on: ubuntu-latest\n    if: github.event_name == 'push' && github.ref == 'refs\u002Fheads\u002Fmain'\n\n    steps:\n      - uses: actions\u002Fcheckout@v4\n\n      - name: Set up Docker Buildx\n        uses: docker\u002Fsetup-buildx-action@v3\n\n      - name: Log in to Container Registry\n        uses: docker\u002Flogin-action@v3\n        with:\n          registry: ${{ env.REGISTRY }}\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n\n      - name: Extract metadata\n        id: meta\n        uses: docker\u002Fmetadata-action@v5\n        with:\n          images: ${{ env.REGISTRY }}\u002F${{ env.IMAGE_NAME }}\n          tags: |\n            type=sha,prefix={{branch}}-\n            type=semver,pattern={{version}}\n            latest\n\n      - name: Build and push Docker image\n        uses: docker\u002Fbuild-push-action@v5\n        with:\n          context: .\n          push: true\n          tags: ${{ steps.meta.outputs.tags }}\n          labels: ${{ steps.meta.outputs.labels }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    environment: production\n\n    steps:\n      - name: Deploy to production\n        uses: appleboy\u002Fssh-action@v1.0.0\n        with:\n          host: ${{ secrets.PROD_HOST }}\n          username: ${{ secrets.PROD_USER }}\n          key: ${{ secrets.PROD_SSH_KEY }}\n          script: |\n            cd \u002Fapp\n            docker pull ${{ env.REGISTRY }}\u002F${{ env.IMAGE_NAME }}:latest\n            docker-compose up -d --no-deps --build web\n            docker image prune -f\n```\n\n### Step 3: Kubernetes Deployment\n\nImplement scalable container orchestration.\n\n**k8s\u002Fdeployment.yaml**:\n```yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp\n  namespace: production\n  labels:\n    app: myapp\nspec:\n  replicas: 3\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1\n      maxUnavailable: 0\n  selector:\n    matchLabels:\n      app: myapp\n  template:\n    metadata:\n      labels:\n        app: myapp\n    spec:\n      containers:\n      - name: myapp\n        image: ghcr.io\u002Fusername\u002Fmyapp:latest\n        imagePullPolicy: Always\n        ports:\n        - containerPort: 3000\n        env:\n        - name: NODE_ENV\n          value: \"production\"\n        - name: DATABASE_URL\n          valueFrom:\n            secretKeyRef:\n              name: myapp-secrets\n              key: database-url\n        resources:\n          requests:\n            memory: \"128Mi\"\n            cpu: \"100m\"\n          limits:\n            memory: \"256Mi\"\n            cpu: \"200m\"\n        livenessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 3000\n          initialDelaySeconds: 30\n          periodSeconds: 10\n        readinessProbe:\n          httpGet:\n            path: \u002Fready\n            port: 3000\n          initialDelaySeconds: 5\n          periodSeconds: 5\n\n---\napiVersion: v1\nkind: Service\nmetadata:\n  name: myapp-service\n  namespace: production\nspec:\n  selector:\n    app: myapp\n  ports:\n  - protocol: TCP\n    port: 80\n    targetPort: 3000\n  type: LoadBalancer\n\n---\napiVersion: autoscaling\u002Fv2\nkind: HorizontalPodAutoscaler\nmetadata:\n  name: myapp-hpa\n  namespace: production\nspec:\n  scaleTargetRef:\n    apiVersion: apps\u002Fv1\n    kind: Deployment\n    name: myapp\n  minReplicas: 2\n  maxReplicas: 10\n  metrics:\n  - type: Resource\n    resource:\n      name: cpu\n      target:\n        type: Utilization\n        averageUtilization: 70\n  - type: Resource\n    resource:\n      name: memory\n      target:\n        type: Utilization\n        averageUtilization: 80\n```\n\n**Deployment Script** (deploy.sh):\n```bash\n#!\u002Fbin\u002Fbash\nset -e\n\n# Variables\nNAMESPACE=\"production\"\nIMAGE_TAG=\"${1:-latest}\"\n\necho \"Deploying myapp:${IMAGE_TAG} to ${NAMESPACE}...\"\n\n# Apply Kubernetes manifests\nkubectl apply -f k8s\u002Fnamespace.yaml\nkubectl apply -f k8s\u002Fsecrets.yaml\nkubectl apply -f k8s\u002Fdeployment.yaml\nkubectl apply -f k8s\u002Fservice.yaml\n\n# Update image\nkubectl set image deployment\u002Fmyapp myapp=ghcr.io\u002Fusername\u002Fmyapp:${IMAGE_TAG} -n ${NAMESPACE}\n\n# Wait for rollout\nkubectl rollout status deployment\u002Fmyapp -n ${NAMESPACE} --timeout=5m\n\n# Verify\nkubectl get pods -n ${NAMESPACE} -l app=myapp\n\necho \"Deployment completed successfully!\"\n```\n\n### Step 4: Vercel\u002FNetlify (Frontend)\n\nSimply deploy static sites and Next.js apps.\n\n**vercel.json**:\n```json\n{\n  \"version\": 2,\n  \"builds\": [\n    {\n      \"src\": \"package.json\",\n      \"use\": \"@vercel\u002Fnext\"\n    }\n  ],\n  \"env\": {\n    \"DATABASE_URL\": \"@database-url\",\n    \"API_KEY\": \"@api-key\"\n  },\n  \"regions\": [\"sin1\", \"icn1\"],\n  \"headers\": [\n    {\n      \"source\": \"\u002F(.*)\",\n      \"headers\": [\n        {\n          \"key\": \"X-Frame-Options\",\n          \"value\": \"DENY\"\n        },\n        {\n          \"key\": \"X-Content-Type-Options\",\n          \"value\": \"nosniff\"\n        }\n      ]\n    }\n  ],\n  \"redirects\": [\n    {\n      \"source\": \"\u002Fold-path\",\n      \"destination\": \"\u002Fnew-path\",\n      \"permanent\": true\n    }\n  ]\n}\n```\n\n**CLI Deployment**:\n```bash\n# Install Vercel CLI\nnpm i -g vercel\n\n# Login\nvercel login\n\n# Deploy to preview\nvercel\n\n# Deploy to production\nvercel --prod\n\n# Set environment variable\nvercel env add DATABASE_URL\n```\n\n### Step 5: Zero-Downtime Deployment Strategy\n\nDeploy new versions without service interruption.\n\n**Blue-Green Deployment** (docker-compose):\n```yaml\nversion: '3.8'\n\nservices:\n  nginx:\n    image: nginx:alpine\n    ports:\n      - \"80:80\"\n    volumes:\n      - .\u002Fnginx.conf:\u002Fetc\u002Fnginx\u002Fnginx.conf:ro\n    depends_on:\n      - app-blue\n      - app-green\n\n  app-blue:\n    image: myapp:blue\n    environment:\n      - NODE_ENV=production\n      - COLOR=blue\n\n  app-green:\n    image: myapp:green\n    environment:\n      - NODE_ENV=production\n      - COLOR=green\n```\n\n**switch.sh** (Blue\u002FGreen Switch):\n```bash\n#!\u002Fbin\u002Fbash\n\nCURRENT_COLOR=$(cat current_color.txt)\nNEW_COLOR=$([[ \"$CURRENT_COLOR\" == \"blue\" ]] && echo \"green\" || echo \"blue\")\n\n# Deploy new version to inactive environment\ndocker-compose up -d app-${NEW_COLOR}\n\n# Wait for health check\nsleep 10\n\n# Health check\nif curl -f http:\u002F\u002Flocalhost:8080\u002Fhealth; then\n  # Update nginx to point to new environment\n  sed -i \"s\u002F${CURRENT_COLOR}\u002F${NEW_COLOR}\u002Fg\" nginx.conf\n  docker-compose exec nginx nginx -s reload\n\n  # Update current color\n  echo ${NEW_COLOR} > current_color.txt\n\n  # Stop old environment after 5 minutes (rollback window)\n  sleep 300\n  docker-compose stop app-${CURRENT_COLOR}\n\n  echo \"Deployment successful! Switched to ${NEW_COLOR}\"\nelse\n  echo \"Health check failed! Keeping ${CURRENT_COLOR}\"\n  docker-compose stop app-${NEW_COLOR}\n  exit 1\nfi\n```\n\n## Output format\n\n### Deployment Checklist\n\n```markdown\n## Deployment Checklist\n\n### Pre-Deployment\n- [ ] All tests passing (unit, integration, E2E)\n- [ ] Code review approved\n- [ ] Environment variables configured\n- [ ] Database migrations ready\n- [ ] Rollback plan documented\n\n### Deployment\n- [ ] Docker image built and tagged\n- [ ] Image pushed to container registry\n- [ ] Kubernetes manifests applied\n- [ ] Rolling update started\n- [ ] Pods healthy and ready\n\n### Post-Deployment\n- [ ] Health check endpoint responding\n- [ ] Metrics\u002Flogs monitoring active\n- [ ] Performance baseline established\n- [ ] Old pods terminated (after grace period)\n- [ ] Deployment documented in changelog\n```\n\n## Constraints\n\n### Required Rules (MUST)\n\n1. **Health Checks**: Health check endpoint for all services\n   ```typescript\n   app.get('\u002Fhealth', (req, res) => {\n     res.status(200).json({ status: 'ok' });\n   });\n   ```\n\n2. **Graceful Shutdown**: Handle SIGTERM signal\n   ```javascript\n   process.on('SIGTERM', async () => {\n     console.log('SIGTERM received, shutting down gracefully');\n     await server.close();\n     await db.close();\n     process.exit(0);\n   });\n   ```\n\n3. **Environment Variable Separation**: No hardcoding; use .env files\n\n### Prohibited Rules (MUST NOT)\n\n1. **No Committing Secrets**: Never commit API keys or passwords to Git\n2. **No Debug Mode in Production**: `NODE_ENV=production` is required\n3. **Avoid latest tag only**: Use version tags (v1.0.0, sha-abc123)\n\n## Best practices\n\n1. **Multi-stage Docker builds**: Minimize image size\n2. **Immutable infrastructure**: Redeploy instead of modifying servers\n3. **Blue-Green deployment**: Zero-downtime deployment and easy rollback\n4. **Monitoring required**: Prometheus, Grafana, Datadog\n\n## References\n\n- [Docker Docs](https:\u002F\u002Fdocs.docker.com\u002F)\n- [Kubernetes Docs](https:\u002F\u002Fkubernetes.io\u002Fdocs\u002F)\n- [GitHub Actions](https:\u002F\u002Fdocs.github.com\u002Fen\u002Factions)\n- [Vercel](https:\u002F\u002Fvercel.com\u002Fdocs)\n- [12 Factor App](https:\u002F\u002F12factor.net\u002F)\n\n## Metadata\n\n### Version\n- **Current Version**: 1.0.0\n- **Last Updated**: 2025-01-01\n- **Compatible Platforms**: Claude, ChatGPT, Gemini\n\n### Related Skills\n- [monitoring](..\u002Fmonitoring\u002FSKILL.md): Post-deployment monitoring\n- [security](..\u002Fsecurity\u002FSKILL.md): Deployment security\n\n### Tags\n`#deployment` `#CI\u002FCD` `#Docker` `#Kubernetes` `#automation` `#infrastructure`\n\n## Examples\n\n### Example 1: Basic usage\n\u003C!-- Add example content here -->\n\n### Example 2: Advanced usage\n\u003C!-- Add advanced example content here -->\n",{"name":5,"metadata":52,"description":7},{"tags":53,"platforms":54},"deployment, CI\u002FCD, Docker, Kubernetes, AWS, GitHub-Actions, automation","Claude, ChatGPT, Gemini","main","def8531e65114c0fca8fb8551c1871ee0eed705c","skills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Fdeployment-automation",24,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub","https:\u002F\u002Fskillshub.wtf","https:\u002F\u002Fgithub.com\u002FComeOnOliver","AI & Blockchain Engineer\r\n","2026-06-24 22:07:19",{"source":8,"skillName":5,"commands":65,"prompt":75,"zipAvailable":76},[66,69,72],{"tool":67,"command":68},"npx","npx skills add ComeOnOliver\u002Fskillshub --skill deployment-automation",{"tool":70,"command":71},"bunx","bunx skills add ComeOnOliver\u002Fskillshub --skill deployment-automation",{"tool":73,"command":74},"pnpm","pnpm dlx skills add ComeOnOliver\u002Fskillshub --skill deployment-automation","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Fdeployment-automation\u002FSKILL.md",true,[78,84],{"path":79,"resourceType":80,"resourceTypeDesc":81,"sizeBytes":82,"sourceHtmlUrl":83},"skill-report.json","REFERENCE","参考文档",9321,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Fdeployment-automation\u002Fskill-report.json",{"path":85,"resourceType":86,"resourceTypeDesc":87,"sizeBytes":88,"sourceHtmlUrl":89},"SKILL.toon","OTHER","其他",653,"https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Faiskillstore\u002Fmarketplace\u002Fsupercent-io\u002Fdeployment-automation\u002FSKILL.toon",[91,101,111,120,126,133],{"skillNo":92,"name":93,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":94,"categories":95,"keywords":97,"publishedAt":47},"01M6FKJN13GMG4KY57J3QD8GY5","model-hierarchy-skill","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzscole\u002Fmodel-hierarchy-skill\u002Fmodel-hierarchy-skill\u002FSKILL.md",[96],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[98,99,100],"model","model hierarchy","model hierarchy skill",{"skillNo":102,"name":103,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":104,"categories":105,"keywords":107,"publishedAt":47},"01M6FKJJJ6GCAMR4PPPRD12M5X","zoom-mcp","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-mcp\u002FSKILL.md",[106],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[108,109,110],"MCP","zoom","zoom mcp",{"skillNo":112,"name":113,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":114,"categories":115,"keywords":116,"publishedAt":47},"01M6FKJE3KYT3KPEZMEEHYKA6K","zoom-apps-sdk","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fzoom-apps-sdk\u002FSKILL.md",[],[117,118,119,109],"sdk","zoom apps sdk","apps",{"skillNo":121,"name":122,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":123,"categories":124,"keywords":125,"publishedAt":47},"01M6FKJ9EDH9Q5VWDF8HAJRSP0","windows","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwindows\u002FSKILL.md",[],[122],{"skillNo":127,"name":128,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":132,"publishedAt":47},"01M6FKJ666BEEFC3AE9GJ72Q93","whiteboard","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwhiteboard\u002FSKILL.md",[131],{"categoryNo":24,"categoryName":25,"taxonomyType":21,"taxonomyTypeDesc":22},[128],{"skillNo":134,"name":135,"nameZh":6,"description":6,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":136,"categories":137,"keywords":138,"publishedAt":47},"01M6FKJ21WFCDGTJQ2Q91T9DVW","websockets","https:\u002F\u002Fgithub.com\u002FComeOnOliver\u002Fskillshub\u002Fblob\u002Fmain\u002Fskills\u002Fzoom\u002Fskills\u002Fwebsockets\u002FSKILL.md",[],[135]]