From 58ee025b458b61df23d5934f2c3b3689f9d228f4 Mon Sep 17 00:00:00 2001 From: Sami Assiri Date: Fri, 1 May 2026 14:06:42 +0300 Subject: [PATCH] docs(ops): beta gates checklist, Railway bind, Actions env setup; dependabot dealix; SECURITY policy; verification log Made-with: Cursor --- .github/dependabot.yml | 10 ++++++ SECURITY.md | 20 +++++++++++ dealix/docs/BETA_PRIVATE_GATES_CHECKLIST.md | 40 +++++++++++++++++++++ dealix/docs/LAUNCH_DAY_RUNBOOK_AR.md | 4 ++- dealix/docs/LAUNCH_DAY_VERIFICATION_LOG.md | 8 ++++- dealix/docs/PRIVATE_BETA_RUNBOOK.md | 3 +- dealix/docs/STAGING_DEPLOYMENT.md | 3 +- dealix/docs/ops/GITHUB_ACTIONS_ENV_SETUP.md | 28 +++++++++++++++ dealix/docs/ops/GITHUB_AI_COMPANY_TRACK.md | 8 +++++ dealix/docs/ops/RAILWAY_AI_COMPANY_BIND.md | 39 ++++++++++++++++++++ 10 files changed, 159 insertions(+), 4 deletions(-) create mode 100644 .github/dependabot.yml create mode 100644 SECURITY.md create mode 100644 dealix/docs/BETA_PRIVATE_GATES_CHECKLIST.md create mode 100644 dealix/docs/ops/GITHUB_ACTIONS_ENV_SETUP.md create mode 100644 dealix/docs/ops/RAILWAY_AI_COMPANY_BIND.md diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 00000000..12837101 --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,10 @@ +version: 2 +updates: + - package-ecosystem: pip + directory: /dealix + schedule: + interval: weekly + open-pull-requests-limit: 5 + labels: + - dependencies + - dealix diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 00000000..64081941 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,20 @@ +# Security policy + +## Reporting a vulnerability + +Please **do not** open a public GitHub issue for security reports. + +1. Open a **private security advisory** for this repository (GitHub → **Security** → **Advisories** → **Report a vulnerability**), or +2. Contact the repository maintainers through a private channel you already use for this project. + +Include: + +- A short description of the issue and affected components (paths or features). +- Steps to reproduce (proof-of-concept) if safe to share. +- Whether you believe the issue is actively exploitable in production. + +We will aim to acknowledge receipt within a reasonable timeframe and coordinate remediation and disclosure. + +## Secrets + +Never commit real API keys, tokens, `DATABASE_URL`, or Moyasar keys. Use Railway variables and GitHub Actions secrets. See `dealix/docs/SECURITY_SECRET_ROTATION_CHECKLIST.md` if a secret may have been exposed. diff --git a/dealix/docs/BETA_PRIVATE_GATES_CHECKLIST.md b/dealix/docs/BETA_PRIVATE_GATES_CHECKLIST.md new file mode 100644 index 00000000..33fa640a --- /dev/null +++ b/dealix/docs/BETA_PRIVATE_GATES_CHECKLIST.md @@ -0,0 +1,40 @@ +# بوابات إغلاق Paid Private Beta — قائمة مرجعية + +استخدم هذه القائمة قبل أول عميل إنتاج أو إرسال حي. التفاصيل في الملفات المرتبطة. + +## أمن وأسرار + +- [ ] لا مفاتيح في الكود أو المحادثات؛ كل القيم في Railway / GitHub Secrets فقط. +- [ ] بعد أي تسريب: [`SECURITY_SECRET_ROTATION_CHECKLIST.md`](SECURITY_SECRET_ROTATION_CHECKLIST.md). +- [ ] `API_KEYS` مفعّل على الإنتاج/staging المقفل — [`api/security/api_key.py`](../api/security/api_key.py). + +## تقنية ونشر + +- [ ] فرع النشر `ai-company` (أو السياسة المعتمدة) — [`docs/ops/GITHUB_AI_COMPANY_TRACK.md`](ops/GITHUB_AI_COMPANY_TRACK.md). +- [ ] Railway: Root `dealix`، `DATABASE_URL`، `APP_SECRET_KEY`, `APP_URL`, `CORS_ORIGINS` — [`docs/ops/RAILWAY_AI_COMPANY_BIND.md`](ops/RAILWAY_AI_COMPANY_BIND.md). +- [ ] `smoke_staging` ناجح — [`LAUNCH_DAY_VERIFICATION_LOG.md`](LAUNCH_DAY_VERIFICATION_LOG.md). + +## قانون وخصوصية (PDPL) + +- [ ] شروط + خصوصية منشورة. +- [ ] DPA pilot جاهز أو موقّع — [`DPA_PILOT_TEMPLATE.md`](DPA_PILOT_TEMPLATE.md). +- [ ] PDPL: [`SECURITY_PDPL_CHECKLIST.md`](SECURITY_PDPL_CHECKLIST.md)، [`PRIVACY_PDPL_READINESS.md`](PRIVACY_PDPL_READINESS.md)، [`DATA_MAP.md`](DATA_MAP.md). + +## فوترة + +- [ ] Moyasar **sandbox** للبيتا حتى الموافقة على live — [`BILLING_RUNBOOK.md`](BILLING_RUNBOOK.md). +- [ ] `MOYASAR_WEBHOOK_SECRET` مضبوط عند تفعيل الويبهوك. + +## واتساب + +- [ ] `WHATSAPP_ALLOW_LIVE_SEND=false` ما لم يُوافَق مع opt-in — [`PRIVATE_BETA_RUNBOOK.md`](PRIVATE_BETA_RUNBOOK.md)، [`WHATSAPP_OPERATOR_FLOW.md`](WHATSAPP_OPERATOR_FLOW.md). + +## تشغيل وتجاري + +- [ ] SOP يومي — [`docs/ops/SOP_REVENUE_ENGINE_DAILY.md`](ops/SOP_REVENUE_ENGINE_DAILY.md). +- [ ] إغلاق أول عملاء — [`docs/business/CLOSE_FIRST_CUSTOMERS_14D.md`](business/CLOSE_FIRST_CUSTOMERS_14D.md). + +## GitHub Actions (اختياري لكن موصى به) + +- [ ] أسرار `STAGING_BASE_URL` / `STAGING_API_KEY` — [`docs/ops/GITHUB_ACTIONS_ENV_SETUP.md`](ops/GITHUB_ACTIONS_ENV_SETUP.md). +- [ ] لاحقاً `DEALIX_API_BASE` / `DEALIX_API_KEY` لآلة الإيراد اليومية. diff --git a/dealix/docs/LAUNCH_DAY_RUNBOOK_AR.md b/dealix/docs/LAUNCH_DAY_RUNBOOK_AR.md index e7e5c446..99614ec6 100644 --- a/dealix/docs/LAUNCH_DAY_RUNBOOK_AR.md +++ b/dealix/docs/LAUNCH_DAY_RUNBOOK_AR.md @@ -5,7 +5,9 @@ **بعد أي تسريب لمفتاح:** [`SECURITY_SECRET_ROTATION_CHECKLIST.md`](SECURITY_SECRET_ROTATION_CHECKLIST.md). **تسجيل نتائج التشغيل:** [`LAUNCH_DAY_VERIFICATION_LOG.md`](LAUNCH_DAY_VERIFICATION_LOG.md). **SOP يومي للإيراد:** [`ops/SOP_REVENUE_ENGINE_DAILY.md`](ops/SOP_REVENUE_ENGINE_DAILY.md). -**تتبع الإطلاق العام:** [`PUBLIC_LAUNCH_GO_NO_GO_TRACKER.md`](PUBLIC_LAUNCH_GO_NO_GO_TRACKER.md). +**تتبع الإطلاق العام:** [`PUBLIC_LAUNCH_GO_NO_GO_TRACKER.md`](PUBLIC_LAUNCH_GO_NO_GO_TRACKER.md). +**بوابات البيتا (قائمة واحدة):** [`BETA_PRIVATE_GATES_CHECKLIST.md`](BETA_PRIVATE_GATES_CHECKLIST.md). +**أسرار Actions:** [`ops/GITHUB_ACTIONS_ENV_SETUP.md`](ops/GITHUB_ACTIONS_ENV_SETUP.md). ## 0) قبل 24–48 ساعة diff --git a/dealix/docs/LAUNCH_DAY_VERIFICATION_LOG.md b/dealix/docs/LAUNCH_DAY_VERIFICATION_LOG.md index 3a31ec81..390c0e90 100644 --- a/dealix/docs/LAUNCH_DAY_VERIFICATION_LOG.md +++ b/dealix/docs/LAUNCH_DAY_VERIFICATION_LOG.md @@ -6,11 +6,17 @@ | الخطوة | الأمر | النتيجة | التاريخ | |--------|--------|---------|---------| -| compileall | `python -m compileall api auto_client_acquisition integrations db core -q` | OK | 2026-05-01 | +| compileall | `python -m compileall api auto_client_acquisition db` | OK | 2026-05-01 | | pytest | `python -m pytest -q --no-cov` | 526 passed, 6 skipped | 2026-05-01 | | print_routes | `python scripts/print_routes.py` | ROUTE_CHECK_OK no duplicate method+path | 2026-05-01 | | smoke_inprocess | `python scripts/smoke_inprocess.py` | SMOKE_INPROCESS_OK | 2026-05-01 | +## Git / CI (فرع `ai-company`) + +| الخطوة | الإجراء | النتيجة | التاريخ | +|--------|---------|---------|---------| +| push | فرع `ai-company` مرفوع إلى `origin` مع `dealix/` و`.github/workflows/dealix-*.yml` | OK — راجع Actions **Dealix API CI** على GitHub | 2026-05-01 | + ## Staging (يتطلب `STAGING_BASE_URL`) | الخطوة | الأمر | النتيجة | التاريخ | diff --git a/dealix/docs/PRIVATE_BETA_RUNBOOK.md b/dealix/docs/PRIVATE_BETA_RUNBOOK.md index 6ab5d7dd..c3ebe55b 100644 --- a/dealix/docs/PRIVATE_BETA_RUNBOOK.md +++ b/dealix/docs/PRIVATE_BETA_RUNBOOK.md @@ -1,6 +1,7 @@ # Private Beta — دليل تشغيل Dealix -**يوم التدشين (فهرس ساعة بساعة):** [`LAUNCH_DAY_RUNBOOK_AR.md`](LAUNCH_DAY_RUNBOOK_AR.md). +**يوم التدشين (فهرس ساعة بساعة):** [`LAUNCH_DAY_RUNBOOK_AR.md`](LAUNCH_DAY_RUNBOOK_AR.md). +**قائمة بوابات موحّدة:** [`BETA_PRIVATE_GATES_CHECKLIST.md`](BETA_PRIVATE_GATES_CHECKLIST.md). ## الجمهور diff --git a/dealix/docs/STAGING_DEPLOYMENT.md b/dealix/docs/STAGING_DEPLOYMENT.md index fc3277bb..e4e41f7f 100644 --- a/dealix/docs/STAGING_DEPLOYMENT.md +++ b/dealix/docs/STAGING_DEPLOYMENT.md @@ -1,6 +1,7 @@ # نشر Staging — Dealix API -مسار GitHub الموصى لخط «AI Company» والفرع `ai-company`: [`docs/ops/GITHUB_AI_COMPANY_TRACK.md`](ops/GITHUB_AI_COMPANY_TRACK.md). +مسار GitHub الموصى لخط «AI Company» والفرع `ai-company`: [`docs/ops/GITHUB_AI_COMPANY_TRACK.md`](ops/GITHUB_AI_COMPANY_TRACK.md). +ربط Railway خطوة بخطوة: [`docs/ops/RAILWAY_AI_COMPANY_BIND.md`](ops/RAILWAY_AI_COMPANY_BIND.md). ## منصة موصى بها diff --git a/dealix/docs/ops/GITHUB_ACTIONS_ENV_SETUP.md b/dealix/docs/ops/GITHUB_ACTIONS_ENV_SETUP.md new file mode 100644 index 00000000..b8b8233a --- /dev/null +++ b/dealix/docs/ops/GITHUB_ACTIONS_ENV_SETUP.md @@ -0,0 +1,28 @@ +# أسرار GitHub Actions — Dealix + +**المسار في GitHub:** Repository → **Settings** → **Secrets and variables** → **Actions** → **New repository secret**. + +الريبو: [VoXc2/system-prompts-and-models-of-ai-tools](https://github.com/VoXc2/system-prompts-and-models-of-ai-tools/settings/secrets/actions). + +## دخان Staging (يدوي) + +| السر | الوصف | +|------|--------| +| `STAGING_BASE_URL` | أصل HTTPS للتطبيق المنشور، بدون شرطة مائلة أخيرة (مثلاً `https://xxx.up.railway.app`) | +| `STAGING_API_KEY` | اختياري؛ إذا فرض التطبيق `X-API-Key` على الطلبات | + +Workflow: [`.github/workflows/dealix-staging-smoke.yml`](../../../.github/workflows/dealix-staging-smoke.yml) — من تبويب **Actions** اختر **Dealix staging smoke** → **Run workflow**. + +## Daily Revenue Machine + +| السر | الوصف | +|------|--------| +| `DEALIX_API_BASE` | أصل الـ API (مثل `https://host` بدون `/` زائدة) | +| `DEALIX_API_KEY` | مفتاح يُرسل كـ `Authorization: Bearer …` | + +Workflow: [`.github/workflows/dealix-daily-revenue-machine.yml`](../../../.github/workflows/dealix-daily-revenue-machine.yml). +**جدولة cron:** تعمل من **الفرع الافتراضي** للريبو (غالباً `main`)؛ راجع تعليق الملف. + +## CI الأساسي + +**Dealix API CI** لا يحتاج أسرار للاختبارات الافتراضية (مفاتيح وهمية داخل YAML). لا تضع مفاتيح إنتاج في CI. diff --git a/dealix/docs/ops/GITHUB_AI_COMPANY_TRACK.md b/dealix/docs/ops/GITHUB_AI_COMPANY_TRACK.md index 0adfd8c3..7a0c38c8 100644 --- a/dealix/docs/ops/GITHUB_AI_COMPANY_TRACK.md +++ b/dealix/docs/ops/GITHUB_AI_COMPANY_TRACK.md @@ -34,3 +34,11 @@ GitHub **لا** يشغّل workflows من `dealix/.github/workflows/` كمصدر ## الريبو العام [https://github.com/VoXc2/system-prompts-and-models-of-ai-tools](https://github.com/VoXc2/system-prompts-and-models-of-ai-tools) + +## Railway (خطوات اللوحة) + +[`RAILWAY_AI_COMPANY_BIND.md`](RAILWAY_AI_COMPANY_BIND.md) + +## أسرار GitHub Actions + +[`GITHUB_ACTIONS_ENV_SETUP.md`](GITHUB_ACTIONS_ENV_SETUP.md) diff --git a/dealix/docs/ops/RAILWAY_AI_COMPANY_BIND.md b/dealix/docs/ops/RAILWAY_AI_COMPANY_BIND.md new file mode 100644 index 00000000..5a44a6bc --- /dev/null +++ b/dealix/docs/ops/RAILWAY_AI_COMPANY_BIND.md @@ -0,0 +1,39 @@ +# ربط Railway — مسار AI Company (`ai-company`) + +نفّذ في [لوحة Railway](https://railway.app) بعد أن يكون الفرع [`ai-company`](https://github.com/VoXc2/system-prompts-and-models-of-ai-tools/tree/ai-company) مرفوعاً على GitHub. + +## 1) المشروع والخدمة + +1. **New Project** → **Deploy from GitHub** → اختر `VoXc2/system-prompts-and-models-of-ai-tools`. +2. أنشئ خدمة **Web** (أو عدّل الخدمة الحالية) لتشغيل Dealix API. + +## 2) إعدادات النشر (إلزامي) + +| الحقل | القيمة | +|--------|--------| +| **Branch** | `ai-company` | +| **Root Directory** | `dealix` | +| **Start Command** | `uvicorn api.main:app --host 0.0.0.0 --port ${PORT:-8000}` | + +مرجع: [`STAGING_DEPLOYMENT.md`](../STAGING_DEPLOYMENT.md). + +## 3) قاعدة البيانات + +1. أضف **PostgreSQL** من Railway أو استخدم `DATABASE_URL` خارجي. +2. اربط متغير **`DATABASE_URL`** بخدمة التطبيق (غالباً يُحقن تلقائياً عند الربط). + +## 4) متغيرات البيئة + +- انسخ **الأسماء** من [`.env.staging.example`](../../.env.staging.example) (staging) أو [`.env.example`](../../.env.example) (production لاحقاً). +- لا تُرفع `.env` إلى Git. +- تأكد من: `APP_SECRET_KEY`, `APP_URL`, `APP_ENV`, `CORS_ORIGINS`, `MOYASAR_*`، و`DAILY_EMAIL_LIMIT` (وليس `EMAIL_DAILY_LIMIT`)، و`WHATSAPP_ALLOW_LIVE_SEND=false` للبيتا حتى الموافقة. + +## 5) التحقق بعد النشر + +1. المتصفح: `https:///health` → 200. +2. محلياً: `STAGING_BASE_URL=https://` ثم `python scripts/smoke_staging.py` من مجلد `dealix`. +3. GitHub Actions: شغّل يدوياً **Dealix staging smoke** بعد ضبط أسرار `STAGING_BASE_URL` / `STAGING_API_KEY` — انظر [`GITHUB_ACTIONS_ENV_SETUP.md`](GITHUB_ACTIONS_ENV_SETUP.md). + +## 6) مسار Git الكامل + +[`GITHUB_AI_COMPANY_TRACK.md`](GITHUB_AI_COMPANY_TRACK.md)