# Environment-specific Configuration Guide

## 📁 فایل‌های appsettings

این پروژه از فایل‌های زیر برای مدیریت تنظیمات محیط‌های مختلف استفاده می‌کند:

### فایل‌های موجود:

| فایل | محیط | Git | توضیحات |
|------|------|-----|---------|
| `appsettings.json` | Base/Default | ✅ Commit | تنظیمات پایه و مقادیر پیش‌فرض |
| `appsettings.Development.json` | Local/Test | ✅ Commit | محیط توسعه محلی (Mock APIs) |
| `appsettings.Staging.json` | Staging | ⚠️ Template | محیط Stage (نیاز به تنظیمات واقعی) |
| `appsettings.Production.json` | Production | ⚠️ Template | محیط Production (نیاز به تنظیمات واقعی) |

---

## 🔐 امنیت

### ⚠️ فایل‌هایی که نباید commit شوند:

```gitignore
# Sensitive configuration files
appsettings.Staging.json
appsettings.Production.json
appsettings.*.local.json
```

### ✅ روش امن:

1. **فایل‌های Template**: فایل‌های `appsettings.Staging.json` و `appsettings.Production.json` به صورت template در Git هستند
2. **مقادیر واقعی**: از **Environment Variables** یا **Kubernetes Secrets** استفاده کنید
3. **CI/CD**: مقادیر حساس را از Azure Key Vault یا Kubernetes Secrets تزریق کنید

---

## 🚀 نحوه اجرا در محیط‌های مختلف

### Local Development:
```bash
dotnet run --environment Development
# یا
export ASPNETCORE_ENVIRONMENT=Development
dotnet run
```

### Staging:
```bash
dotnet run --environment Staging
```

### Production:
```bash
dotnet run --environment Production
```

---

## 🐳 Docker

برای Docker، environment را با `-e` تنظیم کنید:

```bash
docker run -e ASPNETCORE_ENVIRONMENT=Staging yourimage:tag
```

---

## ☸️ Kubernetes

در Deployment manifest:

```yaml
apiVersion: apps/v1
kind: Deployment
metadata:
  name: cms-api
spec:
  template:
    spec:
      containers:
      - name: cms
        env:
        - name: ASPNETCORE_ENVIRONMENT
          value: "Production"  # یا "Staging"
        # Override تنظیمات از Secrets
        - name: ConnectionStrings__DefaultConnection
          valueFrom:
            secretKeyRef:
              name: cms-secrets
              key: db-connection
        - name: Sms__KavenegarApiKey
          valueFrom:
            secretKeyRef:
              name: cms-secrets
              key: kavenegar-key
```

---

## 📋 Checklist تنظیمات محیط Production

- [ ] ConnectionString database production
- [ ] JwtSecurityKey یونیک
- [ ] Sentry DSN
- [ ] Slack Webhook
- [ ] SMTP credentials
- [ ] Kavenegar API Key
- [ ] Daya API Key
- [ ] Chatika API Key
- [ ] Seq Server URL
- [ ] SSL/TLS enabled
- [ ] UseRealPaymentGateway = true
- [ ] Background jobs enabled با cron صحیح

---

## 🔄 CI/CD Pipeline

### برای برنچ `kub-stage`:

```yaml
# در GitLab CI یا GitHub Actions
environment:
  name: staging
  variables:
    ASPNETCORE_ENVIRONMENT: "Staging"
    
# یا در Kubernetes ConfigMap:
kubectl create secret generic cms-secrets \
  --from-literal=db-connection="..." \
  --from-literal=kavenegar-key="..." \
  --namespace=staging
```

### برای برنچ `production`:

```yaml
environment:
  name: production
  variables:
    ASPNETCORE_ENVIRONMENT: "Production"

kubectl create secret generic cms-secrets \
  --from-literal=db-connection="..." \
  --from-literal=kavenegar-key="..." \
  --namespace=production
```

---

## 🎛️ Override تنظیمات با Environment Variables

ASP.NET Core به صورت خودکار از environment variables استفاده می‌کند:

```bash
# Format: Section__Property
export ConnectionStrings__DefaultConnection="Server=..."
export Sms__KavenegarApiKey="your-key"
export BackgroundJobs__WeeklyCommissionCalculation__Enabled="true"
```

**اولویت تنظیمات:**
1. Environment Variables (بالاترین)
2. appsettings.{Environment}.json
3. appsettings.json (پایین‌ترین)

---

## 📊 تفاوت‌های کلیدی محیط‌ها

| تنظیم | Development | Staging | Production |
|-------|-------------|---------|------------|
| Payment Gateway | Mock | Mock | Real |
| SMS | Disabled | Disabled | Enabled |
| Email | Disabled | Disabled | Enabled |
| Sentry | Disabled | Enabled | Enabled |
| Background Jobs | Disabled | Enabled | Enabled |
| Log Level | Debug | Information | Warning |
| Chatika | Disabled | Disabled | Enabled |
| Daya API | Mock | Mock | Real |

---

## 🛠️ تست تنظیمات

برای تست اینکه کدام فایل لود شده:

```csharp
// در Program.cs یا Controller
app.Logger.LogInformation("Environment: {Env}", app.Environment.EnvironmentName);
app.Logger.LogInformation("Connection: {Conn}", 
    app.Configuration.GetConnectionString("DefaultConnection"));
```

یا از endpoint health check:
```
GET /health
```
