Which Self-Hosted Forum Fit Run for Your VPS?
Compare Discourse, Flarum, NodeBB and phpBB for VPS: see the real RAM need, database, spam fight, mail setup and how to migrate comot later.
Which self-hosted forum software you suppose run?
Self-hosted forum software get four main choices wey you fit run for VPS (virtual private server) today: Discourse, Flarum, NodeBB and phpBB. Discourse na the correct default if you fit give am 4 GB of RAM and at least two people dey ready to moderate. If na 1 GB and one moderator, run Flarum or phpBB instead. Quiet forum wey you fit keep clean better pass forum wey get more features but you no fit manage.
Installation na the easy part. All of dem fit dey run within one afternoon. Wetin go decide whether the forum still dey exist after one year na the flag queue and mail path, so read the moderation and email sections before you read the feature lists.
Wetin forum really need to run?
Forum na four different parts, no be one: application process, database wey must survive am, directory for uploaded avatars and attachments, and working way to send mail. You fit replace the application. You no fit replace the database easily, because every post, every account, and every private message dey inside am. Na why the database wey each project choose be the most important line for the sections below. E decide wetin your export go look like on the day wey you wan comot.
The second cost na human effort. Public registration plus public posting mean bot signups, usually within the first week wey the domain show for a crawl. You fit lock down all four parts. Only one of dem ship this workflow inside core.
Discourse: the default, and wetin e really cost
Discourse na Ruby on Rails, with PostgreSQL for data, Redis for cache and job queues, and Sidekiq wey dey run background work. The supported install dey put all of dem inside one Docker container, wey dem build from config file for /var/discourse/containers/app.yml. You no need install the parts by yourself.
wget -qO- https://raw.githubusercontent.com/discourse/discourse_docker/main/install-discourse | sudo bashThat script dey install git and Docker if dem no dey, clone discourse_docker go /var/discourse, then hand over to the interactive discourse-setup wizard. The wizard go ask for your hostname, admin email address and SMTP (simple mail transfer protocol) details, write app.yml, and build the container. Ports 80 and 443 must dey free, because the container dey run im own nginx and request Let's Encrypt certificate for you.
The published minimum na 1 GB of RAM with swap, plus 10 GB of disk. Take the swap requirement exactly as dem write am. The setup script dey create 2 GB swapfile with fallocate -l 2G /swapfile when the wizard decide say the box need one, and that swap no be decoration. The memory peak no be the running site. Na ./launcher rebuild app, wey dey recompile the JavaScript and CSS assets inside the container for every upgrade. For 1 GB box wey no get swap, that step go get killed halfway, the rebuild go end without useful error for screen, and dmesg | tail go show an Out of memory: Killed process line. Budget 2 GB to run am properly, and 4 GB when the forum don busy.
Upgrades dey run from /admin/upgrade for browser, or from the shell:
cd /var/discourse
./launcher rebuild apprebuild dey destroy the running container, bootstrap new one from app.yml, and start am, so the site go dey down for the several minutes wey the process take. You no fit avoid that for one container. If you split am into two containers with the data.yml and web_only.yml samples, PostgreSQL go remain up while the web container dey rebuild. This one become worth am once you get users wey go notice.
Moderation na where Discourse dey use plenty RAM. New accounts dey start for trust level 0 with hard limits on how many links dem fit post and how fast, then dem dey climb as dem read and participate. Flags dey enter review queue wey dey record who handle wetin. Akismet and StopForumSpam integrations na official plugins. For the other three, you go assemble this with add-ons.
Migration into Discourse na im strongest feature. The script/import_scripts/ directory for the source tree carry more than sixty importers, including phpbb3.rb, vbulletin.rb, xenforo.rb, vanilla.rb, mybb.rb, flarum_import.rb, one nodebb directory and one mbox importer for mailing list archives. Dem na Ruby scripts wey you run inside the container against copy of the old database. Dem slow, but dem dey maintained.
Migration out na the weak side. ./launcher enter app followed by discourse backup go write .tar.gz wey hold PostgreSQL dump plus the uploads directory. Another Discourse fit restore am. Nothing else fit read am, so if you leave Discourse, you go need write SQL against that dump by yourself. Decide say you fit manage that before you import 50,000 posts.
Flarum: the light PHP forum
Flarum na normal PHP application: php-fpm behind nginx or Apache, MySQL or MariaDB database, and files for disk. The documented requirements na PHP 7.3 or newer with the curl, dom, fileinfo, gd, json, mbstring, openssl, pdo_mysql, tokenizer and zip extensions, plus MySQL 5.6+ (or 8.0.23+) or MariaDB 10.0.5+. Ubuntu 24.04 dey ship PHP 8.3, wey pass that minimum requirement.
Notice pdo_mysql for that list. Flarum no support PostgreSQL and e no support SQLite. If na single-file database you want, phpBB na the option below.
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/flarumPoint the web server to /srv/flarum/public, no be /srv/flarum. The application code, config file and database password dey one directory above public. So, if document root too high by one level, anybody fit access your credentials. For Apache, you also need mod_rewrite and AllowOverride All so the shipped .htaccess go take effect. For nginx, include the shipped .nginx.conf inside your server block. Then open the domain for browser. Flarum own installer go ask for the database and admin account.
Versions as of August 2026: 1.8.17 na the current stable release, wey dem publish for June 2026, and 2.0 dey for release candidate 5. No start new community with the release candidate. When 2.0 arrive, extensions go need update before dem fit load. Na this upgrade fit cost you one weekend.
The footprint small. E need few php-fpm workers, MariaDB wey dey use few hundred MB, and static files. Young community fit run for 1 GB.
Moderation na the clear weakness. Core give you reports and permissions per group. Approval queues and spam blocking come from extensions, mostly the FriendsOfFlarum collection, wey you install with composer require and switch on for the admin panel. That one dey work today. But you dey depend on smaller volunteer ecosystem than wetin phpBB or Discourse get. If extension no dey maintained, e fit block your next core upgrade because composer no go resolve am against the new version.
Getting data out easy: mysqldump the database and copy the assets directory. Getting data in harder. Discourse ships flarum_import.rb for the Flarum to Discourse direction. This one show you the direction wey traffic usually dey flow. To import phpBB into Flarum, you go use community extensions instead of first-party tool. Test one against a copy before you trust am with the only copy.
NodeBB: realtime posting, and the tax wey come with am
NodeBB na Node.js. E dey push new posts go browsers wey dey open through websockets, so active thread dey update without refresh. Na this be the reason to choose am. The README ask for Node.js 22 or newer, plus either MongoDB 5+ or Redis 7.2+, and PostgreSQL driver dey inside the source tree as third option.
Redis as the primary database na the trap for that sentence. Redis dey keep dataset for memory, so RAM requirement dey grow as forum grow instead of remaining flat. MongoDB or PostgreSQL dey keep data for disk and cache the hot data. Choose Redis only if you fit explain why.
Ubuntu 24.04 packages Node.js 18, wey dey below the required minimum, so install current runtime first.
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 dey interactive. E go ask which database to use and how to reach am, then create admin account and choose port, wey default to 4567. NodeBB no dey start with npm start. The ./nodebb script na the interface, and ./nodebb log na where the output dey go.
./nodebb start dey daemonise, and this no correct for machine wey dey reboot. Run the loader under systemd for foreground instead.
[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 na the part wey people dey miss. Without am, the loader go fork and the parent go exit, so systemctl status nodebb go report say unit don die while curl localhost:4567 still dey answer, and systemctl stop nodebb no go stop anything. Behind reverse proxy, you must pass the websocket upgrade headers through. If proxy_set_header Upgrade $http_upgrade; and proxy_set_header Connection "upgrade"; dey missing from the nginx block, forum go load, browser console go fill with failed socket.io requests, and new posts go stop appearing until reader refresh.
Moderation dey between Flarum and Discourse. Admin panel get flag queue, per-category privileges, and reputation system. Community plugins like nodebb-plugin-spam-be-gone provide anti-spam; e dey connect Akismet and StopForumSpam.
Backups dey manual, and nobody dey talk about am until the day wey you need one. The ./nodebb CLI no get backup command. You dump the database yourself with mongodump or pg_dump, then copy public/uploads directory and config.json together with am. config.json dey hold database credentials and site URL, so restore without am na just new install. No first-party importer dey too. nodebb-plugin-import na community project wey no dey keep up, while Discourse ships NodeBB importer, so the exit door wey definitely dey work lead go Discourse.
phpBB: di small, boring one wey still dey work
phpBB don old, and na that be the reason to use am. The 3.3 line dey run for PHP 7.2.0 reach PHP 8.3, including PHP 8.3. E support MySQL 4.1.3+, MariaDB 5.1+, PostgreSQL 8.3+, SQLite 3.6.15+, MS SQL Server, and Oracle. E need json, mbstring, XML support, and the getimagesize() function must dey enabled.
SQLite na why e dey this list. With SQLite, the forum na directory of PHP files plus one database file. No database server, nothing to tune, and nothing extra to back up. For 1 GB VPS wey dey run another thing already, this difference dey matter. Use SQLite for small community, then move go MySQL when people start posting at the same time more often, because SQLite dey serialise writes and posts go start queue behind each other.
No composer step dey, and no container dey. Install web server with PHP, unpack the archive, then run the browser installer. The complete stack setup dey covered for standard LAMP stack for Ubuntu 24.04.
sudo apt update
sudo apt install -y apache2 php libapache2-mod-php php-mysql php-mbstring php-xml php-gd unzipDownload the current 3.3 release from phpbb.com, unpack am inside the directory wey your vhost dey serve, then make the paths wey installer go write to writable by the web server user.
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/uploadThe official instructions talk say make permission be 666 and 777. Those numbers na for shared hosting, where you no control the user wey PHP dey run as. For your own VPS, you control am, so give ownership to www-data and block everybody else. One Apache detail dey catch people: Ubuntu config only grants access under its own default document root. So, vhost wey point to /srv/phpbb also need matching <Directory> block with Require all granted, or every request go return 403 Forbidden before phpBB even receive am. Finish the setup for browser at /install/index.php, then change config.php back to 640 and delete the install/ directory. phpBB go continue warn you about that directory until you remove am.
Spam na phpBB's known problem, but you fit fix am. The registration form dey for predictable URL (ucp.php?mode=register), so bots go find am within days after dem crawl the domain. The fix wey dey work dey inside admin panel under Spambot countermeasures: set the anti-spam method to Question and Answer, then write question wey only person for your community fit answer. Services wey charge per thousand fit solve image CAPTCHAs (completely automated public Turing tests) cheaply. Question about your own subject no easy for dem solve.
phpBB still be the source wey get the best migration support. Discourse's phpbb3.rb na the importer wey people don use pass for this whole article, and answers from twenty years dey for phpBB support forums. To move out na mysqldump, or copy the SQLite file. Your styles and extensions no dey move with am.
Why forum signup emails never arrive?
Registration for all four depend on confirmation email. If the mail no arrive, the account no go activate, and your logs go show signup wey just stop. Outbound deliverability decide whether the forum fit work at all, so treat am as part of the install.
- Most VPS providers block outbound port 25 by default, so local Postfix wey dey try deliver directly no go reach anywhere. The mail log go show
connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out. - Brand new IP address no get sending reputation, so even when delivery succeed, the message fit enter spam folder. For confirmation link, that one mean say e no arrive.
- If you no publish SPF (sender policy framework) and DKIM (domainkeys identified mail) records for DNS, large providers go reject the message completely. Google's rejection dey read
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) don become expected for anybody wey dey send mail in volume.
The practical answer na relay. Point the forum's SMTP settings to a transactional mail provider for port 587. Publish the SPF, DKIM and DMARC records wey the provider give you. Send from a subdomain like mail.example.com so the forum's reputation stay separate from your personal mail. You fit run the mail server yourself, and one full self-hosted mail server for VPS explain how to do am, but forum launch no be the right week to learn deliverability.
Test am before you announce the forum. For Discourse, run this from inside the container:
cd /var/discourse
./launcher enter app
rake emails:test[you@example.com]That task check the SMTP connection and send one message. E go name the failure when credentials wrong, usually as Net::SMTPAuthenticationError. phpBB get equivalent test for the admin panel under Client communication. For Flarum and NodeBB, register throwaway account with real mailbox for a large provider, then read the raw headers of the message wey arrive. spf=pass and dkim=pass inside the Authentication-Results header na the result wey you dey look for.
One detail about Discourse. As of August 2026, the setup wizard let you skip SMTP and fall back to Discourse ID. That one sign people in with external account instead of emailed link. E fit let you launch without relay. But e no provide notification mail or password resets, so configure SMTP anyway before the community grow.
How you go put the forum behind TLS?
Flarum and phpBB na ordinary virtual hosts, so certbot for the web server wey you already dey run go do. NodeBB and Discourse different: dem be applications wey dey listen on local ports, and something for front must terminate TLS (transport layer security) and route request according to hostname. If forum dey share the same box with other services, put one reverse proxy for front of all of dem. Na wetin Traefik for front of multiple Docker Compose apps dey do.
Discourse by default dey own ports 80 and 443 by itself. E dey use im own nginx and im own Let's Encrypt template. To put am behind an existing proxy, edit app.yml, remove the templates/web.letsencrypt.ssl.template.yml line, change the exposed ports so the container listen only on a local address, then run ./launcher rebuild app. If you do this after installation, you go need rebuild and some minutes of downtime. So decide before you install am, no be after.
Forum wey fit your community size?
The decision rule na about people, no be features.
- If members dey under few hundred, moderator na one, and RAM na 1 GB: use phpBB with SQLite, or Flarum if you want modern interface and fit run MariaDB. Each one na single PHP application wey you need keep patched.
- If community dey grow, moderators dey two or more, and RAM na 4 GB: use Discourse. Trust levels and review queue worth the resources once moderation don pass wetin one person fit manage.
- If you want live conversation pass lasting threads: use NodeBB, or accept say na chat e be and run Rocket.Chat on Docker Compose instead. If nothing for forum still worth reading after one week, e suppose be chat server.
- If wetin you really need na documentation, no use any of these. BookStack, Wiki.js or Outline answer that need better, and forum full of repeated questions usually mean say wiki dey missing.
- If you still dey decide wetin suppose dey for the box at all: the wider self-hosting shortlist for 2026 na better starting point, and the self-hosted Notion alternatives guide cover the overlap between forums and shared workspaces.
Any one wey you choose, forum durability no pass the last backup wey you restore successfully. Dump the database on schedule, copy the uploads directory for that same job, then restore the result somewhere else once to confirm say the dump dey usable. Scheduled restic backups on a VPS cover that part, and na the only part of this setup wey no get second chance.
FAQ
Wetin be the minimum server requirements for self-hosted forum?
phpBB with SQLite fit run with 1 GB of RAM alongside other services, because e no get separate database server. Flarum need 1 GB plus MariaDB. NodeBB dey comfortable with 2 GB and MongoDB. Discourse list 1 GB with swap and 10 GB of disk as the minimum, but 2 GB na the honest minimum and 4 GB better for busy forum, because ./launcher rebuild app dey recompile assets for memory every upgrade, and na that time small machine fit run out of memory and kernel go kill am.
I fit move my phpBB forum to Discourse?
Yes, and na the migration path wey get the best support here. Discourse ship with script/import_scripts/phpbb3.rb, wey you run inside the container against copy of the phpBB database, never against the live database. Users, categories, topics, posts and attachments go come across. Styles and extensions no go come across, and old topic URLs go change, so plan redirects from the phpBB paths before you switch DNS. Large boards fit take hours, so first practise the import once for scratch server and measure the time.
Why new users no dey ever receive the activation email?
Most VPS providers block outbound port 25, so local mail server no fit deliver at all, and the log go show Connection timed out against the recipient mail exchanger. When delivery dey work, new IP wey no get SPF or DKIM records fit get rejection or filtering, and Google go answer with 550 5.7.26 Unauthenticated email ... is not accepted due to domain's DMARC policy. Send through relay on port 587 and publish the SPF, DKIM and DMARC records wey the relay give you. Then confirm am with test registration and read the Authentication-Results header of the message wey you receive.
Which self-hosted forum software need the least moderation work?
Discourse, because the workflow dey inside core instead of adding am later. New accounts get rate limit until dem don read enough. Flags dey gather for queue wey records who act on dem, and the Akismet plugin na official. phpBB dey close once you enable the Question and Answer anti-spam method, wey dey stop most bot registration by itself. Flarum and NodeBB rely on community extensions for the same work. None of this change the real factor: moderation load dey increase based on how many people post, no be based on which software dem post into.