دليل الاستجابة — حرج (PAGE)
سلسلة الدفتر مكسورة — الكتابة معلّقة
لا تُعد التشغيل بشكل أعمى. إعادة التشغيل تعيد التحقق ولكنها لا تُصلح الانحراف الحقيقي.
الأعراض
- تنبيه LedgerChainBroken فعّال (page-tier).
- `ledger_chain_broken == 1` في Prometheus.
- سجل ledger-service: "CHAIN INTEGRITY FAILURE — N errors".
- كل عمليات الدفع/الموافقات/الشهادات معلّقة (الكتابة موقوفة).
الفحوصات الأولى
first-checks.sh
# 1. Confirm Redis flag matches the alert. docker exec via_prod-redis redis-cli GET ledger:chain_broken # Expect "1". If "0" or empty, the gauge is stale — see step 5. # 2. Pull the integrity errors from the most recent verification. docker logs --tail 200 via_prod-ledger-service 2>&1 \ | grep -iE 'CHAIN INTEGRITY|chain.*failure|invalid block' # 3. Re-run verification on demand to capture the offending block(s). curl -s -H "Authorization: Bearer $ADMIN_JWT" \ https://api.via-basket.com/admin/ledger/verify | jq '.errors[:5]' # 4. Identify the last KNOWN-GOOD block id. docker exec via_prod-ledger-db psql -U "$LEDGER_POSTGRES_USER" \ -d "$LEDGER_POSTGRES_DB" -c \ "SELECT id, prev_hash, hash, created_at FROM ledger_blocks ORDER BY id DESC LIMIT 20;"
المعالجة الفورية
- لا تُعد التشغيل. إعادة التشغيل لا تصلح السلسلة وقد تُبدّل البلوك الذي يحمل الإثبات.
- تحقق أن جدار الكتابة فعلاً حماية: حاول POST /ledger/blocks لاختبار الرفض.
- صنّف نوع الفشل من الأخطاء التي ظهرت:
- تالف من DB (هاش متغير): افتح حادث P0 أمني فوراً، اعزل قاعدة بيانات ledger، احفظ snapshot.
- انقطاع جزئي (بلوك ناقص): تحقق من سجل ledger-service وقت الكتابة الأخيرة الناجحة.
- إعادة هجرة DB غير مكتملة: راجع آخر alembic upgrade — هل أنهى دورته؟
- اطلب من فريق المالية تأكيد التوقف عن إصدار أي تسوية يدوية حتى تنتهي المعالجة.
مسار التصعيد
- PagerDuty: oncall-payments (5 دقائق).
- إذا تأكد التلاعب: CTO + الأمن + الشؤون القانونية فوراً.
- إذا ظل الانحراف بعد 30 دقيقة: انقل إلى وضع "قراءة فقط" المعلَن للعملاء.
الاستعادة / التراجع
- لا تحذف أو تعدّل بلوكات يدوياً. الإصلاح يجب أن يكون عبر بلوك تصحيح جديد بحيث يبقى الانحراف موثقاً.
- بعد تأكيد السبب، شغل سكربت الإصلاح المختار (إن وُجد) مع علم --confirm.
- بعد إعادة بناء السلسلة، ستقوم الحلقة الدورية بتفريغ الراية تلقائياً عند نجاح التحقق التالي.
- افتح post-mortem خلال 24 ساعة: ما الذي تسبب بالانحراف، ولماذا لم يُكتشف قبل ذلك.