# راهنمای Deployment روی Kubernetes با Helm

این راهنما نحوه deploy کردن پلتفرم Peikarband روی Kubernetes با استفاده از Helm Chart را توضیح می‌دهد.

## پیش‌نیازها

### 1. ابزارهای مورد نیاز

```bash
# Kubectl (v1.24+)
kubectl version --client

# Helm (v3.10+)
helm version

# Docker (برای build local)
docker --version
```

### 2. دسترسی به Kubernetes Cluster

```bash
# تست دسترسی
kubectl cluster-info
kubectl get nodes
```

### 3. Namespace ها

```bash
# ساخت namespace ها
kubectl create namespace production
kubectl create namespace staging
```

## ساختار Helm Chart

```
helm/peikarband/
├── Chart.yaml              # Metadata
├── values.yaml            # Default values
├── values-production.yaml # Production overrides
├── templates/
│   ├── _helpers.tpl       # Helper templates
│   ├── deployment.yaml    # Deployment
│   ├── service.yaml       # Service
│   ├── ingress.yaml       # Ingress
│   ├── configmap.yaml     # ConfigMap
│   ├── serviceaccount.yaml
│   ├── hpa.yaml          # Horizontal Pod Autoscaler
│   ├── pdb.yaml          # Pod Disruption Budget
│   ├── networkpolicy.yaml
│   └── NOTES.txt
└── .helmignore
```

## مراحل Deployment

### 1. آماده‌سازی Secrets

ابتدا باید secrets مورد نیاز را ایجاد کنید:

```bash
# Database credentials
kubectl create secret generic peikarband-secrets \
  --from-literal=db-username=peikarband \
  --from-literal=db-password=STRONG_PASSWORD_HERE \
  --from-literal=redis-password=REDIS_PASSWORD_HERE \
  -n production

# برای staging
kubectl create secret generic peikarband-secrets \
  --from-literal=db-username=peikarband \
  --from-literal=db-password=STAGING_PASSWORD \
  --from-literal=redis-password=REDIS_PASSWORD \
  -n staging
```

### 2. Build و Push Docker Image

#### روش اول: با GitHub Actions (توصیه می‌شود)

```bash
# فقط یک tag بزنید و GitHub Actions خودکار build و deploy می‌کند
git tag -a v0.1.0 -m "Release v0.1.0"
git push origin v0.1.0
```

#### روش دوم: Build دستی

```bash
# Build image
docker build -t peikarband/landing:0.1.0 .

# Tag for registry
docker tag peikarband/landing:0.1.0 registry.example.com/peikarband/landing:0.1.0

# Push
docker push registry.example.com/peikarband/landing:0.1.0
```

### 3. Validate Helm Chart

قبل از deploy، chart را validate کنید:

```bash
# Lint
helm lint helm/peikarband

# Dry-run
helm install peikarband-test ./helm/peikarband \
  --dry-run \
  --debug \
  --namespace production

# Template rendering
helm template peikarband ./helm/peikarband > rendered.yaml
```

### 4. Deploy به Staging

```bash
helm upgrade --install peikarband-staging ./helm/peikarband \
  --namespace staging \
  --create-namespace \
  --set image.repository=registry.example.com/peikarband/landing \
  --set image.tag=0.1.0 \
  --set ingress.hosts[0].host=staging.peikarband.ir \
  --set replicaCount=2 \
  --wait \
  --timeout 5m
```

### 5. تست Staging

```bash
# چک کردن pods
kubectl get pods -n staging

# چک کردن logs
kubectl logs -f deployment/peikarband-staging -n staging

# Port forward برای تست local
kubectl port-forward svc/peikarband-staging 3000:3000 -n staging

# تست health check
curl http://localhost:8000/ping
```

### 6. Deploy به Production

```bash
helm upgrade --install peikarband-prod ./helm/peikarband \
  --namespace production \
  --create-namespace \
  --set image.repository=registry.example.com/peikarband/landing \
  --set image.tag=0.1.0 \
  --values helm/peikarband/values-production.yaml \
  --wait \
  --timeout 10m
```

## پیکربندی‌های مهم

### 1. تغییر تعداد Replicas

```bash
# با Helm
helm upgrade peikarband-prod ./helm/peikarband \
  --namespace production \
  --reuse-values \
  --set replicaCount=5

# یا با kubectl
kubectl scale deployment peikarband-prod --replicas=5 -n production
```

### 2. Update Image Version

```bash
helm upgrade peikarband-prod ./helm/peikarband \
  --namespace production \
  --reuse-values \
  --set image.tag=0.2.0
```

### 3. تغییر Resources

```bash
helm upgrade peikarband-prod ./helm/peikarband \
  --namespace production \
  --reuse-values \
  --set resources.limits.cpu=2000m \
  --set resources.limits.memory=2Gi
```

### 4. فعال/غیرفعال کردن Autoscaling

```bash
# فعال کردن
helm upgrade peikarband-prod ./helm/peikarband \
  --namespace production \
  --reuse-values \
  --set autoscaling.enabled=true \
  --set autoscaling.minReplicas=3 \
  --set autoscaling.maxReplicas=10

# غیرفعال کردن
helm upgrade peikarband-prod ./helm/peikarband \
  --namespace production \
  --reuse-values \
  --set autoscaling.enabled=false \
  --set replicaCount=3
```

## Ingress و SSL/TLS

### نصب cert-manager (برای Let's Encrypt)

```bash
# نصب cert-manager
kubectl apply -f https://github.com/cert-manager/cert-manager/releases/download/v1.13.0/cert-manager.yaml

# ساخت ClusterIssuer
cat <<EOF | kubectl apply -f -
apiVersion: cert-manager.io/v1
kind: ClusterIssuer
metadata:
  name: letsencrypt-prod
spec:
  acme:
    server: https://acme-v02.api.letsencrypt.org/directory
    email: admin@peikarband.ir
    privateKeySecretRef:
      name: letsencrypt-prod
    solvers:
    - http01:
        ingress:
          class: nginx
EOF
```

### پیکربندی DNS

```bash
# A Record برای domain اصلی
peikarband.ir.         A     YOUR_CLUSTER_IP

# CNAME برای www
www.peikarband.ir.     CNAME peikarband.ir.
```

## Monitoring و Logs

### 1. مشاهده Logs

```bash
# تمام pods
kubectl logs -f deployment/peikarband-prod -n production

# یک pod خاص
kubectl logs -f peikarband-prod-xxxxx-yyyyy -n production

# تمام logs (از همه pods)
kubectl logs -l app.kubernetes.io/name=peikarband -n production --tail=100
```

### 2. مشاهده Events

```bash
kubectl get events -n production --sort-by='.lastTimestamp'
```

### 3. چک کردن Resource Usage

```bash
# CPU و Memory
kubectl top pods -n production

# Metrics از deployment
kubectl top deployment peikarband-prod -n production
```

### 4. HPA Status

```bash
kubectl get hpa -n production
kubectl describe hpa peikarband-prod -n production
```

## Rollback

### 1. مشاهده History

```bash
# Helm releases
helm history peikarband-prod -n production

# Kubernetes rollout history
kubectl rollout history deployment/peikarband-prod -n production
```

### 2. Rollback با Helm

```bash
# به نسخه قبلی
helm rollback peikarband-prod -n production

# به نسخه خاص
helm rollback peikarband-prod 3 -n production
```

### 3. Rollback با Kubectl

```bash
# به نسخه قبلی
kubectl rollout undo deployment/peikarband-prod -n production

# به نسخه خاص
kubectl rollout undo deployment/peikarband-prod --to-revision=2 -n production
```

## Troubleshooting

### Pod در حالت Pending

```bash
# بررسی events
kubectl describe pod POD_NAME -n production

# چک کردن resources
kubectl describe nodes
```

### Pod در حالت CrashLoopBackOff

```bash
# مشاهده logs
kubectl logs POD_NAME -n production --previous

# مشاهده events
kubectl describe pod POD_NAME -n production
```

### Image Pull Error

```bash
# چک کردن imagePullSecrets
kubectl get secrets -n production

# بررسی pod
kubectl describe pod POD_NAME -n production
```

### Health Check Failing

```bash
# تست مستقیم health endpoint
kubectl exec -it POD_NAME -n production -- curl localhost:8000/ping

# بررسی liveness/readiness probes
kubectl describe pod POD_NAME -n production
```

## Clean Up

### حذف Release

```bash
# حذف کامل
helm uninstall peikarband-prod -n production

# با نگه داشتن history
helm uninstall peikarband-prod -n production --keep-history
```

### حذف Namespace

```bash
kubectl delete namespace production
```

## Best Practices

### 1. Always use specific image tags
```yaml
image:
  tag: "v0.1.0"  # ✅ Good
  # tag: "latest"  # ❌ Bad
```

### 2. Set resource limits
```yaml
resources:
  limits:
    cpu: 1000m
    memory: 1Gi
  requests:
    cpu: 250m
    memory: 512Mi
```

### 3. Enable autoscaling برای production
```yaml
autoscaling:
  enabled: true
  minReplicas: 3
  maxReplicas: 10
```

### 4. استفاده از Pod Disruption Budget
```yaml
podDisruptionBudget:
  enabled: true
  minAvailable: 1
```

### 5. NetworkPolicy برای امنیت
```yaml
networkPolicy:
  enabled: true
```

## CI/CD Integration

### GitHub Actions

workflow ما به صورت خودکار:

1. ✅ Build Docker image
2. ✅ Push به registry
3. ✅ Package Helm chart
4. ✅ Deploy به staging (on push to main)
5. ✅ Deploy به production (on tag)
6. ✅ Create GitHub release

### Manual Trigger

```bash
# از طریق GitHub UI: Actions → CD → Run workflow
```

## Support

برای مشکلات و سوالات:
- 📧 Email: support@peikarband.ir
- 💬 Telegram: @peikarband_support
- 📚 Docs: https://docs.peikarband.ir

