11 KiB
11 KiB
دليل النشر والتنفيذ - شامل ومفصل
التاريخ: 16 يونيو 2026
الحالة: قيد الإعداد للنشر
المدة المتوقعة: 9.5 ساعات
🎯 الهدف
تطبيق إصلاحات أمان حرجة على نظام سيرو مع ضمان عدم قطع الخدمة.
📋 المتطلبات قبل البدء
- نسخة احتياطية كاملة من قاعدة البيانات
- وصول مسؤول (SSH) إلى الخوادم
- حساب DevOps / تشغيل
- فريق اختبار جاهز
- خطة العودة للإصدار السابق
🚀 مراحل التنفيذ
المرحلة 1️⃣: تحضيراتي (30 دقيقة)
1.1 التحقق من البيئة الحالية
# تحقق من إصدار PHP
php -v
# تحقق من توفر openssl
php -m | grep openssl
# تحقق من Redis
redis-cli ping
# تحقق من MySQL
mysql -u root -p -e "SELECT VERSION();"
1.2 نسخ احتياطي شامل
# قاعدة البيانات الرئيسية
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 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 نسخ الملفات الجديدة
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
# إنشاء نسخة جديدة من .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 توليد المفاتيح الآمنة
# توليد 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 اختبار الملفات الجديدة
# اختبر بناء الجملة 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 تفعيل الميزات الجديدة
// في 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
// اختبر التوقيع 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
# 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 اختبار أمان - محاولات الهجوم
# ❌ محاولة بدون 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 تفعيل السجلات
# تحقق من 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)
// لاحقاً: إضافة لوحة معلومات للمراقبة
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 توثيق التغييرات
# تقرير النشر
**التاريخ:** 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)
إذا حدثت مشكلة ما:
# 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
- تم إنشاء الجداول الجديدة
- تم اختبار جميع البيانات
- تم اختبار الأمان
- تم مراقبة الخدمة
- تم توثيق التغييرات
- تم إخطار الفريق
📞 الدعم والمساعدة
في حالة أي مشاكل:
- تحقق من السجلات:
/var/log/siro-api/ - جرّب rollback
- اتصل بـ: devops@siromove.com
- أرسل النسخ الاحتياطية للتحليل
النشر منجز ✅