[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M7BF3C01VGEAX5FDP8RCR0FC":3,"skill-same:01M7BF3C01VGEAX5FDP8RCR0FC":48},{"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":18,"publishedAt":19,"linkOnly":20,"markdownContent":21,"markdownBody":22,"frontMatter":23,"refName":25,"commitSha":26,"skillDirectory":27,"forksCount":28,"repositoryHtmlUrl":29,"repositoryHomepageUrl":30,"ownerHtmlUrl":31,"ownerBlogUrl":6,"ownerDescription":32,"updatedAt":33,"install":34,"resources":47},"01M7BF3C01VGEAX5FDP8RCR0FC","deployment-patterns",null,"Deployment iş akışları, CI\u002FCD pipeline kalıpları, Docker konteynerizasyonu, sağlık kontrolleri, rollback stratejileri ve web uygulamaları için üretim hazırlığı kontrol listeleri.","YYC-Cube\u002FYYC3-Knowledge-Base","YYC-Cube","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F235006543?v=4","01M79J2PH4SWD2X0825X6PN748","yyc3","01M79J2PHVK3F6ZBYT8K2SCZCW",1,"MIT","https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-AI-应用工具\u002FYYC3-AI-应用工具-Everything-claude-code\u002Fdocs\u002Ftr\u002Fskills\u002Fdeployment-patterns\u002FSKILL.md",[],[],"2026-11-15 14:19:17",false,"---\nname: deployment-patterns\ndescription: Deployment iş akışları, CI\u002FCD pipeline kalıpları, Docker konteynerizasyonu, sağlık kontrolleri, rollback stratejileri ve web uygulamaları için üretim hazırlığı kontrol listeleri.\norigin: ECC\n---\n\n# Deployment Kalıpları\n\nÜretim deployment iş akışları ve CI\u002FCD en iyi uygulamaları.\n\n## Ne Zaman Aktifleştirmeli\n\n- CI\u002FCD pipeline'ları kurarken\n- Bir uygulamayı Docker'ize ederken\n- Deployment stratejisi planlarken (blue-green, canary, rolling)\n- Sağlık kontrolleri ve hazırlık probe'ları uygularken\n- Üretim yayınına hazırlanırken\n- Ortama özgü ayarları yapılandırırken\n\n## Deployment Stratejileri\n\n### Rolling Deployment (Varsayılan)\n\nInstance'ları kademeli olarak değiştir — rollout sırasında eski ve yeni versiyonlar birlikte çalışır.\n\n```\nInstance 1: v1 → v2  (önce güncelle)\nInstance 2: v1        (hala v1 çalışıyor)\nInstance 3: v1        (hala v1 çalışıyor)\n\nInstance 1: v2\nInstance 2: v1 → v2  (ikinci olarak güncelle)\nInstance 3: v1\n\nInstance 1: v2\nInstance 2: v2\nInstance 3: v1 → v2  (son olarak güncelle)\n```\n\n**Artıları:** Sıfır kesinti, kademeli rollout\n**Eksileri:** İki versiyon aynı anda çalışır — geriye uyumlu değişiklikler gerektirir\n**Ne zaman kullanılır:** Standart deployment'lar, geriye uyumlu değişiklikler\n\n### Blue-Green Deployment\n\nİki özdeş ortam çalıştır. Trafiği atomik olarak değiştir.\n\n```\nBlue  (v1) ← trafik\nGreen (v2)   boşta, yeni versiyon çalışıyor\n\n# Doğrulamadan sonra:\nBlue  (v1)   boşta (yedek haline gelir)\nGreen (v2) ← trafik\n```\n\n**Artıları:** Anında rollback (blue'ya geri dön), temiz geçiş\n**Eksileri:** Deployment sırasında 2x altyapı gerektirir\n**Ne zaman kullanılır:** Kritik servisler, sorunlara sıfır tolerans\n\n### Canary Deployment\n\nÖnce trafiğin küçük bir yüzdesini yeni versiyona yönlendir.\n\n```\nv1: %95 trafik\nv2:  %5 trafik  (canary)\n\n# Metrikler iyi görünüyorsa:\nv1: %50 trafik\nv2: %50 trafik\n\n# Final:\nv2: %100 trafik\n```\n\n**Artıları:** Tam rollout'tan önce gerçek trafikle sorunları yakalar\n**Eksileri:** Trafik bölme altyapısı, izleme gerektirir\n**Ne zaman kullanılır:** Yüksek trafikli servisler, riskli değişiklikler, feature flag'ler\n\n## Docker\n\n### Multi-Stage Dockerfile (Node.js)\n\n```dockerfile\n# Stage 1: Bağımlılıkları yükle\nFROM node:22-alpine AS deps\nWORKDIR \u002Fapp\nCOPY package.json package-lock.json .\u002F\nRUN npm ci --production=false\n\n# Stage 2: Build\nFROM node:22-alpine AS builder\nWORKDIR \u002Fapp\nCOPY --from=deps \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY . .\nRUN npm run build\nRUN npm prune --production\n\n# Stage 3: Production image\nFROM node:22-alpine AS runner\nWORKDIR \u002Fapp\n\nRUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001\nUSER appuser\n\nCOPY --from=builder --chown=appuser:appgroup \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY --from=builder --chown=appuser:appgroup \u002Fapp\u002Fdist .\u002Fdist\nCOPY --from=builder --chown=appuser:appgroup \u002Fapp\u002Fpackage.json .\u002F\n\nENV NODE_ENV=production\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\n  CMD wget --no-verbose --tries=1 --spider http:\u002F\u002Flocalhost:3000\u002Fhealth || exit 1\n\nCMD [\"node\", \"dist\u002Fserver.js\"]\n```\n\n### Multi-Stage Dockerfile (Go)\n\n```dockerfile\nFROM golang:1.22-alpine AS builder\nWORKDIR \u002Fapp\nCOPY go.mod go.sum .\u002F\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -ldflags=\"-s -w\" -o \u002Fserver .\u002Fcmd\u002Fserver\n\nFROM alpine:3.19 AS runner\nRUN apk --no-cache add ca-certificates\nRUN adduser -D -u 1001 appuser\nUSER appuser\n\nCOPY --from=builder \u002Fserver \u002Fserver\n\nEXPOSE 8080\nHEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http:\u002F\u002Flocalhost:8080\u002Fhealth || exit 1\nCMD [\"\u002Fserver\"]\n```\n\n### Multi-Stage Dockerfile (Python\u002FDjango)\n\n```dockerfile\nFROM python:3.12-slim AS builder\nWORKDIR \u002Fapp\nRUN pip install --no-cache-dir uv\nCOPY requirements.txt .\nRUN uv pip install --system --no-cache -r requirements.txt\n\nFROM python:3.12-slim AS runner\nWORKDIR \u002Fapp\n\nRUN useradd -r -u 1001 appuser\nUSER appuser\n\nCOPY --from=builder \u002Fusr\u002Flocal\u002Flib\u002Fpython3.12\u002Fsite-packages \u002Fusr\u002Flocal\u002Flib\u002Fpython3.12\u002Fsite-packages\nCOPY --from=builder \u002Fusr\u002Flocal\u002Fbin \u002Fusr\u002Flocal\u002Fbin\nCOPY . .\n\nENV PYTHONUNBUFFERED=1\nEXPOSE 8000\n\nHEALTHCHECK --interval=30s --timeout=3s CMD python -c \"import urllib.request; urllib.request.urlopen('http:\u002F\u002Flocalhost:8000\u002Fhealth\u002F')\" || exit 1\nCMD [\"gunicorn\", \"config.wsgi:application\", \"--bind\", \"0.0.0.0:8000\", \"--workers\", \"4\"]\n```\n\n### Docker En İyi Uygulamaları\n\n```\n# İYİ uygulamalar\n- Belirli versiyon tag'leri kullanın (node:22-alpine, node:latest değil)\n- Image boyutunu minimize etmek için multi-stage build'ler\n- Root olmayan kullanıcı olarak çalıştır\n- Önce bağımlılık dosyalarını kopyalayın (layer caching)\n- node_modules, .git, test'leri hariç tutmak için .dockerignore kullanın\n- HEALTHCHECK talimatı ekleyin\n- docker-compose veya k8s'te kaynak limitleri ayarlayın\n\n# KÖTÜ uygulamalar\n- Root olarak çalıştırmak\n- :latest tag'lerini kullanmak\n- Tüm repo'yu tek COPY layer'da kopyalamak\n- Production image'de dev bağımlılıklarını yüklemek\n- Image'de secret'ları saklamak (env var veya secrets manager kullanın)\n```\n\n## CI\u002FCD Pipeline\n\n### GitHub Actions (Standart Pipeline)\n\n```yaml\nname: CI\u002FCD\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: 22\n          cache: npm\n      - run: npm ci\n      - run: npm run lint\n      - run: npm run typecheck\n      - run: npm test -- --coverage\n      - uses: actions\u002Fupload-artifact@v4\n        if: always()\n        with:\n          name: coverage\n          path: coverage\u002F\n\n  build:\n    needs: test\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: docker\u002Fsetup-buildx-action@v3\n      - uses: docker\u002Flogin-action@v3\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      - uses: docker\u002Fbuild-push-action@v5\n        with:\n          push: true\n          tags: ghcr.io\u002F${{ github.repository }}:${{ github.sha }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    environment: production\n    steps:\n      - name: Deploy to production\n        run: |\n          # Platforma özgü deployment komutu\n          # Railway: railway up\n          # Vercel: vercel --prod\n          # K8s: kubectl set image deployment\u002Fapp app=ghcr.io\u002F${{ github.repository }}:${{ github.sha }}\n          echo \"Deploying ${{ github.sha }}\"\n```\n\n### Pipeline Aşamaları\n\n```\nPR açıldığında:\n  lint → typecheck → unit tests → integration tests → preview deploy\n\nMain'e merge edildiğinde:\n  lint → typecheck → unit tests → integration tests → build image → deploy staging → smoke tests → deploy production\n```\n\n## Sağlık Kontrolleri\n\n### Sağlık Kontrolü Endpoint'i\n\n```typescript\n\u002F\u002F Basit sağlık kontrolü\napp.get(\"\u002Fhealth\", (req, res) => {\n  res.status(200).json({ status: \"ok\" });\n});\n\n\u002F\u002F Detaylı sağlık kontrolü (dahili izleme için)\napp.get(\"\u002Fhealth\u002Fdetailed\", async (req, res) => {\n  const checks = {\n    database: await checkDatabase(),\n    redis: await checkRedis(),\n    externalApi: await checkExternalApi(),\n  };\n\n  const allHealthy = Object.values(checks).every(c => c.status === \"ok\");\n\n  res.status(allHealthy ? 200 : 503).json({\n    status: allHealthy ? \"ok\" : \"degraded\",\n    timestamp: new Date().toISOString(),\n    version: process.env.APP_VERSION || \"unknown\",\n    uptime: process.uptime(),\n    checks,\n  });\n});\n\nasync function checkDatabase(): Promise\u003CHealthCheck> {\n  try {\n    await db.query(\"SELECT 1\");\n    return { status: \"ok\", latency_ms: 2 };\n  } catch (err) {\n    return { status: \"error\", message: \"Database unreachable\" };\n  }\n}\n```\n\n### Kubernetes Probe'ları\n\n```yaml\nlivenessProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 3000\n  initialDelaySeconds: 10\n  periodSeconds: 30\n  failureThreshold: 3\n\nreadinessProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 3000\n  initialDelaySeconds: 5\n  periodSeconds: 10\n  failureThreshold: 2\n\nstartupProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 3000\n  initialDelaySeconds: 0\n  periodSeconds: 5\n  failureThreshold: 30    # 30 * 5s = 150s max başlatma süresi\n```\n\n## Ortam Yapılandırması\n\n### Twelve-Factor App Kalıbı\n\n```bash\n# Tüm yapılandırma ortam değişkenleri ile — asla kodda değil\nDATABASE_URL=postgres:\u002F\u002Fuser:pass@host:5432\u002Fdb\nREDIS_URL=redis:\u002F\u002Fhost:6379\u002F0\nAPI_KEY=${API_KEY}           # secrets manager tarafından enjekte edilir\nLOG_LEVEL=info\nPORT=3000\n\n# Ortama özgü davranış\nNODE_ENV=production          # veya staging, development\nAPP_ENV=production           # açık uygulama ortamı\n```\n\n### Yapılandırma Validasyonu\n\n```typescript\nimport { z } from \"zod\";\n\nconst envSchema = z.object({\n  NODE_ENV: z.enum([\"development\", \"staging\", \"production\"]),\n  PORT: z.coerce.number().default(3000),\n  DATABASE_URL: z.string().url(),\n  REDIS_URL: z.string().url(),\n  JWT_SECRET: z.string().min(32),\n  LOG_LEVEL: z.enum([\"debug\", \"info\", \"warn\", \"error\"]).default(\"info\"),\n});\n\n\u002F\u002F Başlangıçta validasyon yap — yapılandırma yanlışsa hızlı başarısız ol\nexport const env = envSchema.parse(process.env);\n```\n\n## Rollback Stratejisi\n\n### Anında Rollback\n\n```bash\n# Docker\u002FKubernetes: önceki image'a işaret et\nkubectl rollout undo deployment\u002Fapp\n\n# Vercel: önceki deployment'ı yükselt\nvercel rollback\n\n# Railway: önceki commit'i tekrar deploy et\nrailway up --commit \u003Cprevious-sha>\n\n# Veritabanı: migration'ı rollback et (geri alınabilirse)\nnpx prisma migrate resolve --rolled-back \u003Cmigration-name>\n```\n\n### Rollback Kontrol Listesi\n\n- [ ] Önceki image\u002Fartifact mevcut ve tag'lenmiş\n- [ ] Veritabanı migration'ları geriye uyumlu (yıkıcı değişiklik yok)\n- [ ] Feature flag'ler deploy olmadan yeni özellikleri devre dışı bırakabilir\n- [ ] Hata oranı artışları için izleme alarmları yapılandırılmış\n- [ ] Rollback üretim yayınından önce staging'de test edilmiş\n\n## Üretim Hazırlığı Kontrol Listesi\n\nHerhangi bir üretim deployment'ından önce:\n\n### Uygulama\n- [ ] Tüm testler geçiyor (unit, integration, E2E)\n- [ ] Kodda veya yapılandırma dosyalarında hardcode edilmiş secret yok\n- [ ] Hata işleme tüm edge case'leri kapsıyor\n- [ ] Loglama yapılandırılmış (JSON) ve PII içermiyor\n- [ ] Sağlık kontrolü endpoint'i anlamlı durum döndürüyor\n\n### Altyapı\n- [ ] Docker image yeniden üretilebilir şekilde build oluyor (sabitlenmiş versiyonlar)\n- [ ] Ortam değişkenleri dokümante edilmiş ve başlangıçta validate ediliyor\n- [ ] Kaynak limitleri ayarlanmış (CPU, bellek)\n- [ ] Horizontal scaling yapılandırılmış (min\u002Fmax instance'lar)\n- [ ] Tüm endpoint'lerde SSL\u002FTLS etkin\n\n### İzleme\n- [ ] Uygulama metrikleri export ediliyor (istek oranı, gecikme, hatalar)\n- [ ] Hata oranı > eşik için alarmlar yapılandırılmış\n- [ ] Log toplama kurulmuş (yapılandırılmış loglar, aranabilir)\n- [ ] Sağlık endpoint'inde uptime izleme\n\n### Güvenlik\n- [ ] Bağımlılıklar CVE'ler için taranmış\n- [ ] CORS sadece izin verilen origin'ler için yapılandırılmış\n- [ ] Halka açık endpoint'lerde hız sınırlama etkin\n- [ ] Kimlik doğrulama ve yetkilendirme doğrulanmış\n- [ ] Güvenlik header'ları ayarlanmış (CSP, HSTS, X-Frame-Options)\n\n### Operasyonlar\n- [ ] Rollback planı dokümante edilmiş ve test edilmiş\n- [ ] Veritabanı migration'ı üretim boyutundaki veriye karşı test edilmiş\n- [ ] Yaygın hata senaryoları için runbook\n- [ ] Nöbet rotasyonu ve yükseltme yolu tanımlanmış\n","# Deployment Kalıpları\n\nÜretim deployment iş akışları ve CI\u002FCD en iyi uygulamaları.\n\n## Ne Zaman Aktifleştirmeli\n\n- CI\u002FCD pipeline'ları kurarken\n- Bir uygulamayı Docker'ize ederken\n- Deployment stratejisi planlarken (blue-green, canary, rolling)\n- Sağlık kontrolleri ve hazırlık probe'ları uygularken\n- Üretim yayınına hazırlanırken\n- Ortama özgü ayarları yapılandırırken\n\n## Deployment Stratejileri\n\n### Rolling Deployment (Varsayılan)\n\nInstance'ları kademeli olarak değiştir — rollout sırasında eski ve yeni versiyonlar birlikte çalışır.\n\n```\nInstance 1: v1 → v2  (önce güncelle)\nInstance 2: v1        (hala v1 çalışıyor)\nInstance 3: v1        (hala v1 çalışıyor)\n\nInstance 1: v2\nInstance 2: v1 → v2  (ikinci olarak güncelle)\nInstance 3: v1\n\nInstance 1: v2\nInstance 2: v2\nInstance 3: v1 → v2  (son olarak güncelle)\n```\n\n**Artıları:** Sıfır kesinti, kademeli rollout\n**Eksileri:** İki versiyon aynı anda çalışır — geriye uyumlu değişiklikler gerektirir\n**Ne zaman kullanılır:** Standart deployment'lar, geriye uyumlu değişiklikler\n\n### Blue-Green Deployment\n\nİki özdeş ortam çalıştır. Trafiği atomik olarak değiştir.\n\n```\nBlue  (v1) ← trafik\nGreen (v2)   boşta, yeni versiyon çalışıyor\n\n# Doğrulamadan sonra:\nBlue  (v1)   boşta (yedek haline gelir)\nGreen (v2) ← trafik\n```\n\n**Artıları:** Anında rollback (blue'ya geri dön), temiz geçiş\n**Eksileri:** Deployment sırasında 2x altyapı gerektirir\n**Ne zaman kullanılır:** Kritik servisler, sorunlara sıfır tolerans\n\n### Canary Deployment\n\nÖnce trafiğin küçük bir yüzdesini yeni versiyona yönlendir.\n\n```\nv1: %95 trafik\nv2:  %5 trafik  (canary)\n\n# Metrikler iyi görünüyorsa:\nv1: %50 trafik\nv2: %50 trafik\n\n# Final:\nv2: %100 trafik\n```\n\n**Artıları:** Tam rollout'tan önce gerçek trafikle sorunları yakalar\n**Eksileri:** Trafik bölme altyapısı, izleme gerektirir\n**Ne zaman kullanılır:** Yüksek trafikli servisler, riskli değişiklikler, feature flag'ler\n\n## Docker\n\n### Multi-Stage Dockerfile (Node.js)\n\n```dockerfile\n# Stage 1: Bağımlılıkları yükle\nFROM node:22-alpine AS deps\nWORKDIR \u002Fapp\nCOPY package.json package-lock.json .\u002F\nRUN npm ci --production=false\n\n# Stage 2: Build\nFROM node:22-alpine AS builder\nWORKDIR \u002Fapp\nCOPY --from=deps \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY . .\nRUN npm run build\nRUN npm prune --production\n\n# Stage 3: Production image\nFROM node:22-alpine AS runner\nWORKDIR \u002Fapp\n\nRUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001\nUSER appuser\n\nCOPY --from=builder --chown=appuser:appgroup \u002Fapp\u002Fnode_modules .\u002Fnode_modules\nCOPY --from=builder --chown=appuser:appgroup \u002Fapp\u002Fdist .\u002Fdist\nCOPY --from=builder --chown=appuser:appgroup \u002Fapp\u002Fpackage.json .\u002F\n\nENV NODE_ENV=production\nEXPOSE 3000\n\nHEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \\\n  CMD wget --no-verbose --tries=1 --spider http:\u002F\u002Flocalhost:3000\u002Fhealth || exit 1\n\nCMD [\"node\", \"dist\u002Fserver.js\"]\n```\n\n### Multi-Stage Dockerfile (Go)\n\n```dockerfile\nFROM golang:1.22-alpine AS builder\nWORKDIR \u002Fapp\nCOPY go.mod go.sum .\u002F\nRUN go mod download\nCOPY . .\nRUN CGO_ENABLED=0 GOOS=linux go build -ldflags=\"-s -w\" -o \u002Fserver .\u002Fcmd\u002Fserver\n\nFROM alpine:3.19 AS runner\nRUN apk --no-cache add ca-certificates\nRUN adduser -D -u 1001 appuser\nUSER appuser\n\nCOPY --from=builder \u002Fserver \u002Fserver\n\nEXPOSE 8080\nHEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http:\u002F\u002Flocalhost:8080\u002Fhealth || exit 1\nCMD [\"\u002Fserver\"]\n```\n\n### Multi-Stage Dockerfile (Python\u002FDjango)\n\n```dockerfile\nFROM python:3.12-slim AS builder\nWORKDIR \u002Fapp\nRUN pip install --no-cache-dir uv\nCOPY requirements.txt .\nRUN uv pip install --system --no-cache -r requirements.txt\n\nFROM python:3.12-slim AS runner\nWORKDIR \u002Fapp\n\nRUN useradd -r -u 1001 appuser\nUSER appuser\n\nCOPY --from=builder \u002Fusr\u002Flocal\u002Flib\u002Fpython3.12\u002Fsite-packages \u002Fusr\u002Flocal\u002Flib\u002Fpython3.12\u002Fsite-packages\nCOPY --from=builder \u002Fusr\u002Flocal\u002Fbin \u002Fusr\u002Flocal\u002Fbin\nCOPY . .\n\nENV PYTHONUNBUFFERED=1\nEXPOSE 8000\n\nHEALTHCHECK --interval=30s --timeout=3s CMD python -c \"import urllib.request; urllib.request.urlopen('http:\u002F\u002Flocalhost:8000\u002Fhealth\u002F')\" || exit 1\nCMD [\"gunicorn\", \"config.wsgi:application\", \"--bind\", \"0.0.0.0:8000\", \"--workers\", \"4\"]\n```\n\n### Docker En İyi Uygulamaları\n\n```\n# İYİ uygulamalar\n- Belirli versiyon tag'leri kullanın (node:22-alpine, node:latest değil)\n- Image boyutunu minimize etmek için multi-stage build'ler\n- Root olmayan kullanıcı olarak çalıştır\n- Önce bağımlılık dosyalarını kopyalayın (layer caching)\n- node_modules, .git, test'leri hariç tutmak için .dockerignore kullanın\n- HEALTHCHECK talimatı ekleyin\n- docker-compose veya k8s'te kaynak limitleri ayarlayın\n\n# KÖTÜ uygulamalar\n- Root olarak çalıştırmak\n- :latest tag'lerini kullanmak\n- Tüm repo'yu tek COPY layer'da kopyalamak\n- Production image'de dev bağımlılıklarını yüklemek\n- Image'de secret'ları saklamak (env var veya secrets manager kullanın)\n```\n\n## CI\u002FCD Pipeline\n\n### GitHub Actions (Standart Pipeline)\n\n```yaml\nname: CI\u002FCD\n\non:\n  push:\n    branches: [main]\n  pull_request:\n    branches: [main]\n\njobs:\n  test:\n    runs-on: ubuntu-latest\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: actions\u002Fsetup-node@v4\n        with:\n          node-version: 22\n          cache: npm\n      - run: npm ci\n      - run: npm run lint\n      - run: npm run typecheck\n      - run: npm test -- --coverage\n      - uses: actions\u002Fupload-artifact@v4\n        if: always()\n        with:\n          name: coverage\n          path: coverage\u002F\n\n  build:\n    needs: test\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    steps:\n      - uses: actions\u002Fcheckout@v4\n      - uses: docker\u002Fsetup-buildx-action@v3\n      - uses: docker\u002Flogin-action@v3\n        with:\n          registry: ghcr.io\n          username: ${{ github.actor }}\n          password: ${{ secrets.GITHUB_TOKEN }}\n      - uses: docker\u002Fbuild-push-action@v5\n        with:\n          push: true\n          tags: ghcr.io\u002F${{ github.repository }}:${{ github.sha }}\n          cache-from: type=gha\n          cache-to: type=gha,mode=max\n\n  deploy:\n    needs: build\n    runs-on: ubuntu-latest\n    if: github.ref == 'refs\u002Fheads\u002Fmain'\n    environment: production\n    steps:\n      - name: Deploy to production\n        run: |\n          # Platforma özgü deployment komutu\n          # Railway: railway up\n          # Vercel: vercel --prod\n          # K8s: kubectl set image deployment\u002Fapp app=ghcr.io\u002F${{ github.repository }}:${{ github.sha }}\n          echo \"Deploying ${{ github.sha }}\"\n```\n\n### Pipeline Aşamaları\n\n```\nPR açıldığında:\n  lint → typecheck → unit tests → integration tests → preview deploy\n\nMain'e merge edildiğinde:\n  lint → typecheck → unit tests → integration tests → build image → deploy staging → smoke tests → deploy production\n```\n\n## Sağlık Kontrolleri\n\n### Sağlık Kontrolü Endpoint'i\n\n```typescript\n\u002F\u002F Basit sağlık kontrolü\napp.get(\"\u002Fhealth\", (req, res) => {\n  res.status(200).json({ status: \"ok\" });\n});\n\n\u002F\u002F Detaylı sağlık kontrolü (dahili izleme için)\napp.get(\"\u002Fhealth\u002Fdetailed\", async (req, res) => {\n  const checks = {\n    database: await checkDatabase(),\n    redis: await checkRedis(),\n    externalApi: await checkExternalApi(),\n  };\n\n  const allHealthy = Object.values(checks).every(c => c.status === \"ok\");\n\n  res.status(allHealthy ? 200 : 503).json({\n    status: allHealthy ? \"ok\" : \"degraded\",\n    timestamp: new Date().toISOString(),\n    version: process.env.APP_VERSION || \"unknown\",\n    uptime: process.uptime(),\n    checks,\n  });\n});\n\nasync function checkDatabase(): Promise\u003CHealthCheck> {\n  try {\n    await db.query(\"SELECT 1\");\n    return { status: \"ok\", latency_ms: 2 };\n  } catch (err) {\n    return { status: \"error\", message: \"Database unreachable\" };\n  }\n}\n```\n\n### Kubernetes Probe'ları\n\n```yaml\nlivenessProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 3000\n  initialDelaySeconds: 10\n  periodSeconds: 30\n  failureThreshold: 3\n\nreadinessProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 3000\n  initialDelaySeconds: 5\n  periodSeconds: 10\n  failureThreshold: 2\n\nstartupProbe:\n  httpGet:\n    path: \u002Fhealth\n    port: 3000\n  initialDelaySeconds: 0\n  periodSeconds: 5\n  failureThreshold: 30    # 30 * 5s = 150s max başlatma süresi\n```\n\n## Ortam Yapılandırması\n\n### Twelve-Factor App Kalıbı\n\n```bash\n# Tüm yapılandırma ortam değişkenleri ile — asla kodda değil\nDATABASE_URL=postgres:\u002F\u002Fuser:pass@host:5432\u002Fdb\nREDIS_URL=redis:\u002F\u002Fhost:6379\u002F0\nAPI_KEY=${API_KEY}           # secrets manager tarafından enjekte edilir\nLOG_LEVEL=info\nPORT=3000\n\n# Ortama özgü davranış\nNODE_ENV=production          # veya staging, development\nAPP_ENV=production           # açık uygulama ortamı\n```\n\n### Yapılandırma Validasyonu\n\n```typescript\nimport { z } from \"zod\";\n\nconst envSchema = z.object({\n  NODE_ENV: z.enum([\"development\", \"staging\", \"production\"]),\n  PORT: z.coerce.number().default(3000),\n  DATABASE_URL: z.string().url(),\n  REDIS_URL: z.string().url(),\n  JWT_SECRET: z.string().min(32),\n  LOG_LEVEL: z.enum([\"debug\", \"info\", \"warn\", \"error\"]).default(\"info\"),\n});\n\n\u002F\u002F Başlangıçta validasyon yap — yapılandırma yanlışsa hızlı başarısız ol\nexport const env = envSchema.parse(process.env);\n```\n\n## Rollback Stratejisi\n\n### Anında Rollback\n\n```bash\n# Docker\u002FKubernetes: önceki image'a işaret et\nkubectl rollout undo deployment\u002Fapp\n\n# Vercel: önceki deployment'ı yükselt\nvercel rollback\n\n# Railway: önceki commit'i tekrar deploy et\nrailway up --commit \u003Cprevious-sha>\n\n# Veritabanı: migration'ı rollback et (geri alınabilirse)\nnpx prisma migrate resolve --rolled-back \u003Cmigration-name>\n```\n\n### Rollback Kontrol Listesi\n\n- [ ] Önceki image\u002Fartifact mevcut ve tag'lenmiş\n- [ ] Veritabanı migration'ları geriye uyumlu (yıkıcı değişiklik yok)\n- [ ] Feature flag'ler deploy olmadan yeni özellikleri devre dışı bırakabilir\n- [ ] Hata oranı artışları için izleme alarmları yapılandırılmış\n- [ ] Rollback üretim yayınından önce staging'de test edilmiş\n\n## Üretim Hazırlığı Kontrol Listesi\n\nHerhangi bir üretim deployment'ından önce:\n\n### Uygulama\n- [ ] Tüm testler geçiyor (unit, integration, E2E)\n- [ ] Kodda veya yapılandırma dosyalarında hardcode edilmiş secret yok\n- [ ] Hata işleme tüm edge case'leri kapsıyor\n- [ ] Loglama yapılandırılmış (JSON) ve PII içermiyor\n- [ ] Sağlık kontrolü endpoint'i anlamlı durum döndürüyor\n\n### Altyapı\n- [ ] Docker image yeniden üretilebilir şekilde build oluyor (sabitlenmiş versiyonlar)\n- [ ] Ortam değişkenleri dokümante edilmiş ve başlangıçta validate ediliyor\n- [ ] Kaynak limitleri ayarlanmış (CPU, bellek)\n- [ ] Horizontal scaling yapılandırılmış (min\u002Fmax instance'lar)\n- [ ] Tüm endpoint'lerde SSL\u002FTLS etkin\n\n### İzleme\n- [ ] Uygulama metrikleri export ediliyor (istek oranı, gecikme, hatalar)\n- [ ] Hata oranı > eşik için alarmlar yapılandırılmış\n- [ ] Log toplama kurulmuş (yapılandırılmış loglar, aranabilir)\n- [ ] Sağlık endpoint'inde uptime izleme\n\n### Güvenlik\n- [ ] Bağımlılıklar CVE'ler için taranmış\n- [ ] CORS sadece izin verilen origin'ler için yapılandırılmış\n- [ ] Halka açık endpoint'lerde hız sınırlama etkin\n- [ ] Kimlik doğrulama ve yetkilendirme doğrulanmış\n- [ ] Güvenlik header'ları ayarlanmış (CSP, HSTS, X-Frame-Options)\n\n### Operasyonlar\n- [ ] Rollback planı dokümante edilmiş ve test edilmiş\n- [ ] Veritabanı migration'ı üretim boyutundaki veriye karşı test edilmiş\n- [ ] Yaygın hata senaryoları için runbook\n- [ ] Nöbet rotasyonu ve yükseltme yolu tanımlanmış\n",{"name":5,"origin":24,"description":7},"ECC","main","87afe6ce96220accf50a345dea46784c8c9f210e","YYC3-AI-应用工具\u002FYYC3-AI-应用工具-Everything-claude-code\u002Fdocs\u002Ftr\u002Fskills\u002Fdeployment-patterns",0,"https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base","https:\u002F\u002Fkb.yyc3.top\u002F","https:\u002F\u002Fgithub.com\u002FYYC-Cube","万象归元于云枢 | 深栈智启新纪元","2026-11-10 10:37:32",{"source":8,"skillName":5,"commands":35,"prompt":45,"zipAvailable":46},[36,39,42],{"tool":37,"command":38},"npx","npx skills add YYC-Cube\u002FYYC3-Knowledge-Base --skill deployment-patterns",{"tool":40,"command":41},"bunx","bunx skills add YYC-Cube\u002FYYC3-Knowledge-Base --skill deployment-patterns",{"tool":43,"command":44},"pnpm","pnpm dlx skills add YYC-Cube\u002FYYC3-Knowledge-Base --skill deployment-patterns","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-AI-应用工具\u002FYYC3-AI-应用工具-Everything-claude-code\u002Fdocs\u002Ftr\u002Fskills\u002Fdeployment-patterns\u002FSKILL.md",true,[],[49,56,63,70,77,84],{"skillNo":50,"name":51,"nameZh":6,"description":52,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":53,"categories":54,"keywords":55,"publishedAt":19},"01M7CTDWHERCXPQCP0K03A86AS","vercel-sandbox","Run agent-browser + Chrome inside Vercel Sandbox microVMs for browser automation from any Vercel-deployed app. Use when the user needs browser automation in a Vercel app (Next.js, SvelteKit, Nuxt, Remix, Astro, etc.), wants to run headless Chrome without binary size limits, needs persistent browser sessions across commands, or wants ephemeral isolated browser environments. Triggers include \"Vercel Sandbox browser\", \"microVM Chrome\", \"agent-browser in sandbox\", \"browser automation on Vercel\", or any task requiring Chrome in a Vercel Sandbox.","https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-WebSpec-Web标准\u002FYYC3-WebSpec-Web标准-standards\u002Fbrowser-agent\u002Fskills\u002Fvercel-sandbox\u002FSKILL.md",[],[],{"skillNo":57,"name":58,"nameZh":6,"description":59,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":60,"categories":61,"keywords":62,"publishedAt":19},"01M7CTD8D2BNJY54S65M47HEJA","slack","Interact with Slack workspaces using browser automation. Use when the user needs to check unread channels, navigate Slack, send messages, extract data, find information, search conversations, or automate any Slack task. Triggers include \"check my Slack\", \"what channels have unreads\", \"send a message to\", \"search Slack for\", \"extract from Slack\", \"find who said\", or any task requiring programmatic Slack interaction.","https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-WebSpec-Web标准\u002FYYC3-WebSpec-Web标准-standards\u002Fbrowser-agent\u002Fskills\u002Fslack\u002FSKILL.md",[],[],{"skillNo":64,"name":65,"nameZh":6,"description":66,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":67,"categories":68,"keywords":69,"publishedAt":19},"01M7CTCSSB8ZP3Q58C3YZDZK1W","electron","Automate Electron desktop apps (VS Code, Slack, Discord, Figma, Notion, Spotify, etc.) using agent-browser via Chrome DevTools Protocol. Use when the user needs to interact with an Electron app, automate a desktop app, connect to a running app, control a native app, or test an Electron application. Triggers include \"automate Slack app\", \"control VS Code\", \"interact with Discord app\", \"test this Electron app\", \"connect to desktop app\", or any task requiring automation of a native Electron application.","https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-WebSpec-Web标准\u002FYYC3-WebSpec-Web标准-standards\u002Fbrowser-agent\u002Fskills\u002Felectron\u002FSKILL.md",[],[],{"skillNo":71,"name":72,"nameZh":6,"description":73,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":74,"categories":75,"keywords":76,"publishedAt":19},"01M7CTCBJY76688V4DCZGWFHGQ","dogfood","Systematically explore and test a web application to find bugs, UX issues, and other problems. Use when asked to \"dogfood\", \"QA\", \"exploratory test\", \"find issues\", \"bug hunt\", \"test this app\u002Fsite\u002Fplatform\", or review the quality of a web application. Produces a structured report with full reproduction evidence -- step-by-step screenshots, repro videos, and detailed repro steps for every issue -- so findings can be handed directly to the responsible teams.","https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-WebSpec-Web标准\u002FYYC3-WebSpec-Web标准-standards\u002Fbrowser-agent\u002Fskills\u002Fdogfood\u002FSKILL.md",[],[],{"skillNo":78,"name":79,"nameZh":6,"description":80,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":81,"categories":82,"keywords":83,"publishedAt":19},"01M7CTC4H0FFGVEAQR9PA4GA1A","agent-browser","Browser automation CLI for AI agents. Use when the user needs to interact with websites, including navigating pages, filling forms, clicking buttons, taking screenshots, extracting data, testing web apps, or automating any browser task. Triggers include requests to \"open a website\", \"fill out a form\", \"click a button\", \"take a screenshot\", \"scrape data from a page\", \"test this web app\", \"login to a site\", \"automate browser actions\", or any task requiring programmatic web interaction.","https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-WebSpec-Web标准\u002FYYC3-WebSpec-Web标准-standards\u002Fbrowser-agent\u002Fskills\u002Fagent-browser\u002FSKILL.md",[],[],{"skillNo":85,"name":86,"nameZh":6,"description":87,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":88,"categories":89,"keywords":90,"publishedAt":19},"01M7CTBKVFYBG78FDSABSDJTTQ","shadcn","Manages shadcn components and projects — adding, searching, fixing, debugging, styling, and composing UI, including chat interfaces. Provides project context, component docs, and usage examples. Applies when working with shadcn\u002Fui, component registries, presets, --preset codes, or any project with a components.json file. Also triggers for \"shadcn init\", \"create an app with --preset\", \"switch to --preset\", and for building a design system or applying a DESIGN.md or brand spec to shadcn\u002Fui.","https:\u002F\u002Fgithub.com\u002FYYC-Cube\u002FYYC3-Knowledge-Base\u002Fblob\u002Fmain\u002FYYC3-UI-界面组件\u002FYYC3-UI-界面组件-ui\u002Fskills\u002Fshadcn\u002FSKILL.md",[],[]]