# پشتیبان‌گیری، بازیابی و بهره‌برداری

## ۱. راهبرد پشتیبان‌گیری

| موضوع | مقدار |
|---|---|
| دوره‌ی پشتیبان‌گیری کامل | هر ۶ ساعت |
| نگه‌داری (Retention) | ۳۰ روز (قابل تنظیم با `BACKUP_RETENTION_DAYS`) |
| قالب | `pg_dump --format=custom` فشرده با gzip |
| مقصد | حجم `backup-archive` و همگام‌سازی به سطل `shahrnama-backups` در MinIO |
| RPO هدف | حداکثر ۶ ساعت داده |
| RTO هدف | کمتر از ۱ ساعت |

اسکریپت‌ها: `datacenter/backups/scripts/{schedule,backup,restore}.sh`

`backup.sh` پس از تولید فایل، **خالی نبودن آن را بررسی می‌کند** و در صورت شکست،
فایل ناقص را حذف کرده و با کد خطا خارج می‌شود — یعنی پشتیبان معیوب در آرشیو نمی‌ماند.

## ۲. بازیابی

```bash
docker compose -f datacenter/docker-compose.yml exec backup \
  /scripts/restore.sh /archive/shahrnama-20260821-0600.dump.gz
```

اسکریپت عمداً نیازمند تایپ دستی `CONFIRM` است. پس از بازیابی حتماً نمایه‌ی
جست‌وجو را بازسازی کنید:

```
POST /api/admin/maintenance/reindex
```

## ۳. آزمون دوره‌ای بازیابی

پشتیبانی که آزمون نشده، پشتیبان نیست. کارگر `backup-verify` روزانه آخرین نسخه را
روی یک پایگاه‌داده‌ی موقت بازیابی می‌کند و تعداد رکورد جدول‌های کلیدی
(`articles`, `cases`, `users`) را با نسخه‌ی زنده مقایسه می‌کند.

## ۴. آنچه در پشتیبان نیست و باید جداگانه مدیریت شود

- فایل‌های رسانه در MinIO (سیاست نسخه‌بندی سطل جداگانه)
- متغیرهای محیطی و اسرار (در مدیر رمز سازمانی)
- داده‌ی موقت Redis (قابل بازسازی؛ نشست‌ها باطل می‌شوند و کاربران دوباره وارد می‌شوند)

## ۵. پایش

`datacenter/monitoring/prometheus/prometheus.yml`

علاوه بر شاخص‌های زیرساختی، هشدارهای **دامنه‌ای** تعریف شده‌اند:

| هشدار | چرا مهم است |
|---|---|
| نرخ نقض SLA بالاتر از آستانه | نشانه‌ی ناکارآمدی سازمان یا مسیریابی اشتباه |
| صف بررسی گزارش‌ها بیش از N ساعت راکد | شهروند بی‌پاسخ می‌ماند |
| شکست پیاپی ارسال به کانال‌های سازمانی | قطع ارتباط رسمی |
| افزایش ناگهانی جست‌وجوهای بی‌نتیجه | شکاف محتوایی |

## ۶. وظایف نگهداری دستی

همه‌ی کارگرها معادل endpoint دستی دارند تا بدون زمان‌بند هم قابل اجرا و آزمون باشند:

| endpoint | معادل کارگر |
|---|---|
| `POST /api/admin/maintenance/sla-sweep` | `sla-sweep` |
| `POST /api/admin/maintenance/editorial-lock` | `editorial-lock` |
| `POST /api/admin/maintenance/reindex` | `search-reindex` |

## ۷. محدودیت‌های محیط فعلی (صادقانه)

در سندباکس این مخزن:

- **Docker نصب نیست** و قابل نصب نبود ⇒ `datacenter/docker-compose.yml` یک artifact
  پیکربندی برای استقرار واقعی است، نه چیزی که اینجا اجرا شده باشد.
- **PostgreSQL و Redis از طریق apt در دسترس نبودند** ⇒ توسعه با PGlite انجام شد
  (همان اسکیما و همان مهاجرت‌ها).
- **دسترسی به اینترنت عمومی مسدود است** (به‌جز رجیستری npm) ⇒ قلم Vazirmatn از
  بسته‌ی npm گرفته شد و تصاویر به‌جای عکس واقعی، **گرافیک برداری تولیدشده** هستند
  تا هیچ تصویر جعلی به‌عنوان عکس خبری واقعی جا زده نشود.
- **مرورگر Playwright قابل دانلود نبود** ⇒ آزمون سرتاسری خودکار اجرا نشد؛ اعتبارسنجی
  با `tsc --noEmit`، `next build` و آزمون‌های دامنه‌ای بک‌اند انجام شد.
