5.4 KiB
5.4 KiB
Flatlogic CI/CD + External DB + Ingestion API
هذا الإعداد يجعل المشروع يعمل بهذه الصورة:
- GitHub هو مصدر الحقيقة للكود.
- Bolt / Replit يدفعان التعديلات إلى نفس المستودع أو يرسلان
repository_dispatch. - GitHub Actions تبني المشروع وتتحقق منه ثم تنشره إلى VM الخاص بـ Flatlogic.
- Flatlogic / API Server يدير بيانات المنتجات القادمة من أدوات السحب وويبهوكات شي إن.
- Supabase / PostgreSQL هو مخزن البيانات الخارجي للمنتجات والفئات وسجل أحداث التكامل.
ما تمت إضافته
.github/workflows/ci.yml- Typecheck + Build لكل Push / Pull Request.
.github/workflows/deploy-flatlogic.yml- ينشر تلقائيًا إلى VM عند التحديث على
mainأوmaster. - يدعم
repository_dispatchلأنواع:bolt_syncreplit_syncflatlogic_deploy
- ينشر تلقائيًا إلى VM عند التحديث على
scripts/flatlogic-deploy.sh- يسحب آخر نسخة من GitHub.
- يثبت الحزم.
- يشغل
typecheckوbuild. - يطبق schema قاعدة البيانات عبر Drizzle.
- يعيد تشغيل
extra-storeوflatlogic-apiعبر PM2.
.env.example- كل متغيرات البيئة المطلوبة للـ DB والـ API والأمان.
- API endpoints جديدة داخل
artifacts/api-server.
الأسرار المطلوبة في GitHub Actions
أضف هذه القيم في GitHub → Settings → Secrets and variables → Actions:
أسرار النشر إلى Flatlogic VM
FLATLOGIC_HOSTFLATLOGIC_USERFLATLOGIC_SSH_KEYFLATLOGIC_PROJECT_DIRFLATLOGIC_DEPLOY_BRANCH(اختياري)
أسرار الـ backend
DATABASE_URLDB_SSL=requireDB_POOL_MAX=20DB_QUERY_TIMEOUT_MS=15000DB_STATEMENT_TIMEOUT_MS=15000ADMIN_TOKENAPI_INGEST_KEYWEBHOOK_SECRETSHEIN_WEBHOOK_SECRETAPI_PORT=8080STORE_PORT=3001
إعداد قاعدة البيانات الخارجية (Supabase / PostgreSQL)
الحد الأدنى المقترح لاستيعاب 2000 منتج من Extra + Shein:
- استخدم Postgres خارجي أو Supabase.
- يفضل في Supabase استخدام transaction pooler داخل
DATABASE_URL. - الإعدادات الافتراضية المضافة في الكود:
DB_POOL_MAX=20DB_QUERY_TIMEOUT_MS=15000DB_STATEMENT_TIMEOUT_MS=15000keepAlive=true
- أضف الـ schema بالأمر:
pnpm --filter @workspace/db run push
ملاحظة: الجدول
productsصار يدعم الآنsource,external_id,source_url,currency,availability,metadata,last_synced_atمع فهارس مخصصة للبحث والتزامن.
API Endpoints الجديدة
1) Bulk ingestion للمنتجات
POST /api/ingest/products/bulk
Headers:
x-api-key: <API_INGEST_KEY>
content-type: application/json
Body مثال:
{
"source": "shein",
"webhook_id": "apify-run-123",
"products": [
{
"external_id": "shein-10001",
"sku": "SKU-10001",
"name": "فستان صيفي",
"brand": "SHEIN",
"price": 149,
"original_price": 199,
"stock": 25,
"availability": "in_stock",
"sizes": ["S", "M", "L"],
"colors": ["Black", "Pink"],
"images": ["https://example.com/1.jpg"],
"category": {
"slug": "dresses",
"name": "فساتين"
},
"source_url": "https://example.com/product/10001"
}
]
}
2) Upsert منتج مفرد
POST /api/ingest/products/upsert
نفس الحماية عبر x-api-key.
3) Webhook تحديثات شي إن
POST /api/webhooks/shein/products
Headers:
x-api-key: <API_INGEST_KEY>
x-webhook-signature: sha256=<hmac_sha256_of_raw_body>
content-type: application/json
Body مثال:
{
"webhook_id": "shein-webhook-987",
"event": "price.updated",
"products": [
{
"external_id": "shein-10001",
"price": 139,
"stock": 12,
"availability": "low_stock",
"sizes": ["S", "M"]
}
]
}
4) Pipeline status
GET /api/integrations/pipeline/status
- محمي بـ
Authorization: Bearer <ADMIN_TOKEN> - يعرض:
- حالة إعداد الأمان
- حالة الـ DB
- عدد المنتجات حسب المصدر
- آخر أحداث التكامل
ربط Bolt / Replit مع GitHub
أفضل سيناريو:
- اجعل Bolt أو Replit يدفعان إلى نفس مستودع GitHub.
- كل Push إلى
mainيشغل:ci.yml- ثم
deploy-flatlogic.yml
- النتيجة: يتم تحديث الموقع والـ backend تلقائيًا.
إذا كانت الأداة لا تدفع مباشرة إلى GitHub، استخدم repository_dispatch من GitHub API بنوع:
bolt_syncreplit_sync
ملاحظات تشغيلية
- الواجهة الأمامية الآن تدعم
VITE_API_BASE_URLإذا أردت backend مختلفًا عن نفس الدومين. - في وضع التطوير، Vite يمرر
/apiإلىhttp://127.0.0.1:8080عبر proxy. - إذا لم تكن أسرار الـ backend موجودة، فسيستمر المتجر الأمامي بالعمل، لكن تشغيل خدمة الـ API سيتم تخطيه أثناء النشر.