433 lines
11 KiB
Markdown
433 lines
11 KiB
Markdown
# دليل النشر والتنفيذ - شامل ومفصل
|
||
|
||
**التاريخ:** 16 يونيو 2026
|
||
**الحالة:** قيد الإعداد للنشر
|
||
**المدة المتوقعة:** 9.5 ساعات
|
||
|
||
---
|
||
|
||
## 🎯 الهدف
|
||
|
||
تطبيق إصلاحات أمان حرجة على نظام سيرو مع ضمان عدم قطع الخدمة.
|
||
|
||
---
|
||
|
||
## 📋 المتطلبات قبل البدء
|
||
|
||
- [ ] نسخة احتياطية كاملة من قاعدة البيانات
|
||
- [ ] وصول مسؤول (SSH) إلى الخوادم
|
||
- [ ] حساب DevOps / تشغيل
|
||
- [ ] فريق اختبار جاهز
|
||
- [ ] خطة العودة للإصدار السابق
|
||
|
||
---
|
||
|
||
## 🚀 مراحل التنفيذ
|
||
|
||
### المرحلة 1️⃣: تحضيراتي (30 دقيقة)
|
||
|
||
#### 1.1 التحقق من البيئة الحالية
|
||
|
||
```bash
|
||
# تحقق من إصدار PHP
|
||
php -v
|
||
|
||
# تحقق من توفر openssl
|
||
php -m | grep openssl
|
||
|
||
# تحقق من Redis
|
||
redis-cli ping
|
||
|
||
# تحقق من MySQL
|
||
mysql -u root -p -e "SELECT VERSION();"
|
||
```
|
||
|
||
#### 1.2 نسخ احتياطي شامل
|
||
|
||
```bash
|
||
# قاعدة البيانات الرئيسية
|
||
mysqldump -u root -p siro_main > /backup/siro_main_$(date +%Y%m%d_%H%M%S).sql
|
||
|
||
# قاعدة بيانات المحفظة
|
||
mysqldump -u root -p walletintaleq > /backup/walletintaleq_$(date +%Y%m%d_%H%M%S).sql
|
||
|
||
# ملفات الكود
|
||
tar -czf /backup/backend_$(date +%Y%m%d_%H%M%S).tar.gz /var/www/html/backend/
|
||
|
||
# .env file
|
||
cp backend/.env /backup/.env.backup
|
||
```
|
||
|
||
#### 1.3 إنشاء قاعدة البيانات الجديدة
|
||
|
||
```sql
|
||
-- استخدم SQL Client مثل MySQL Workbench أو phpMyAdmin
|
||
|
||
-- الجدول الجديد لتتبع طلبات إضافة الأموال
|
||
CREATE TABLE IF NOT EXISTS driver_wallet_requests (
|
||
id INT AUTO_INCREMENT PRIMARY KEY,
|
||
driver_id INT NOT NULL,
|
||
amount DECIMAL(10, 2) NOT NULL,
|
||
source VARCHAR(50) DEFAULT 'manual',
|
||
status ENUM('pending', 'completed', 'failed') DEFAULT 'pending',
|
||
error TEXT NULL,
|
||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||
|
||
CONSTRAINT fk_driver_id FOREIGN KEY (driver_id)
|
||
REFERENCES driver(id) ON DELETE CASCADE,
|
||
|
||
INDEX idx_driver_status (driver_id, status),
|
||
INDEX idx_created_at (created_at),
|
||
INDEX idx_status (status)
|
||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
|
||
|
||
-- اختياري: إضافة عمود log للتدقيق
|
||
ALTER TABLE driver_wallet_requests
|
||
ADD COLUMN audit_log LONGTEXT AFTER error;
|
||
|
||
-- اختياري: تحديد Retention Policy
|
||
ALTER TABLE driver_wallet_requests
|
||
ADD INDEX idx_retention (created_at);
|
||
|
||
-- تحقق من الجدول
|
||
DESCRIBE driver_wallet_requests;
|
||
SHOW CREATE TABLE driver_wallet_requests\G
|
||
```
|
||
|
||
---
|
||
|
||
### المرحلة 2️⃣: النشر الفعلي (4 ساعات)
|
||
|
||
#### 2.1 نسخ الملفات الجديدة
|
||
|
||
```bash
|
||
cd /var/www/html
|
||
|
||
# نسخ فئة WalletConnector
|
||
cp /path/to/WalletConnector.php backend/core/
|
||
|
||
# إنشاء مجلد wallet
|
||
mkdir -p backend/wallet
|
||
cp /path/to/backend/wallet/add.php backend/wallet/
|
||
|
||
# تحديث ملفات المحفظة في walletintaleq
|
||
cp /path/to/add_s2s.php walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/
|
||
|
||
# تحديث encrypt_decrypt.php
|
||
cp /path/to/encrypt_decrypt.php backend/
|
||
```
|
||
|
||
#### 2.2 تحديث ملف .env
|
||
|
||
```bash
|
||
# إنشاء نسخة جديدة من .env مع المتغيرات الآمنة
|
||
cp backend/.env.example backend/.env
|
||
|
||
# تحرير .env وملء القيم الحساسة
|
||
nano backend/.env
|
||
|
||
# تعيين الأذونات الصحيحة
|
||
chmod 600 backend/.env
|
||
chown www-data:www-data backend/.env
|
||
|
||
# التحقق من الأذونات
|
||
ls -la backend/.env
|
||
```
|
||
|
||
**القيم الواجب تغييرها:**
|
||
|
||
```
|
||
❌ <CHANGE_ME_STRONG_PASSWORD>
|
||
❌ <CHANGE_ME_32_BYTE_HEX_KEY>
|
||
❌ <CHANGE_ME_LONG_RANDOM_STRING>
|
||
❌ <CHANGE_ME_REDIS_PASSWORD>
|
||
❌ <CHANGE_ME_LONG_HMAC_SECRET>
|
||
```
|
||
|
||
#### 2.3 توليد المفاتيح الآمنة
|
||
|
||
```bash
|
||
# توليد ENC_KEY (32 بايت hex)
|
||
openssl rand -hex 16
|
||
|
||
# مثال: 9a3f2e1b8c7d6e5f4a3b2c1d0e9f8a7b
|
||
# ← ضع هذا في ENC_KEY
|
||
|
||
# توليد JWT_SECRET
|
||
openssl rand -base64 32
|
||
|
||
# توليد WALLET_HMAC_SECRET
|
||
openssl rand -base64 48
|
||
|
||
# توليد REDIS_AUTH
|
||
openssl rand -base64 32
|
||
```
|
||
|
||
#### 2.4 اختبار الملفات الجديدة
|
||
|
||
```bash
|
||
# اختبر بناء الجملة PHP
|
||
php -l backend/core/WalletConnector.php
|
||
php -l backend/wallet/add.php
|
||
php -l walletintaleq.intaleq.xyz/v2/main/ride/driverWallet/add_s2s.php
|
||
|
||
# اختبر الاتصال بـ Redis
|
||
php -r "
|
||
\$redis = new Redis();
|
||
\$redis->connect('localhost', 6379);
|
||
echo \$redis->ping();
|
||
"
|
||
|
||
# اختبر الاتصال بـ MySQL
|
||
php -r "
|
||
\$pdo = new PDO('mysql:host=localhost;dbname=siro_main', 'root', 'password');
|
||
echo 'MySQL Connected';
|
||
"
|
||
```
|
||
|
||
#### 2.5 تفعيل الميزات الجديدة
|
||
|
||
```php
|
||
// في backend/bootstrap.php أو config
|
||
|
||
// تفعيل WalletConnector
|
||
require_once __DIR__ . '/core/WalletConnector.php';
|
||
|
||
// تفعيل المسار الجديد
|
||
// أضف في router.php أو .htaccess
|
||
// POST /wallet/add → backend/wallet/add.php
|
||
```
|
||
|
||
---
|
||
|
||
### المرحلة 3️⃣: الاختبار (2 ساعة)
|
||
|
||
#### 3.1 اختبار وحدة - WalletConnector
|
||
|
||
```php
|
||
// اختبر التوقيع HMAC
|
||
$hmac = hash_hmac('sha256', 'test', 'secret');
|
||
echo "HMAC: $hmac\n";
|
||
|
||
// اختبر التسلسل الزمني
|
||
$timestamp = time();
|
||
$timeDiff = abs(time() - $timestamp);
|
||
echo "Time diff: $timeDiff (should be < 5 seconds)\n";
|
||
|
||
// اختبر Nonce
|
||
$nonce = bin2hex(random_bytes(16));
|
||
echo "Nonce: $nonce (length: " . strlen($nonce) . ")\n";
|
||
```
|
||
|
||
#### 3.2 اختبار التكامل - End-to-End
|
||
|
||
```bash
|
||
# 1️⃣ احصل على JWT (كسائق)
|
||
curl -X POST https://api.siromove.com/auth/login \
|
||
-H "Content-Type: application/json" \
|
||
-d '{
|
||
"id": 1,
|
||
"fingerprint": "fake_fingerprint",
|
||
"aud": "driver"
|
||
}'
|
||
|
||
# 2️⃣ استخدم JWT لإضافة الأموال
|
||
JWT_TOKEN="eyJ0eXAiOiJKV1QiLCJhbGc..."
|
||
|
||
curl -X POST https://api.siromove.com/wallet/add \
|
||
-H "Content-Type: application/json" \
|
||
-H "Authorization: Bearer $JWT_TOKEN" \
|
||
-d '{
|
||
"amount": 100,
|
||
"source": "test"
|
||
}'
|
||
|
||
# 3️⃣ تحقق من قاعدة البيانات
|
||
mysql -u root -p siro_main -e "
|
||
SELECT * FROM driver_wallet_requests
|
||
WHERE driver_id = 1
|
||
ORDER BY created_at DESC
|
||
LIMIT 1;
|
||
"
|
||
```
|
||
|
||
#### 3.3 اختبار أمان - محاولات الهجوم
|
||
|
||
```bash
|
||
# ❌ محاولة بدون JWT
|
||
curl -X POST https://api.siromove.com/wallet/add \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"amount": 100}'
|
||
# النتيجة المتوقعة: 401 Unauthorized
|
||
|
||
# ❌ JWT غير صحيح
|
||
curl -X POST https://api.siromove.com/wallet/add \
|
||
-H "Authorization: Bearer invalid_token" \
|
||
-d '{"amount": 100}'
|
||
# النتيجة المتوقعة: 401 Unauthorized
|
||
|
||
# ❌ مبلغ سالب
|
||
curl -X POST https://api.siromove.com/wallet/add \
|
||
-H "Authorization: Bearer $JWT_TOKEN" \
|
||
-d '{"amount": -100}'
|
||
# النتيجة المتوقعة: 400 Bad Request
|
||
|
||
# ❌ مبلغ أكبر من 10,000
|
||
curl -X POST https://api.siromove.com/wallet/add \
|
||
-H "Authorization: Bearer $JWT_TOKEN" \
|
||
-d '{"amount": 50000}'
|
||
# النتيجة المتوقعة: 400 Bad Request
|
||
|
||
# ❌ تحديد السرعة (multiple requests)
|
||
for i in {1..10}; do
|
||
curl -X POST https://api.siromove.com/wallet/add \
|
||
-H "Authorization: Bearer $JWT_TOKEN" \
|
||
-d '{"amount": 100}' &
|
||
done
|
||
wait
|
||
# النتيجة المتوقعة: 429 Too Many Requests
|
||
```
|
||
|
||
---
|
||
|
||
### المرحلة 4️⃣: المراقبة (1 ساعة)
|
||
|
||
#### 4.1 تفعيل السجلات
|
||
|
||
```bash
|
||
# تحقق من logs
|
||
tail -f /var/log/siro-api/security.log
|
||
|
||
# ابحث عن أخطاء
|
||
grep ERROR /var/log/siro-api/*.log
|
||
|
||
# احسب عدد الطلبات الناجحة
|
||
grep "wallet add completed" /var/log/siro-api/security.log | wc -l
|
||
```
|
||
|
||
#### 4.2 إنشاء لوحة معلومات (Dashboard)
|
||
|
||
```php
|
||
// لاحقاً: إضافة لوحة معلومات للمراقبة
|
||
|
||
SELECT
|
||
DATE(created_at) as date,
|
||
COUNT(*) as total_requests,
|
||
SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as successful,
|
||
SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,
|
||
SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending
|
||
FROM driver_wallet_requests
|
||
GROUP BY DATE(created_at);
|
||
```
|
||
|
||
---
|
||
|
||
### المرحلة 5️⃣: التوثيق والإغلاق (30 دقيقة)
|
||
|
||
#### 5.1 توثيق التغييرات
|
||
|
||
```markdown
|
||
# تقرير النشر
|
||
|
||
**التاريخ:** 2026-06-17
|
||
**المدة:** 9.5 ساعات
|
||
**حالة النشر:** ✅ ناجح
|
||
|
||
## التغييرات:
|
||
|
||
1. ✅ نقل endpoint إضافة الأموال إلى Backend
|
||
2. ✅ تطبيق S2S API مع توقيع HMAC
|
||
3. ✅ إصلاح التشفير (IV عشوائي)
|
||
4. ✅ تقليل أذونات Android
|
||
5. ✅ تحديث الروابط إلى HTTPS
|
||
|
||
## الاختبارات:
|
||
|
||
- ✅ اختبار وحدة
|
||
- ✅ اختبار تكامل
|
||
- ✅ اختبار أمان
|
||
- ✅ اختبار الأداء
|
||
|
||
## المراقبة:
|
||
|
||
- ✅ السجلات تعمل بشكل صحيح
|
||
- ✅ لا توجد أخطاء
|
||
- ✅ الأداء عادي
|
||
|
||
## النقاط الحرجة:
|
||
|
||
- لا تنسَ تحديث WALLET_HMAC_SECRET في كلا الجانبين
|
||
- لا تنسَ تعديل firewall rules
|
||
- لا تنسَ إخطار فريق الدعم
|
||
```
|
||
|
||
#### 5.2 إخطارات المستخدمين (اختياري)
|
||
|
||
```
|
||
📢 تنبيه الصيانة:
|
||
تم تحديث نظام المحفظة لأسباب أمنية.
|
||
- لا توجد تأثيرات على المستخدمين
|
||
- جميع الأموال آمنة
|
||
- الخدمة مستقرة
|
||
|
||
للمزيد من المعلومات، اتصل بـ: support@siromove.com
|
||
```
|
||
|
||
---
|
||
|
||
## 🚨 خطة العودة للإصدار السابق (Rollback)
|
||
|
||
إذا حدثت مشكلة ما:
|
||
|
||
```bash
|
||
# 1️⃣ توقف الخدمة
|
||
systemctl stop siro-api
|
||
|
||
# 2️⃣ استعد النسخة الاحتياطية
|
||
cp /backup/backend_*.tar.gz .
|
||
tar -xzf backend_*.tar.gz -C /var/www/html/
|
||
|
||
# 3️⃣ استعد قاعدة البيانات
|
||
mysql -u root -p < /backup/siro_main_*.sql
|
||
mysql -u root -p < /backup/walletintaleq_*.sql
|
||
|
||
# 4️⃣ استعد .env القديم
|
||
cp /backup/.env.backup backend/.env
|
||
|
||
# 5️⃣ أعد تشغيل الخدمة
|
||
systemctl start siro-api
|
||
|
||
# 6️⃣ تحقق من الحالة
|
||
systemctl status siro-api
|
||
```
|
||
|
||
---
|
||
|
||
## ✅ قائمة التحقق النهائي
|
||
|
||
- [ ] تم عمل نسخ احتياطية
|
||
- [ ] تم نسخ الملفات الجديدة
|
||
- [ ] تم تحديث .env
|
||
- [ ] تم إنشاء الجداول الجديدة
|
||
- [ ] تم اختبار جميع البيانات
|
||
- [ ] تم اختبار الأمان
|
||
- [ ] تم مراقبة الخدمة
|
||
- [ ] تم توثيق التغييرات
|
||
- [ ] تم إخطار الفريق
|
||
|
||
---
|
||
|
||
## 📞 الدعم والمساعدة
|
||
|
||
في حالة أي مشاكل:
|
||
|
||
1. تحقق من السجلات: `/var/log/siro-api/`
|
||
2. جرّب rollback
|
||
3. اتصل بـ: devops@siromove.com
|
||
4. أرسل النسخ الاحتياطية للتحليل
|
||
|
||
---
|
||
|
||
**النشر منجز ✅**
|