ما تحتاج إليه (60 ثانية)
شيء واحد: باقة cdn.com.tr تتضمن منصة الحاويات — وكل الباقات القياسية تتضمنها. ثبّت الأداة بالسطر الواحد أدناه وسجّل الدخول. يعمل الأمر بالطريقة نفسها على Linux وmacOS وWindows؛ وتوجد أيضًا مستودعات APT/YUM وHomebrew وصورة Docker إن كنت تفضّل مدير حزم.
$ curl -fsSL https://cdn.com.tr/downloads/cdnctl/install.sh | sh
$ cdnctl login --email you@company.com
الخطوة 1 — cdnctl init: دَع المجلد يعرّف بنفسه
شغّل init داخل مجلد المشروع. يكتشف الحزمة التقنية والمنفذ، ويكتب ملف توصيف صغيرًا cdnctl.yaml، ويضيف قسمَ نشرٍ إلى AGENTS.md ليتعلّم وكيل البرمجة الذكي عندك المسارَ أيضًا. كما يفحص حسابك: إن كانت منصة الحاويات غائبة، يطبع رابط الشراء الدقيق — ومع --wait يتوقف ببساطة حتى يكتمل دفعك في المتصفح، ثم يواصل من تلقاء نفسه.
$ cdnctl init
Proje : gorev-takip (node/express, port 3000)
Agent : claude-code (claude on PATH), cursor
Paket : ✓ Large (max 5 app)
Karne : 2 HATA, 2 uyarı — ayrıntı: cdnctl check
Yazıldı : cdnctl.yaml, AGENTS.md
→ Önce `cdnctl check` hatalarını düzeltin (deploy sonrası site açılmaz).
الخطوة 2 — cdnctl check: أصلِح وهو رخيص
check هو مدقّق (linter) محلي لقابلية النشر. الأخطاء (التي ستعطّل الموقع المباشر) توقف النشر؛ أما التحذيرات فلا. والإصلاحات غالبًا أسطر مفردة: اربط بـ 0.0.0.0 بدل 127.0.0.1، وانقل الرمز المكتوب في الكود إلى --secret، وأضف مسار GET /health يعيد 200، واقرأ المنفذ من متغيّر البيئة PORT.
$ cdnctl check
[ERROR] bind-localhost (server.js:61)
The app binds to 127.0.0.1 — unreachable inside a container.
→ Bind to 0.0.0.0 (just drop the host argument).
[ERROR] secret-in-code (server.js:10)
A hard-coded secret (API key/token/password).
→ Move it to --secret KEY=VALUE; read it via process.env.
[WARNING] sqlite-single-pod
SQLite loses data on restart / multiple replicas.
→ Mount a persistent disk or switch to a managed database.
[WARNING] no-healthcheck
No /health route — the platform can’t tell your app is alive.
الخطوة 3 — cdnctl deploy: مجلدٌ يدخل، رابطٌ يخرج
يؤرشف deploy المجلد (node_modules و.git لا يسافران أبدًا)، ويرفعه، ويبنيه في بيئة المنصة المعزولة، ثم يطلقه. سطور التقدّم تعني ما تقوله حرفيًا؛ وحين ترى LIVE يكون الرابط يخدم فعلًا عبر HTTPS. والتحديثات هي الأمر نفسه — لا تحل النسخة الجديدة محل القديمة إلا بعد قيامها.
$ cdnctl deploy
→ archiving source (gorev-takip)
→ uploading (0.1 MB)
→ starting build (Kaniko, isolated sandbox)
build: running
build: success (41 s)
→ creating the app
→ assigning a subdomain
→ first deploy
→ waiting for the app to come up
✓ LIVE: https://ca…….cdn.com.tr
لا باقة بعد؟ مصافحة المتصفح
إن لم يجد init منصة حاويات في حسابك، أرسلك إلى صفحة الشراء مصحوبًا بالسياق — تعرض الصفحة لافتة تؤكد أن cdnctl هو من أرسلك، وتعلّم الباقة الموصى بها. ادفع في المتصفح كالمعتاد؛ تخبرك صفحة التأكيد بالعودة إلى الطرفية، ويلتقط cdnctl (مع --wait، أو بإعادة تشغيل init ببساطة) المسارَ تلقائيًا. لا نسخ مفاتيح، ولا تهيئة.
الحدود والتفاصيل الصريحة
سقف رفع المصدر 128 ميغابايت — وهو كافٍ بارتياح ما دام node_modules باقيًا في البيت. البناء النموذجي يستغرق نحو دقيقة. إن احتاج تطبيقك إلى حفظ ملفات، فاطلب قرصًا دائمًا وقت النشر أو استخدم تخزين الكائنات؛ وإن كان يستخدم SQLite، ففكّر في قاعدة البيانات المُدارة بدلًا منه — وسيواصل check تذكيرك بالسبب. وإن فشل بناء، يطبع cdnctl سجل البناء مباشرة؛ وأشيع سبب في المرة الأولى ملفُ Dockerfile ينسخ node_modules من جهازك (أضفه إلى .dockerignore).
الأسئلة الشائعة
هل أستطيع ربط نطاقي الخاص؟
نعم — يحصل التطبيق فورًا على نطاق فرعي عامل، وتستطيع بعد ذلك ربط نطاقك الخاص من اللوحة أو من سطر الأوامر.
أين سجلاتي؟
يغطي cdnctl container apps show وتبويب الصحة في اللوحة الحالةَ؛ ويطبع cdnctl deploy سجلات البناء عند الفشل، وتسكن سجلات التشغيل في اللوحة.
هل أستطيع تشغيل أكثر من تطبيق؟
نعم؛ باقتك تحدد حصة التطبيقات. وكل مجلد مشروع يُنشَر تطبيقًا مستقلًا برابطه الخاص.
وكيلي الذكي هو من يبرمج — هل يستطيع النشر أيضًا؟
نعم. علّمه init الأوامرَ سلفًا عبر AGENTS.md؛ امنحه رمزًا مخصّصًا للنشر فقط (cdnctl deploy-token create) ليستطيع الإطلاق دون أن يحمل كلمة مرور حسابك أبدًا.