[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6NXY5YN8MVTS0DBGVKCTF9K":3,"skill-same:01M6NXY5YN8MVTS0DBGVKCTF9K":82},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":15,"categories":16,"keywords":22,"publishedAt":43,"linkOnly":44,"markdownContent":45,"markdownBody":46,"frontMatter":47,"refName":33,"commitSha":57,"skillDirectory":58,"forksCount":13,"repositoryHtmlUrl":59,"repositoryHomepageUrl":6,"ownerHtmlUrl":60,"ownerBlogUrl":6,"ownerDescription":6,"updatedAt":61,"install":62,"resources":75},"01M6NXY5YN8MVTS0DBGVKCTF9K","blue-green-deploy",null,"Configure zero-downtime deployment strategies including blue-green, canary, and rolling deployments.","duc-duy-1612\u002FOnline-Delivery-Systems-Web","duc-duy-1612","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F192231384?v=4","01M6NSDKQQDKVTHZ8DZMZ1VYY6","01M6NSDKW8DDVTQHBT1HBDDJPT",0,"MIT","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fblue-green-deploy\u002FSKILL.md",[17],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000011","运维与部署","SCENARIO","使用场景",[23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42],"deploy","blue","blue green deploy","blue green","green","devops-security","access","configure","only","community","main","kubectl","strategies","ci","critical","scripts","relevant","git","blue-green","security","2026-11-10 10:12:30",false,"---\nname: blue-green-deploy\ndescription: Configure zero-downtime deployment strategies including blue-green, canary,\n  and rolling deployments.\ncategory: devops\nrisk: critical\nsource: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\nsource_repo: BagelHole\u002FDevOps-Security-Agent-Skills\nsource_type: community\ndate_added: '2026-09-20'\nlicense: MIT\nlicense_source: https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE\ncompatibility: Requires the relevant platform CLIs (kubectl, helm, terraform, git,\n  CI runners) and authorized access to the target environment. Docs-only; helper scripts\n  and templates not bundled.\nmetadata:\n  author: devops-skills\n  version: '1.0'\n---\n\n# Blue-Green & Deployment Strategies\n\nImplement zero-downtime deployment patterns for production systems.\n\n## Prerequisites\n\n- Load balancer or ingress controller\n- Container orchestration (K8s) or cloud platform\n- CI\u002FCD pipeline\n- Health check endpoints\n\n## Deployment Strategy Overview\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                    DEPLOYMENT STRATEGIES                     │\n├─────────────┬─────────────┬─────────────┬──────────────────┤\n│  Blue-Green │   Canary    │   Rolling   │    Recreate      │\n├─────────────┼─────────────┼─────────────┼──────────────────┤\n│ Full env    │ Gradual %   │ Pod by pod  │ All at once      │\n│ swap        │ rollout     │ replacement │                  │\n├─────────────┼─────────────┼─────────────┼──────────────────┤\n│ Instant     │ Slow, safe  │ Moderate    │ Fast, risky      │\n│ rollback    │ rollback    │ rollback    │                  │\n├─────────────┼─────────────┼─────────────┼──────────────────┤\n│ 2x resources│ +10-25%     │ Same        │ Same             │\n│ needed      │ resources   │ resources   │                  │\n└─────────────┴─────────────┴─────────────┴──────────────────┘\n```\n\n## Blue-Green Deployment\n\n### Concept\n\n```\nBefore:\n┌─────────┐     ┌───────────────┐\n│  Users  │────▶│  Blue (v1)    │ ◀── Active\n└─────────┘     └───────────────┘\n                ┌───────────────┐\n                │  Green (v2)   │ ◀── Staging\n                └───────────────┘\n\nAfter Switch:\n┌─────────┐     ┌───────────────┐\n│  Users  │     │  Blue (v1)    │ ◀── Standby\n└─────────┘     └───────────────┘\n      │         ┌───────────────┐\n      └────────▶│  Green (v2)   │ ◀── Active\n                └───────────────┘\n```\n\n### Kubernetes Implementation\n\n```yaml\n# blue-deployment.yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp-blue\n  labels:\n    app: myapp\n    version: blue\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: myapp\n      version: blue\n  template:\n    metadata:\n      labels:\n        app: myapp\n        version: blue\n    spec:\n      containers:\n      - name: myapp\n        image: myapp:v1.0.0\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n---\n# green-deployment.yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp-green\n  labels:\n    app: myapp\n    version: green\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: myapp\n      version: green\n  template:\n    metadata:\n      labels:\n        app: myapp\n        version: green\n    spec:\n      containers:\n      - name: myapp\n        image: myapp:v2.0.0\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n---\n# service.yaml - Switch by changing selector\napiVersion: v1\nkind: Service\nmetadata:\n  name: myapp\nspec:\n  selector:\n    app: myapp\n    version: blue  # Change to 'green' to switch\n  ports:\n  - port: 80\n    targetPort: 8080\n```\n\n### Switch Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# blue-green-switch.sh\n\nCURRENT=$(kubectl get svc myapp -o jsonpath='{.spec.selector.version}')\nNEW_VERSION=$1\n\necho \"Current version: $CURRENT\"\necho \"Switching to: $NEW_VERSION\"\n\n# Verify new deployment is ready\nkubectl rollout status deployment\u002Fmyapp-$NEW_VERSION\n\n# Check health\nHEALTH=$(kubectl exec -it deployment\u002Fmyapp-$NEW_VERSION -- curl -s localhost:8080\u002Fhealth)\nif [ \"$HEALTH\" != \"ok\" ]; then\n  echo \"Health check failed\"\n  exit 1\nfi\n\n# Switch traffic\nkubectl patch svc myapp -p \"{\\\"spec\\\":{\\\"selector\\\":{\\\"version\\\":\\\"$NEW_VERSION\\\"}}}\"\n\necho \"Switched to $NEW_VERSION\"\n```\n\n### AWS ECS Blue-Green\n\n```yaml\n# AWS CodeDeploy appspec.yml\nversion: 0.0\nResources:\n  - TargetService:\n      Type: AWS::ECS::Service\n      Properties:\n        TaskDefinition: \"arn:aws:ecs:region:account:task-definition\u002Fmyapp:2\"\n        LoadBalancerInfo:\n          ContainerName: \"myapp\"\n          ContainerPort: 8080\nHooks:\n  - BeforeInstall: \"LambdaFunctionToValidateBeforeTrafficShift\"\n  - AfterInstall: \"LambdaFunctionToValidateAfterTrafficShift\"\n  - AfterAllowTestTraffic: \"LambdaFunctionToValidateTestTraffic\"\n  - BeforeAllowTraffic: \"LambdaFunctionToValidateBeforeAllowTraffic\"\n  - AfterAllowTraffic: \"LambdaFunctionToValidateAfterAllowTraffic\"\n```\n\n## Canary Deployment\n\n### Kubernetes with Istio\n\n```yaml\n# VirtualService for traffic splitting\napiVersion: networking.istio.io\u002Fv1beta1\nkind: VirtualService\nmetadata:\n  name: myapp\nspec:\n  hosts:\n  - myapp\n  http:\n  - match:\n    - headers:\n        x-canary:\n          exact: \"true\"\n    route:\n    - destination:\n        host: myapp\n        subset: canary\n  - route:\n    - destination:\n        host: myapp\n        subset: stable\n      weight: 90\n    - destination:\n        host: myapp\n        subset: canary\n      weight: 10\n---\napiVersion: networking.istio.io\u002Fv1beta1\nkind: DestinationRule\nmetadata:\n  name: myapp\nspec:\n  host: myapp\n  subsets:\n  - name: stable\n    labels:\n      version: stable\n  - name: canary\n    labels:\n      version: canary\n```\n\n### Argo Rollouts\n\n```yaml\napiVersion: argoproj.io\u002Fv1alpha1\nkind: Rollout\nmetadata:\n  name: myapp\nspec:\n  replicas: 5\n  strategy:\n    canary:\n      steps:\n      - setWeight: 10\n      - pause: {duration: 5m}\n      - setWeight: 25\n      - pause: {duration: 5m}\n      - setWeight: 50\n      - pause: {duration: 5m}\n      - setWeight: 75\n      - pause: {duration: 5m}\n      analysis:\n        templates:\n        - templateName: success-rate\n        startingStep: 2\n        args:\n        - name: service-name\n          value: myapp\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: myapp:v2.0.0\n        ports:\n        - containerPort: 8080\n---\napiVersion: argoproj.io\u002Fv1alpha1\nkind: AnalysisTemplate\nmetadata:\n  name: success-rate\nspec:\n  args:\n  - name: service-name\n  metrics:\n  - name: success-rate\n    interval: 1m\n    successCondition: result[0] >= 0.95\n    failureLimit: 3\n    provider:\n      prometheus:\n        address: http:\u002F\u002Fprometheus:9090\n        query: |\n          sum(rate(http_requests_total{service=\"{{args.service-name}}\",status=~\"2.*\"}[5m]))\n          \u002F\n          sum(rate(http_requests_total{service=\"{{args.service-name}}\"}[5m]))\n```\n\n## Rolling Deployment\n\n### Kubernetes Default\n\n```yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp\nspec:\n  replicas: 5\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1        # Max pods above desired\n      maxUnavailable: 0   # Max pods unavailable\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: myapp:v2.0.0\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            path: \u002Fready\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n        livenessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 8080\n          initialDelaySeconds: 10\n          periodSeconds: 10\n```\n\n### Rolling Update Commands\n\n```bash\n# Update image\nkubectl set image deployment\u002Fmyapp myapp=myapp:v2.0.0\n\n# Watch rollout\nkubectl rollout status deployment\u002Fmyapp\n\n# Pause rollout\nkubectl rollout pause deployment\u002Fmyapp\n\n# Resume rollout\nkubectl rollout resume deployment\u002Fmyapp\n\n# Rollback\nkubectl rollout undo deployment\u002Fmyapp\n\n# Rollback to specific revision\nkubectl rollout undo deployment\u002Fmyapp --to-revision=2\n\n# View history\nkubectl rollout history deployment\u002Fmyapp\n```\n\n## Health Checks\n\n### Comprehensive Health Endpoint\n\n```python\n# Flask health endpoint\nfrom flask import Flask, jsonify\nimport psycopg2\nimport redis\n\napp = Flask(__name__)\n\n@app.route('\u002Fhealth')\ndef health():\n    \"\"\"Liveness probe - is the app running?\"\"\"\n    return jsonify({'status': 'healthy'}), 200\n\n@app.route('\u002Fready')\ndef ready():\n    \"\"\"Readiness probe - can the app serve traffic?\"\"\"\n    checks = {}\n    \n    # Database check\n    try:\n        conn = psycopg2.connect(DATABASE_URL)\n        conn.close()\n        checks['database'] = 'ok'\n    except Exception as e:\n        checks['database'] = str(e)\n        return jsonify({'status': 'unhealthy', 'checks': checks}), 503\n    \n    # Redis check\n    try:\n        r = redis.from_url(REDIS_URL)\n        r.ping()\n        checks['redis'] = 'ok'\n    except Exception as e:\n        checks['redis'] = str(e)\n        return jsonify({'status': 'unhealthy', 'checks': checks}), 503\n    \n    return jsonify({'status': 'healthy', 'checks': checks}), 200\n```\n\n\n## Contents\n\n- [Rollback Procedures](references\u002Fdetails.md)\n- [Rollback Checklist](references\u002Fdetails.md)\n- [Common Issues](references\u002Fdetails.md)\n- [Best Practices](references\u002Fdetails.md)\n- [Related Skills](references\u002Fdetails.md)\n\n## When to Use This Skill\n\nUse this skill when:\n- Implementing zero-downtime deployments\n- Reducing deployment risk\n- Enabling instant rollbacks\n- Running canary releases\n- Performing A\u002FB testing in production\n\n## Limitations\n\n- Guidance executes against real environments: confirm target, blast radius, and rollback plan before applying anything.\n- Never deploy to production without explicit approval. Docs-only import: upstream scripts and templates not bundled.\n\n### Example\n\n```bash\ngit status && git diff --stat\nkubectl diff -f manifest.yaml\n```\n\n> Adapted from [BagelHole\u002FDevOps-Security-Agent-Skills](https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills) (MIT); frontmatter, When to Use\u002FLimitations, and safety boundaries added for upstream compliance. Docs-only import: helper scripts and templates not bundled.\n","# Blue-Green & Deployment Strategies\n\nImplement zero-downtime deployment patterns for production systems.\n\n## Prerequisites\n\n- Load balancer or ingress controller\n- Container orchestration (K8s) or cloud platform\n- CI\u002FCD pipeline\n- Health check endpoints\n\n## Deployment Strategy Overview\n\n```\n┌─────────────────────────────────────────────────────────────┐\n│                    DEPLOYMENT STRATEGIES                     │\n├─────────────┬─────────────┬─────────────┬──────────────────┤\n│  Blue-Green │   Canary    │   Rolling   │    Recreate      │\n├─────────────┼─────────────┼─────────────┼──────────────────┤\n│ Full env    │ Gradual %   │ Pod by pod  │ All at once      │\n│ swap        │ rollout     │ replacement │                  │\n├─────────────┼─────────────┼─────────────┼──────────────────┤\n│ Instant     │ Slow, safe  │ Moderate    │ Fast, risky      │\n│ rollback    │ rollback    │ rollback    │                  │\n├─────────────┼─────────────┼─────────────┼──────────────────┤\n│ 2x resources│ +10-25%     │ Same        │ Same             │\n│ needed      │ resources   │ resources   │                  │\n└─────────────┴─────────────┴─────────────┴──────────────────┘\n```\n\n## Blue-Green Deployment\n\n### Concept\n\n```\nBefore:\n┌─────────┐     ┌───────────────┐\n│  Users  │────▶│  Blue (v1)    │ ◀── Active\n└─────────┘     └───────────────┘\n                ┌───────────────┐\n                │  Green (v2)   │ ◀── Staging\n                └───────────────┘\n\nAfter Switch:\n┌─────────┐     ┌───────────────┐\n│  Users  │     │  Blue (v1)    │ ◀── Standby\n└─────────┘     └───────────────┘\n      │         ┌───────────────┐\n      └────────▶│  Green (v2)   │ ◀── Active\n                └───────────────┘\n```\n\n### Kubernetes Implementation\n\n```yaml\n# blue-deployment.yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp-blue\n  labels:\n    app: myapp\n    version: blue\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: myapp\n      version: blue\n  template:\n    metadata:\n      labels:\n        app: myapp\n        version: blue\n    spec:\n      containers:\n      - name: myapp\n        image: myapp:v1.0.0\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n---\n# green-deployment.yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp-green\n  labels:\n    app: myapp\n    version: green\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: myapp\n      version: green\n  template:\n    metadata:\n      labels:\n        app: myapp\n        version: green\n    spec:\n      containers:\n      - name: myapp\n        image: myapp:v2.0.0\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n---\n# service.yaml - Switch by changing selector\napiVersion: v1\nkind: Service\nmetadata:\n  name: myapp\nspec:\n  selector:\n    app: myapp\n    version: blue  # Change to 'green' to switch\n  ports:\n  - port: 80\n    targetPort: 8080\n```\n\n### Switch Script\n\n```bash\n#!\u002Fbin\u002Fbash\n# blue-green-switch.sh\n\nCURRENT=$(kubectl get svc myapp -o jsonpath='{.spec.selector.version}')\nNEW_VERSION=$1\n\necho \"Current version: $CURRENT\"\necho \"Switching to: $NEW_VERSION\"\n\n# Verify new deployment is ready\nkubectl rollout status deployment\u002Fmyapp-$NEW_VERSION\n\n# Check health\nHEALTH=$(kubectl exec -it deployment\u002Fmyapp-$NEW_VERSION -- curl -s localhost:8080\u002Fhealth)\nif [ \"$HEALTH\" != \"ok\" ]; then\n  echo \"Health check failed\"\n  exit 1\nfi\n\n# Switch traffic\nkubectl patch svc myapp -p \"{\\\"spec\\\":{\\\"selector\\\":{\\\"version\\\":\\\"$NEW_VERSION\\\"}}}\"\n\necho \"Switched to $NEW_VERSION\"\n```\n\n### AWS ECS Blue-Green\n\n```yaml\n# AWS CodeDeploy appspec.yml\nversion: 0.0\nResources:\n  - TargetService:\n      Type: AWS::ECS::Service\n      Properties:\n        TaskDefinition: \"arn:aws:ecs:region:account:task-definition\u002Fmyapp:2\"\n        LoadBalancerInfo:\n          ContainerName: \"myapp\"\n          ContainerPort: 8080\nHooks:\n  - BeforeInstall: \"LambdaFunctionToValidateBeforeTrafficShift\"\n  - AfterInstall: \"LambdaFunctionToValidateAfterTrafficShift\"\n  - AfterAllowTestTraffic: \"LambdaFunctionToValidateTestTraffic\"\n  - BeforeAllowTraffic: \"LambdaFunctionToValidateBeforeAllowTraffic\"\n  - AfterAllowTraffic: \"LambdaFunctionToValidateAfterAllowTraffic\"\n```\n\n## Canary Deployment\n\n### Kubernetes with Istio\n\n```yaml\n# VirtualService for traffic splitting\napiVersion: networking.istio.io\u002Fv1beta1\nkind: VirtualService\nmetadata:\n  name: myapp\nspec:\n  hosts:\n  - myapp\n  http:\n  - match:\n    - headers:\n        x-canary:\n          exact: \"true\"\n    route:\n    - destination:\n        host: myapp\n        subset: canary\n  - route:\n    - destination:\n        host: myapp\n        subset: stable\n      weight: 90\n    - destination:\n        host: myapp\n        subset: canary\n      weight: 10\n---\napiVersion: networking.istio.io\u002Fv1beta1\nkind: DestinationRule\nmetadata:\n  name: myapp\nspec:\n  host: myapp\n  subsets:\n  - name: stable\n    labels:\n      version: stable\n  - name: canary\n    labels:\n      version: canary\n```\n\n### Argo Rollouts\n\n```yaml\napiVersion: argoproj.io\u002Fv1alpha1\nkind: Rollout\nmetadata:\n  name: myapp\nspec:\n  replicas: 5\n  strategy:\n    canary:\n      steps:\n      - setWeight: 10\n      - pause: {duration: 5m}\n      - setWeight: 25\n      - pause: {duration: 5m}\n      - setWeight: 50\n      - pause: {duration: 5m}\n      - setWeight: 75\n      - pause: {duration: 5m}\n      analysis:\n        templates:\n        - templateName: success-rate\n        startingStep: 2\n        args:\n        - name: service-name\n          value: myapp\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: myapp:v2.0.0\n        ports:\n        - containerPort: 8080\n---\napiVersion: argoproj.io\u002Fv1alpha1\nkind: AnalysisTemplate\nmetadata:\n  name: success-rate\nspec:\n  args:\n  - name: service-name\n  metrics:\n  - name: success-rate\n    interval: 1m\n    successCondition: result[0] >= 0.95\n    failureLimit: 3\n    provider:\n      prometheus:\n        address: http:\u002F\u002Fprometheus:9090\n        query: |\n          sum(rate(http_requests_total{service=\"{{args.service-name}}\",status=~\"2.*\"}[5m]))\n          \u002F\n          sum(rate(http_requests_total{service=\"{{args.service-name}}\"}[5m]))\n```\n\n## Rolling Deployment\n\n### Kubernetes Default\n\n```yaml\napiVersion: apps\u002Fv1\nkind: Deployment\nmetadata:\n  name: myapp\nspec:\n  replicas: 5\n  strategy:\n    type: RollingUpdate\n    rollingUpdate:\n      maxSurge: 1        # Max pods above desired\n      maxUnavailable: 0   # Max pods unavailable\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: myapp:v2.0.0\n        ports:\n        - containerPort: 8080\n        readinessProbe:\n          httpGet:\n            path: \u002Fready\n            port: 8080\n          initialDelaySeconds: 5\n          periodSeconds: 5\n        livenessProbe:\n          httpGet:\n            path: \u002Fhealth\n            port: 8080\n          initialDelaySeconds: 10\n          periodSeconds: 10\n```\n\n### Rolling Update Commands\n\n```bash\n# Update image\nkubectl set image deployment\u002Fmyapp myapp=myapp:v2.0.0\n\n# Watch rollout\nkubectl rollout status deployment\u002Fmyapp\n\n# Pause rollout\nkubectl rollout pause deployment\u002Fmyapp\n\n# Resume rollout\nkubectl rollout resume deployment\u002Fmyapp\n\n# Rollback\nkubectl rollout undo deployment\u002Fmyapp\n\n# Rollback to specific revision\nkubectl rollout undo deployment\u002Fmyapp --to-revision=2\n\n# View history\nkubectl rollout history deployment\u002Fmyapp\n```\n\n## Health Checks\n\n### Comprehensive Health Endpoint\n\n```python\n# Flask health endpoint\nfrom flask import Flask, jsonify\nimport psycopg2\nimport redis\n\napp = Flask(__name__)\n\n@app.route('\u002Fhealth')\ndef health():\n    \"\"\"Liveness probe - is the app running?\"\"\"\n    return jsonify({'status': 'healthy'}), 200\n\n@app.route('\u002Fready')\ndef ready():\n    \"\"\"Readiness probe - can the app serve traffic?\"\"\"\n    checks = {}\n    \n    # Database check\n    try:\n        conn = psycopg2.connect(DATABASE_URL)\n        conn.close()\n        checks['database'] = 'ok'\n    except Exception as e:\n        checks['database'] = str(e)\n        return jsonify({'status': 'unhealthy', 'checks': checks}), 503\n    \n    # Redis check\n    try:\n        r = redis.from_url(REDIS_URL)\n        r.ping()\n        checks['redis'] = 'ok'\n    except Exception as e:\n        checks['redis'] = str(e)\n        return jsonify({'status': 'unhealthy', 'checks': checks}), 503\n    \n    return jsonify({'status': 'healthy', 'checks': checks}), 200\n```\n\n\n## Contents\n\n- [Rollback Procedures](references\u002Fdetails.md)\n- [Rollback Checklist](references\u002Fdetails.md)\n- [Common Issues](references\u002Fdetails.md)\n- [Best Practices](references\u002Fdetails.md)\n- [Related Skills](references\u002Fdetails.md)\n\n## When to Use This Skill\n\nUse this skill when:\n- Implementing zero-downtime deployments\n- Reducing deployment risk\n- Enabling instant rollbacks\n- Running canary releases\n- Performing A\u002FB testing in production\n\n## Limitations\n\n- Guidance executes against real environments: confirm target, blast radius, and rollback plan before applying anything.\n- Never deploy to production without explicit approval. Docs-only import: upstream scripts and templates not bundled.\n\n### Example\n\n```bash\ngit status && git diff --stat\nkubectl diff -f manifest.yaml\n```\n\n> Adapted from [BagelHole\u002FDevOps-Security-Agent-Skills](https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills) (MIT); frontmatter, When to Use\u002FLimitations, and safety boundaries added for upstream compliance. Docs-only import: helper scripts and templates not bundled.\n",{"name":5,"risk":37,"source":48,"license":14,"category":49,"metadata":50,"date_added":53,"description":7,"source_repo":54,"source_type":32,"compatibility":55,"license_source":56},"https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills","devops",{"author":51,"version":52},"devops-skills","1.0","2026-09-20","BagelHole\u002FDevOps-Security-Agent-Skills","Requires the relevant platform CLIs (kubectl, helm, terraform, git, CI runners) and authorized access to the target environment. Docs-only; helper scripts and templates not bundled.","https:\u002F\u002Fgithub.com\u002FBagelHole\u002FDevOps-Security-Agent-Skills\u002Fblob\u002Fmain\u002FLICENSE","f3312ba749561b6159f477dbfc9313c875d40a56",".agents\u002Fskills_archive\u002Fblue-green-deploy","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612","2026-10-25 23:50:58",{"source":8,"skillName":5,"commands":63,"prompt":73,"zipAvailable":74},[64,67,70],{"tool":65,"command":66},"npx","npx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill blue-green-deploy",{"tool":68,"command":69},"bunx","bunx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill blue-green-deploy",{"tool":71,"command":72},"pnpm","pnpm dlx skills add duc-duy-1612\u002FOnline-Delivery-Systems-Web --skill blue-green-deploy","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fblue-green-deploy\u002FSKILL.md",true,[76],{"path":77,"resourceType":78,"resourceTypeDesc":79,"sizeBytes":80,"sourceHtmlUrl":81},"references\u002Fdetails.md","REFERENCE","参考文档",2179,"https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fblue-green-deploy\u002Freferences\u002Fdetails.md",[83,101,125,150,178,202],{"skillNo":84,"name":85,"nameZh":6,"description":86,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":87,"categories":88,"keywords":90,"publishedAt":43},"01M6Q0FA5FZ410Z33Z3TFQ4DBA","zero-trust","Implement zero-trust network architecture. Configure identity-based access, micro-segmentation, and continuous verification. Use when implementing modern security architectures.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzero-trust\u002FSKILL.md",[89],{"categoryNo":18,"categoryName":19,"taxonomyType":20,"taxonomyTypeDesc":21},[91,92,93,94,95,96,85,97,28,29,30,31,32,33,98,37,99,38,39,100],"ZeRO","trust","zero trust","architecture","assessment","verification","segmentation","active","scope","implementing",{"skillNo":102,"name":103,"nameZh":6,"description":104,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":105,"categories":106,"keywords":107,"publishedAt":43},"01M6Q0F1YZJW3KX5FBKEVZ8CV4","zcode-delegate","Delegate coding tasks to the Z.AI ZCode CLI only when the user explicitly requests it, while the orchestrator retains review and landing responsibility.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fzcode-delegate\u002FSKILL.md",[],[108,109,110,111,112,113,114,115,116,117,118,119,120,31,121,32,122,123,37,124],"delegate","zcode","zcode delegate","review","cli","orchestration","tasks","run","Bash","model","node","read","orchestrator","files","desktop app","app","agent-orchestration",{"skillNo":126,"name":127,"nameZh":6,"description":128,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":129,"categories":130,"keywords":131,"publishedAt":43},"01M6Q0ETK41VGNMYEXW0T00AJN","youtube-transcript","Fetch YouTube transcripts through DeepAPI or local fallback tooling and save clean text output.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript\u002FSKILL.md",[],[132,133,134,135,136,137,138,139,140,141,142,143,144,32,33,145,146,147,148,149],"transcript","youtube transcript","youtube","safe","github","codex","research","license","https","text","fetch","tooling","clean","local","output","deepapi","youtube transcripts","blob",{"skillNo":151,"name":152,"nameZh":6,"description":153,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":154,"categories":155,"keywords":167,"publishedAt":43},"01M6Q0EPPH2PVMDW40017F8WX0","youtube-transcript-skills","Fetch YouTube video transcripts, search videos\u002Fchannels, browse channels, and extract playlists via the getyoutubetranscript.com API - free tier, no card required.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-transcript-skills\u002FSKILL.md",[156,159,162],{"categoryNo":157,"categoryName":158,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000010","后端与接口",{"categoryNo":160,"categoryName":161,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000016","图像与多媒体",{"categoryNo":163,"categoryName":164,"taxonomyType":165,"taxonomyTypeDesc":166},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[132,133,134,168,135,169,136,137,139,170,171,172,173,142,174,32,33,175,176,177],"youtube transcript skills","gemini","search","api","Video","browse","api-integration","free","card","channels",{"skillNo":179,"name":180,"nameZh":6,"description":181,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":182,"categories":183,"keywords":188,"publishedAt":43},"01M6Q0EAB96PX83W5PTE8A0R8D","youtube-notetaker","Turn YouTube talks into local study notes with slides, transcripts, editable annotations, and a markdown-backed viewer.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-notetaker\u002FSKILL.md",[184,187],{"categoryNo":185,"categoryName":186,"taxonomyType":20,"taxonomyTypeDesc":21},"01JBSEEDCAT000000000000003","演示文稿",{"categoryNo":160,"categoryName":161,"taxonomyType":20,"taxonomyTypeDesc":21},[134,189,190,112,135,191,192,193,194,139,172,195,196,197,198,33,199,145,200,201],"youtube notetaker","notetaker","workflow","official","notes","code","markdown","slides","annotations","README","study","dair-academy","viewer",{"skillNo":203,"name":204,"nameZh":6,"description":205,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":6,"repositoryNo":12,"starsCount":13,"licenseSpdxId":14,"licenseFileUrl":6,"sourceHtmlUrl":206,"categories":207,"keywords":209,"publishedAt":43},"01M6Q0E55F0GW5MX48V8HXS8B5","youtube-full","Fetch YouTube transcripts, search videos, browse channels, and extract playlists via TranscriptAPI — no yt-dlp, no Google API key, works from any cloud server.","https:\u002F\u002Fgithub.com\u002Fduc-duy-1612\u002FOnline-Delivery-Systems-Web\u002Fblob\u002Fmain\u002F.agents\u002Fskills_archive\u002Fyoutube-full\u002FSKILL.md",[208],{"categoryNo":157,"categoryName":158,"taxonomyType":20,"taxonomyTypeDesc":21},[210,134,211,212,135,169,170,213,214,171,172,173,142,215,174,32,33,175,216,148],"youtube full","full","google","server","dlp","credits","automatic"]