--- title: Wolf Host emoji: 🐺 colorFrom: indigo colorTo: blue sdk: docker pinned: false short_description: Multi-user Python hosting panel behind a Cloudflare gateway --- # 🐺 Wolf Host — استضافة هيما لوحة تحكم متعددة المستخدمين لاستضافة وتشغيل سكربتات Python (و **PHP بمحرك كامل** عبر مسار التشغيل)، مبنية على **ثلاث طبقات** حتى لا يظهر أي سر داخل الكود ولا ينكشف الرابط الحقيقي، مع **مجمّع بوابتين في حسابي Cloudflare مختلفين** لمضاعفة الحصة اليومية: ``` المتصفح ──► https://3mh-host.pages.dev (Cloudflare Pages — الواجهة الساكنة) │ _worker.js (موزّع المجمّع: A أولًا ثم B عند النفاد) ▼ ┌──────────────────────────┬──────────────────────────┐ │ wolf-gateway (حساب A) │ wolf-gateway-2 (حساب B) │ │ host.for.wolf │ contact.3mh │ └──────────────────────────┴──────────────────────────┘ │ لكل حساب 100k طلب/يوم — يتزامنان معًا │ • تسجيل الدخول + الكابتشا + الجلسات (KV/D1) │ • API خفيفة تُقرأ من D1 مباشرة │ • فحص مسارات الملكية ومنع traversal │ • توقيع HMAC لكل طلب يمرّ للخلفية ▼ *.hf.space (Hugging Face Space — هذا السبيس) • تشغيل/إيقاف العمليات + pip install • File Manager + Console • مزامنة القرص ⇄ D1 كل 60 ثانية • إدارة ويب هوك تيليجرام تلقائيًا (set/delete) ``` **الرابط الذي لا يتغيّر:** `https://3mh-host.pages.dev/` **مصدر الحقيقة للبيانات:** Cloudflare D1 (وليس قرص السبيس — القرص يُمسح مع كل rebuild). **زيارات المواقع المستضافة** تخرج على **رابط مباشر** `/web//…` (لا تمرّ بالوسيط) فتتوزّع بين الحسابين وتوفّر نصف الاستدعاءات. --- ## ✨ الوظائف (كلها محفوظة) - دخول أدمن + مستخدمين (التسجيل العام **مغلق** افتراضيًا) - أنواع سيرفرات جديدة عند الإنشاء: - `python` — بوت/سكربت (الوضع الافتراضي) - `webapp` — تطبيق ويب Python (يأخذ `PORT`/`HOST` من البيئة) - `api` — خدمة API بلغة Python - `php` — **محرك PHP كامل** (php-cli + إضافات) عبر خادم PHP المضمّن - كل سيرفر من نوع webapp/api/php يحصل على **دومين فرعي** خاص به مع **رابط مباشر** `/web//` يثبَّت بالهاش على أحد الحسابين (توزيع أحمال) - 🤖 **ويب هوك تيليجرام تلقائي**: زر واحد في الكونسول يفعّله — الخلفية تكتشف توكن البوت في ملفات السيرفر وتنادي `setWebhook` على الرابط المباشر، وتعيد التسجيل عند كل تشغيل، وتزيله عند الإيقاف/الحذف، وتنقله للحساب الآخر إن نفدت حصته. (لا تستخدم `getUpdates` معه — تيليجرام يرفض الجمع بين الطريقتين.) - **مجمّع بوابتين** `GATEWAY_URLS` مع قاطع صحة: التبديل التلقائي عند نفاد حصة أحد الحسابين، وصفحة 503 مؤقتة (مع `Retry-After`) إذا نفدا معًا - **API عامة للمنصة** على `/api/v1/*` بمفتاح `PANEL_API_KEY` - إنشاء «سيرفرات» بدون حدود، مع تهدئة تلقائية تحت الضغط (`adaptive_throttle`) - تشغيل / إيقاف / إعادة تشغيل مع تثبيت تلقائي للمكتبات الناقصة و `requirements.txt` - File Manager كامل: رفع، إنشاء، إعادة تسمية، حذف، تحرير داخل المتصفح - Console حيّ منقّى من ضوضاء pip (CPU / RAM / IP) - لوحة أدمن: إحصائيات، تفعيل/حظر مستخدمين، حظر سيرفرات، مفاتيح API - مزامنة كل 60 ثانية: ملفات السيرفرات + `meta.json` + الحالة + آخر أسطر الكونسول ## 🗂️ بنية المشروع | المسار | الدور | |---|---| | `app.py` | الخلفية (Flask) — كل العمليات الثقيلة + إدارة ويب هوك تيليجرام | | `gwclient.py` | الاتصال بالبوابات: توقيع HMAC + `/internal/*` + `/tg` | | `proxy/` | تغليف يمرر طلبات Telegram عبر Cloudflare Worker | | `worker/src/` | كود البوابات (`auth`, `api`, `store`, `internal`, `peer` …) | | `worker/wrangler.toml` | إعداد البوابة A (حساب host.for.wolf) | | `worker/wrangler.account2.toml` | إعداد البوابة B (حساب contact.3mh) | | `migrations/` | سكيما D1 | | `dist/` | ما يُنشر على Cloudflare Pages (`_worker.js` الموزّع + الواجهة) | | `scripts/seed_gateway.py` | بذر الحساب الثاني (مستخدمون/مفاتيح/جلسات) | | `scripts/` | الترحيل إلى D1، التشويش، CSP، سكربتات المساعدة | | `.github/workflows/` | النشر التلقائي عند الدفع (A + B + Pages + السبيس) | ## 🚀 النشر الخطوات الكاملة (بما فيها الأسرار وأوامر النشر والبذر): **[docs/DEPLOY.md](docs/DEPLOY.md)** ملخّص الأمن: **[docs/SECURITY.md](docs/SECURITY.md)** ```bash # 1) D1 schema (الحساب A فقط) cd worker && npx wrangler d1 migrations apply wolf_host --remote # 2) البوابتان npx wrangler secret bulk --file secrets.json --env="" npx wrangler deploy # A npx wrangler secret bulk --file secrets.json -c wrangler.account2.toml npx wrangler deploy -c wrangler.account2.toml # B # 3) Pages (الرابط ثابت) ثم بذر B من A cd .. && npx wrangler pages deploy dist --project-name 3mh-host python scripts/seed_gateway.py --from --to --secret ``` ## 🔐 لماذا لا يوجد سر واحد داخل الكود - `PANEL_SERVICE_SECRET` / `ADMIN_PASSWORD` / `HF_ORIGIN` → **Cloudflare Secrets** - نفس القيم على السبيس → **Hugging Face Secrets** - لا يوجد `PANEL_SECRET_KEY` بعد الآن (لا توجد جلسات Flask) - التسجيل معطّل افتراضيًا (`ALLOW_REGISTRATION=0`) - السبيس يرفض أي طلب غير موقّع، فالرابط المكشوف لا يكفي للوصول > الرخصة: MIT · المؤلف: White Wolf — https://t.me/j49_c