SSD Nodes Learn 🎉 VPS เริ่ม $5.50/เดือน
คู่มือ Matt Connorโดย Matt Connor · อัปเดตเมื่อ 2026-08-13

เปรียบเทียบซอฟต์แวร์ฟอรัม self-hosted ตัวไหนน่าใช้ที่สุด

เปรียบเทียบ Discourse, Flarum, NodeBB และ phpBB บน VPS เจาะลึกการใช้ RAM จริง ฐานข้อมูลที่รองรับ ระบบป้องกันสแปม และขั้นตอนการย้ายข้อมูลเพื่อช่วยคุณตัดสินใจเลือกซอฟต์แวร์ที่เหมาะสม

ซอฟต์แวร์ฟอรัมแบบ self-hosted ตัวใดที่คุณควรเลือกใช้?

ปัจจุบันมีซอฟต์แวร์ฟอรัมแบบ self-hosted สี่ตัวเลือกหลักที่คุณสามารถรันบน VPS (virtual private server) ได้แก่ Discourse, Flarum, NodeBB และ phpBB หากคุณสามารถจัดสรร RAM ขนาด 4 GB และมีผู้ดูแลระบบอย่างน้อยสองคน Discourse คือตัวเลือกมาตรฐานที่เหมาะสมที่สุด แต่หากคุณมี RAM เพียง 1 GB และมีผู้ดูแลเพียงคนเดียว ให้เลือกใช้ Flarum หรือ phpBB แทน เพราะฟอรัมขนาดเล็กที่ดูแลให้สะอาดเรียบร้อยได้นั้น ย่อมดีกว่าฟอรัมที่มีฟีเจอร์ครบครันแต่คุณไม่สามารถดูแลได้

การติดตั้งเป็นเพียงส่วนที่ง่ายที่สุด ซอฟต์แวร์เหล่านี้ทุกตัวสามารถติดตั้งเสร็จสิ้นได้ภายในช่วงบ่าย สิ่งที่จะตัดสินว่าฟอรัมของคุณจะยังคงอยู่ต่อไปในอีกหนึ่งปีข้างหน้าหรือไม่นั้น คือระบบจัดการ flag และการตั้งค่า mail path ดังนั้นโปรดอ่านส่วนการดูแลระบบ (moderation) และอีเมล (email) ก่อนที่จะอ่านรายการฟีเจอร์ต่างๆ

ฟอรัมจำเป็นต้องมีอะไรบ้างในการทำงานจริง

ฟอรัมประกอบด้วยส่วนประกอบหลัก 4 ส่วน ไม่ใช่แค่ส่วนเดียว ได้แก่ กระบวนการทำงานของแอปพลิเคชัน, ฐานข้อมูลที่ต้องคงอยู่ถาวร, ไดเรกทอรีสำหรับเก็บรูปโปรไฟล์และไฟล์แนบที่อัปโหลด และช่องทางสำหรับการส่งอีเมล แอปพลิเคชันนั้นสามารถเปลี่ยนทดแทนได้ แต่ฐานข้อมูลไม่สามารถทำได้ เนื่องจากโพสต์ บัญชีผู้ใช้ และข้อความส่วนตัวทั้งหมดถูกเก็บไว้ในนั้น นี่คือเหตุผลว่าทำไมฐานข้อมูลที่แต่ละโปรเจกต์เลือกใช้จึงเป็นบรรทัดที่สำคัญที่สุดในส่วนต่างๆ ด้านล่างนี้ เพราะมันจะเป็นตัวกำหนดรูปแบบข้อมูลส่งออก (export) ของคุณในวันที่คุณต้องการย้ายระบบ

ต้นทุนส่วนที่สองคือทรัพยากรบุคคล การเปิดให้ลงทะเบียนและโพสต์ข้อความแบบสาธารณะหมายถึงการสมัครสมาชิกของบอท ซึ่งมักจะเกิดขึ้นภายในสัปดาห์แรกที่โดเมนปรากฏในการค้นหา ทั้ง 4 ส่วนสามารถจำกัดการเข้าถึงได้ แต่มีเพียงส่วนเดียวเท่านั้นที่มีเวิร์กโฟลว์การจัดการมาให้ในตัว (core)

Discourse: ค่าเริ่มต้นและต้นทุนที่แท้จริง

Discourse พัฒนาด้วย Ruby on Rails โดยใช้ PostgreSQL สำหรับจัดเก็บข้อมูล, Redis สำหรับแคชและคิวงาน และ Sidekiq สำหรับประมวลผลงานเบื้องหลัง การติดตั้งที่รองรับจะรวมส่วนประกอบทั้งหมดไว้ใน Docker container เดียว ซึ่งสร้างจากไฟล์คอนฟิกที่ /var/discourse/containers/app.yml คุณไม่จำเป็นต้องติดตั้งส่วนประกอบเหล่านี้ด้วยตนเอง

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

สคริปต์ดังกล่าวจะติดตั้ง git และ Docker หากยังไม่มีในระบบ จากนั้นจะทำการ clone discourse_docker ไปยัง /var/discourse แล้วส่งต่อให้วิซาร์ดแบบโต้ตอบ discourse-setup วิซาร์ดจะสอบถามชื่อโฮสต์, อีเมลผู้ดูแลระบบ และรายละเอียด SMTP (simple mail transfer protocol) จากนั้นจะเขียนไฟล์ app.yml และสร้าง container ขึ้นมา พอร์ต 80 และ 443 จะต้องว่างอยู่ เนื่องจาก container จะรัน nginx ของตัวเองและร้องขอใบรับรอง Let's Encrypt ให้คุณโดยอัตโนมัติ

ข้อกำหนดขั้นต่ำที่ระบุไว้คือ RAM 1 GB พร้อม swap และพื้นที่ดิสก์ 10 GB โปรดอ่านส่วนของ swap ตามตัวอักษร สคริปต์การติดตั้งจะสร้าง swapfile ขนาด 2 GB ด้วย fallocate -l 2G /swapfile เมื่อวิซาร์ดประเมินว่าเซิร์ฟเวอร์จำเป็นต้องใช้ ซึ่ง swap นี้ไม่ใช่สิ่งที่ใส่ไว้ประดับ ระบบจะใช้หน่วยความจำสูงสุดไม่ใช่ตอนที่เว็บไซต์รันอยู่ แต่เป็นช่วง ./launcher rebuild app ซึ่งจะทำการคอมไพล์ JavaScript และ CSS assets ใหม่ภายใน container ทุกครั้งที่มีการอัปเกรด บนเครื่องที่มี RAM 1 GB และไม่มี swap ขั้นตอนนี้จะถูกสั่ง kill กลางคัน ทำให้การ rebuild จบลงโดยไม่มีข้อความแสดงข้อผิดพลาดที่ชัดเจนบนหน้าจอ และ dmesg | tail จะแสดงบรรทัด Out of memory: Killed process แนะนำให้เตรียม RAM ไว้ 2 GB เพื่อการใช้งานที่ราบรื่น และ 4 GB เมื่อฟอรัมเริ่มมีผู้ใช้งานหนาแน่น

การอัปเกรดสามารถทำได้จาก /admin/upgrade ในเบราว์เซอร์ หรือผ่านเชลล์:

cd /var/discourse
./launcher rebuild app

rebuild จะทำลาย container ที่กำลังรันอยู่ แล้วทำการ bootstrap container ใหม่จาก app.yml จากนั้นจึงเริ่มการทำงานใหม่ ซึ่งจะทำให้เว็บไซต์หยุดให้บริการเป็นเวลาหลายนาทีในระหว่างกระบวนการนี้ ไม่มีวิธีหลีกเลี่ยงปัญหานี้หากใช้เพียง container เดียว การแยกเป็นสอง container โดยใช้ตัวอย่าง data.yml และ web_only.yml จะช่วยให้ PostgreSQL ยังคงทำงานอยู่ได้ในขณะที่ web container กำลัง rebuild ซึ่งคุ้มค่าที่จะทำเมื่อคุณมีผู้ใช้งานที่สังเกตเห็นช่วงเวลาที่ระบบหยุดทำงาน

การดูแลเนื้อหา (Moderation) คือส่วนที่ Discourse ใช้ RAM มากที่สุด บัญชีใหม่จะเริ่มต้นที่ระดับความน่าเชื่อถือ (trust level) 0 โดยมีข้อจำกัดที่เข้มงวดเกี่ยวกับจำนวนลิงก์ที่โพสต์ได้และความเร็วในการโพสต์ จากนั้นระดับจะเพิ่มขึ้นตามการอ่านและการมีส่วนร่วม การแจ้งเตือน (flags) จะถูกส่งไปยังคิวตรวจสอบซึ่งบันทึกว่าใครเป็นผู้จัดการเรื่องใด การเชื่อมต่อกับ Akismet และ StopForumSpam เป็นปลั๊กอินอย่างเป็นทางการ ส่วนที่เหลืออีกสามรายการคุณต้องประกอบเองจากส่วนเสริม

การย้ายข้อมูล เข้าสู่ Discourse คือจุดเด่นที่สุด ไดเรกทอรี script/import_scripts/ ในซอร์สทรีมีตัวนำเข้าข้อมูลมากกว่าหกสิบรายการ รวมถึง phpbb3.rb, vbulletin.rb, xenforo.rb, vanilla.rb, mybb.rb, flarum_import.rb, ไดเรกทอรี nodebb และตัวนำเข้า mbox สำหรับคลังจดหมายเมลลิสต์ ทั้งหมดเป็นสคริปต์ Ruby ที่คุณรันภายใน container โดยอ้างอิงจากสำเนาฐานข้อมูลเก่า กระบวนการนี้ทำงานช้าแต่ได้รับการดูแลรักษาอย่างต่อเนื่อง

การย้ายข้อมูล ออกจาก Discourse เป็นจุดอ่อน ./launcher enter app ตามด้วย discourse backup จะเขียนไฟล์ .tar.gz ซึ่งบรรจุ PostgreSQL dump และไดเรกทอรีไฟล์ที่อัปโหลดไว้ Discourse อื่นสามารถกู้คืนข้อมูลนี้ได้ แต่ไม่มีซอฟต์แวร์อื่นที่อ่านไฟล์นี้ได้ ดังนั้นการย้ายออกจาก Discourse หมายความว่าคุณต้องเขียน SQL เพื่อดึงข้อมูลจาก dump นั้นด้วยตัวเอง ตัดสินใจให้แน่ใจว่าคุณยอมรับเงื่อนไขนี้ได้ก่อนที่จะนำเข้าโพสต์จำนวน 50,000 รายการ

Flarum: ฟอรัม PHP ขนาดเบา

Flarum เป็นแอปพลิเคชัน PHP ทั่วไปที่ทำงานบน php-fpm ร่วมกับ nginx หรือ Apache โดยใช้ฐานข้อมูล MySQL หรือ MariaDB และจัดเก็บไฟล์ไว้บนดิสก์ ข้อกำหนดตามเอกสารระบุว่าต้องใช้ PHP 7.3 หรือใหม่กว่า พร้อมด้วย extension ได้แก่ 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

กำหนดให้ web server ชี้ไปที่ /srv/flarum/public ไม่ใช่ /srv/flarum เนื่องจากโค้ดของแอปพลิเคชัน ไฟล์ตั้งค่า และรหัสผ่านฐานข้อมูลทั้งหมดจะถูกจัดเก็บไว้ในไดเรกทอรีที่อยู่เหนือ public ขึ้นไปหนึ่งระดับ ดังนั้นหากกำหนด document root สูงเกินไปจะทำให้ผู้อื่นสามารถเข้าถึงข้อมูลรับรองของคุณได้ สำหรับ Apache คุณจำเป็นต้องตั้งค่า mod_rewrite และ AllowOverride All เพื่อให้ไฟล์ .htaccess ที่มากับซอฟต์แวร์ทำงานได้อย่างถูกต้อง ส่วนบน nginx ให้รวมไฟล์ .nginx.conf ไว้ภายใน server block ของคุณ จากนั้นให้เข้าถึงผ่านโดเมนเพื่อเริ่มตัวติดตั้งของ Flarum ซึ่งจะสอบถามข้อมูลฐานข้อมูลและบัญชีผู้ดูแลระบบ

ข้อมูลเวอร์ชัน ณ เดือนสิงหาคม 2026: 1.8.17 คือเวอร์ชันเสถียรปัจจุบันที่เผยแพร่ในเดือนมิถุนายน 2026 และ 2.0 อยู่ในสถานะ release candidate 5 อย่าเพิ่งเริ่มสร้างชุมชนใหม่บนเวอร์ชัน release candidate เมื่อเวอร์ชัน 2.0 ออกมาอย่างเป็นทางการ extension ต่างๆ จำเป็นต้องได้รับการอัปเดตก่อนจึงจะใช้งานได้ ซึ่งการอัปเกรดดังกล่าวอาจใช้เวลาดำเนินการตลอดทั้งสุดสัปดาห์

Flarum ใช้ทรัพยากรน้อย โดยใช้ php-fpm worker เพียงไม่กี่ตัว, MariaDB ที่ต้องการหน่วยความจำไม่กี่ร้อย MB และไฟล์ static ทั่วไป ชุมชนขนาดเล็กสามารถทำงานได้บน RAM ขนาด 1 GB

จุดอ่อนที่สำคัญคือระบบการกลั่นกรองเนื้อหา (moderation) โดยตัว core ให้ฟีเจอร์การรายงานและการกำหนดสิทธิ์ตามกลุ่มผู้ใช้เท่านั้น ส่วนคิวการอนุมัติเนื้อหาและการป้องกันสแปมต้องอาศัย extension ซึ่งส่วนใหญ่มาจากคอลเลกชัน FriendsOfFlarum โดยติดตั้งผ่าน composer require และเปิดใช้งานในแผงควบคุมผู้ดูแลระบบ ซึ่งวิธีนี้ใช้งานได้ดีในปัจจุบัน อย่างไรก็ตาม คุณกำลังพึ่งพาระบบนิเวศของอาสาสมัครที่มีขนาดเล็กกว่า phpBB หรือ Discourse และหาก extension ใดไม่ได้รับการดูแลต่อ จะขัดขวางการอัปเกรด core ในอนาคตของคุณ เนื่องจาก composer จะปฏิเสธการแก้ไข dependency ให้สอดคล้องกับเวอร์ชันใหม่

การนำข้อมูลออกทำได้ง่ายโดยการ mysqldump ฐานข้อมูลและคัดลอกไดเรกทอรี assets แต่การนำข้อมูลเข้าทำได้ยากกว่า Discourse มีเครื่องมือ flarum_import.rb สำหรับการย้ายข้อมูลจาก Flarum ไปยัง Discourse ซึ่งแสดงให้เห็นทิศทางของข้อมูลที่มักจะไหลไปทางนั้น การนำเข้าข้อมูลจาก phpBB มายัง Flarum ต้องอาศัย extension ของชุมชนแทนที่จะเป็นเครื่องมือจากผู้พัฒนาโดยตรง ดังนั้นควรทดสอบกับข้อมูลสำเนาก่อนที่จะใช้งานจริงกับข้อมูลชุดเดียวที่คุณมีอยู่

NodeBB: การโพสต์แบบเรียลไทม์และภาระงานที่ตามมา

NodeBB พัฒนาด้วย Node.js โดยใช้ WebSockets ในการผลักดันโพสต์ใหม่ไปยังเบราว์เซอร์ที่เปิดอยู่ ทำให้กระทู้ที่มีการเคลื่อนไหวอัปเดตได้โดยไม่ต้องรีเฟรชหน้าเว็บ นี่คือเหตุผลหลักในการเลือกใช้งาน README ของ NodeBB ระบุว่าต้องการ Node.js เวอร์ชัน 22 ขึ้นไป และ MongoDB เวอร์ชัน 5 ขึ้นไป หรือ Redis เวอร์ชัน 7.2 ขึ้นไป นอกจากนี้ยังมีไดรเวอร์ PostgreSQL รวมอยู่ในซอร์สโค้ดเป็นตัวเลือกที่สาม

การใช้ Redis เป็นฐานข้อมูลหลักถือเป็นกับดักในข้อความดังกล่าว เนื่องจาก Redis เก็บชุดข้อมูลไว้ในหน่วยความจำ (RAM) ความต้องการ RAM ของคุณจึงเพิ่มขึ้นตามขนาดของฟอรัม แทนที่จะคงที่เหมือนการใช้ฐานข้อมูลอื่น ส่วน MongoDB หรือ PostgreSQL จะเก็บข้อมูลไว้ในดิสก์และทำแคชเฉพาะข้อมูลที่ถูกเรียกใช้งานบ่อยเท่านั้น ให้เลือกใช้ Redis ก็ต่อเมื่อคุณมีเหตุผลรองรับที่ชัดเจนเพียงพอ

Ubuntu 24.04 มาพร้อมกับ Node.js เวอร์ชัน 18 ซึ่งต่ำกว่าความต้องการขั้นต่ำ ดังนั้นคุณต้องติดตั้งรันไทม์เวอร์ชันปัจจุบันก่อน

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 และ parent process จะจบการทำงาน ส่งผลให้ systemctl status nodebb รายงานว่า unit ตายแล้ว ในขณะที่ curl localhost:4567 ยังคงตอบสนองอยู่ และ systemctl stop nodebb จะไม่สามารถหยุดการทำงานของโปรเซสได้ เมื่ออยู่หลัง reverse proxy จะต้องส่งผ่าน header สำหรับการอัปเกรด WebSockets หากขาด proxy_set_header Upgrade $http_upgrade; และ proxy_set_header Connection "upgrade"; ในบล็อกของ nginx ฟอรัมจะโหลดได้ปกติ แต่คอนโซลของเบราว์เซอร์จะเต็มไปด้วยข้อผิดพลาดจาก socket.io และโพสต์ใหม่จะไม่ปรากฏจนกว่าผู้อ่านจะรีเฟรชหน้าเว็บ

ระบบการจัดการเนื้อหา (Moderation) ของ NodeBB อยู่กึ่งกลางระหว่าง Flarum และ Discourse โดยมีคิวการแจ้งเตือน (flag queue) ในแผงควบคุมผู้ดูแลระบบ, สิทธิ์การเข้าถึงแยกตามหมวดหมู่ และระบบชื่อเสียง (reputation system) การป้องกันสแปมทำได้ผ่านปลั๊กอินชุมชน เช่น nodebb-plugin-spam-be-gone ซึ่งเชื่อมต่อกับ Akismet และ StopForumSpam

การสำรองข้อมูลต้องทำด้วยตนเอง และมักไม่มีใครพูดถึงจนกว่าจะถึงวันที่จำเป็นต้องใช้ CLI ของ ./nodebb ไม่มีคำสั่งสำรองข้อมูล คุณต้อง dump ฐานข้อมูลด้วยตนเองโดยใช้ mongodump หรือ pg_dump และต้องคัดลอกไดเรกทอรี public/uploads รวมถึง config.json ที่อยู่คู่กัน config.json เก็บข้อมูลรับรองฐานข้อมูลและ URL ของเว็บไซต์ ดังนั้นการกู้คืนโดยไม่มีไฟล์นี้ก็ไม่ต่างจากการติดตั้งใหม่ นอกจากนี้ยังไม่มีเครื่องมือ import จากผู้พัฒนาโดยตรง nodebb-plugin-import เป็นโปรเจกต์จากชุมชนที่ไม่ได้รับการอัปเดตให้ทันสมัย ในขณะที่ Discourse มีเครื่องมือสำหรับ import ข้อมูลจาก NodeBB ดังนั้นทางออกที่ใช้งานได้จริงที่สุดคือการย้ายไปใช้ Discourse

phpBB: ตัวเลือกขนาดเล็กที่เรียบง่ายและยังคงใช้งานได้ดี

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 จะจัดการการเขียนข้อมูลแบบลำดับ (serialize) ทำให้การโพสต์เริ่มต่อคิวรอกัน

ไม่มีขั้นตอนการใช้ composer และไม่มี container ให้ติดตั้งเว็บเซิร์ฟเวอร์พร้อม PHP แตกไฟล์ที่ดาวน์โหลดมา แล้วรันตัวติดตั้งผ่านเบราว์เซอร์ การตั้งค่า stack ทั้งหมดครอบคลุมอยู่ใน LAMP stack มาตรฐานบน Ubuntu 24.04

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

ดาวน์โหลด phpBB รุ่น 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 ซึ่งตัวเลขเหล่านั้นมีไว้สำหรับ shared hosting ที่คุณไม่สามารถควบคุมผู้ใช้ที่รัน PHP ได้ แต่บน VPS ของคุณเอง คุณสามารถควบคุมได้ ดังนั้นให้เปลี่ยนความเป็นเจ้าของไฟล์เป็น www-data และจำกัดสิทธิ์ผู้อื่น รายละเอียดของ Apache ที่มักทำให้ผู้ใช้สับสนคือ การตั้งค่าของ Ubuntu จะอนุญาตให้เข้าถึงได้เฉพาะภายใต้ document root เริ่มต้นเท่านั้น ดังนั้น vhost ที่ชี้ไปยัง /srv/phpbb จึงจำเป็นต้องมีบล็อก <Directory> ที่สอดคล้องกันพร้อมกับ Require all granted มิฉะนั้นทุกคำขอจะได้รับข้อผิดพลาด 403 Forbidden ก่อนที่จะเข้าถึง phpBB ได้ ให้ดำเนินการติดตั้งให้เสร็จสิ้นในเบราว์เซอร์ที่ /install/index.php จากนั้นตั้งค่า config.php กลับเป็น 640 และลบไดเรกทอรี install/ ออก phpBB จะแจ้งเตือนเกี่ยวกับไดเรกทอรีนี้จนกว่าคุณจะลบมันทิ้ง

สแปมเป็นปัญหาที่ทราบกันดีของ phpBB แต่สามารถแก้ไขได้ แบบฟอร์มการลงทะเบียนจะอยู่ที่ URL ที่คาดเดาได้ (ucp.php?mode=register) ดังนั้นบอทจะพบมันภายในไม่กี่วันหลังจากโดเมนถูก crawl วิธีแก้ไขที่ได้ผลคือไปที่แผงควบคุมผู้ดูแลระบบในส่วน Spambot countermeasures: ตั้งค่าวิธีป้องกันสแปมเป็น Question and Answer และเขียนคำถามที่เฉพาะสมาชิกในชุมชนของคุณเท่านั้นที่ตอบได้ ส่วน Image CAPTCHA (การทดสอบทัวริงสาธารณะแบบอัตโนมัติ) นั้นถูกแก้ได้ง่ายด้วยบริการที่คิดค่าใช้จ่ายเป็นหลักพันครั้ง แต่คำถามเกี่ยวกับหัวข้อเฉพาะของคุณนั้นบอทไม่สามารถแก้ได้

phpBB ยังเป็นแหล่งข้อมูลที่ได้รับการสนับสนุนดีที่สุดสำหรับการย้ายระบบ ตัวนำเข้าข้อมูล phpbb3.rb ของ Discourse เป็นเครื่องมือที่มีการใช้งานมากที่สุดในบทความนี้ และมีคำตอบสะสมอยู่บนฟอรัมสนับสนุนของ phpBB ตลอดระยะเวลา 20 ปี การย้ายข้อมูลออกทำได้โดยใช้ mysqldump หรือคัดลอกไฟล์ SQLite ไป สิ่งที่จะไม่ถูกย้ายไปด้วยคือสไตล์และส่วนขยายที่คุณติดตั้งไว้

ทำไมอีเมลยืนยันการสมัครสมาชิกฟอรัมถึงไม่ส่งมา

การลงทะเบียนในทั้ง 4 แพลตฟอร์มนี้จำเป็นต้องมีการยืนยันผ่านอีเมล หากอีเมลดังกล่าวไม่ถูกส่งมา บัญชีจะไม่ถูกเปิดใช้งาน และ log ของคุณจะแสดงเพียงการสมัครที่ค้างอยู่เท่านั้น ความสามารถในการส่งอีเมลออก (outbound deliverability) เป็นตัวตัดสินว่าฟอรัมจะใช้งานได้หรือไม่ ดังนั้นให้ถือว่าส่วนนี้เป็นส่วนหนึ่งของการติดตั้ง

  • พอร์ตขาออก 25 ถูกบล็อกโดยผู้ให้บริการ VPS ส่วนใหญ่ตามค่าเริ่มต้น ดังนั้น Postfix ในเครื่องที่พยายามส่งอีเมลโดยตรงจึงไม่สามารถส่งออกไปได้ โดย log ของอีเมลจะแสดง connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out
  • IP address ที่เพิ่งใช้งานใหม่จะไม่มีชื่อเสียงในการส่งอีเมล (sending reputation) ดังนั้นแม้จะส่งสำเร็จ อีเมลก็มักจะไปอยู่ในโฟลเดอร์สแปม ซึ่งสำหรับลิงก์ยืนยันตัวตนแล้ว ถือว่าไม่ต่างจากการไม่ได้รับอีเมล
  • หากไม่มีการประกาศระเบียน SPF (sender policy framework) และ DKIM (domainkeys identified mail) ไว้ใน DNS ผู้ให้บริการรายใหญ่จะปฏิเสธข้อความทันที การปฏิเสธของ Google จะแสดงข้อความ 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 ตามที่ผู้ให้บริการกำหนด และส่งอีเมลจาก subdomain เช่น mail.example.com เพื่อแยกชื่อเสียงของฟอรัมออกจากอีเมลส่วนตัวของคุณ การรัน mail server ด้วยตนเองเป็นสิ่งที่ทำได้ และ การรัน mail server บน VPS ด้วยตนเองแบบเต็มรูปแบบ ได้ครอบคลุมเนื้อหานี้ไว้แล้ว แต่ช่วงเวลาที่เปิดตัวฟอรัมไม่ใช่เวลาที่เหมาะสมในการเรียนรู้เรื่องการจัดการ deliverability

ควรทดสอบก่อนที่จะประกาศเปิดตัวฟอรัม สำหรับ Discourse ให้ดำเนินการจากภายใน container ดังนี้:

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

งานดังกล่าวจะตรวจสอบการเชื่อมต่อ SMTP และส่งข้อความทดสอบ หากข้อมูลรับรองไม่ถูกต้อง ระบบจะระบุความผิดพลาด ซึ่งมักจะแสดงเป็น Net::SMTPAuthenticationError สำหรับ phpBB จะมีการทดสอบในลักษณะเดียวกันในแผงควบคุมผู้ดูแลระบบภายใต้หัวข้อ Client communication ส่วน Flarum และ NodeBB ให้ลองลงทะเบียนบัญชีทดสอบด้วยอีเมลจริงจากผู้ให้บริการรายใหญ่ แล้วตรวจสอบ raw headers ของอีเมลที่ได้รับ ค่า spf=pass และ dkim=pass ใน header Authentication-Results คือผลลัพธ์ที่คุณต้องการ

ข้อควรทราบสำหรับ Discourse: ตั้งแต่เดือนสิงหาคม 2026 เป็นต้นไป ตัวช่วยตั้งค่า (setup wizard) จะอนุญาตให้คุณข้ามขั้นตอน SMTP และใช้ Discourse ID แทน ซึ่งเป็นการให้ผู้ใช้ล็อกอินด้วยบัญชีภายนอกแทนการใช้ลิงก์ยืนยันผ่านอีเมล วิธีนี้ช่วยให้คุณเปิดตัวฟอรัมได้โดยไม่ต้องใช้ relay อย่างไรก็ตาม วิธีนี้จะไม่รองรับอีเมลแจ้งเตือนหรือการรีเซ็ตรหัสผ่าน ดังนั้นควรตั้งค่า SMTP ให้เรียบร้อยก่อนที่ชุมชนจะขยายตัวขึ้น

การนำฟอรัมไปไว้หลัง TLS ทำได้อย่างไร

Flarum และ phpBB เป็น virtual host ทั่วไป ดังนั้นการใช้ certbot บนเว็บเซิร์ฟเวอร์ที่คุณใช้งานอยู่แล้วจึงเพียงพอ แต่ NodeBB และ Discourse นั้นแตกต่างออกไป เนื่องจากเป็นแอปพลิเคชันที่ฟังพอร์ตภายในเครื่อง และต้องมีตัวกลางด้านหน้าทำหน้าที่ terminate TLS (transport layer security) และกำหนดเส้นทางตามชื่อโฮสต์ หากฟอรัมใช้งานเซิร์ฟเวอร์ร่วมกับบริการอื่น ให้ใช้ reverse proxy ตัวเดียววางไว้ด้านหน้าบริการทั้งหมด ซึ่งเป็นสิ่งที่ Traefik สำหรับแอป Docker Compose หลายตัว ออกแบบมาเพื่อการนี้

โดยค่าเริ่มต้น Discourse จะยึดพอร์ต 80 และ 443 ไว้เอง โดยใช้ nginx และเทมเพลต Let's Encrypt ของตนเอง หากต้องการนำไปไว้หลัง proxy ที่มีอยู่แล้ว ให้แก้ไขไฟล์ app.yml ลบบรรทัด templates/web.letsencrypt.ssl.template.yml ออก เปลี่ยนพอร์ตที่เปิดใช้งานเพื่อให้คอนเทนเนอร์ฟังเฉพาะที่อยู่ภายในเครื่องเท่านั้น จากนั้นจึงรันคำสั่ง ./launcher rebuild app การดำเนินการนี้หลังจากติดตั้งไปแล้วจะทำให้ต้องสร้างคอนเทนเนอร์ใหม่และมีช่วงเวลาที่ระบบหยุดทำงานเล็กน้อย ดังนั้นควรตัดสินใจให้เรียบร้อยก่อนเริ่มการติดตั้งแทนที่จะทำภายหลัง

ฟอรัมใดที่เหมาะสมกับขนาดชุมชนของคุณ

เกณฑ์การตัดสินใจขึ้นอยู่กับจำนวนผู้ใช้งาน ไม่ใช่ฟีเจอร์

  • สมาชิกไม่กี่ร้อยคน, ผู้ดูแล 1 คน, RAM 1 GB: ใช้ phpBB บน SQLite หรือ Flarum หากคุณต้องการอินเทอร์เฟซที่ทันสมัยและสามารถรัน MariaDB ได้ ทั้งสองเป็นแอปพลิเคชัน PHP เดี่ยวที่ต้องคอยอัปเดตแพตช์อยู่เสมอ
  • ชุมชนที่กำลังเติบโต, ผู้ดูแล 2 คนขึ้นไป, RAM 4 GB: ใช้ Discourse ระบบระดับความน่าเชื่อถือ (trust levels) และคิวการตรวจสอบ (review queue) นั้นคุ้มค่ากับทรัพยากรที่ใช้ เมื่อการดูแลระบบเริ่มเกินกว่าที่คนคนเดียวจะจัดการได้
  • คุณต้องการการสนทนาแบบสดมากกว่ากระทู้ที่คงอยู่ถาวร: ใช้ NodeBB หรือยอมรับว่ามันคือการแชทแล้วรัน Rocket.Chat บน Docker Compose แทน ฟอรัมที่ไม่มีเนื้อหาใดน่าอ่านหลังจากผ่านไปหนึ่งสัปดาห์ควรเป็นเซิร์ฟเวอร์แชทตั้งแต่แรก
  • สิ่งที่คุณต้องการจริงๆ คือเอกสารประกอบไม่ใช่การอภิปราย: ไม่แนะนำตัวเลือกเหล่านี้ BookStack, Wiki.js หรือ Outline ตอบโจทย์นั้นได้ดีกว่า และฟอรัมที่เต็มไปด้วยคำถามซ้ำซากมักเกิดจากการขาดวิกิ
  • ยังตัดสินใจไม่ได้ว่าควรติดตั้งอะไรบนเซิร์ฟเวอร์: รายการซอฟต์แวร์สำหรับ self-hosting ประจำปี 2026 เป็นจุดเริ่มต้นที่ดีกว่า และ คู่มือทางเลือกสำหรับ Notion แบบ self-hosted ครอบคลุมส่วนที่คาบเกี่ยวกันระหว่างฟอรัมและพื้นที่ทำงานร่วมกัน

ไม่ว่าคุณจะเลือกตัวเลือกใด ความคงทนของฟอรัมขึ้นอยู่กับการสำรองข้อมูลครั้งล่าสุดที่กู้คืนได้สำเร็จ ให้ทำการ dump ฐานข้อมูลตามกำหนดเวลา คัดลอกไดเรกทอรีที่เก็บไฟล์อัปโหลดในงานเดียวกัน และทดสอบกู้คืนผลลัพธ์ไปยังที่อื่นอย่างน้อยหนึ่งครั้งเพื่อพิสูจน์ว่าไฟล์ dump นั้นใช้งานได้จริง การสำรองข้อมูลด้วย restic ตามกำหนดเวลาบน VPS ครอบคลุมส่วนนี้ และเป็นส่วนเดียวของการตั้งค่านี้ที่ไม่มีโอกาสแก้ตัวหากเกิดความผิดพลาด

FAQ

ความต้องการขั้นต่ำของเซิร์ฟเวอร์สำหรับการโฮสต์ฟอรัมด้วยตนเองคือเท่าใด

phpBB ที่ใช้ SQLite สามารถทำงานบน RAM ขนาด 1 GB ควบคู่ไปกับบริการอื่นได้ เนื่องจากไม่มีการใช้ database server แยกต่างหาก Flarum ต้องการ RAM 1 GB และ MariaDB ส่วน NodeBB ทำงานได้ดีบน RAM 2 GB ร่วมกับ MongoDB สำหรับ Discourse นั้นระบุความต้องการขั้นต่ำไว้ที่ RAM 1 GB พร้อม swap และพื้นที่ดิสก์ 10 GB แต่ในทางปฏิบัติ RAM 2 GB คือระดับเริ่มต้นที่เหมาะสม และ 4 GB จะเหมาะสำหรับฟอรัมที่มีผู้ใช้งานหนาแน่น เนื่องจาก ./launcher rebuild app จะทำการคอมไพล์ assets ใหม่ในหน่วยความจำทุกครั้งที่มีการอัปเกรด ซึ่งเป็นช่วงเวลาที่เซิร์ฟเวอร์ขนาดเล็กมักถูก kernel สั่งยุติการทำงานด้วย out of memory handler

ฉันสามารถย้ายฟอรัม phpBB ไปยัง Discourse ได้หรือไม่

ได้ และนี่คือเส้นทางการย้ายข้อมูลที่ได้รับการสนับสนุนดีที่สุด Discourse มาพร้อมกับ script/import_scripts/phpbb3.rb ซึ่งคุณต้องรันภายใน container โดยเชื่อมต่อกับสำเนาของฐานข้อมูล phpBB เท่านั้น ห้ามรันกับฐานข้อมูลที่ใช้งานจริง ข้อมูลผู้ใช้ หมวดหมู่ หัวข้อ กระทู้ และไฟล์แนบจะถูกย้ายมาทั้งหมด แต่รูปแบบสไตล์และส่วนขยายจะไม่ถูกย้าย รวมถึง URL ของหัวข้อเดิมจะเปลี่ยนไป ดังนั้นควรวางแผนการทำ redirects จาก path เดิมของ phpBB ก่อนที่จะเปลี่ยน DNS การย้ายข้อมูลขนาดใหญ่ต้องใช้เวลาหลายชั่วโมง ดังนั้นควรทดลองซ้อมการนำเข้าข้อมูลบนเซิร์ฟเวอร์สำรองก่อนเพื่อประเมินเวลาที่ใช้จริง

เหตุใดผู้ใช้ใหม่จึงไม่ได้รับอีเมลยืนยันตัวตน

ผู้ให้บริการ VPS ส่วนใหญ่บล็อกพอร์ต 25 สำหรับขาออก ทำให้ mail server ภายในไม่สามารถส่งอีเมลได้เลย และ log จะแสดงข้อผิดพลาด Connection timed out เมื่อพยายามส่งไปยัง mail exchanger ของผู้รับ แม้ว่าจะส่งได้สำเร็จ แต่ 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 กำหนด จากนั้นให้ทดสอบการลงทะเบียนและตรวจสอบ header Authentication-Results ของข้อความที่ได้รับ

ซอฟต์แวร์ฟอรัมแบบ self-hosted ตัวใดต้องการงานดูแลรักษาน้อยที่สุด

Discourse เนื่องจากเวิร์กโฟลว์การจัดการถูกรวมไว้ในแกนหลักของระบบ ไม่ใช่การติดตั้งเพิ่มภายหลัง บัญชีผู้ใช้ใหม่จะถูกจำกัดอัตราการใช้งานจนกว่าจะอ่านเนื้อหาเพียงพอ การแจ้งเตือน (flags) จะถูกรวบรวมไว้ในคิวที่บันทึกว่าใครเป็นผู้ดำเนินการ และมีปลั๊กอิน Akismet อย่างเป็นทางการ ส่วน phpBB จะทำได้ใกล้เคียงกันเมื่อเปิดใช้งานวิธีการป้องกันสแปมแบบ Question and Answer ซึ่งสามารถหยุดการลงทะเบียนของบอทส่วนใหญ่ได้ด้วยตัวเอง สำหรับ Flarum และ NodeBB จะต้องพึ่งพาส่วนขยายจากชุมชนเพื่อทำงานเหล่านี้ ทั้งนี้ ไม่มีสิ่งใดเปลี่ยนความจริงที่ว่า ปริมาณงานดูแลรักษาจะแปรผันตามจำนวนผู้ใช้งานที่โพสต์ข้อความ ไม่ใช่ขึ้นอยู่กับซอฟต์แวร์ที่ใช้