SSD Nodes Learn 🎉 VPS من $5.50/شهر
الأدلة Matt Connorبقلم Matt Connor

تثبيت Flarum على VPS باستخدام PHP وMariaDB

ثبّت Flarum 1.8 على VPS باستخدام PHP وComposer وMariaDB، واعرض مجلد /public فقط عبر TLS، وتعرّف إلى خطأ البريد وفخ ترقية الإضافات قبل تعطل المنتدى.

ثبّت Flarum على VPS باستخدام PHP وMariaDB

عند تثبيت Flarum على VPS، تحصل على منتدى يعمل باستخدام PHP وMariaDB، من دون Docker أو Ruby أو مشغّل مهام منفصل. وهذا هو سبب اختياره. يعني تثبيت Discourse على VPS تشغيل حزمة Docker تضم Ruby وPostgreSQL وRedis وعاملاً للمهام الخلفية، كما أن 2 GB من الذاكرة هي الحد العملي الأدنى قبل إضافة النسخ الاحتياطية أو خدمة البريد. يبرّر Discourse هذه الموارد في مجتمع نشط ينشر آلاف المشاركات يومياً. أما في منتدى يضم بضع مئات من المستخدمين، فستدفع مقابل هذه المكوّنات كل شهر من دون أن تستخدمها. يندمج Flarum ضمن حزمة PHP قد تكون قيد التشغيل لديك بالفعل، لذلك يستطيع VPS بسعة 1 GB ويعمل عليه nginx وMariaDB استضافته إلى جانب الخدمات الموجودة. وإذا كان القرار لم يُحسم بعد، فتغطي المقارنة الأوسع لبرامج المنتديات ذاتية الاستضافة بقية الخيارات.

يثبّت هذا الدليل Flarum على الإصدار 1.x، وتحديداً السلسلة 1.8 حالياً. اعتباراً من August 2026، لا يزال Flarum 2.0 في مرحلة release candidate، لذلك يكون 1.8 هو الإصدار المناسب لتشغيل منتدى يعتمد عليه مستخدمون آخرون. وتهم الإضافات هنا أكثر من الإصدار الأساسي، كما أن معظم مطوّري الإضافات لم ينتقلوا إلى 2.0 بعد.

ما يحتاج إليه Flarum 1.8 على الخادم

تتمثل المتطلبات الموثقة لـFlarum في PHP 7.3 أو أحدث، وMySQL 5.6+ أو MariaDB 10.0.5+، إضافةً إلى nginx أو Apache مع mod_rewrite. يأتي Ubuntu 24.04 مزوداً بـPHP 8.3 وMariaDB 10.11، لذلك تفي حزم التوزيعة بالمتطلبين دون الحاجة إلى مستودع تابع لجهة خارجية. امتدادات PHP التي يتطلبها Flarum هي curl وdom وfileinfo وgd وjson وmbstring وopenssl وpdo_mysql وtokenizer وzip. تحتاج أيضاً إلى وصول إلى shell، لأن Composer ليس اختيارياً هنا: كل امتداد في Flarum هو حزمة Composer، ولا توجد طريقة لإضافة امتداد من دون تشغيل Composer.

Flarum تطبيق PHP عادي. إذا كنت تشغّل مكدس LAMP على Ubuntu 24.04 بالفعل، فمعظم ما يرد في القسمين التاليين مثبت، ويمكنك الانتقال سريعاً إلى قسم قاعدة البيانات.

ثبّت PHP والملحقات التي يتطلبها Flarum

sudo apt update
sudo apt install -y nginx mariadb-server composer
sudo apt install -y php8.3-fpm php8.3-cli php8.3-curl php8.3-gd php8.3-mbstring php8.3-mysql php8.3-xml php8.3-zip
php -m | grep -E 'curl|dom|gd|mbstring|pdo_mysql|zip'
composer --version

لا تتطابق أسماء الحزم واحداً بواحد مع قائمة Flarum. يوجد الملحق dom داخل php8.3-xml، بينما الملحقات fileinfo وjson وopenssl وtokenizer مضمّنة في PHP 8.3 على Ubuntu، لذلك لا توجد حزمة لتثبيتها لهذه الملحقات. يجب أن يطبع grep ستة أسطر، ويجب أن يشير composer --version إلى إصدار 2.x. يستحق أي ملحق مفقود الإصلاح الآن، لأن Composer يرفض تثبيت Flarum بدونه، ويذكر الخطأ اسم الملحق المطلوب:

  Problem 1
    - flarum/core[v1.8.0, ..., v1.8.17] require ext-gd * -> it is missing from your system.
      Install or enable PHP's gd extension.

تحقق من أن إصدار PHP المستخدم في سطر الأوامر وإصدار مدير العمليات FastCGI ‏(PHP-FPM) متطابقان. يعمل Composer باستخدام الملف التنفيذي المستخدم في سطر الأوامر، بينما يعمل المنتدى باستخدام FPM، لذلك يجب أن يتطابق php -v مع sudo php-fpm8.3 -v. قد يختلف الإصداران على جهاز جُمعت فيه عدة إصدارات من PHP من مستودع تابع لجهة خارجية. عندها يصبح الملحق الذي ثبّتَّه لإصدار واحد غير مرئي للإصدار الآخر.

إنشاء قاعدة البيانات ومستخدم قاعدة بيانات مخصص

sudo mariadb-secure-installation
sudo mariadb
CREATE DATABASE flarum CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
CREATE USER 'flarum'@'localhost' IDENTIFIED BY 'use-a-long-random-password';
GRANT ALL PRIVILEGES ON flarum.* TO 'flarum'@'localhost';
FLUSH PRIVILEGES;
EXIT;

امنح Flarum مستخدم قاعدة بيانات خاصاً به بدلاً من root. يقتصر هذا المنح على flarum.* ولا يشمل أي شيء آخر، لذلك لا يمكن لخلل SQL injection في إضافة لم تكتبها قراءة قواعد بياناتك الأخرى. ومجموعة الأحرف مهمة أيضاً: يخزّن utf8mb4 الرموز التعبيرية والنصوص غير اللاتينية بشكل صحيح، بينما يستخدم MySQL القديم utf8 ترميزاً من ثلاثة بايتات، ما يؤدي إلى اقتطاع المنشور عند أول محرف من أربعة بايتات. تأكد من أن المستخدم يعمل قبل المتابعة.

mariadb -u flarum -p flarum -e 'SELECT DATABASE();'

من المفترض أن يطبع ذلك flarum. ويعني ERROR 1045 (28000): Access denied for user 'flarum'@'localhost' أن كلمة المرور غير مطابقة، أو أن المستخدم أُنشئ لمضيف مختلف عن localhost.

ثبّت Flarum على VPS باستخدام Composer مع تثبيت الإصدار عند 1.8

أنشئ أولاً مستخدم نظام يملك الشيفرة. يؤدي تشغيل Composer بوصفك root إلى إنشاء ملفات يملكها root في vendor/ وstorage/، لذلك لا يستطيع PHP كتابة ذاكرة التخزين المؤقت الخاصة به لاحقاً، ويجيب المنتدى عن كل طلب بخطأ 500.

sudo useradd --system --home-dir /srv/flarum --shell /bin/bash flarum
sudo install -d -o flarum -g flarum -m 755 /srv/flarum
sudo -iu flarum

يضعك الأمر الأخير في shell بصلاحيات المستخدم flarum، داخل /srv/flarum. تُنفَّذ كل الأوامر من هنا حتى نهاية الدليل بهذا المستخدم، ما لم يبدأ الأمر بـ sudo.

composer create-project flarum/flarum:^1.8.0 .

القيد ^1.8.0 هو تثبيت الإصدار. فهو يقبل إصدارات التصحيح 1.8.x ويرفض 2.0، وهذا ما تريده ما دام 2.0 إصداراً مرشحاً. ينزّل Composer الهيكل الأساسي، ويحل flarum/core وتبعياته، ويترك لديك public/ وstorage/ وvendor/ وcomposer.json، إضافة إلى script لسطر الأوامر باسم flarum.

في VPS صغير، تحدث الأعطال غالباً في هذه الخطوة، وقد يبدو سببان مختلفان متشابهين. يمثّل PHP Fatal error: Allowed memory size of 134217728 bytes exhausted حد memory_limit الخاص بـPHP، وتؤدي إضافة COMPOSER_MEMORY_LIMIT=-1 قبل الأمر إلى إزالة هذا الحد لتشغيل واحد. أما ظهور Killed مجرداً في سطر مستقل، من دون خطأ من PHP، فيعني أن kernel فعّل قاتل نفاد الذاكرة، ويمكنك تأكيد ذلك باستخدام dmesg | tail. في هذه الحالة نفدت ذاكرة RAM فعلياً من الجهاز، لذا أضف swap. إن رفع حد PHP سيزيد المشكلة سوءاً، لأن PHP سيطلب ذاكرة أكبر قبل أن يتدخل kernel.

لماذا يجب أن يكون /public هو الجزء الوحيد المعرّض للويب

يحتوي جذر المشروع على config.php الذي يتضمن كلمة مرور قاعدة البيانات بنص واضح، وعلى vendor/ الذي يتضمن جميع التبعيات، وعلى storage/ الذي يتضمن السجلات والجلسات المخزنة مؤقتاً. لا ينبغي أن يكون أيّ من ذلك متاحاً على الإنترنت العام. يضع Flarum كل ما يمكن الوصول إليه عبر الويب في دليل فرعي واحد، هو public/، ويحتوي هذا الدليل على index.php ومجلد assets/ وقليل غير ذلك. وجّه جذر خادم الويب إلى /srv/flarum/public، وبذلك يتعذر الوصول إلى بقية شجرة الملفات عبر HTTP بحكم البنية، لا بفضل قاعدة عليك تذكّرها.

إذا وجّهت الجذر إلى /srv/flarum بدلاً من ذلك، فستكون العواقب فعلية. يعيد طلب /config.php نتيجة غير مفيدة، لأن PHP ينفّذ الملف ولا يعيد إلا مصفوفة. لكن /storage/logs/flarum.log يكشف لشخص غريب آثار مكدس التنفيذ وأخطاء قاعدة البيانات، بينما /composer.lock يريه الإصدار الدقيق لكل حزمة تستخدمها، ما يزوّده بقائمة من الثغرات المعروفة التي يمكنه محاولة استغلالها.

امنح PHP-FPM تجمعاً خاصاً به

يحتاج Flarum إلى صلاحية الكتابة في ثلاثة مسارات: جذر المشروع، حتى يتمكن برنامج التثبيت من إنشاء config.php؛ وstorage/، للسجلات وذاكرة التخزين المؤقت؛ وassets/، للصور الرمزية والشعارات التي يرفعها المستخدمون. تعود ملكية الملفات إلى المستخدم flarum، لذلك فالحل الصحيح هو إنشاء تجمع PHP-FPM يعمل بصفة flarum. يواصل nginx العمل بصفة www-data ولا يقرأ إلا الملفات.

اكتب /etc/php/8.3/fpm/pool.d/flarum.conf:

[flarum]
user = flarum
group = flarum
listen = /run/php/php8.3-fpm-flarum.sock
listen.owner = www-data
listen.group = www-data
listen.mode = 0660
pm = ondemand
pm.max_children = 10
pm.process_idle_timeout = 30s
php_admin_value[memory_limit] = 256M
php_admin_value[upload_max_filesize] = 16M
php_admin_value[post_max_size] = 17M
sudo systemctl restart php8.3-fpm
ls -l /run/php/php8.3-fpm-flarum.sock

يجب أن يظهر المقبس باسم srw-rw---- 1 www-data www-data. تعمل العملية الرئيسية بصفة root وتنشئ المقبس، ولذلك يمكنها منح ملكيته إلى www-data، بينما تعمل العمليات العاملة بصفة flarum. إذا لم يكن المقبس موجوداً، يطبع sudo journalctl -u php8.3-fpm -n 30 السطر FPM rejected. يبدأ pm = ondemand عمليات العمل عند وصول طلب فقط، ولذلك يكاد المنتدى الهادئ لا يستهلك ذاكرة بين زيارات المستخدمين.

كتلة خادم nginx

يضم Flarum مقتطفاً خاصاً بـnginx في جذر المشروع باسم .nginx.conf. يحتوي هذا المقتطف على قاعدة إعادة الكتابة، ورؤوس التخزين المؤقت، وإعدادات الضغط. ضمّنه بدلاً من نسخه، حتى يصل أي تغيير يطرأ على المقتطف في ترقية Flarum إلى خادمك من دون تعديل يدوي.

server {
    listen 80;
    listen [::]:80;
    server_name forum.example.com;

    root /srv/flarum/public;
    index index.php;
    client_max_body_size 16M;

    include /srv/flarum/.nginx.conf;

    location ~ \.php$ {
        include snippets/fastcgi-php.conf;
        fastcgi_pass unix:/run/php/php8.3-fpm-flarum.sock;
    }
}

احفظ ذلك باسم /etc/nginx/sites-available/flarum، ثم فعّله.

sudo ln -s /etc/nginx/sites-available/flarum /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx

يجب أن يستجيب nginx -t إلى syntax is ok وtest is successful. سطر include هو السطر الذي يغفله المستخدمون غالباً. يؤدي حذفه إلى عرض محدد جداً: تُحمّل الصفحة الرئيسية بشكل سليم، بينما يعيد كل رابط مناقشة الخطأ 404 من nginx. يوجّه Flarum عنوان URL مثل /d/1-hello-world داخل PHP. هذا المسار ليس ملفاً موجوداً على القرص، لذلك يبحث nginx، من دون قاعدة try_files $uri $uri/ /index.php?$query_string الموجودة في المقتطف، عن دليل باسم d. لا يجد هذا الدليل، فيعيد الخطأ 404 قبل أن يطلب معالجة PHP للمسار. يحصل Apache على التوجيه نفسه من ملف .htaccess الموجود مسبقاً في public/، ولا يصبح هذا الملف فعالاً إلا إذا ضبطت كتلة <Directory> المطابقة القيمة AllowOverride All.

أضف TLS قبل تشغيل أداة التثبيت

أنشئ الشهادة الآن، وليس بعد ذلك. يكتب Flarum عنوان URL الأساسي الخاص به في config.php أثناء التثبيت، ويأخذ هذا العنوان من العنوان الظاهر في متصفحك. إذا ثبّتَّه عبر http://، فستبدأ عناوين URL لكل الأصول التي ينشئها Flarum لاحقاً بـhttp://. لذلك، بعد إضافة TLS (أمان طبقة النقل)، يحظر المتصفح هذه الطلبات باعتبارها محتوى مختلطاً، ويُحمّل المنتدى كنص غير منسّق من دون JavaScript. نفّذ أولاً إعداد certbot للحصول على Let's Encrypt على nginx، وتأكد من أن https://forum.example.com يعرض صفحة، ثم عُد إلى هنا.

إذا ثبّتَّه بالفعل عبر HTTP العادي، فالإصلاح يتطلب سطراً واحداً. حرّر /srv/flarum/config.php بحيث تكون قيمة المفتاح url هي 'url' => 'https://forum.example.com',، ثم شغّل php flarum cache:clear باستخدام المستخدم flarum.

شغّل برنامج التثبيت وقيّد صلاحيات config.php

افتح https://forum.example.com في متصفح. يطلب برنامج التثبيت على الويب الخاص بـFlarum اسم قاعدة البيانات، واسم مستخدم قاعدة البيانات وكلمة المرور اللذين أنشأتهما، وعنوان المنتدى، وحساب المسؤول لديك. يكتب البرنامج config.php وينشئ الجداول. بعد اكتمال التثبيت، شدّد صلاحيات الملف الذي يحتوي الآن على كلمة مرور قاعدة البيانات.

sudo chmod 640 /srv/flarum/config.php

يبقى الملف قابلاً للقراءة والكتابة من قِبل flarum، وهو المستخدم الذي يعمل به FPM، ولا يمكن لأي حساب آخر على الخادم قراءته. بعد ذلك، تحقّق من التثبيت من shell.

php flarum info

يعرض ذلك إصدار النواة، وإصدار PHP، والإضافات المفعّلة، وبرنامج تشغيل البريد، والمسارات المستخدمة. هذا هو أول أمر تشغّله عند حدوث مشكلة، وأول شيء سيطلبه منك أي شخص يساعدك.

لماذا تفشل رسائل التسجيل وإعادة تعيين كلمة المرور بصمت

يحدد هذا القسم ما إذا كان منتداك سيستمر خلال أسبوعه الأول. أول رسالتين يرسلهما المنتدى الجديد هما رسالة تأكيد التسجيل ورسالة إعادة تعيين كلمة المرور. وتُرسل الرسالتان في اللحظة نفسها التي يقرر فيها الزائر ما إذا كان مجتمعك حقيقياً. تفشل كلتاهما بصمت. ولا يستطيع الشخص الذي لم تصله الرسالة إبلاغك، كما لا يظهر أي تنبيه أحمر في لوحة إدارة المنتدى.

يوفّر Flarum أربعة برامج تشغيل للبريد، ويمكن ضبطها من Administration ثم Email: smtp وmail وmailgun وlog. اختر smtp واربطه بخدمة بريد ستسلّم الرسائل فعلياً. يسلّم برنامج التشغيل mail الرسالة إلى ملف تنفيذي محلي باسم sendmail، وهذا الملف غير موجود في Ubuntu VPS جديد، لذلك لا تصل الرسالة إلى أي مكان ولا يظهر أي خطأ. يكتب برنامج التشغيل log محتوى الرسالة في storage/logs/ ولا يرسل شيئاً، لأنه مخصص للتطوير.

احفظ الإعدادات، ثم اضغط زر إرسال رسالة اختبار في الصفحة نفسها. هذا الزر هو آلية التحقق الوحيدة المتاحة لك، فاستخدمه قبل دعوة أي شخص. إذا لم تصل الرسالة، اقرأ السجل.

tail -n 50 /srv/flarum/storage/logs/flarum.log

تظهر هناك حالات رفض الاتصال، ورفض تسجيل الدخول، وفشل تفاوض TLS، مع المضيف والمنفذ اللذين جرت محاولة استخدامهما. يعني السطر الذي يقرأ Connection could not be established with host smtp.example.com أن المنفذ محظور أو غير صحيح. والسبب المعتاد هو أن مزود الخدمة يحظر الاتصالات الصادرة عبر المنفذ 25 افتراضياً. يعمل المنفذ 587 مع ضبط حقل التشفير على tls مع معظم خدمات البريد تقريباً.

عند تعطل البريد، يرى الزائر الذي يسجل في Flarum شريط فشل عاماً، Oops! Something went wrong. Please reload the page and try again.، لأن الطلب يفشل أثناء إرسال رسالة التأكيد. وفي كلتا الحالتين، لا يستطيع ذلك الشخص الدخول، ولن يكتب لك لإبلاغك بالمشكلة.

وصول الرسالة إلى خادم البريد وقبولها مشكلة منفصلة عن إرسالها. إذا أرسلت الرسالة من عنوان VPS لا توجد له سجلات SPF أو DKIM منشورة لنطاقك، فقد تصل إلى مجلد البريد العشوائي أو تُسقط من دون أي رسالة ارتداد. لذلك يظهر السجل أن الإرسال نجح، بينما لا يرى القارئ أي شيء. يوضح إرسال البريد بشكل موثوق من التطبيقات ذاتية الاستضافة سجلات DNS التي ينبغي نشرها وخدمات الترحيل المناسبة للاستخدام.

الإضافات حزم Composer، لذلك تكون ترقيتها عبر أمر

الإضافة في Flarum هي حزمة Composer. لا يوجد زر رفع، ولا ملف zip تضعه في مجلد. هذا قرار تصميم مقصود: تُحل الإصدارات بما يتوافق مع بعضها، وتُسجَّل المجموعة الدقيقة في composer.lock، كما تُثبَّت مكتبة PHP التي تعتمد عليها الإضافة تثبيتاً صحيحاً. لكن إضافة حزمة تتطلب تنفيذ ثلاثة أوامر بصفة المستخدم flarum.

composer require 'fof/upload:*'
php flarum migrate
php flarum cache:clear

بعد ذلك، فعّلها من Administration ثم Extensions. لكل أمر وظيفة محددة. يضع composer require الشفرة على القرص. يشغّل php flarum migrate عمليات ترحيل قاعدة البيانات التي تتضمنها الإضافة، وهي الطريقة التي تنشئ بها جداولها الخاصة. يعيد php flarum cache:clear بناء حزم JavaScript وCSS المجمّعة التي يحمّلها المتصفح. يؤدي تخطي الأمر الأخير إلى المشكلة المعروفة: تظهر الإضافة في القائمة، ويكون مفتاح التفعيل قيد التشغيل، ولا يتغير شيء في المتصفح مهما أعدت تحميل الصفحة.

تتم إزالة الإضافة بالترتيب العكسي. عطّلها أولاً من لوحة الإدارة، ثم أزل الحزمة. يترك Flarum جداول الإضافة كما هي عمداً، حتى لا تفقد البيانات عند إعادة تفعيلها لاحقاً. إذا أردت حذف الجداول أيضاً، فأعد عمليات ترحيلها إلى الحالة السابقة قبل إزالة الشفرة.

php flarum migrate:reset --extension fof-upload
composer remove fof/upload
php flarum cache:clear

معرّف الإضافة في ذلك الأمر هو اسم الحزمة بعد استبدال الشرطة المائلة بشرطة وصل. إذا كنت تفضّل النقر بدلاً من الكتابة، يضيف composer require 'flarum/extension-manager:*' صفحة إدارة رسمية تلتف حول Composer. وينفّذ العمليات نفسها بصفة مستخدم الويب، ويحتاج إلى الذاكرة نفسها وإلى أذونات الكتابة نفسها، ويفشل بالطرق نفسها. لذلك يظل سطر الأوامر المسار الموثوق عند حدوث مشكلة.

لماذا يرفض Composer ترقية Flarum

تتطلب ترقية Flarum وجميع الإضافات تنفيذ أمر واحد في Composer، يتبعه أمران في Flarum. أنشئ نسخة احتياطية من قاعدة البيانات أولاً.

composer update --prefer-dist --no-plugins --no-dev -a --with-all-dependencies
php flarum migrate
php flarum cache:clear

اقرأ المخرجات بدلاً من افتراض نجاح العملية، لأن الحالة المهمة هي عندما يرفض Composer تنفيذ أي إجراء:

Your requirements could not be resolved to an installable set of packages.

تعني هذه الرسالة أن إحدى الإضافات المثبتة تعلن عن قيد flarum/core يستبعد الإصدار الذي تريد الترقية إليه. لن يخالف Composer هذا القيد، ولذلك يُبقي التثبيت بالكامل على الإصدار القديم بدلاً من إنشاء مجموعة قالت الجهة المطوِّرة للإضافة إنها لن تعمل. ابحث عن الحزمة المسؤولة.

composer why-not flarum/core 1.8.17

تسرد المخرجات كل حزمة تمنع استخدام ذلك الإصدار، والقيد الذي تعلنه كل حزمة. بعد ذلك، يمكنك انتظار نشر الجهة المطوِّرة لإصدار متوافق، أو إزالة الإضافة والاستغناء عنها. هذه هي تبعات نموذج Composer، ومن المفيد فهمها قبل تثبيت خمس عشرة إضافة على منتدى يعتمد عليه أشخاص آخرون. فضّل الإضافات التي أصدرت إصداراً حديثاً، وأبقِ القائمة قصيرة بما يكفي لقراءتها.

ما الذي يجب نسخه احتياطياً

انسخ قاعدة البيانات ودليل المشروع احتياطياً. يمكن إعادة إنشاء كل ما عدا ذلك.

mariadb-dump -u flarum -p --single-transaction flarum > flarum-$(date +%F).sql
sudo tar czf flarum-files.tgz -C /srv flarum

في الأنظمة الأقدم، يُسمّى mariadb-dump باسم mysqldump؛ وفي Ubuntu 24.04 يعمل الاسمان. تحتوي قاعدة البيانات على كل منشور وكل مستخدم وكل إعداد. يحتوي دليل المشروع على config.php وcomposer.json (وهو السجل الفعلي للإضافات التي تشغّلها) وassets/، بما في ذلك الصور الرمزية والشعارات التي رُفعت. يمكنك تخطي vendor/، لأن composer install يعيد إنشاءه من composer.lock، كما أن storage/ يُنشئ نفسه مجدداً. انسخ الملفين إلى خارج الخادم، لأن النسخة الاحتياطية الموجودة على الجهاز الذي تحميه لا تُعد نسخة احتياطية. تتطلب الاستعادة تثبيت Flarum جديداً بالإصدار نفسه، ثم composer install، وإعادة الملفات المحفوظة إلى مواضعها، وتحميل ملف SQL.

FAQ

هل يمكن لـFlarum العمل على VPS بسعة 1 GB؟

نعم، إذا كان المجتمع صغيراً. في التشغيل العادي، يستجيب PHP-FPM للطلبات بالتعاون مع MariaDB، ومع pm = ondemand لا تكون عمليات PHP موجودة إلا أثناء تصفح المستخدم. تحدث الذروة أثناء تثبيت البرنامج نفسه: يحل composer create-project شجرة الاعتماديات كاملة في الذاكرة، وهذه الخطوة هي الأكثر عرضة للإيقاف بواسطة قاتل نفاد الذاكرة. أنشئ ملف swap قبل التثبيت، أو شغّل Composer مرة واحدة على جهاز أكبر ثم انسخ الشجرة إلى الخادم.

لماذا تُرجع روابط المناقشات الخطأ 404 بينما تعمل الصفحة الرئيسية؟

يفتقد server block في nginx إلى include /srv/flarum/.nginx.conf;. يعالج Flarum عناوين URL مثل /d/1-hello-world داخل PHP، وهذا المسار ليس ملفاً على القرص. من دون قاعدة try_files $uri $uri/ /index.php?$query_string في المقطع، يبحث nginx عن دليل باسم d، ويفشل، ثم يُرجع الخطأ 404 بنفسه من دون استدعاء PHP. في Apache، تأتي عملية التوجيه نفسها من public/.htaccess، ولا تُستخدم إلا إذا عيّن block <Directory> القيمة AllowOverride All.

لماذا فقد منتداي كل التنسيق بعد تفعيل HTTPS؟

يخزّن Flarum عنوان URL الأساسي في config.php، ويأخذه من العنوان الذي استخدمته عند تشغيل برنامج التثبيت. إذا ثبّت البرنامج عبر HTTP العادي، فسيواصل Flarum إنشاء عناوين URL للموارد من نوع http://، ويحظرها المتصفح باعتبارها محتوى مختلطاً في صفحة HTTPS، فتظهر نصوص بلا تنسيق. عدّل المفتاح url في /srv/flarum/config.php إلى العنوان https://، ثم شغّل php flarum cache:clear بصفة المستخدم الذي يملك الملفات.

لماذا لا يتلقى أي شخص رسالة تأكيد التسجيل؟

تحقق من مشغل البريد أولاً. يحتاج مشغل mail إلى ملف sendmail محلي قابل للتنفيذ، وهو غير متوفر في Ubuntu VPS جديد، بينما يكتب مشغل log إلى storage/logs/ ولا يرسل شيئاً. بدّل إلى smtp، واستخدم المنفذ 587 مع ضبط التشفير على tls لأن معظم مزودي الخدمة يحظرون المنفذ الصادر 25، ثم اضغط إرسال بريد اختباري. إذا أظهر السجل نجاح الإرسال ولم تصل الرسالة، فالمشكلة تتعلق بقابلية التسليم لا بالإعدادات؛ لذلك انشر سجلات SPF وDKIM لنطاق الإرسال.

هل ينبغي أن أثبّت Flarum 1.8 أم 2.0؟

ثبّت 1.8. اعتباراً من August 2026، لا يزال Flarum 2.0 إصداراً مرشحاً، والأهم أن العديد من الإضافات لا تزال تعلن قيد flarum/core يتوقف عند 1.x. يعني تثبيت 2.0 اليوم تشغيل منتدى لا يمكن تحديث إضافاته معاً، وهو الفشل المحدد الذي صُمم composer why-not لتشخيصه. ثبّت الإصدار باستخدام flarum/flarum:^1.8.0، ثم أعد التقييم بعد أن تنشر الإضافات التي تعتمد عليها إصدارات 2.0.