# Wakel AI — Disaster Recovery (استعادة الكوارث)

كيف تُرجِع المنصة بالكامل لو تلف السيرفر — من **GitHub** (الكود) + **النسخة الاحتياطية** (قاعدة البيانات + الإعدادات + ذاكرات الوكلاء).

---

## ما الذي يُنسَخ احتياطياً

| المكوّن | المصدر | أين يُحفَظ | التكرار |
|---|---|---|---|
| الكود | git | **GitHub** (private repo) | يومياً (push) |
| قاعدة البيانات | `wakelaicom-postgres` (pg_dump) | داخل الحزمة | يومياً |
| الأسرار/الإعدادات | `.env`, `.env.local`, `docker-compose*.yml`, `schema.prisma` | داخل الحزمة | يومياً |
| موديولات الـruntime | `.runtime/` (compose + traefik لكل عميل) | داخل الحزمة | يومياً |
| nginx vhosts | `/etc/nginx/conf.d/*wakelai*` + `nginx.conf` | داخل الحزمة | يومياً |
| أدوات التشغيل | `ops/` + systemd units + watchdog | داخل الحزمة + GitHub | يومياً |
| ذاكرات وكلاء Hermes | كل أحجام `*hermes*-data` (~3.5GB) | داخل الحزمة الكاملة | أسبوعياً (الأحد) |

الحزم في `/var/backups/wakelai/`:
- `wakelai-core-<ts>.tar.gz` — يومية، صغيرة (بضع MB)، **نزّلها لجهازك يومياً**.
- `wakelai-full-<ts>.tar.gz` — أسبوعية، تشمل ذاكرات الوكلاء.

> **مهم:** الحزم تحتوي أسراراً وبيانات عملاء — صلاحياتها `600` وتُحفظ في مجلد root فقط. نزّلها عبر قناة آمنة (scp) واحفظها مشفّرة على جهازك.

---

## تنزيل النسخة لجهازك (يدوياً أو مجدوَل)

```bash
# أحدث نسخة أساسية
scp -P 21098 root@203.161.35.97:/var/backups/wakelai/wakelai-core-*.tar.gz .
# أحدث نسخة كاملة (ذاكرات الوكلاء)
scp -P 21098 root@203.161.35.97:'/var/backups/wakelai/wakelai-full-*.tar.gz' .
```

---

## الاستعادة على سيرفر جديد

### 1) الكود من GitHub
```bash
git clone git@github.com:<owner>/wakelai.com.git
cd wakelai.com
```

### 2) شغّل قاعدة البيانات (نفس نمط الإنتاج — host networking على 55433)
```bash
docker run -d --name wakelaicom-postgres --restart unless-stopped --network host \
  -e POSTGRES_DB=wakelai -e POSTGRES_USER=wakelai -e POSTGRES_PASSWORD=<من .env.local> \
  -v wakelaicom_postgres-local-data:/var/lib/postgresql/data \
  postgres:16-alpine postgres -c listen_addresses=127.0.0.1 -p 55433
```

### 3) استعد كل شيء من الحزمة
```bash
sudo ops/wakelai-restore.sh /path/to/wakelai-full-<ts>.tar.gz
# أو للمعاينة فقط دون تغيير:
sudo ops/wakelai-restore.sh /path/to/wakelai-core-<ts>.tar.gz --dry-run
# أو قاعدة البيانات فقط:
sudo ops/wakelai-restore.sh /path/to/bundle.tar.gz --db-only
```
سكربت الاستعادة يعيد: قاعدة البيانات، `.env`/`.env.local`، `.runtime`، vhosts، والأحجام (من الحزمة الكاملة).

### 4) ابنِ وشغّل التطبيق
```bash
npm ci
NEXT_DIST_DIR=.next node node_modules/next/dist/bin/next build   # لا تستخدم npm run build (يمسح .next)
cp ops/systemd/*.service ops/systemd/*.timer /etc/systemd/system/
cp ops/wakelai-watchdog.sh ops/wakelai-backup.sh ops/wakelai-restore.sh /usr/local/bin/
systemctl daemon-reload
systemctl enable --now wakelai-nextjs.service wakelai-watchdog.timer wakelai-backup.timer
curl -sI http://127.0.0.1:9100/
```

### 5) أعد توجيه nginx وتحقّق
```bash
nginx -t && nginx -s reload
```

### 6) أعد إنشاء حاويات العملاء
موديولات كل عميل في `.runtime/<slug>/docker-compose.yml`. المنصة تعيد إنشاءها عند الحاجة (self-healing عبر `recoverCompanyContainer` / `ensurePoolContainer`)، أو يدوياً:
```bash
docker compose -p genney-<slug> -f .runtime/<slug>/docker-compose.yml up -d
```

---

## اختبار الاستعادة (بدون كارثة)
جرّب `--dry-run` على أحدث حزمة دورياً للتأكد أنها سليمة:
```bash
sudo /usr/local/bin/wakelai-restore.sh $(ls -t /var/backups/wakelai/wakelai-core-*.tar.gz | head -1) --dry-run
```

---

## ملاحظات تشغيلية
- **قاعدة البيانات** تعمل بـ host networking على `127.0.0.1:55433` (حاوية `wakelaicom-postgres`) لأن سلسلة iptables `DOCKER-FORWARD` مفقودة على المضيف؛ الإصلاح الجذري = `systemctl restart docker` (يعيد تشغيل كل الحاويات) ثم العودة لـ`docker compose -f docker-compose.local.yml`.
- **Odoo**: لا توجد قواعد Odoo قيد التشغيل حالياً؛ عند تفعيلها أضف dump لقاعدة Odoo في `wakelai-backup.sh`.
- **مراقبة الصحة**: `wakelai-watchdog.timer` يعيد تشغيل التطبيق تلقائياً لو تجمّد، ويلتقط تقرير تشخيص في `/var/log/wakelai-reports`.
