لماذا تستضيف 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 في ثماني خطوات
تجهيز المضيف وتثبيت Docker
على خادم Debian أو Ubuntu محدَّث، ثبّت Docker بالسكربت الرسمي:
curl -fsSL https://get.docker.com | sh. فعّل الخدمة بـsystemctl enable --now dockerثم تحقق منdocker versionوdocker compose version. افتح المنفذين 80 و443 في الجدار الناري وقصر المنفذ 22 على عناوينك.تنزيل المثبّت الرسمي
أنشئ مجلداً مخصصاً بـ
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.تشغيل التثبيت
نفّذ
./setup.shبصفة root أو بمستخدم من مجموعة docker ثم اختر الخيار 1 (Install). ينزّل السكربتdocker-compose.yamlوplane.envإلىplane-app/ويولّد في الإصدارات الحديثة بيانات اعتماد لتخزين الكائنات المضمَّن. اخرج من القائمة بالخيار 8 قبل الإعداد: تطلب الوثائق إيقاف الحزمة قبل تعديلplane.env.ملء 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واحدة.تشغيل الحزمة وفحص الحاويات
أعد تشغيل
./setup.shواختر الخيار 2 (Start). ينزّل التشغيل الأول الصور، ثم تُعدّ الحاويةmigratorالقاعدة وتتوقف. افحص الحالة بـdocker compose -f plane-app/docker-compose.yaml --env-file plane-app/plane.env ps: يجب أن تكون بقية الحاويات قيد التشغيل. يعرض الخيار 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/. يجب أن يشير اسم النطاق إلى الخادم مسبقاً.إعداد 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: أغلقه من الخارج عبر جدار مزوّدك الناري.إنشاء مدير النسخة والفريق
افتح
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 للإنتاج.