# AKİA — Backup və Bərpa Təlimatı

Bu sənəd sistem administratoru üçündür. Sənəd arxivi sistemində məlumat itkisi
fəlakətdir — ona görə **həm verilənlər bazası, həm də yüklənmiş fayllar** müntəzəm
backup olunmalıdır.

> ⚠️ **Ən vacib qayda:** Yalnız DB-ni backup etmək **KİFAYƏT DEYİL**.
> Sənədlərin faktiki faylları (PDF/şəkil) ayrıca qovluqda saxlanılır.
> DB-də qeyd qalsa da, fayllar backup-da yoxdursa, sənədlər bərpa olunmaz.

---

## 1. Nə backup olunmalıdır?

| # | Komponent | Yer | Tezlik |
|---|-----------|-----|--------|
| 1 | **Verilənlər bazası** (MySQL `arxiv`) | `arxiv_db` konteyneri / `mysql_data` volume | Gündə 1 dəfə (min.) |
| 2 | **Yüklənmiş fayllar** | `storage/app/private/` | Gündə 1 dəfə (min.) |
| 3 | **`.env` faylı** | layihə kökü | Dəyişdikcə |

**Fayl qovluqlarının detalı:**
```
storage/app/private/appeals/main/         → əsas sənədlər (PDF/şəkil)
storage/app/private/appeals/attachments/  → qoşma sənədlər
```

---

## 2. Verilənlər bazası backup-ı

### Əl ilə (bir dəfəlik)
```bash
# Tarixli fayl adı ilə dump
docker exec arxiv_db sh -c \
  'mysqldump -u arxiv -p"$MYSQL_PASSWORD" arxiv' \
  | gzip > backup-db-$(date +%F-%H%M).sql.gz
```
> Qeyd: parol `.env`-dəki `DB_PASSWORD` ilə eynidir. Konteynerdə `MYSQL_PASSWORD`
> dəyişəni təyin olunmayıbsa, parolu birbaşa yazın: `mysqldump -u arxiv -pSIZIN_PAROL arxiv`.

### Avtomatik (cron — hər gecə 02:00)
`crontab -e` ilə əlavə edin:
```cron
0 2 * * * cd /path/to/arxiv && docker exec arxiv_db sh -c 'mysqldump -u arxiv -pSIZIN_PAROL arxiv' | gzip > /backups/db/arxiv-$(date +\%F).sql.gz
```

---

## 3. Fayl backup-ı

### Əl ilə
```bash
tar -czf backup-files-$(date +%F-%H%M).tar.gz storage/app/private
```

### Avtomatik (cron — hər gecə 02:30)
```cron
30 2 * * * cd /path/to/arxiv && tar -czf /backups/files/arxiv-files-$(date +\%F).tar.gz storage/app/private
```

> **Alternativ (tövsiyə):** `rsync` ilə inkremental backup daha səmərəlidir:
> ```bash
> rsync -a --delete storage/app/private/ /backups/files-mirror/
> ```

---

## 4. Bərpa (Restore)

### Verilənlər bazasını bərpa et
```bash
# gzip-li dump-dan
gunzip < backup-db-2026-06-04.sql.gz | docker exec -i arxiv_db mysql -u arxiv -pSIZIN_PAROL arxiv
```

### Faylları bərpa et
```bash
tar -xzf backup-files-2026-06-04.tar.gz -C /path/to/arxiv
# storage/app/private bərpa olunur
```

### Bərpadan sonra
```bash
docker exec arxiv_app php artisan optimize:clear
```

> ⚠️ DB və fayllar **eyni tarixli** backup-dan bərpa olunmalıdır ki, sənəd qeydləri
> ilə faktiki fayllar uyğun gəlsin.

---

## 5. Yoxlama və saxlama qaydaları

- **Test restore:** Ən azı ayda 1 dəfə backup-ı test mühitinə bərpa edib yoxlayın.
  Yoxlanılmamış backup = backup deyil.
- **Saxlama (retention):** Tövsiyə — son 7 gündəlik + son 4 həftəlik + son 12 aylıq.
- **Off-site:** Backup-ları **fərqli fiziki yerdə/serverdə** saxlayın (eyni serverdə
  saxlanan backup server sıradan çıxanda itir).
- **Monitorinq:** Cron-un uğurla işlədiyini yoxlayın (boş/0-baytlıq dump = problem).

---

## 6. Tez yoxlama siyahısı (checklist)

- [ ] DB backup cron-u qurulub və işləyir
- [ ] `storage/app/private` fayl backup-ı cron-u qurulub
- [ ] Backup-lar off-site saxlanılır
- [ ] `.env` təhlükəsiz yerdə saxlanılır
- [ ] Test restore aparılıb və uğurludur
- [ ] Saxlama müddəti (retention) təyin olunub

---

## 7. Managed/bulud mühit üçün

Əgər sistem managed DB (məs. AWS RDS, DigitalOcean Managed MySQL) və ya bulud
storage istifadə edirsə:
- **DB:** provayderin avtomatik snapshot/point-in-time-recovery funksiyasını aktiv edin.
- **Fayllar:** `storage/app/private`-i S3/object storage-a köçürüb versiyalamanı aktiv
  etmək olar (bu halda `FILESYSTEM_DISK`-i `s3`-ə dəyişmək lazımdır — tələb olunsa
  development komandası ilə əlaqə saxlayın).
