docs/tr/skills/deployment-patterns/SKILL.md
Deployment iş akışları, CI/CD pipeline kalıpları, Docker konteynerizasyonu, sağlık kontrolleri, rollback stratejileri ve web uygulamaları için üretim hazırlığı kontrol listeleri.
npx skillsauth add affaan-m/everything-claude-code deployment-patternsInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Üretim deployment iş akışları ve CI/CD en iyi uygulamaları.
Instance'ları kademeli olarak değiştir — rollout sırasında eski ve yeni versiyonlar birlikte çalışır.
Instance 1: v1 → v2 (önce güncelle)
Instance 2: v1 (hala v1 çalışıyor)
Instance 3: v1 (hala v1 çalışıyor)
Instance 1: v2
Instance 2: v1 → v2 (ikinci olarak güncelle)
Instance 3: v1
Instance 1: v2
Instance 2: v2
Instance 3: v1 → v2 (son olarak güncelle)
Artıları: Sıfır kesinti, kademeli rollout Eksileri: İki versiyon aynı anda çalışır — geriye uyumlu değişiklikler gerektirir Ne zaman kullanılır: Standart deployment'lar, geriye uyumlu değişiklikler
İki özdeş ortam çalıştır. Trafiği atomik olarak değiştir.
Blue (v1) ← trafik
Green (v2) boşta, yeni versiyon çalışıyor
# Doğrulamadan sonra:
Blue (v1) boşta (yedek haline gelir)
Green (v2) ← trafik
Artıları: Anında rollback (blue'ya geri dön), temiz geçiş Eksileri: Deployment sırasında 2x altyapı gerektirir Ne zaman kullanılır: Kritik servisler, sorunlara sıfır tolerans
Önce trafiğin küçük bir yüzdesini yeni versiyona yönlendir.
v1: %95 trafik
v2: %5 trafik (canary)
# Metrikler iyi görünüyorsa:
v1: %50 trafik
v2: %50 trafik
# Final:
v2: %100 trafik
Artıları: Tam rollout'tan önce gerçek trafikle sorunları yakalar Eksileri: Trafik bölme altyapısı, izleme gerektirir Ne zaman kullanılır: Yüksek trafikli servisler, riskli değişiklikler, feature flag'ler
# Stage 1: Bağımlılıkları yükle
FROM node:22-alpine AS deps
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm ci --production=false
# Stage 2: Build
FROM node:22-alpine AS builder
WORKDIR /app
COPY --from=deps /app/node_modules ./node_modules
COPY . .
RUN npm run build
RUN npm prune --production
# Stage 3: Production image
FROM node:22-alpine AS runner
WORKDIR /app
RUN addgroup -g 1001 -S appgroup && adduser -S appuser -u 1001
USER appuser
COPY --from=builder --chown=appuser:appgroup /app/node_modules ./node_modules
COPY --from=builder --chown=appuser:appgroup /app/dist ./dist
COPY --from=builder --chown=appuser:appgroup /app/package.json ./
ENV NODE_ENV=production
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget --no-verbose --tries=1 --spider http://localhost:3000/health || exit 1
CMD ["node", "dist/server.js"]
FROM golang:1.22-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /server ./cmd/server
FROM alpine:3.19 AS runner
RUN apk --no-cache add ca-certificates
RUN adduser -D -u 1001 appuser
USER appuser
COPY --from=builder /server /server
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD wget -qO- http://localhost:8080/health || exit 1
CMD ["/server"]
FROM python:3.12-slim AS builder
WORKDIR /app
RUN pip install --no-cache-dir uv
COPY requirements.txt .
RUN uv pip install --system --no-cache -r requirements.txt
FROM python:3.12-slim AS runner
WORKDIR /app
RUN useradd -r -u 1001 appuser
USER appuser
COPY --from=builder /usr/local/lib/python3.12/site-packages /usr/local/lib/python3.12/site-packages
COPY --from=builder /usr/local/bin /usr/local/bin
COPY . .
ENV PYTHONUNBUFFERED=1
EXPOSE 8000
HEALTHCHECK --interval=30s --timeout=3s CMD python -c "import urllib.request; urllib.request.urlopen('http://localhost:8000/health/')" || exit 1
CMD ["gunicorn", "config.wsgi:application", "--bind", "0.0.0.0:8000", "--workers", "4"]
# İYİ uygulamalar
- Belirli versiyon tag'leri kullanın (node:22-alpine, node:latest değil)
- Image boyutunu minimize etmek için multi-stage build'ler
- Root olmayan kullanıcı olarak çalıştır
- Önce bağımlılık dosyalarını kopyalayın (layer caching)
- node_modules, .git, test'leri hariç tutmak için .dockerignore kullanın
- HEALTHCHECK talimatı ekleyin
- docker-compose veya k8s'te kaynak limitleri ayarlayın
# KÖTÜ uygulamalar
- Root olarak çalıştırmak
- :latest tag'lerini kullanmak
- Tüm repo'yu tek COPY layer'da kopyalamak
- Production image'de dev bağımlılıklarını yüklemek
- Image'de secret'ları saklamak (env var veya secrets manager kullanın)
name: CI/CD
on:
push:
branches: [main]
pull_request:
branches: [main]
jobs:
test:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 22
cache: npm
- run: npm ci
- run: npm run lint
- run: npm run typecheck
- run: npm test -- --coverage
- uses: actions/upload-artifact@v4
if: always()
with:
name: coverage
path: coverage/
build:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- uses: actions/checkout@v4
- uses: docker/setup-buildx-action@v3
- uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- uses: docker/build-push-action@v5
with:
push: true
tags: ghcr.io/${{ github.repository }}:${{ github.sha }}
cache-from: type=gha
cache-to: type=gha,mode=max
deploy:
needs: build
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
environment: production
steps:
- name: Deploy to production
run: |
# Platforma özgü deployment komutu
# Railway: railway up
# Vercel: vercel --prod
# K8s: kubectl set image deployment/app app=ghcr.io/${{ github.repository }}:${{ github.sha }}
echo "Deploying ${{ github.sha }}"
PR açıldığında:
lint → typecheck → unit tests → integration tests → preview deploy
Main'e merge edildiğinde:
lint → typecheck → unit tests → integration tests → build image → deploy staging → smoke tests → deploy production
// Basit sağlık kontrolü
app.get("/health", (req, res) => {
res.status(200).json({ status: "ok" });
});
// Detaylı sağlık kontrolü (dahili izleme için)
app.get("/health/detailed", async (req, res) => {
const checks = {
database: await checkDatabase(),
redis: await checkRedis(),
externalApi: await checkExternalApi(),
};
const allHealthy = Object.values(checks).every(c => c.status === "ok");
res.status(allHealthy ? 200 : 503).json({
status: allHealthy ? "ok" : "degraded",
timestamp: new Date().toISOString(),
version: process.env.APP_VERSION || "unknown",
uptime: process.uptime(),
checks,
});
});
async function checkDatabase(): Promise<HealthCheck> {
try {
await db.query("SELECT 1");
return { status: "ok", latency_ms: 2 };
} catch (err) {
return { status: "error", message: "Database unreachable" };
}
}
livenessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 10
periodSeconds: 30
failureThreshold: 3
readinessProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 5
periodSeconds: 10
failureThreshold: 2
startupProbe:
httpGet:
path: /health
port: 3000
initialDelaySeconds: 0
periodSeconds: 5
failureThreshold: 30 # 30 * 5s = 150s max başlatma süresi
# Tüm yapılandırma ortam değişkenleri ile — asla kodda değil
DATABASE_URL=postgres://user:pass@host:5432/db
REDIS_URL=redis://host:6379/0
API_KEY=${API_KEY} # secrets manager tarafından enjekte edilir
LOG_LEVEL=info
PORT=3000
# Ortama özgü davranış
NODE_ENV=production # veya staging, development
APP_ENV=production # açık uygulama ortamı
import { z } from "zod";
const envSchema = z.object({
NODE_ENV: z.enum(["development", "staging", "production"]),
PORT: z.coerce.number().default(3000),
DATABASE_URL: z.string().url(),
REDIS_URL: z.string().url(),
JWT_SECRET: z.string().min(32),
LOG_LEVEL: z.enum(["debug", "info", "warn", "error"]).default("info"),
});
// Başlangıçta validasyon yap — yapılandırma yanlışsa hızlı başarısız ol
export const env = envSchema.parse(process.env);
# Docker/Kubernetes: önceki image'a işaret et
kubectl rollout undo deployment/app
# Vercel: önceki deployment'ı yükselt
vercel rollback
# Railway: önceki commit'i tekrar deploy et
railway up --commit <previous-sha>
# Veritabanı: migration'ı rollback et (geri alınabilirse)
npx prisma migrate resolve --rolled-back <migration-name>
Herhangi bir üretim deployment'ından önce:
development
Share durable, inspectable context and handoffs between Claude, Codex, Hermes, Cursor, OpenCode, and other agents through the local ECC Memory Vault. Use when an agent must save work state, transfer context, resume another agent's task, or search shared project knowledge.
development
Use when multiple consumers and providers must evolve an API or event schema without field drift, integration surprises, or one side silently redefining the interface.
tools
Query live GPU inventory, submit an authenticated Itô fixed-rate RFQ, inspect RFQ or procurement status, and run explicitly gated node qualification through the separately installed canonical CLI. Use when a user asks to find H100/H200 capacity, request a fixed compute rate, check Itô compute status, or validate GPU nodes.
data-ai
Instinct-based learning system that observes sessions via hooks, creates atomic instincts with confidence scoring, and evolves them into skills/commands/agents. v2.1 adds project-scoped instincts to prevent cross-project contamination.