SSD Nodes Learn 🎉 VPS از $5.50/ماه
راهنماها Matt Connorتوسط Matt Connor · به‌روزرسانی شده 2026-08-13

بهترین نرم‌افزار انجمن‌ساز برای میزبانی روی VPS

مقایسه فنی Discourse، Flarum، NodeBB و phpBB برای میزبانی شخصی. بررسی دقیق میزان رم مورد نیاز، مدیریت پایگاه داده، مقابله با اسپم و مسیر مهاجرت برای هر کدام در سال 2025.

کدام نرم‌افزار انجمن‌ساز (forum) را برای میزبانی شخصی انتخاب کنیم؟

برای میزبانی شخصی یک انجمن روی یک VPS (سرور مجازی)، در حال حاضر چهار گزینهٔ واقعی وجود دارد: Discourse، Flarum، NodeBB و phpBB. اگر می‌توانید 4 GB رم اختصاص دهید و حداقل دو نفر برای مدیریت انجمن دارید، Discourse گزینهٔ پیش‌فرض مناسبی است. با 1 GB رم و یک مدیر، از Flarum یا phpBB استفاده کنید. داشتن یک انجمن کوچک که بتوانید آن را تمیز و مرتب نگه دارید، بسیار بهتر از یک انجمن پیشرفته است که از کنترل شما خارج شده باشد.

نصب نرم‌افزار بخش آسان کار است. راه‌اندازی هر یک از این گزینه‌ها در یک بعدازظهر انجام می‌شود. آنچه تعیین می‌کند آیا انجمن شما یک سال بعد همچنان فعال خواهد بود یا خیر، صف گزارش‌ها (flag queue) و مسیر ارسال ایمیل است؛ بنابراین پیش از مطالعهٔ لیست قابلیت‌ها، بخش‌های مربوط به مدیریت و ایمیل را بخوانید.

یک انجمن برای اجرا واقعاً به چه چیزی نیاز دارد؟

یک انجمن از چهار بخش متحرک تشکیل شده است، نه یک بخش: یک پردازش برنامه، یک پایگاه داده که باید طول عمری بیشتر از برنامه داشته باشد، یک دایرکتوری برای آواتارها و فایل‌های پیوست بارگذاری‌شده، و یک مسیر کاری برای ارسال ایمیل. برنامه قابل جایگزینی است. اما پایگاه داده چنین نیست، زیرا هر پست، هر حساب کاربری و هر پیام خصوصی درون آن قرار دارد. به همین دلیل است که پایگاه داده‌ای که هر پروژه انتخاب می‌کند، مهم‌ترین خط در بخش‌های زیر است. این انتخاب تعیین می‌کند که خروجی داده‌های شما در روزی که قصد مهاجرت دارید، چگونه خواهد بود.

هزینه دوم، هزینه انسانی است. ثبت‌نام عمومی به همراه ارسال پست عمومی به معنای عضویت ربات‌هاست که معمولاً در همان هفته اولِ ظاهر شدن دامنه در خزش موتورهای جستجو رخ می‌دهد. هر چهار بخش را می‌توان محدود کرد. تنها یکی از آن‌ها گردش کار را به‌صورت پیش‌فرض در هسته خود ارائه می‌دهد.

Discourse: پیش‌فرض‌ها و هزینه واقعی آن

Discourse بر پایه Ruby on Rails است و از PostgreSQL برای داده‌ها، Redis برای کش و صف‌های پردازش، و Sidekiq برای اجرای وظایف پس‌زمینه استفاده می‌کند. روش نصب پشتیبانی‌شده، تمام این اجزا را درون یک کانتینر Docker قرار می‌دهد که از یک فایل پیکربندی در /var/discourse/containers/app.yml ساخته شده است. شما نیازی به نصب دستی این اجزا ندارید.

wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bash

این اسکریپت در صورت نبود git و Docker، آن‌ها را نصب می‌کند، discourse_docker را در /var/discourse کلون می‌کند و سپس کنترل را به ویزارد تعاملی discourse-setup می‌سپارد. ویزارد از شما نام میزبان (hostname)، یک ایمیل برای مدیر و جزئیات SMTP (پروتکل انتقال نامه ساده) را می‌پرسد، فایل app.yml را می‌نویسد و کانتینر را می‌سازد. پورت‌های 80 و 443 باید آزاد باشند، زیرا کانتینر از nginx داخلی خود استفاده می‌کند و برای شما یک گواهی Let’s Encrypt درخواست می‌کند.

حداقل سخت‌افزار اعلام‌شده، 1 گیگابایت رم به همراه swap و 10 گیگابایت فضای دیسک است. بخش swap را جدی بگیرید. اسکریپت نصب در صورتی که ویزارد تشخیص دهد سرور به آن نیاز دارد، یک فایل swap با حجم 2 گیگابایت توسط fallocate -l 2G /swapfile ایجاد می‌کند و این swap صرفاً تزئینی نیست. اوج مصرف حافظه مربوط به زمان اجرای سایت نیست، بلکه مربوط به ./launcher rebuild app است که در هر بار ارتقا، دارایی‌های JavaScript و CSS را درون کانتینر دوباره کامپایل می‌کند. روی یک سرور 1 گیگابایتی بدون swap، این مرحله در میانه راه متوقف (kill) می‌شود، بازسازی بدون نمایش خطای مفیدی پایان می‌یابد و dmesg | tail یک خطای Out of memory: Killed process را نشان می‌دهد. برای اجرای بی‌دردسر، 2 گیگابایت رم و برای زمانی که انجمن شلوغ شد، 4 گیگابایت رم در نظر بگیرید.

ارتقاها از طریق /admin/upgrade در مرورگر یا از طریق shell انجام می‌شوند:

cd /var/discourse
./launcher rebuild app

دستور rebuild کانتینر در حال اجرا را از بین می‌برد، یک کانتینر جدید از app.yml بوت‌ستراپ می‌کند و آن را بالا می‌آورد؛ بنابراین سایت برای چند دقیقه‌ای که این فرآیند طول می‌کشد، از دسترس خارج می‌شود. در یک کانتینر تکی راهی برای دور زدن این موضوع وجود ندارد. تقسیم سرویس به دو کانتینر با استفاده از نمونه‌های data.yml و web_only.yml باعث می‌شود PostgreSQL هنگام بازسازی کانتینر وب بالا بماند؛ این کار زمانی که کاربرانی دارید که متوجه قطعی می‌شوند، ارزشمند است.

مدیریت محتوا (Moderation) بخشی است که Discourse رم مصرفی خود را در آن توجیه می‌کند. حساب‌های کاربری جدید با سطح اعتماد 0 شروع می‌شوند که محدودیت‌های شدیدی برای تعداد لینک‌های ارسالی و سرعت ارسال دارند و با خواندن و مشارکت بیشتر، ارتقا می‌یابند. گزارش‌های تخلف (Flags) در یک صف بررسی قرار می‌گیرند که ثبت می‌کند چه کسی به چه موردی رسیدگی کرده است. ادغام با Akismet و StopForumSpam جزو افزونه‌های رسمی هستند. برای سایر موارد، باید این قابلیت‌ها را از طریق افزودنی‌ها (add-ons) پیاده‌سازی کنید.

مهاجرت به Discourse قوی‌ترین ویژگی آن است. دایرکتوری script/import_scripts/ در درخت منبع، بیش از شصت ابزار واردکننده (importer) دارد، از جمله phpbb3.rb، vbulletin.rb، xenforo.rb، vanilla.rb، mybb.rb، flarum_import.rb، یک دایرکتوری nodebb و یک واردکننده mbox برای آرشیو لیست‌های ایمیل. این‌ها اسکریپت‌های Ruby هستند که شما درون کانتینر و روی نسخه‌ای از دیتابیس قدیمی اجرا می‌کنید. این فرآیند کند است اما به‌خوبی نگهداری می‌شود.

مهاجرت از Discourse نقطه ضعف آن است. دستور ./launcher enter app و به دنبال آن discourse backup، یک فایل .tar.gz ایجاد می‌کند که شامل یک dump از PostgreSQL و دایرکتوری آپلودها است. فقط یک Discourse دیگر می‌تواند آن را بازیابی کند. هیچ ابزار دیگری آن را نمی‌خواند، بنابراین خروج از Discourse به معنای آن است که باید خودتان با استفاده از SQL، داده‌ها را از آن dump استخراج کنید. پیش از وارد کردن 50,000 پست، مطمئن شوید که با این محدودیت مشکلی ندارید.

Flarum: انجمن PHP سبک

Flarum یک برنامه معمولی PHP است: php-fpm پشت Nginx یا Apache، یک دیتابیس MySQL یا MariaDB و فایل‌هایی روی دیسک. نیازمندی‌های مستندشده شامل PHP 7.3 یا جدیدتر به همراه اکستنشن‌های curl، dom، fileinfo، gd، json، mbstring، openssl، pdo_mysql، tokenizer و zip، به علاوه MySQL 5.6+ (یا 8.0.23+) یا MariaDB 10.0.5+ است. سیستم‌عامل Ubuntu 24.04 دارای PHP 8.3 است که بالاتر از این حداقل است.

به pdo_mysql در آن لیست دقت کنید. Flarum از PostgreSQL پشتیبانی نمی‌کند و از SQLite نیز پشتیبانی نمی‌کند. اگر به دنبال دیتابیس تک‌فایلی هستید، phpBB در ادامه آمده است.

sudo apt update
sudo apt install -y nginx mariadb-server composer php-fpm php-mysql php-curl php-gd php-mbstring php-xml php-zip
sudo install -d -m 755 /srv/flarum
cd /srv/flarum
sudo COMPOSER_ALLOW_SUPERUSER=1 composer create-project flarum/flarum:^1.8.0 .
sudo chown -R www-data:www-data /srv/flarum

وب‌سرور را به /srv/flarum/public اشاره دهید، نه به /srv/flarum. کد برنامه، فایل پیکربندی و رمز عبور دیتابیس همگی یک دایرکتوری بالاتر از public قرار دارند، بنابراین اگر document root را یک سطح بالاتر تنظیم کنید، اعتبارنامه‌های شما برای هر کسی که درخواست کند، در دسترس قرار می‌گیرد. در Apache همچنین به mod_rewrite و AllowOverride All نیاز دارید تا .htaccess ارائه شده اعمال شود. در nginx باید .nginx.conf ارائه شده را داخل بلاک server خود قرار دهید. سپس به دامنه بروید؛ نصب‌کننده خودِ Flarum اطلاعات دیتابیس و حساب کاربری مدیر را از شما می‌پرسد.

نسخه‌ها، تا اوت 2026: نسخه 1.8.17 نسخه پایدار فعلی است که در ژوئن 2026 منتشر شده و نسخه 2.0 در مرحله release candidate 5 قرار دارد. یک انجمن جدید را با نسخه release candidate راه‌اندازی نکنید. وقتی نسخه 2.0 برسد، اکستنشن‌ها پیش از بارگذاری نیاز به به‌روزرسانی دارند و این همان ارتقایی است که یک آخر هفته شما را می‌گیرد.

ردپای منابع آن کوچک است. چند worker برای php-fpm، مقدار چند صد مگابایت رم برای MariaDB و فایل‌های استاتیک. یک انجمن نوپا روی 1 GB رم به خوبی اجرا می‌شود.

مدیریت محتوا نقطه ضعف صادقانه آن است. هسته اصلی به شما قابلیت گزارش‌دهی و مجوزهای گروهی می‌دهد. صف‌های تأیید و مسدودسازی اسپم از طریق اکستنشن‌ها، عمدتاً مجموعه FriendsOfFlarum، تأمین می‌شوند که با composer require نصب شده و در پنل مدیریت فعال می‌شوند. این روش امروز کار می‌کند. شما به یک اکوسیستم داوطلبانه کوچک‌تر از phpBB یا Discourse اعتماد می‌کنید و یک اکستنشن بدون پشتیبانی می‌تواند ارتقای بعدی هسته را مسدود کند، زیرا composer از حل وابستگی آن با نسخه جدید خودداری می‌کند.

خارج کردن داده‌ها آسان است: از دیتابیس mysqldump بگیرید و دایرکتوری assets را کپی کنید. وارد کردن داده‌ها دشوارتر است. Discourse ابزار flarum_import.rb را برای مسیر Flarum به Discourse ارائه می‌دهد که نشان می‌دهد ترافیک معمولاً به کدام سمت جریان دارد. وارد کردن phpBB به Flarum توسط اکستنشن‌های جامعه کاربری انجام می‌شود و نه ابزارهای رسمی؛ بنابراین پیش از اعتماد به تنها نسخه موجود، آن را روی یک کپی از داده‌ها تست کنید.

NodeBB: ارسال بلادرنگ و هزینه‌های مرتبط با آن

NodeBB مبتنی بر Node.js است. این نرم‌افزار پست‌های جدید را از طریق websockets به مرورگرهای باز ارسال می‌کند، بنابراین یک رشتهٔ گفتگو بدون نیاز به رفرش صفحه به‌روز می‌شود. دلیل انتخاب آن همین است. فایل README نسخه Node.js 22 یا جدیدتر و همچنین MongoDB 5+ یا Redis 7.2+ را درخواست می‌کند؛ یک درایور PostgreSQL نیز به عنوان گزینه سوم در سورس‌کد موجود است.

استفاده از Redis به عنوان دیتابیس اصلی، تلهٔ موجود در آن جمله است. Redis مجموعه داده را در حافظه (RAM) نگه می‌دارد، بنابراین نیاز شما به RAM همگام با رشد انجمن افزایش می‌یابد و ثابت نمی‌ماند. MongoDB یا PostgreSQL داده‌ها را روی دیسک نگه می‌دارند و فقط داده‌های پرکاربرد (hot) را کش می‌کنند. تنها در صورتی Redis را انتخاب کنید که دلیل فنی مشخصی برای آن داشته باشید.

بسته Node.js در Ubuntu 24.04 نسخه 18 است که پایین‌تر از حداقل مورد نیاز است، بنابراین ابتدا یک runtime به‌روز نصب کنید.

curl -fsSL https://deb.nodesource.com/setup_22.x | sudo -E bash -
sudo apt install -y nodejs git build-essential
sudo adduser --system --group --home /srv/nodebb nodebb
sudo -u nodebb git clone -b v4.x https://github.com/NodeBB/NodeBB.git /srv/nodebb
cd /srv/nodebb
sudo -u nodebb ./nodebb setup

./nodebb setup تعاملی است. این دستور می‌پرسد از کدام دیتابیس استفاده شود و چگونه به آن متصل شوید، سپس حساب کاربری مدیر را می‌سازد و یک پورت انتخاب می‌کند که به‌صورت پیش‌فرض 4567 است. NodeBB با npm start شروع نمی‌شود. اسکریپت ./nodebb رابط اصلی است و ./nodebb log محلی است که خروجی در آن نوشته می‌شود.

./nodebb start سرویس را به پس‌زمینه (daemonize) می‌برد که برای ماشینی که ریبوت می‌شود، اشتباه است. در عوض، لودر را تحت systemd و در پیش‌زمینه (foreground) اجرا کنید.

[Unit]
Description=NodeBB
After=network.target

[Service]
Type=simple
User=nodebb
WorkingDirectory=/srv/nodebb
ExecStart=/usr/bin/env node loader.js --no-daemon
Restart=on-failure

[Install]
WantedBy=multi-user.target

--no-daemon بخشی است که افراد از آن غافل می‌شوند. بدون آن، لودر fork می‌شود و پروسه والد خاتمه می‌یابد، بنابراین systemctl status nodebb وضعیت واحد را dead گزارش می‌کند در حالی که curl localhost:4567 همچنان پاسخگو است و systemctl stop nodebb در نتیجه چیزی را متوقف نمی‌کند. پشت یک reverse proxy، هدرهای websocket upgrade باید عبور داده شوند. اگر proxy_set_header Upgrade $http_upgrade; و proxy_set_header Connection "upgrade"; در بلاک nginx نباشند، انجمن لود می‌شود، کنسول مرورگر با درخواست‌های ناموفق socket.io پر می‌شود و پست‌های جدید تا زمانی که کاربر صفحه را رفرش نکند، نمایش داده نمی‌شوند.

قابلیت‌های مدیریت (Moderation) بین Flarum و Discourse قرار دارد. یک صف گزارش (flag queue) در پنل مدیریت، دسترسی‌های مبتنی بر دسته‌بندی و یک سیستم اعتبار (reputation) وجود دارد. ضد اسپم از طریق پلاگین‌های جامعه کاربری مانند nodebb-plugin-spam-be-gone تأمین می‌شود که Akismet و StopForumSpam را متصل می‌کند.

بک‌آپ‌ها دستی هستند و تا روزی که به آن‌ها نیاز پیدا نکنید، کسی به آن اشاره نمی‌کند. رابط خط فرمان ./nodebb دستور بک‌آپ ندارد. شما باید دیتابیس را خودتان با mongodump یا pg_dump دامپ کنید و دایرکتوری public/uploads و فایل config.json را در کنار آن کپی کنید. فایل config.json حاوی اعتبارنامه‌های دیتابیس و URL سایت است، بنابراین بازیابی بدون آن، فقط یک نصب جدید خواهد بود. هیچ ابزار واردکننده‌ای (importer) رسمی نیز وجود ندارد. nodebb-plugin-import یک پروژه جامعه کاربری است که به‌روز نمانده است، در حالی که Discourse یک واردکننده برای NodeBB ارائه می‌دهد، بنابراین راه خروجی که قطعاً کار می‌کند، انتقال به Discourse است.

phpBB: گزینه‌ای کوچک و ساده که همچنان کارآمد است

نرم‌افزار phpBB قدیمی است و همین موضوع دلیل اصلی استفاده از آن است. سری 3.3 این نرم‌افزار روی PHP 7.2.0 تا 8.3 اجرا می‌شود و از MySQL 4.1.3 به بالا، MariaDB 5.1 به بالا، PostgreSQL 8.3 به بالا، SQLite 3.6.15 به بالا، MS SQL Server و Oracle پشتیبانی می‌کند. این نرم‌افزار به json، mbstring، پشتیبانی از XML و فعال بودن تابع getimagesize() نیاز دارد.

دلیل قرارگیری این نرم‌افزار در این لیست، پشتیبانی از SQLite است. با استفاده از SQLite، انجمن شما شامل مجموعه‌ای از فایل‌های PHP و تنها یک فایل دیتابیس خواهد بود. نیازی به سرور دیتابیس، تنظیمات پیچیده یا پشتیبان‌گیری از موارد اضافی نیست. در یک VPS با 1 GB رم که سرویس‌های دیگری را نیز میزبانی می‌کند، این تفاوت کاملاً محسوس است. برای جوامع کوچک از SQLite استفاده کنید و زمانی که تعداد پست‌های همزمان افزایش یافت، به MySQL مهاجرت کنید؛ چرا که SQLite عملیات نوشتن را به صورت سریالی انجام می‌دهد و پست‌ها در صف انتظار قرار می‌گیرند.

در اینجا مرحله composer یا استفاده از container وجود ندارد. کافی است یک وب‌سرور با PHP نصب کنید، آرشیو را استخراج کرده و نصب‌کننده تحت مرورگر را اجرا کنید. راه‌اندازی کامل این پشته در یک پشته LAMP استاندارد روی Ubuntu 24.04 پوشش داده شده است.

sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-mysql php-mbstring php-xml php-gd unzip

نسخه فعلی 3.3 را از phpbb.com دانلود کنید، آن را در دایرکتوری vhost خود استخراج کنید و سپس مسیرهایی که نصب‌کننده در آن‌ها می‌نویسد را برای کاربر وب‌سرور قابل‌نوشتن کنید.

sudo chown -R www-data:www-data /srv/phpbb
sudo chmod 660 /srv/phpbb/config.php
sudo chmod -R 770 /srv/phpbb/store /srv/phpbb/cache /srv/phpbb/files /srv/phpbb/images/avatars/upload

دستورالعمل‌های رسمی به مجوزهای 666 و 777 اشاره دارند. این اعداد برای هاست‌های اشتراکی هستند که در آن‌ها کنترلی روی کاربری که PHP با آن اجرا می‌شود ندارید. در VPS شخصی، شما کنترل کامل دارید؛ بنابراین مالکیت را به www-data بدهید و دسترسی سایرین را محدود کنید. یک نکته در مورد Apache وجود دارد که کاربران را دچار مشکل می‌کند: پیکربندی Ubuntu فقط به دایرکتوری پیش‌فرض ریشه وب دسترسی می‌دهد، بنابراین vhost که به /srv/phpbb اشاره دارد، به یک بلوک <Directory> متناظر با Require all granted نیاز دارد، در غیر این صورت پیش از آنکه درخواست به phpBB برسد، با خطای 403 Forbidden مواجه خواهید شد. مراحل نصب را در مرورگر در /install/index.php به پایان برسانید، سپس config.php را به 640 برگردانید و دایرکتوری install/ را حذف کنید. phpBB تا زمانی که این دایرکتوری حذف نشود، به شما هشدار خواهد داد.

اسپم مشکل شناخته‌شده phpBB است، اما قابل‌حل است. فرم ثبت‌نام در یک URL قابل‌پیش‌بینی (ucp.php?mode=register) قرار دارد، بنابراین ربات‌ها چند روز پس از ایندکس شدن دامنه، آن را پیدا می‌کنند. راهکار موثر در پنل مدیریت و بخش Spambot countermeasures قرار دارد: روش ضد اسپم را روی Question and Answer تنظیم کنید و سوالی بنویسید که فقط اعضای جامعه شما پاسخ آن را می‌دانند. CAPTCHAهای تصویری (تست‌های تورینگ عمومی کاملاً خودکار) به راحتی توسط سرویس‌هایی که به ازای هر هزار تست هزینه دریافت می‌کنند، حل می‌شوند. اما سوالی که مربوط به موضوع تخصصی شما باشد، به این سادگی قابل‌حل نیست.

phpBB همچنین بهترین منبع پشتیبانی‌شده برای مهاجرت است. ابزار phpbb3.rb در Discourse پرکاربردترین ابزار واردکننده در این مقاله است و بیست سال پاسخ در انجمن‌های پشتیبانی phpBB وجود دارد. خروج از این سیستم با استفاده از mysqldump یا کپی کردن فایل SQLite انجام می‌شود. آنچه در مهاجرت منتقل نمی‌شود، استایل‌ها و افزونه‌های شما هستند.

چرا ایمیل‌های ثبت‌نام انجمن هرگز نمی‌رسند؟

ثبت‌نام در هر چهار مورد از این انجمن‌ها منوط به تأیید ایمیل است. اگر آن ایمیل نرسد، حساب کاربری هرگز فعال نمی‌شود و لاگ‌های شما ثبت‌نامی را نشان می‌دهند که به‌سادگی متوقف شده است. قابلیت تحویل ایمیل‌های خروجی تعیین می‌کند که آیا انجمن اصلاً کار می‌کند یا خیر، بنابراین آن را بخشی از مراحل نصب در نظر بگیرید.

  • پورت خروجی 25 به‌طور پیش‌فرض توسط اکثر ارائه‌دهندگان VPS مسدود است، بنابراین یک Postfix محلی که سعی می‌کند مستقیماً ایمیل ارسال کند، به جایی نمی‌رسد. لاگ ایمیل در این حالت connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out را نشان می‌دهد.
  • یک آدرس IP کاملاً جدید هیچ اعتبار ارسالی ندارد، بنابراین حتی در صورت تحویل موفقیت‌آمیز، ایمیل در پوشه اسپم قرار می‌گیرد. برای یک لینک تأیید، این وضعیت تفاوتی با نرسیدن ایمیل ندارد.
  • بدون رکوردهای SPF (sender policy framework) و DKIM (domainkeys identified mail) که در DNS منتشر شده باشند، ارائه‌دهندگان بزرگ پیام را مستقیماً رد می‌کنند. پیام رد شدن توسط گوگل به صورت 550 5.7.26 Unauthenticated email from example.com is not accepted due to domain's DMARC policy است. امروزه از هر کسی که در حجم بالا ایمیل ارسال می‌کند، انتظار می‌رود DMARC (domain-based message authentication, reporting and conformance) را پیاده‌سازی کرده باشد.

پاسخ عملی، استفاده از یک relay است. تنظیمات SMTP انجمن را روی یک ارائه‌دهنده ایمیل تراکنشی (transactional mail provider) در پورت 587 تنظیم کنید، رکوردهای SPF، DKIM و DMARC ارائه‌شده توسط آن سرویس را منتشر کنید و ایمیل‌ها را از یک زیردامنه مانند mail.example.com ارسال کنید تا اعتبار انجمن از ایمیل شخصی شما جدا بماند. اجرای سرور ایمیل توسط خودتان امکان‌پذیر است و یک سرور ایمیل کامل self-hosted روی VPS آن را پوشش می‌دهد، اما هفتهٔ راه‌اندازی انجمن زمان مناسبی برای یادگیری مباحث تحویل ایمیل نیست.

پیش از اعلام عمومی انجمن، تست کنید. در Discourse، از داخل کانتینر:

cd /var/discourse
./launcher enter app
rake emails:test[you@example.com]

این دستور اتصال SMTP را بررسی کرده و یک پیام ارسال می‌کند؛ در صورت اشتباه بودن اعتبارنامه‌ها، نوع خطا را مشخص می‌کند که معمولاً به صورت Net::SMTPAuthenticationError است. phpBB تست مشابهی در پنل مدیریت تحت بخش Client communication دارد. برای Flarum و NodeBB، یک حساب کاربری موقت با یک ایمیل واقعی در یکی از ارائه‌دهندگان بزرگ بسازید و هدرهای خام ایمیل دریافتی را بخوانید. spf=pass و dkim=pass در هدر Authentication-Results نتیجه‌ای است که به دنبال آن هستید.

یک نکته در مورد Discourse: از اوت 2026، ویزارد راه‌اندازی به شما اجازه می‌دهد از SMTP صرف‌نظر کرده و از Discourse ID استفاده کنید که کاربران را به‌جای لینک ایمیل، با یک حساب خارجی وارد می‌کند. این کار به شما امکان می‌دهد بدون نیاز به relay کار را شروع کنید. البته این روش ایمیل‌های اطلاع‌رسانی یا بازنشانی رمز عبور را فعال نمی‌کند، بنابراین پیش از رشد جامعه کاربری، حتماً SMTP را پیکربندی کنید.

چگونه انجمن را پشت TLS قرار دهیم؟

نرم‌افزارهای Flarum و phpBB میزبان‌های مجازی (virtual hosts) معمولی هستند، بنابراین استفاده از certbot روی وب‌سروری که هم‌اکنون اجرا می‌کنید، کافی است. NodeBB و Discourse متفاوت هستند: آن‌ها برنامه‌هایی هستند که روی پورت‌های محلی گوش می‌دهند و باید چیزی در مقابل آن‌ها قرار بگیرد تا TLS (امنیت لایه انتقال) را خاتمه داده و ترافیک را بر اساس نام دامنه هدایت کند. اگر انجمن با سرویس‌های دیگر در یک سرور مشترک است، یک reverse proxy در مقابل همه آن‌ها قرار دهید؛ این همان کاری است که Traefik در مقابل چندین برنامه Docker Compose برای آن طراحی شده است.

Discourse به‌صورت پیش‌فرض پورت‌های 80 و 443 را در اختیار می‌گیرد و از nginx و قالب Let's Encrypt اختصاصی خود استفاده می‌کند. برای قرار دادن آن پشت یک پروکسی موجود، باید فایل app.yml را ویرایش کنید، خط templates/web.letsencrypt.ssl.template.yml را حذف نمایید، پورت‌های exposed را تغییر دهید تا container فقط روی یک آدرس محلی گوش دهد و سپس دستور ./launcher rebuild app را اجرا کنید. انجام این کار پس از نصب، مستلزم بازسازی (rebuild) و چند دقیقه قطعی سرویس است، بنابراین پیش از نصب در مورد آن تصمیم بگیرید.

کدام انجمن با اندازه جامعه شما متناسب است؟

قانون تصمیم‌گیری بر اساس افراد است، نه قابلیت‌ها.

  • برای کمتر از چند صد عضو، یک مدیر و 1 GB رم: phpBB روی SQLite، یا اگر رابط کاربری مدرن می‌خواهید و می‌توانید MariaDB را اجرا کنید، Flarum. هر کدام یک برنامه PHP واحد هستند که باید وصله‌های امنیتی آن‌ها را اعمال کنید.
  • برای جامعه در حال رشد، دو یا چند مدیر و 4 GB رم: Discourse. لحظه‌ای که مدیریت دیگر در ذهن یک نفر نمی‌گنجد، سطوح اعتماد (Trust levels) و صف بازبینی (Review queue) ارزش منابع مصرفی آن را دارند.
  • اگر بیش از تاپیک‌های ماندگار به گفتگوی زنده نیاز دارید: NodeBB، یا بپذیرید که این یک چت است و به‌جای آن Rocket.Chat on Docker Compose را اجرا کنید. انجمنی که در آن هیچ مطلبی ارزش خواندن پس از یک هفته را ندارد، باید یک سرور چت می‌بود.
  • اگر بیش از بحث و گفتگو به مستندات نیاز دارید: هیچ‌کدام از این‌ها. BookStack, Wiki.js or Outline پاسخ بهتری به این نیاز است و انجمنی که پر از سوالات تکراری است، معمولاً نشان‌دهنده فقدان یک ویکی است.
  • اگر هنوز در حال بررسی این هستید که چه چیزی باید روی سرور قرار بگیرد: the wider self-hosting shortlist for 2026 نقطه شروع بهتری است و the self-hosted Notion alternatives guide هم‌پوشانی بین انجمن‌ها و فضاهای کاری اشتراکی را پوشش می‌دهد.

هر کدام را که انتخاب کنید، پایداری انجمن تنها به آخرین نسخه پشتیبان بازیابی‌شده بستگی دارد. دیتابیس را طبق برنامه dump کنید، دایرکتوری آپلودها را در همان فرآیند کپی کنید و نتیجه را یک بار در جای دیگری بازیابی کنید تا ثابت شود dump قابل استفاده است. Scheduled restic backups on a VPS این بخش را پوشش می‌دهد و این تنها قطعه از این پیکربندی است که فرصت دومی برای آن وجود ندارد.

FAQ

حداقل نیازمندی‌های سرور برای یک انجمن خودمیزبان (self-hosted) چیست؟

نرم‌افزار phpBB با استفاده از SQLite در کنار سایر سرویس‌ها با 1 گیگابایت رم اجرا می‌شود، زیرا نیازی به سرور پایگاه‌داده مجزا ندارد. Flarum به 1 گیگابایت رم به همراه MariaDB نیاز دارد. NodeBB با 2 گیگابایت رم و MongoDB به‌خوبی کار می‌کند. Discourse حداقل 1 گیگابایت رم (با swap) و 10 گیگابایت فضای دیسک را پیشنهاد می‌دهد، اما 2 گیگابایت رم حداقلِ واقعی است و 4 گیگابایت برای یک انجمن پرتردد مناسب است؛ زیرا ./launcher rebuild app در هر بار ارتقا، دارایی‌ها (assets) را در حافظه بازسازی (recompile) می‌کند و این همان لحظه‌ای است که یک سرور کوچک توسط مدیریت حافظه هسته (OOM Killer) متوقف می‌شود.

آیا می‌توانم انجمن phpBB خود را به Discourse منتقل کنم؟

بله، و این بهترین مسیر مهاجرت پشتیبانی‌شده در اینجا است. Discourse شامل script/import_scripts/phpbb3.rb است که باید آن را درون کانتینر و روی یک کپی از پایگاه‌داده phpBB اجرا کنید، نه روی پایگاه‌داده اصلی و در حال کار. کاربران، دسته‌بندی‌ها، موضوعات، پست‌ها و پیوست‌ها منتقل می‌شوند. استایل‌ها و افزونه‌ها منتقل نمی‌شوند و URLهای قدیمی موضوعات تغییر می‌کنند، بنابراین پیش از تغییر DNS، برای مسیرهای phpBB برنامه‌ریزی جهت redirect داشته باشید. انتقال انجمن‌های بزرگ ساعت‌ها طول می‌کشد، بنابراین یک بار عملیات انتقال را روی یک سرور آزمایشی تمرین کنید و زمان آن را بسنجید.

چرا کاربران جدید ایمیل فعال‌سازی را دریافت نمی‌کنند؟

بیشتر ارائه‌دهندگان VPS پورت 25 خروجی را مسدود می‌کنند، بنابراین یک سرور ایمیل محلی اصلاً قادر به ارسال نیست و لاگ، خطای Connection timed out را در برابر سرور تبادل ایمیل (MX) گیرنده نشان می‌دهد. حتی اگر ارسال انجام شود، یک IP جدید بدون رکوردهای SPF یا DKIM رد یا فیلتر می‌شود و Google با خطای 550 5.7.26 Unauthenticated email ... is not accepted due to domain's DMARC policy پاسخ می‌دهد. ارسال را از طریق یک relay روی پورت 587 انجام دهید و رکوردهای SPF، DKIM و DMARC ارائه‌شده توسط آن relay را منتشر کنید؛ سپس با یک ثبت‌نام آزمایشی تست کنید و هدر Authentication-Results پیام دریافتی را بررسی نمایید.

کدام نرم‌افزار انجمن خودمیزبان به کمترین کار مدیریتی نیاز دارد؟

Discourse، زیرا گردش کار (workflow) در هسته آن تعبیه شده است و نه به‌صورت افزونه‌های جانبی. حساب‌های کاربری جدید تا زمانی که به اندازه کافی مطالعه نکرده باشند، محدودیت نرخ (rate limit) دارند؛ گزارش‌های تخلف (flags) در یک صف جمع‌آوری می‌شوند که ثبت می‌کند چه کسی به آن‌ها رسیدگی کرده است و افزونه Akismet نیز رسمی است. phpBB نیز پس از فعال‌سازی روش ضد اسپم «پرسش و پاسخ» به این سطح نزدیک می‌شود که به‌تنهایی جلوی اکثر ثبت‌نام‌های رباتیک را می‌گیرد. Flarum و NodeBB برای این کارها به افزونه‌های جامعه کاربری متکی هستند. هیچ‌کدام از این‌ها عامل اصلی را تغییر نمی‌دهد: حجم کار مدیریتی با تعداد افرادی که پست می‌گذارند مقیاس‌پذیر است، نه با نرم‌افزاری که در آن پست می‌گذارند.