دليل النشر

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

انشر على VPS Cloud ←

دليل عملي

الأتمتة

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

تزداد فاتورة ‎Linear أو ‎Jira مع كل مقعد جديد، ولا يكون تسليم تذاكر مشاريعك إلى مزوّد خارجي مقبولاً دائماً. ‎Plane بديل مرخّص بـ‎AGPL-3.0، يُوزَّع بنسخة ‎Community قابلة للاستضافة الذاتية مع مثبّت رسمي يعتمد ‎Docker ‎Compose. يوضح هذا الدليل كيف تنشره على خادم ‎VPS لينكس، وتضعه خلف بروكسي عكسي ‎HTTPS، وتفهم ما تتطلبه صورة ‎AIO فعلاً، وتشخّص الأعطال التي تتكرر في التذاكر العلنية: صورة ‎MinIO غير موجودة، وحلقة إعادة توجيه في صفحة الملف الشخصي، ومشكلات بعد ترقية الإصدار.

13 دقيقةً للقراءةعدد الخطوات: 8
المحتويات· لماذا تستضيف ‎Plane بنفسك بدلاً من الدفع عن كل مقعد1/11
  1. 01لماذا تستضيف ‎Plane بنفسك بدلاً من الدفع عن كل مقعد
  2. 02ما تكسبه باستضافة ‎Plane على خادمك الافتراضي
  3. 03متطلبات مقدّرة لنشر مستقر
  4. 04نشر ‎Plane ‎Community في ثماني خطوات
  5. 05الإعداد بعد التثبيت: المتغيرات التي تهمّ
  6. 06تخزين الكائنات: صورة ‎MinIO المفقودة وإصلاح الإصدار 1.4.3
  7. 07بعد ترقية الإصدار: ما تثبته التذكرة 8708 وما لا تثبته
  8. 08مثبّت ‎Compose أم صورة ‎AIO: ما يتطلبه كل منهما
  9. 09استكشاف الأخطاء: حلقة إعادة التوجيه بين /‎profile/ و/?‎next_path=/‎profile/
  10. 10استكشاف الأخطاء: أخطاء متكررة أخرى وعلاجها
  11. 11حافظ على سيطرتك على بنيتك التحتية دون صيانة طبقة النظام

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

تجمع أداة تتبّع التذاكر أكثر ما يقوله الفريق: القرارات والمرفقات وأسماء العملاء والمواعيد. استضافتها على خادمك الافتراضي تنقل التكلفة من عدد المقاعد إلى سعة الخادم: تدفع مقابل الموارد لا مقابل المستخدمين. يتجاوز ‎Plane 61 000 نجمة على ‎GitHub، ويُنشر كوده بترخيص ‎AGPL-3.0، ويعلن ناشره في مدوّنته أكثر من 100 000 عملية نشر عبر ‎Docker وأكثر من 44 000 عبر ‎Kubernetes، وهو ما يعطي فكرة عن حجم القاعدة المثبّتة وعن كمية التجارب العلنية المتاحة.

هناك مقابل يجدر معرفته قبل البدء. تضم حزمة ‎Community عدة خدمات: واجهة الويب، وواجهة ‎API، وعمّال المعالجة، وخادم الوقت الفعلي، وقاعدة ‎PostgreSQL، وذاكرة ‎Valkey المؤقتة، وطابور رسائل ‎RabbitMQ، وتخزين كائنات متوافق مع ‎S3، وبروكسي عكسي. ينسّقها المثبّت الرسمي عبر ‎Docker ‎Compose، لكنك أنت المسؤول عن النسخ الاحتياطي والترقيات وحالة تخزين الكائنات. تفصّل الأقسام التالية كل نقطة، مع التمييز بين ما أكّده المشرفون وما أبلغ عنه المستخدمون فقط.

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

  • تكلفة مرتبطة بالجهاز لا بالمقاعد — لا يتغيّر سعر الخادم مع عدد الحسابات؛ ما يحدّ الفريق هو الذاكرة والقرص.
  • بيانات تحت سيطرتك — تبقى التذاكر والتعليقات والملفات والأعضاء في قاعدة ‎PostgreSQL وتخزين الكائنات لديك، على قرصك.
  • ترخيص ‎AGPL-3.0 — يمكن تدقيق الكود؛ ويُلزمك الترخيص بنشر تعديلاتك إن أتحت للمستخدمين نسخة معدّلة.
  • المهام والدورات والوحدات والصفحات وصندوق الوارد — تتبّع المهام والسباقات والتجميعات الوظيفية والتوثيق الخفيف والطلبات الواردة دون وحدة منفصلة.
  • مثبّت رسمي — يجلب السكربت setup.sh ملفّي docker-compose.yaml وplane.env المنشورين مع الإصدار، ثم يتولى التشغيل والإيقاف والترقية والنسخ الاحتياطي.
  • ترقيات بإيقاعك — تختار لحظة ترقية الإصدار بعد نسخة احتياطية، ويؤرشف السكربت ملف ‎Compose القديم قبل استبداله.
  • تخزين يمكن إخراجه من الخادم — يمكن أن تعيش قاعدة ‎PostgreSQL وتخزين ‎S3 خارج الخادم؛ وتوصي به وثائق ‎Plane للإنتاج.
  • واجهة ‎REST موثّقة — مفيدة لمزامنة المهام من خط ‎CI أو من ‎GitHub.

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

تذكر وثائق ‎Plane نواتين و4 غيغابايت من الذاكرة كحد أدنى، مع توصية بـ8 غيغابايت في الإنتاج. احسب 2 ‎vCPU و8 غيغابايت من الذاكرة إذا تجاوز الفريق عشرة أشخاص أو أكثر من استخدام الصفحات والدورات: تتشارك ‎PostgreSQL و‎RabbitMQ والعمّال وواجهة ‎API الجهاز نفسه. خصّص 20 غيغابايت من القرص أو أكثر: الصور وقاعدة البيانات خفيفة في البداية، والملفات المرفوعة هي التي تُكبّر وحدة التخزين uploads.

تحتاج إلى ‎Docker حديث مع إضافة ‎Compose (يستدعي السكربت docker compose)، واسم نطاق أو نطاقاً فرعياً يشير سجلّ ‎A فيه إلى الخادم، والمنفذين 80 و443 مفتوحين. شهادة ‎TLS لا غنى عنها في الإنتاج: بدون ‎HTTPS تنتقل كلمات المرور والجلسات بنص صريح.

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

  1. تجهيز المضيف وتثبيت ‎Docker

    على خادم ‎Debian أو ‎Ubuntu محدَّث، ثبّت ‎Docker بالسكربت الرسمي: curl -fsSL https://get.docker.com | sh. فعّل الخدمة بـsystemctl enable --now docker ثم تحقق من docker version وdocker compose version. افتح المنفذين 80 و443 في الجدار الناري وقصر المنفذ 22 على عناوينك.

  2. تنزيل المثبّت الرسمي

    أنشئ مجلداً مخصصاً بـmkdir -p /opt/plane-selfhost && cd /opt/plane-selfhost ثم نزّل سكربت أحدث إصدار: curl -fsSL -o setup.sh https://github.com/makeplane/plane/releases/latest/download/setup.sh وchmod +x setup.sh. يعمل السكربت في المجلد الحالي: ينشئ فيه المجلد الفرعي plane-app.

  3. تشغيل التثبيت

    نفّذ ./setup.sh بصفة ‎root أو بمستخدم من مجموعة ‎docker ثم اختر الخيار 1 (‎Install). ينزّل السكربت docker-compose.yaml وplane.env إلى plane-app/ ويولّد في الإصدارات الحديثة بيانات اعتماد لتخزين الكائنات المضمَّن. اخرج من القائمة بالخيار 8 قبل الإعداد: تطلب الوثائق إيقاف الحزمة قبل تعديل plane.env.

  4. ملء ‎plane.env

    افتح plane-app/plane.env وحدّد على الأقل APP_DOMAIN=plane.your-domain.com وWEB_URL=https://plane.your-domain.com وCORS_ALLOWED_ORIGINS=https://plane.your-domain.com. لكي يحتفظ ‎Nginx بالمنفذين 80 و443 أضف LISTEN_HTTP_PORT=8080. تأكد أن SECRET_KEY وLIVE_SERVER_SECRET_KEY تحملان قيمتين فريدتين لا مثالين: يولّد openssl rand -hex 32 واحدة.

  5. تشغيل الحزمة وفحص الحاويات

    أعد تشغيل ./setup.sh واختر الخيار 2 (‎Start). ينزّل التشغيل الأول الصور، ثم تُعدّ الحاوية migrator القاعدة وتتوقف. افحص الحالة بـdocker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env ps: يجب أن تكون بقية الحاويات قيد التشغيل. يعرض الخيار 6 في القائمة السجلات.

  6. الحصول على شهادة ‎TLS عبر ‎Certbot

    ثبّت ‎Nginx و‎Certbot بـapt install -y nginx certbot python3-certbot-nginx ثم اطلب الشهادة: certbot certonly --nginx -d plane.your-domain.com. توضع الملفات في /etc/letsencrypt/live/plane.your-domain.com/. يجب أن يشير اسم النطاق إلى الخادم مسبقاً.

  7. إعداد ‎Nginx كبروكسي عكسي ‎HTTPS

    أنشئ موقع ‎Nginx يستمع على المنفذ 443 بالشهادة التي حصلت عليها ويمرّر كل شيء إلى http://127.0.0.1:8080. أضف الترويسات Host وX-Real-IP وX-Forwarded-For وX-Forwarded-Proto، وكذلك Upgrade وConnection لاتصالات ‎WebSocket الخاصة بخادم الوقت الفعلي. تعيد كتلة server ثانية توجيه المنفذ 80 إلى ‎HTTPS بـreturn 301 https://$host$request_uri;. فعّل الموقع ثم نفّذ nginx -t && systemctl reload nginx. ينشر ‎Docker المنفذ 8080 دون المرور بـ‎UFW: أغلقه من الخارج عبر جدار مزوّدك الناري.

  8. إنشاء مدير النسخة والفريق

    افتح https://plane.your-domain.com/god-mode/ لإنشاء حساب مدير النسخة. أبقِ الشرطة المائلة الأخيرة: يذكر مستخدم أن عنواناً بدونها بقي معلّقاً، وهي نقطة لم يؤكدها المشرفون. ثم افتح التطبيق وأنشئ مساحة العمل والمشروع الأول وادعُ زملاءك.

الإعداد بعد التثبيت: المتغيرات التي تهمّ

WEB_URL وCORS_ALLOWED_ORIGINS: تطلب الوثائق ضبطهما على العنوان الذي يستخدمه المتصفح فعلاً. هذا أول ما يُفحص عند سلوك غريب بعد تسجيل الدخول.

LISTEN_HTTP_PORT وLISTEN_HTTPS_PORT: المنفذان اللذان ينشرهما البروكسي المضمَّن، 80 و443 افتراضياً. غيّرهما إن كان ‎Nginx يشغل المنفذين القياسيين.

TRUSTED_PROXIES وNUM_PROXIES: يحددان عنوان ‎IP للعميل كما تراه واجهة ‎API، وبالتالي تحديد معدل الطلبات. خلف بروكسيك العكسي الخاص يطلب ‎README المثبّت رفع NUM_PROXIES بواحد لكل قفزة إضافية؛ وإذا تُرك فارغاً يُطبَّق السلوك الافتراضي.

UNSPLASH_ACCESS_KEY: اختياري، يغذّي منتقي صور الغلاف. اتركه فارغاً إن كنت لا تستخدم ‎Unsplash؛ وهو أول إعداد يُعاد فحصه عند حلقة إعادة التوجيه الموصوفة أدناه.

APP_RELEASE: الإصدار المتَّبع، stable في البداية. يحوّله السكربت إلى رقم إصدار عند التثبيت وفي كل ترقية.

أوقف الحزمة بالخيار 3 قبل تعديل plane.env ثم أعد التشغيل بالخيار 4.

قبل أي ترقية، خذ نسخة احتياطية: الخيار 7 في السكربت، إضافة إلى تفريغ ‎PostgreSQL بـdocker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env exec -T plane-db pg_dump -U plane plane > plane-backup-$(date +%F).sql. ثم نفّذ الخيار 5 (‎Upgrade): يقارن السكربت الإصدار المثبّت بالأحدث، ويطلب التأكيد، ويؤرشف docker-compose.yaml القديم في plane-app/archive/ ويحتفظ بنسخة plane.env.bak. أعد قراءة plane.env بعد ذلك لاكتشاف المتغيرات الجديدة. لا ترقِّ أبداً بـdocker compose down -v: الخيار -v يحذف وحدة التخزين uploads أي مرفقاتك. تصلح ملاحظات الإصدار ‎v1.4.3 المنشور في أكتوبر 2026 عدة ثغرات في التحكم بالوصول وتطلب من النسخ المستضافة ذاتياً أن تُرقّى.

تخزين الكائنات: صورة ‎MinIO المفقودة وإصلاح الإصدار 1.4.3

العَرَض. عند تثبيت جديد أو ترقية يفشل تنزيل الصور في خدمة التخزين برسالة pull access denied for minio/minio, repository does not exist or may require 'docker login'. يرد السجلّ بـ401 بدل 404 على العميل المجهول، فتبدو الرسالة كمشكلة اعتماد: لن يغيّر أي docker login شيئاً.

مؤكَّد من فريق ‎Plane. اختفت منظمة minio من ‎Docker ‎Hub. تلاحظ ذلك طلب الدمج #9829 المدموج في سبتمبر 2026 وتحوّل الصور إلى ‎quay.io. ثم تحدد ملاحظات الإصدار ‎v1.4.3 أن تخزين الكائنات المضمَّن يستخدم الصورة pgsty/silo مثبّتة على وسم إصدار بدل latest. وذكر مساهم في المستودع أيضاً في التذكرة #9834 المفتوحة في سبتمبر 2026 أن الإصدار حُدِّث بصورة أخرى.

مُبلَّغ عنه من المستخدمين فقط. نجح الحل المؤقت بـquay.io/minio/minio عند بعضهم، ثم أبلغ عدة مشاركين عن أخطاء 401 في ذلك السجلّ ابتداءً من 24 سبتمبر 2026. هذه التقارير سابقة لإصلاح الإصدار؛ لا تطبّقها على تثبيت حديث.

ما العمل. في تثبيت جديد استعمل سكربت أحدث إصدار ثم تحقق بـgrep -n 'image:' plane-app/docker-compose.yaml أنه لا يوجد سطر يذكر minio/minio. في تثبيت قائم ما زال يذكرها، خذ نسخة احتياطية ثم نفّذ الخيار 5 في السكربت. للإنتاج، يوصي طلب الدمج #9829 نفسه بتفضيل تخزين ‎S3 خارجي على ‎MinIO المضمَّن الذي فرعه المجتمعي مجمَّد في المصدر بحسب كاتبه: هذا توجّه من فريق ‎Plane لا ضمانة.

بعد ترقية الإصدار: ما تثبته التذكرة 8708 وما لا تثبته

في مارس 2026 فتح مستخدم التذكرة #8708 ليصف تثبيتاً صعباً. بعد الانتقال من الإصدار 2.3.3 إلى 2.3.7 تعطلت صلاحيات الملفات المرفوعة؛ وفُسِّر بشكل خاطئ حجم معرَّف بعلامات اقتباس مفردة في ملف من صورة ‎AIO؛ وقاد الزر الأول المعروض على المدير إلى /god-mode بدون الشرطة المائلة الأخيرة، وهي صفحة بقيت معلّقة.

ما أكده المشرفون يكفيه سطر واحد: الإصدار 2.3.7 ليس إصداراً رسمياً، وقد أُنتج لعميل بعينه، والإصدار 2.4.0 يحل المشكلة. لم يؤكدوا أياً من الشذوذات الثلاثة. ردّ الكاتب بأن عيب علامات الاقتباس مستمر في ‎Dockerfile، وأُغلقت التذكرة دون إصلاح مرتبط.

احتفظ بثلاث قواعد. ثبّت فقط إصدارات منشورة في صفحة ‎Releases بالمستودع، وأحدثها ‎v1.4.3؛ ولا تسحب إصداراً وسيطاً. خذ نسخة احتياطية قبل كل ترقية إصدار. بعد الترقية افتح مرفقاً قديماً وآخر حديثاً: إن فشل الفتح فافحص صلاحيات وحدة ‎uploads بـdocker volume inspect قبل تغيير أي شيء، مع إبقاء النسخة الاحتياطية في المتناول.

مثبّت ‎Compose أم صورة ‎AIO: ما يتطلبه كل منهما

مرّر الجدول أفقيًا

المعيارمثبّت ‎Compose (‎Community)صورة ‎AIO ‎Community
الخدمات المضمَّنة‎PostgreSQL و‎Valkey و‎RabbitMQ وتخزين الكائنات والبروكسي داخل حزمة ‎Composeالتطبيقات وواجهة ‎API والعمّال وبروكسي ‎Caddy في حاوية واحدة
الخدمات الخارجيةلا شيء إلزامي؛ موصى بها في الإنتاج‎PostgreSQL و‎Redis و‎RabbitMQ وتخزين ‎S3 عليك توفيرها
نقطة الدخول`./setup.sh` وملف `plane.env``docker run` مع `DOMAIN_NAME` و`DATABASE_URL` و`REDIS_URL` و`AMQP_URL` ومتغيرات ‎S3
الأسرارقيم تُفحص في `plane.env``SECRET_KEY` و`LIVE_SERVER_SECRET_KEY` إلزاميتان: تتوقف الحاوية إن كانتا فارغتين
الترقيةالخيار 5 في السكربت مع أرشفة ملف ‎Compose القديمسحب الصورة الجديدة وإعادة إنشاء الحاوية
الاستخدام الموصوفخادم واحد مع تخزين خارجي منصوح به في الإنتاجنشر بسيط واختبارات بحسب ‎README الخاص بها

استكشاف الأخطاء: حلقة إعادة التوجيه بين /‎profile/ و/?‎next_path=/‎profile/

العَرَض (التذكرة #6694 المفتوحة في مارس 2025 وما زالت مفتوحة في 24 أكتوبر 2026). خلف اسم نطاق، يعيد فتح https://your-domain.com/profile/ التوجيه إلى https://your-domain.com/?next_path=/profile/ ثم تدور الصفحة في حلقة. في سجلّ واجهة ‎API لدى الكاتب تردّ شبه كل الطلبات بـ200 عدا واحد يعود في كل دورة: GET /api/unsplash/?query= HTTP/1.1" 401 يتبعه Unauthorized: /api/unsplash/.

المثبَت. كان الكاتب يستخدم ‎Docker ‎Compose مع ‎Nginx خارجي أمام ‎Plane. سأل المشرفون عن نمط النشر ثم عن وجود بروكسي عكسي، وردّوا في مارس 2025 بأنهم يحققون. لم ينشروا أي سبب.

المُبلَّغ عنه. في يوليو 2026 وجد مشارك العَرَض نفسه: كان قد أدخل المفتاح السري لـ‎Unsplash بدل مفتاح الوصول في UNSPLASH_ACCESS_KEY. يطرح طلب دمج #10108 اقترحه مساهم خارجي، وما زال مفتوحاً في 31 أكتوبر 2026، التفسير التالي: تعيد واجهة ‎API استجابة 401 من ‎Unsplash كما هي، ويعامل تطبيق الويب أي 401 كجلسة منتهية، ومن هنا إعادة التوجيه؛ ويقترح الرد بـ502 بدلاً منها. هذه فرضية مساهم يسندها شاهد واحد، لا استنتاج من المشرفين، ولا تغطي بالضرورة كل حلقات إعادة التوجيه.

ما العمل، بالترتيب. أولاً ابحث عن السطر في السجلّ: docker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env logs api | grep unsplash. إن لم يظهر فحلقتك لها سبب آخر: أعد فحص WEB_URL وCORS_ALLOWED_ORIGINS. وإن ظهر مع 401 فأعد فحص UNSPLASH_ACCESS_KEY في plane.env وفي قسم ‎Images من لوحة /god-mode/: المطلوب مفتاح الوصول (‎Access ‎Key) لا المفتاح السري. وإن كنت لا تستخدم ‎Unsplash فأفرغ القيمة وأعد تشغيل الحزمة؛ بحسب طلب الدمج يعيد غياب المفتاح قائمة فارغة دون خطأ.

استكشاف الأخطاء: أخطاء متكررة أخرى وعلاجها

إعادة توجيه إلى http://localhost أو موارد لا تُحمَّل. لا يطابق WEB_URL وCORS_ALLOWED_ORIGINS العنوان العام. صحّحهما ثم أوقف الحزمة وأعد تشغيلها.

pull access denied for minio/minio. راجع قسم تخزين الكائنات: انتقل إلى إصدار حديث بالخيار 5 في السكربت.

502 ‎Bad ‎Gateway من ‎Nginx. لا يستمع البروكسي المضمَّن على المنفذ المستهدف. قارن LISTEN_HTTP_PORT في plane.env بهدف proxy_pass ثم جرّب curl -I http://127.0.0.1:8080 من الخادم. إن تأخر الرد فإن docker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env ps يبيّن أي حاوية تعيد التشغيل في حلقة.

رسائل الدعوة لا تُرسَل. أدخل خادم ‎SMTP في إعدادات البريد للنسخة من /god-mode/ ثم أرسل دعوة تجريبية. وتحقق أيضاً أن المستضيف لا يحجب منفذ ‎SMTP الصادر.

بطء مع مستخدمين كثر. راقب docker stats: إن كانت الذاكرة مشبعة فزد الذاكرة قبل أي ضبط آخر، ثم فكّر في إخراج ‎PostgreSQL وتخزين الكائنات من الخادم.

حافظ على سيطرتك على بنيتك التحتية دون صيانة طبقة النظام

تُظهر استضافة ‎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 تلقائيًا. النطاق مطلوب ومُدرَج في الوصفة — الوصول الأول في دقائق، والبيانات تحت سيطرتك.