Files
Siro/DEPLOYMENT_GUIDE.md
2026-06-16 17:47:19 +03:00

433 lines
11 KiB
Markdown
Raw Blame History

This file contains invisible Unicode characters
This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# دليل النشر والتنفيذ - شامل ومفصل
**التاريخ:** 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. أرسل النسخ الاحتياطية للتحليل
---
**النشر منجز ✅**