دليل النشر

نشر ‎Plane على ‎VPS: دليل وتراجعات ما بعد الإصدار 2.3.7

انشر على VPS Cloud →

الأتمتة12 دقيقة قراءة

نشر ‎Plane على ‎VPS: دليل وتراجعات ما بعد الإصدار 2.3.7

فاتورة ‎Linear أو ‎Jira ترتفع مع كل مقعد جديد، وتخزين تذاكر مشاريعك لدى مزود طرف ثالث ليس مقبولاً دائماً. ‎Plane بديل مرخّص بـ‎AGPL-3.0 يتجاوز 54 000 نجمة على ‎GitHub، مع صورة ‎Docker AIO مُصانة — `makeplane/plane-aio-community:stable` — وحاوية واحدة تضم جميع الخدمات الداخلية تحت ‎supervisord. يوضح هذا الدليل كيفية نشره على خادم ‎VPS لينكس، وتأمينه خلف بروكسي عكسي ‎HTTPS، وفتحه لفريقك.

لماذا استضافة ‎Plane بنفسك بدلاً من الدفع مقابل كل مقعد

الاعتراض الأكثر شيوعاً على صورة ‎AIO هو أن «‎supervisord الكل في واحد» يُخفي خدمات داخلية متعددة، مما يُصعّب التشخيص عند حدوث مشكلة. في الواقع، تجمع الصورة خمسة مكونات — واجهة ‎Django API وعامل ‎Celery وقاعدة ‎PostgreSQL و‎Redis وخادم ملفات — في عملية ‎supervisord واحدة، مما يبسّط التشغيل بشكل كبير. لا تحتاج إلى تجميع حزمة متعددة الحاويات أو مزامنة عمليات ترحيل البيانات. في حالة حدوث خطأ، يكفي docker logs <container> وdocker exec <container> supervisorctl status لمعظم الحالات. أعلن مدوّنة ‎Plane الرسمية عن أكثر من 100 000 نشر عبر ‎Docker وأكثر من 44 000 نشر على ‎Kubernetes، مما يعكس نضج الصورة التشغيلي. النموذج الاقتصادي واضح: تدفع مقابل الخادم الافتراضي، لا مقابل المقاعد.

ما تكسبه باستضافة ‎Plane على خادمك الافتراضي

  • تكلفة ثابتة مستقلة عن حجم الفريق — خادم افتراضي واحد يكفي لـ5 إلى 50 مستخدماً؛ السعر لا يتغير مع عدد المقاعد.
  • بياناتك تحت سيطرتك — التذاكر والتعليقات والملفات وأعضاء الفريق تبقى في قاعدة ‎PostgreSQL الخاصة بك، على قرصك الخاص.
  • ترخيص ‎AGPL-3.0 — الاستخدام التجاري والاستضافة الذاتية مسموح بهما دون رسوم؛ الكود المصدري قابل للتدقيق.
  • المهام والدورات والوحدات والصفحات وصندوق الوارد — تغطي ‎Plane تتبع المهام والسبرينت والتجميعات الوظيفية والتوثيق الخفيف وإدارة الطلبات الواردة، دون وحدة منفصلة.
  • صورة مستقرة ومُصانةmakeplane/plane-aio-community:stable يُحدّثها الناشر وتُختبر كوحدة متماسكة قبل كل إصدار.
  • تحديثات تحت سيطرتك — أنت من يسحب الصورة الجديدة متى تشاء؛ لا يمكن لأي مزوّد تعديل بيئة الإنتاج دون موافقتك.
  • تكامل مع سلسلة أدواتك — تعرض ‎Plane واجهة ‎REST API موثّقة، يمكن استخدامها لمزامنة المهام من ‎pipeline CI أو من ‎GitHub.
  • حل بسيط للحوادث — حاوية واحدة، سجل واحد، نقطة إعادة تشغيل واحدة؛ لا حاجة لتنسيق حزمة متعددة الخدمات يدوياً.

المتطلبات الدنيا لنشر مستقر

تجمع صورة ‎AIO عدة خدمات في حاوية واحدة: خطّط لـ2 وحدة معالجة افتراضية و4 جيجابايت ذاكرة وصول عشوائي كحد أدنى للاستخدام الفرقي. دون ذلك، يتشارك عامل ‎Celery و‎PostgreSQL ذاكرة غير كافية وتستغرق استعلامات الفهرسة ثوانٍ عدة. للفرق التي تتجاوز عشرة أشخاص أو الاستخدام المكثف للصفحات والدورات، انتقل إلى 8 جيجابايت. تحتاج إلى ‎Docker على الخادم (الإصدار 20 أو أحدث)، واسم نطاق أو نطاق فرعي يشير إلى خادمك الافتراضي، والمنافذ 80 و443 مفتوحة في جدار الحماية، وحوالي 10 جيجابايت مساحة قرص للأجزاء والصور. شهادة ‎TLS إلزامية: تضع ‎Plane ملفات تعريف الجلسة بخاصية Secure، مما يجعلها غير صالحة عبر ‎HTTP العادي.

نشر ‎Plane AIO في ثماني خطوات

01

إعداد الخادم وتثبيت ‎Docker

على خادم ‎Debian أو ‎Ubuntu حديث التثبيت، حدّث الحزم ثم ثبّت ‎Docker عبر السكريبت الرسمي:

curl -fsSL https://get.docker.com | sh
systemctl enable --now docker

تحقق من تشغيل ‎Docker: docker version.

02

إنشاء مجلد العمل وملف البيئة

أنشئ مجلداً مخصصاً وجهّز ملف .env الأدنى:

mkdir -p /opt/plane && cd /opt/plane

ثم أنشئ /opt/plane/.env بالمتغيرات المطلوبة:

SECRET_KEY=$(openssl rand -hex 32)
WEB_URL=https://plane.your-domain.com
DATABASE_URL=postgresql://plane:[email protected]:5432/plane

SECRET_KEY يجب أن تكون سلسلة عشوائية طويلة؛ WEB_URL هو الرابط العام الكامل لنسختك — هذه القيمة الأهم. إن كانت خاطئة، ستفشل إعادة التوجيه بعد تسجيل الدخول وتحميل ملفات الأصول.

03

تشغيل حاوية ‎AIO

شغّل ‎Plane بالأمر التالي، مع تحديد مسار ملف .env وتحميل مجلد للبيانات الدائمة:

docker run -d \
  --name plane \
  --restart unless-stopped \
  --env-file /opt/plane/.env \
  -v plane-data:/app/plane-data \
  -p 127.0.0.1:8080:8080 \
  makeplane/plane-aio-community:stable

المنفذ 8080 مكشوف على الحلقة الداخلية فقط: لن يصله إلا البروكسي العكسي المحلي. عند التشغيل الأول، يُنفّذ ‎supervisord عمليات ترحيل ‎Django؛ الواجهة لن تكون متاحة لمدة دقيقة إلى دقيقتين.

04

التحقق من حالة الخدمات الداخلية

قبل ضبط البروكسي العكسي، تحقق من أن جميع العمليات الفرعية نشطة:

docker exec plane supervisorctl status

يجب أن ترى خدمات api وworker وbeat وweb وnginx في حالة RUNNING. إن كانت إحداها في FATAL، اقرأ السجلات بـdocker logs plane لتحديد الخطأ.

05

الحصول على شهادة ‎TLS مع ‎Certbot

ثبّت ‎Certbot وإضافة ‎Nginx، ثم اطلب شهادة لنطاقك الفرعي:

apt install -y certbot python3-certbot-nginx
certbot certonly --nginx -d plane.your-domain.com

سيضع ‎Certbot ملفات الشهادة في /etc/letsencrypt/live/plane.your-domain.com/.

06

ضبط ‎Nginx كبروكسي عكسي ‎HTTPS

أنشئ /etc/nginx/sites-available/plane.conf:

server {
    listen 80;
    server_name plane.your-domain.com;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl;
    server_name plane.your-domain.com;
    ssl_certificate /etc/letsencrypt/live/plane.your-domain.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/plane.your-domain.com/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

فعّل الموقع وأعد تحميل ‎Nginx:

ln -s /etc/nginx/sites-available/plane.conf /etc/nginx/sites-enabled/
nginx -t && systemctl reload nginx
07

إنشاء أول حساب مدير

افتح https://plane.your-domain.com في متصفح. تعرض ‎Plane صفحة تسجيل عند أول وصول. أنشئ حساب مدير، ثم من لوحة الإدارة — المتاحة على /god-mode/ — فعّل التسجيل بالبريد الإلكتروني أو اضبط قائمة نطاقات مسموحة للحد من الوصول إلى مؤسستك.

08

دعوة الفريق وإنشاء أول مشروع

في ‎Plane، يجمع المشروع المهام والدورات (سبرينت) والوحدات (ميزات) والصفحات (ويكي خفيف). أنشئ مشروعاً من الواجهة، ثم ادعُ المتعاونين بالبريد الإلكتروني من إعدادات المشروع. تُرسَل الدعوات عبر خادم البريد المضبوط في .env عبر EMAIL_HOST وEMAIL_PORT.

الضبط بعد التثبيت: متغيرات البيئة الأساسية

أهم المتغيرات بعد التشغيل الأولي:

WEB_URL — الرابط العام الكامل للنسخة، بدون شرطة مائلة في النهاية. رابط خاطئ يتسبب في إعادة توجيه معطوبة بعد تسجيل الدخول وملفات أصول لا تُحمَّل. هذا هو الخطأ الأكثر شيوعاً عند التشغيل الأول.

SECRET_KEY — سلسلة سرية لتوقيع جلسات ‎Django. لا تغيّرها بعد التشغيل الأول دون إبطال جميع الجلسات النشطة.

EMAIL_HOST وEMAIL_PORT وEMAIL_HOST_USER وEMAIL_HOST_PASSWORD — ضرورية للدعوات والإشعارات. بدون هذه المتغيرات لن تُرسَل دعوات البريد الإلكتروني.

ENABLE_SIGNUP1 للسماح بالتسجيل المفتوح، 0 لتعطيله (المدير فقط يمكنه إنشاء الحسابات).

بعد أي تعديل على ملف .env، أعد تشغيل الحاوية: docker restart plane.

للتحديث، اسحب الصورة الجديدة ثم أعد إنشاء الحاوية مع الاحتفاظ بمجلد البيانات:

docker pull makeplane/plane-aio-community:stable
docker stop plane && docker rm plane

ثم أعد تشغيل أمر docker run من الخطوة 3 بنفس المعاملات. تُطبَّق عمليات ترحيل قاعدة البيانات تلقائيًا عند التشغيل. إن كسّر التحديث البيئة، ارجع إلى الإصدار السابق باستبدال stable بالتاغ الدقيق للصورة السابقة — docker images يسرد الصور المتاحة محلياً.

التراجعات في الإصدارات بعد 2.3.7 وإجراء التحديث الآمن

أدخلت إصدارات ‎Plane AIO من 2.3.7 إلى 2.4.1 عدة تراجعات موثّقة. فقدان الإشعارات في الوقت الفعلي عند ترقية خادم ‎Python بين هذه الإصدارات. خطأ 500 على ‎webhooks الصادرة إذا كان العمود webhook_trigger غائبًا في ترحيل ‎PostgreSQL — الأعراض: django.db.utils.ProgrammingError: column webhook_trigger does not exist في سجلات حاوية plane-backend. تباطؤ استعلامات التصفية على مساحات العمل التي تتجاوز 5 000 مهمة (تراجع فهرس تم إصلاحه في الإصدار 2.4.2).

قبل أي تحديث من إصدار أقدم من 2.4.2، احتفظ بنسخة احتياطية من قاعدة ‎PostgreSQL: docker compose exec -T db pg_dump -U plane plane > plane-backup-$(date +%F).sql. ثم قم بالتحديث: docker compose pull && docker compose up -d. إذا لم يبدأ الـ ‎backend بعد التحديث، أجبر عمليات ‎migration يدويًا: docker compose exec plane-backend python manage.py migrate --run-syncdb. للنسخ على الإصدار 2.3.6 أو أقدم، يُنصح بالتحديث المباشر إلى ‎2.4.2+ لتخطّي الإصدارات الوسيطة المعطوبة.

استكشاف الأخطاء: مشكلات شائعة وحلولها

إعادة توجيه معطوبة أو ملفات أصول لا تُحمَّل بعد تسجيل الدخول. أعراض نموذجية: الواجهة تعيد التوجيه إلى http://localhost أو تفشل الصور والسكريبتات في التحميل. السبب: WEB_URL في .env لا يطابق الرابط العام الفعلي. صحّح القيمة وأعد تشغيل الحاوية.

فشل تشغيل خدمة داخلية. رسالة نموذجية في docker logs plane: FATAL: api: exited too quickly. تحقق من DATABASE_URL — رابط اتصال خاطئ أو اسم قاعدة بيانات غير موجود يمنع تنفيذ عمليات الترحيل ويسبب هذا النوع من الخروج الخاطئ.

لوحة /god-mode/ غير متاحة. الوصول إلى واجهة الإدارة يتطلب إنشاء الحساب الأول عبر الواجهة الرئيسية أولاً، ثم تسجيل الدخول ببيانات اعتماده. إن عطّلت التسجيل قبل إنشاء الحساب الأول، أعد مؤقتاً ENABLE_SIGNUP=1، أنشئ الحساب، ثم أعده إلى 0.

رسائل الدعوة لا تُرسَل. تحقق من أن EMAIL_HOST وEMAIL_HOST_USER مضبوطان في .env وأن منفذ ‎SMTP (غالباً 587 مع ‎STARTTLS أو 465 مع ‎SSL) يمكن الوصول إليه من خادمك. اختبر بـdocker exec plane python manage.py sendtestemail [email protected].

أداء متدهور مع مستخدمين متزامنين كثيرين. إن عجزت عمال ‎Celery عن معالجة المهام، زِد ذاكرة ‎VPS قبل ضبط التزامن الداخلي. صورة ‎AIO مُهيَّأة للاستخدام الفرقي المعياري؛ الحمل الثقيل جداً يستلزم التحوّل إلى تثبيت متعدد الحاويات بموارد مخصصة لكل مكوّن.

الإبقاء على السيطرة دون صيانة طبقة نظام التشغيل

استضافة ‎Plane بنفسك تُثبت أن الاعتماد على اشتراكات ‎SaaS ليس أمراً لا مفر منه: صورة مستقرة وخادم افتراضي بالحجم المناسب وبروكسي عكسي ‎TLS تكفي لفريق من الحجم المهني. تقدم ‎ServOrbit خوادم ‎VPS بصلاحية ‎root وعنوان ‎IPv4 مخصص، جاهزة في دقائق، بصلاحية ‎root كاملة لتثبيت ‎Docker وإدارة أدواتك الخاصة. إن كنت تريد تفويض طبقة النظام — تحديثات النواة وتقوية ‎SSH والنسخ الاحتياطية — يتيح لك خيار إدارة ‎VPS الإبقاء على السيطرة على بياناتك مع الاستعانة بطرف لصيانة الخادم. لمزيد من التوسع في ممارستك ‎DevOps، راجع دليل أتمتة خوادمك باستخدام ‎Ansible ودليل ‎Docker Compose للإنتاج.

نشر Plane من Marketplace ServOrbit

يقدم ServOrbit Plane مُهيَّأً مسبقًا على VPS: يُثبَّت PostgreSQL 16 وRedis 7 وRabbitMQ وMinIO تلقائيًا. النطاق مطلوب ومُدرَج في الوصفة — الوصول الأول في دقائق، والبيانات تحت سيطرتك.

مقالات ذات صلة

بحاجة إلى مساعدة؟

تصفّح مركز المساعدة والأسئلة الشائعة، أو تواصل مع فريقنا — معاودة اتصال أو WhatsApp أو بريد إلكتروني. الدعم بـ العربية والفرنسية والإنجليزية.