8.1 KiB
Dealix — Universal Deployment Guide
دليل نشر Dealix على أي منصة: Railway, Render, Fly.io, Heroku, DigitalOcean, AWS, Docker self-hosted.
🎯 TL;DR — نشر خلال 10 دقائق
- أي منصة تدعم Docker → استخدم
Dockerfileالموجود في root - عيّن env vars من
.env.example(انسخه كبداية) - Health check:
GET /health - التطبيق يستمع على
${PORT:-8000} - يتطلب PostgreSQL (اختياري — التطبيق يعمل بدونه في dev mode)
📦 المتغيرات المطلوبة (Minimum للإنتاج)
الإلزامية (بدونها الدفع ما يشتغل)
# Security
APP_SECRET_KEY=CHANGE_ME_64_byte_hex # generate: python -c "import secrets; print(secrets.token_hex(32))"
ENVIRONMENT=production
LOG_LEVEL=INFO
# Database (Railway/Render/Heroku postgres auto-normalize لـ asyncpg)
DATABASE_URL=postgresql://user:pass@host:5432/dealix
# Moyasar Payments
MOYASAR_SECRET_KEY=sk_live_xxxxx
MOYASAR_WEBHOOK_SECRET=CHANGE_ME_shared_with_moyasar_dashboard
# PostHog Analytics (اختياري لكن موصى به)
POSTHOG_API_KEY=phc_xxxxx
POSTHOG_HOST=https://us.i.posthog.com
# Calendly
CALENDLY_URL=https://calendly.com/sami-assiri11/dealix-demo
CALENDLY_WEBHOOK_SECRET=xxxxx
# CORS (أضف domain الـ landing)
CORS_ORIGINS=https://dealix.sa,https://www.dealix.sa
الاختيارية
API_KEYS=key1,key2 # إذا بدك حماية admin endpoints
APP_URL=https://dealix.sa # للـ checkout callback
SENTRY_DSN=https://...@sentry.io/...
🚀 نشر على المنصات المختلفة
1) Railway (الموصى به — مجاني تقريباً)
إعداد أولي:
- افتح https://railway.com → New Project → Deploy from GitHub → اختر
VoXc2/dealix - Railway يكتشف
Dockerfileتلقائياً - أضف Postgres: + New → Database → PostgreSQL
- اذهب لخدمة
dealix→ Variables → Raw Editor - الصق محتوى
dealix_railway_vars.txt(يُرفق مع الحزمة) - Settings → Deploy → Start Command: اتركه فارغ (يستخدم Dockerfile)
- احفظ → Railway ينشر تلقائياً
التحقق:
curl https://<your-app>.up.railway.app/health
# {"status":"ok"}
2) Render
- https://render.com → New → Web Service → Connect GitHub →
VoXc2/dealix - اختر Docker runtime
- Add environment variables من
.env.example - Health Check Path:
/health - Add PostgreSQL من Render marketplace
- Deploy
3) Fly.io
fly launch --dockerfile Dockerfile
fly secrets set APP_SECRET_KEY=... MOYASAR_SECRET_KEY=...
fly postgres create --name dealix-db
fly postgres attach dealix-db
fly deploy
4) Heroku
heroku create dealix-api
heroku stack:set container
heroku addons:create heroku-postgresql:mini
heroku config:set APP_SECRET_KEY=... MOYASAR_SECRET_KEY=...
git push heroku main
5) DigitalOcean App Platform
- https://cloud.digitalocean.com/apps → Create App → GitHub →
VoXc2/dealix - App Platform يكتشف Dockerfile
- أضف managed PostgreSQL
- أضف env vars
- Deploy
6) Docker self-hosted (أي VPS)
# على السيرفر:
git clone https://github.com/VoXc2/dealix.git
cd dealix
cp .env.example .env
# عبّي المتغيرات في .env
docker build -t dealix .
docker run -d --name dealix -p 8000:8000 --env-file .env dealix
# مع PostgreSQL:
docker-compose up -d # إذا استخدمت docker-compose.yml (راجع docker-compose.example.yml)
7) AWS (ECS Fargate)
- ادفع صورة Docker لـ ECR:
docker build -t dealix . && docker push <ecr-url>/dealix:latest - أنشئ ECS Cluster + Task Definition بالصورة
- أضف RDS Postgres
- عيّن env vars في Task Definition
- أنشئ Service مع Application Load Balancer
- Route 53 → ربط الدومين
🔗 ربط Landing Page مع Backend
Landing في مجلد landing/ يقرأ عنوان API من window.DEALIX_API_BASE.
خيار A — نشر منفصل (Netlify / Vercel / Cloudflare Pages)
- انشر مجلد
landing/كـ static site - قبل النشر، عدّل
landing/index.html:<script> window.DEALIX_API_BASE = 'https://your-backend-url.com'; </script> - أضف domain
dealix.saفي CORS_ORIGINS في backend
خيار B — نشر مع الـ Backend على نفس المنصة
في Railway أو Render: أضف landing/ كـ static serving.
أو استخدم nginx reverse proxy (راجع nginx.example.conf).
💳 إعداد Moyasar Webhook
مطلوب حتى الدفع يعمل نهاية إلى نهاية:
- افتح https://dashboard.moyasar.com/webhooks
- Add Webhook:
- URL:
https://<your-backend-url>/api/v1/webhooks/moyasar - Events:
payment_paid,payment_failed,payment_refunded - Secret: القيمة اللي عيّنتها في
MOYASAR_WEBHOOK_SECRETenv var (نفس القيمة بالضبط)
- URL:
- Save
- Moyasar يرسل ping اختباري → يجب أن يرجع 200
🧪 اختبار بعد النشر
BASE_URL=https://your-backend-url.com
# 1. Health
curl $BASE_URL/health
# {"status":"ok"}
# 2. Pricing
curl $BASE_URL/api/v1/pricing/plans
# 3. Demo request (landing form simulation)
curl -X POST $BASE_URL/api/v1/public/demo-request \
-H "Content-Type: application/json" \
-d '{"name":"تجربة","company":"Test Co","email":"test@example.com","phone":"+966500000000","consent":true}'
# 4. Checkout (1 SAR pilot — دفع حقيقي)
curl -X POST $BASE_URL/api/v1/checkout \
-H "Content-Type: application/json" \
-d '{"plan":"pilot_1sar","email":"you@example.com"}'
# returns payment_url — افتحه في المتصفح وادفع
🐛 المشاكل الشائعة
Railway: Invalid value for '--port': '${PORT:-8000}' is not a valid integer
السبب: Railway UI Start Command override يتجاوز shell expansion.
الحل: في Settings → Deploy → Start Command: امسحه أو ضع /app/start.sh
Healthcheck فاشل بعد deploy
السبب: المتغيرات ناقصة أو app crash at startup.
الحل: راجع logs — إذا email-validator is not installed فأعد النشر (PR #68 حلّها).
Moyasar webhook 401
السبب: MOYASAR_WEBHOOK_SECRET مختلف في Moyasar dashboard والـ env.
الحل: تأكد من تطابقهما بالضبط.
DB connection refused
السبب: DATABASE_URL بصيغة خاطئة.
الحل: التطبيق يحوّل postgres:// → postgresql+asyncpg:// تلقائياً. تأكد أن الـ URL صحيح.
📚 مسارات API الجاهزة
| Route | Method | الوصف |
|---|---|---|
/health |
GET | Health check (public) |
/api/v1/public/health |
GET | Health للـ landing (public) |
/api/v1/public/demo-request |
POST | Landing form → Calendly (public) |
/api/v1/pricing/plans |
GET | قائمة الباقات (public) |
/api/v1/checkout |
POST | توليد Moyasar invoice |
/api/v1/webhooks/moyasar |
POST | استقبال أحداث Moyasar |
/api/v1/webhooks/whatsapp |
POST/GET | WhatsApp Meta webhook |
/api/v1/webhooks/calendly |
POST | Calendly lifecycle events |
/api/v1/leads |
POST | إنشاء lead (يتطلب API key) |
/api/v1/sales/* |
* | Sales ops (API key) |
/api/v1/admin/* |
* | Admin (API key) |
/docs |
GET | Swagger UI |
🔐 الأمان — قواعد صارمة
- لا تدفع
.envأو مفاتيح لـ Git (موجود.gitignore) - Rotate
APP_SECRET_KEYإذا أي شخص شافه MOYASAR_SECRET_KEY=sk_live_*للإنتاج فقط (استخدمsk_test_*للاختبار)API_KEYSللحماية — ابدأ بدونها لكن فعّلها قبل الإطلاق العام- CORS_ORIGINS صارم — ما في wildcard
*في الإنتاج
📞 الدعم
- Issues: https://github.com/VoXc2/dealix/issues
- Owner: sami.assiri11@gmail.com