{
  "title": "استراتژی محیط‌ها",
  "slug": "team/devops/environment-strategy",
  "url": "/docs/team/devops/environment-strategy",
  "frontmatter": {
    "layout": "doc",
    "title": "استراتژی محیط‌ها",
    "description": "تعریف رسمی محیط‌های استقرار — Development, Production و نقشه راه Staging",
    "version": "1.0.0",
    "status": "PRIVATE",
    "author": "Antigravity",
    "owner": "Devops Team",
    "created_at": "2026-06-16",
    "updated_at": "2026-06-16",
    "tags": "",
    "reviewers": ""
  },
  "sections": [
    {
      "level": 1,
      "heading": "استراتژی محیط‌ها",
      "content": "**Environment Strategy**\n\n---"
    },
    {
      "level": 2,
      "heading": "۱. اصول معماری",
      "content": "- **یک معماری، چند محیط** — همه محیط‌ها از چارت‌های Helm یکسان استفاده می‌کنند؛ فقط `values.yaml` متفاوت است.\n- **Kubernetes-Native** — همه محیط‌ها روی K3d (محلی) یا K3s (پروداکشن) اجرا می‌شوند.\n- **محیط‌ها ایزوله هستند** — هیچ سرویسی بین محیط‌ها به اشتراک گذاشته نمی‌شود.\n- **ترفیع تصویر (Image Promotion)** — یک تصویر پس از تأیید در Staging، بدون تغییر به Production ارتقا می‌یابد.\n\n---"
    },
    {
      "level": 2,
      "heading": "۲. محیط‌های رسمی",
      "content": ""
    },
    {
      "level": 3,
      "heading": "۲.۱ Development (محلی)",
      "content": "| مشخصه | مقدار |\n|-------|-------|\n| Cluster | K3d (محلی روی لپ‌تاپ توسعه‌دهنده) |\n| Namespace | `nons-platform`, `nons-system` |\n| تصاویر | `k3d image import` — بدون Registry خارجی |\n| Secrets | مقادیر placeholder از `.env.example` |\n| TLS | بدون TLS (HTTP محلی) |\n| DNS | `localhost` |\n| استقرار | دستی با Helm |\n| Monitoring | خاموش |\n\n**موارد استفاده:** توسعه محلی، تست سریع، debug.\n\n**فرمان استقرار:**\n\n```bash\nk3d cluster create nons -p \"80:80@loadbalancer\" --k3s-arg \"--disable=traefik@server:0\"\nkubectl create namespace nons-platform\nkubectl create namespace nons-system\n\nhelm install nons-postgres ./deploy/helm/postgres -n nons-platform -f ./deploy/environments/local/values.yaml\nhelm install nons-redis ./deploy/helm/redis -n nons-platform -f ./deploy/environments/local/values.yaml\nhelm install nons-nats ./deploy/helm/nats -n nons-platform -f ./deploy/environments/local/values.yaml\nhelm install nons-kratos ./deploy/helm/kratos -n nons-platform -f ./deploy/environments/local/values.yaml\nhelm install nons-hydra ./deploy/helm/hydra -n nons-platform -f ./deploy/environments/local/values.yaml\nk3d image import nons-auth-service:latest -c nons\nhelm install nons-auth-service ./deploy/helm/auth-service -n nons-platform -f ./deploy/environments/local/values.yaml\nhelm install nons-gateway ./deploy/helm/gateway -n nons-system -f ./deploy/environments/local/values.yaml\n```"
    },
    {
      "level": 3,
      "heading": "۲.۲ Production (عملیاتی)",
      "content": "| مشخصه | مقدار |\n|-------|-------|\n| Cluster | K3s (سرور عملیاتی) |\n| Namespace | `nons-platform`, `nons-system` |\n| تصاویر | Pull از `ghcr.io/nons/*` با `imagePullSecrets` |\n| Secrets | Kubernetes Secrets واقعی + GitHub Environments |\n| TLS | Let's Encrypt (cert-manager) |\n| DNS | `api.nons.ir`, `auth.nons.ir`, ... |\n| استقرار | دستی با تأیید تیم (Manual Gate) |\n| Replica | ۲-۵ پاد با HPA |\n| Monitoring | Prometheus + Grafana (فاز ۲) |\n\n**موارد استفاده:** ترافیک واقعی کاربران، uptime الزامی.\n\n**فرمان استقرار:**\n\n```bash\nhelm upgrade --install nons-postgres ./deploy/helm/postgres \\\n  -n nons-platform \\\n  -f ./deploy/environments/production/values.yaml\n\nhelm upgrade --install nons-auth-service ./deploy/helm/auth-service \\\n  --set image.tag=1.2.0 \\\n  -n nons-platform \\\n  -f ./deploy/environments/production/values.yaml\n```\n\n---"
    },
    {
      "level": 2,
      "heading": "۳. Staging — وضعیت و نقشه راه",
      "content": ""
    },
    {
      "level": 3,
      "heading": "۳.۱ وضعیت فعلی",
      "content": "**Staging بخشی از MVP نیست.** در حال حاضر:\n\n| مؤلفه | وضعیت |\n|-------|-------|\n| Kubernetes Resources | 📄 دایرکتوری `deploy/environments/staging/` وجود دارد |\n| values.yaml | 📄 پوسته موجود — مقادیر واقعی تنظیم نشده |\n| CI/CD Pipeline | ❌ استقرار خودکار به Staging پیاده‌سازی نشده |\n| E2E Tests | 📄 مستند شده در `release-lifecycle-blueprint` — پیاده‌سازی نشده |\n| Active Use | ❌ استفاده نمی‌شود |"
    },
    {
      "level": 3,
      "heading": "۳.۲ دلیل عدم نیاز در MVP",
      "content": "1. **تعداد سرویس‌های فعال کم است** — تنها auth-service + Core + زیرساخت. تست دستی روی Development کافی است.\n2. **ترافیک اولیه پایین است** — MVP با کاربران محدود شروع می‌شود.\n3. **تیم کوچک است** — حفظ ۳ محیط برای تیم ۲-۳ نفره هزینه نگهداری دارد."
    },
    {
      "level": 3,
      "heading": "۳.۳ نقشه راه Staging",
      "content": "| فاز | قابلیت | وابستگی | زمان پیشنهادی |\n|-----|--------|---------|--------------|\n| **فاز ۲-۱** | ایجاد CI/CD Pipeline برای Staging | ghcr.io + GitHub Environments | پس از MVP Launch |\n| **فاز ۲-۲** | فعال‌سازی GitHub Environment `staging` | GitHub Environments Setup | همزمان با فاز ۲-۱ |\n| **فاز ۲-۳** | استقرار خودکار هر commit به `main` روی Staging | CI/CD Pipeline کامل | همزمان با فاز ۲-۱ |\n| **فاز ۲-۴** | E2E Tests خودکار پس از استقرار | Test Suite + Test Data | فاز ۲-۳ + ۱ ماه |\n| **فاز ۲-۵** | Active Use — تیم از Staging برای تأیید استفاده کند | همه موارد بالا | فاز ۲-۴ + ۲ هفته |\n\n---"
    },
    {
      "level": 2,
      "heading": "۴. مقایسه محیط‌ها",
      "content": "| پارامتر | Development (K3d) | Staging (K3s) | Production (K3s) |\n|---------|-------------------|---------------|------------------|\n| Cluster | K3d (Docker) | K3s | K3s |\n| Replica | ۱ | ۱-۲ | ۲-۵ |\n| Image Source | `k3d image import` | `ghcr.io` (SHA tag) | `ghcr.io` (Version tag) |\n| TLS | ❌ | ✅ (Self-signed/Let's Encrypt) | ✅ (Let's Encrypt) |\n| DNS | `localhost` | `staging.nons.ir` | `api.nons.ir` |\n| Secrets | Placeholders | واقعی (گردش limited) | واقعی (کامل) |\n| Monitoring | ❌ | ✅ (Prometheus + Grafana) | ✅ (Prometheus + Grafana) |\n| استقرار | دستی | خودکار (CI) | دستی (تأیید تیم) |\n| Rollback | دستی | خودکار (در صورت خطا) | دستی |\n| Data | تستی / synthetic | محدود (subset) | واقعی |\n| Uptime Goal | — | ۹۹٪ | ۹۹٫۹٪ |\n\n---"
    },
    {
      "level": 2,
      "heading": "۵. تفاوت‌های کلیدی Values بین محیط‌ها",
      "content": "| پارامتر | Local | Production |\n|---------|-------|-----------|\n| `replicaCount` | ۱ | ۲-۵ |\n| `ingress.hosts` | `localhost` | `api.nons.ir` |\n| `resources.limits.cpu` | بدون محدودیت | `500m`-`2` |\n| `resources.limits.memory` | بدون محدودیت | `512Mi`-`4Gi` |\n| `postgres.persistence.size` | `1Gi` | `50Gi` |\n| `postgres.persistence.storageClass` | `local-path` | `ssd-cloud` |\n| `image.pullPolicy` | `Never` | `Always` |\n| `image.tag` | `latest` | SemVer (e.g., `1.2.0`) |\n\n---"
    },
    {
      "level": 2,
      "heading": "۶. خط‌مشی ارتقاء بین محیط‌ها (Promotion Flow)",
      "content": "```\nDevelopment (K3d)\n  ↓  تصویر با `latest` تگ — توسعه و تست محلی\nCI Build\n  ↓  تصویر با `sha-{commit}` تگ — push به ghcr.io\nStaging (K3s) — [فاز ۲]\n  ↓  استقرار خودکار + E2E Tests\nProduction (K3s)\n  ↓  استقرار دستی با تأیید تیم + Git Tag\n```\n\n**قوانین Promotion:**\n\n| مرحله | از | به | گیت | مسئول |\n|-------|---|----|-----|-------|\n| توسعه | Local | CI | Commit به `main` | توسعه‌دهنده |\n| استقرار Staging | CI | Staging | خودکار (فاز ۲) | CI |\n| تأیید Staging | Staging | — | E2E Tests (فاز ۲) | CI |\n| استقرار Production | CI/CD | Production | تأیید دستی تیم | Devops Team Lead |\n| Release | Production | — | Git Tag + GitHub Release | Devops Team |\n\n---"
    },
    {
      "level": 2,
      "heading": "۷. خلاصه",
      "content": "| محیط | وضعیت | Cluster | استقرار | MVP |\n|------|-------|---------|---------|-----|\n| **Development** | ✅ فعال | K3d | دستی | ✅ بخشی از MVP |\n| **Staging** | 📅 فاز ۲ | K3s | خودکار (آینده) | ❌ خارج از MVP |\n| **Production** | 🟡 در حال آماده‌سازی | K3s | دستی (تأیید تیم) | ✅ هدف MVP |"
    }
  ]
}