SSD Nodes Learn 🎉 VPS від $5.50/міс
Посібники Matt ConnorВід Matt Connor · Оновлено 2026-08-13

Порівняння self-hosted форумів на VPS

Discourse, Flarum, NodeBB і phpBB: скільки RAM їм потрібно, які бази даних вони використовують, як протистоять спаму та як перейти на інше ПЗ.

Яке self-hosted форумне програмне забезпечення варто запустити?

Сьогодні на VPS (virtual private server) є чотири реальні варіанти self-hosted форумного програмного забезпечення: Discourse, Flarum, NodeBB і phpBB. Discourse — оптимальний варіант за замовчуванням, якщо ви можете виділити йому 4 GB RAM і маєте щонайменше двох людей, готових модерувати форум. За 1 GB RAM і з одним модератором краще запустити Flarum або phpBB. Тихий форум, який можна підтримувати в належному стані, кращий за функціональніший форум, який ви не можете модерувати.

Інсталяція — найпростіша частина. Кожен із цих варіантів можна запустити за один день. Те, чи існуватиме форум через рік, визначають черга скарг і шлях доставки пошти, тому прочитайте розділи про модерацію та електронну пошту до ознайомлення зі списками функцій.

Що насправді потрібно форуму для роботи?

Форум складається з чотирьох компонентів, а не з одного: процесу застосунку, бази даних, яка має зберігатися незалежно від нього, каталогу із завантаженими аватарами та вкладеннями і робочого способу надсилати пошту. Застосунок можна замінити. Базу даних — ні, оскільки в ній зберігаються кожен допис, кожен обліковий запис і кожне приватне повідомлення. Саме тому база даних, яку обрав кожен проєкт, є найважливішим рядком у наведених нижче розділах. Вона визначає формат вашого експорту в день, коли ви захочете перейти на інше рішення.

Друга складова витрат — людський ресурс. Публічна реєстрація разом із можливістю публікувати дописи означає появу реєстрацій ботів, зазвичай протягом першого тижня після того, як домен потрапляє до пошукового сканування. Усі чотири компоненти можна захистити. Лише один із них постачається з таким робочим процесом у ядрі.

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. Майстер запитує ім’я хоста, адресу електронної пошти адміністратора та параметри SMTP (simple mail transfer protocol), записує app.yml і збирає контейнер. Порти 80 і 443 мають бути вільними, оскільки контейнер запускає власний nginx і сам запитує сертифікат Let’s Encrypt.

Опублікована мінімальна вимога — 1 GB RAM зі swap і 10 GB дискового простору. Вимогу щодо swap слід розуміти буквально. Скрипт встановлення створює файл підкачки розміром 2 GB за допомогою fallocate -l 2G /swapfile, якщо майстер визначає, що сервер його потребує. Цей swap потрібен для роботи. Пікове споживання пам’яті припадає не на запущений сайт, а на ./launcher rebuild app, який під час кожного оновлення перекомпілює ресурси JavaScript і CSS усередині контейнера. На сервері з 1 GB RAM без swap цей етап примусово завершується, перебудова обривається без корисного повідомлення на екрані, а в dmesg | tail з’являється рядок Out of memory: Killed process. Для стабільної роботи закладайте 2 GB, а для активного форуму — 4 GB.

Оновлення запускають у браузері з /admin/upgrade або з оболонки:

cd /var/discourse
./launcher rebuild app

rebuild знищує запущений контейнер, створює новий на основі app.yml і запускає його. Через це сайт буде недоступний кілька хвилин. На одному контейнері цього не уникнути. Розділення на два контейнери за зразками data.yml і web_only.yml дає змогу залишити PostgreSQL запущеним, поки вебконтейнер перебудовується. Це стає виправданим, коли у вас уже є користувачі, які помічають такі простої.

Саме модерація пояснює значне споживання RAM Discourse. Нові облікові записи починають із рівня довіри 0 і мають жорсткі обмеження на кількість посилань, які можна публікувати, та швидкість публікації. Надалі рівень підвищується залежно від читання й участі в обговореннях. Скарги потрапляють до черги перевірки, де фіксується, хто і яку скаргу опрацював. Інтеграції Akismet і StopForumSpam є офіційними плагінами. Для трьох інших систем це потрібно зібрати з додаткових компонентів.

Міграція до Discourse — його найсильніша сторона. Каталог script/import_scripts/ у дереві вихідного коду містить понад шістдесят імпортерів, зокрема phpbb3.rb, vbulletin.rb, xenforo.rb, vanilla.rb, mybb.rb, flarum_import.rb, каталог nodebb та імпортер mbox для архівів списків розсилки. Це Ruby-скрипти, які запускають усередині контейнера для копії старої бази даних. Вони працюють повільно, але підтримуються.

Міграція з Discourse — його слабка сторона. ./launcher enter app разом із discourse backup записує .tar.gz, що містить дамп PostgreSQL і каталог завантажених файлів. Інший екземпляр Discourse може його відновити. Жодна інша система цей формат не читає, тому для переходу з Discourse вам доведеться самостійно писати SQL-запити до цього дампа. Врахуйте це до імпорту 50,000 публікацій.

Легкий PHP-форум Flarum

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 block. Потім відкрийте домен у браузері, і власний інсталятор Flarum попросить указати базу даних та обліковий запис адміністратора.

Версії станом на August 2026: 1.8.17 — поточний стабільний реліз, опублікований у June 2026, а 2.0 перебуває на етапі release candidate 5. Не запускайте нову спільноту на release candidate. Коли вийде 2.0, розширення потрібно оновити, перш ніж вони завантажаться. Саме це оновлення може забрати весь вихідний день.

Вимоги до ресурсів невеликі. Потрібно кілька процесів php-fpm, MariaDB використовує кілька сотень MB, а також потрібне місце для статичних файлів. Для молодої спільноти достатньо 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 зростає разом із ним, а не залишається сталою. 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 запускає процес у фоновому режимі. Для машини, яка перезавантажується, це неправильний підхід. Натомість запускайте loader у foreground під керуванням systemd.

[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 — це частина, яку часто пропускають. Без неї loader створює дочірній процес і завершує батьківський процес. Тому systemctl status nodebb повідомляє, що unit зупинений, хоча curl localhost:4567 все ще відповідає, а systemctl stop nodebb не зупиняє жодного процесу. За reverse proxy потрібно передавати заголовки оновлення websocket-з’єднання. Якщо в блоці nginx відсутні proxy_set_header Upgrade $http_upgrade; і proxy_set_header Connection "upgrade";, форум завантажується, консоль браузера заповнюється невдалими запитами socket.io, а нові публікації не з’являються, доки читач не оновить сторінку.

Модерація NodeBB перебуває між Flarum і Discourse. В адміністративній панелі є черга скарг, привілеї для окремих категорій і система репутації. Захист від спаму забезпечують community plugins, зокрема nodebb-plugin-spam-be-gone, який інтегрує Akismet і StopForumSpam.

Резервне копіювання виконується вручну, але про це згадують лише тоді, коли воно вже потрібне. У CLI ./nodebb немає команди резервного копіювання. Базу даних потрібно самостійно експортувати за допомогою mongodump або pg_dump, а разом із нею скопіювати каталог public/uploads і config.json. У config.json зберігаються облікові дані бази даних і URL-адреса сайту, тому відновлення без цього файлу фактично створює нову інсталяцію. Офіційного імпортера також немає. nodebb-plugin-import — це community project, який не встигає за поточними версіями, тоді як 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 робить phpBB доречним у цьому списку. У разі використання SQLite форум складається з каталогу PHP-файлів і одного файлу бази даних. Не потрібен сервер бази даних, нічого не потрібно налаштовувати, і немає додаткових даних для резервного копіювання. На VPS із 1 GB RAM, де вже працює інше програмне забезпечення, ця різниця помітна. Використовуйте SQLite для невеликої спільноти, а коли одночасних публікацій стане більше, перейдіть на MySQL, оскільки SQLite серіалізує операції запису, і публікації починають чекати одна на одну в черзі.

Кроку з composer і контейнера немає. Встановіть вебсервер із 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. Ці значення призначені для 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 і видаліть каталог install/. phpBB продовжує попереджати про цей каталог, доки його не буде видалено.

Спам — відома проблема phpBB, але її можна усунути. Форма реєстрації доступна за передбачуваною URL-адресою (ucp.php?mode=register), тому боти знаходять її протягом кількох днів після сканування домену. Надійне рішення доступне в адміністративній панелі в розділі Spambot countermeasures: виберіть метод захисту від спаму Question and Answer і створіть запитання, на яке зможе відповісти лише учасник вашої спільноти. Графічні CAPTCHA (completely automated public Turing tests) недорого розв’язуються сервісами, які стягують плату за тисячу перевірок. Запитання про власну тематику так просто не обійти.

phpBB також є найкраще підтримуваним джерелом для міграції. phpbb3.rb у Discourse — імпортер, який найчастіше використовують у всій цій статті, а на форумах підтримки phpBB за двадцять років накопичилося багато відповідей. Експорт виконується через mysqldump або копіювання файлу SQLite. Не переносяться ваші стилі та розширення.

Чому листи для реєстрації на форумі ніколи не надходять?

Реєстрація на всіх чотирьох платформах залежить від листа підтвердження. Якщо цей лист не надходить, обліковий запис не активується, а в журналі видно реєстрацію, яка просто припинилася. Відправлення пошти визначає, чи працює форум узагалі, тому вважайте його частиною інсталяції.

  • Більшість VPS-провайдерів типово блокують вихідний порт 25, тому локальний Postfix, який намагається доставляти пошту безпосередньо, не може цього зробити. У журналі пошти з’являється connect to gmail-smtp-in.l.google.com[...]:25: Connection timed out.
  • Нова IP-адреса не має репутації відправника, тому навіть успішно доставлений лист потрапляє до папки спаму. Для посилання підтвердження це фактично те саме, що лист не надійшов.
  • Якщо в DNS не опубліковано записи SPF (sender policy framework) і DKIM (domainkeys identified mail), великі поштові провайдери відхиляють повідомлення. У відповіді 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 форуму транзакційного поштового провайдера на порту 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 зареєструйте тимчасовий обліковий запис зі справжньою поштовою скринькою у великого провайдера та перегляньте raw headers отриманого листа. Результатом, якого ви очікуєте, є spf=pass і dkim=pass у заголовку Authentication-Results.

Є один нюанс щодо Discourse. Станом на August 2026 майстер налаштування дає змогу пропустити SMTP і використовувати Discourse ID, який виконує вхід користувачів через зовнішній обліковий запис замість посилання в листі. Це дає змогу запустити форум без relay. Але сповіщення електронною поштою та скидання паролів не працюватимуть, тому все одно налаштуйте SMTP до зростання спільноти.

Як розмістити форум за TLS?

Flarum і phpBB — звичайні віртуальні хости, тому достатньо запустити certbot на наявному вебсервері. NodeBB і Discourse працюють інакше: це застосунки, які прослуховують локальні порти, а TLS (безпеку транспортного рівня) має завершувати зовнішній компонент, який також маршрутизує запити за іменем хоста. Якщо форум працює на тому самому сервері, що й інші сервіси, розмістіть один reverse proxy перед усіма ними. Саме для цього призначено Traefik перед кількома застосунками Docker Compose.

За замовчуванням Discourse сам займає порти 80 і 443, використовуючи власні nginx і шаблон Let's Encrypt. Щоб розмістити його за наявним проксі, відредагуйте app.yml, видаліть рядок templates/web.letsencrypt.ssl.template.yml, змініть опубліковані порти так, щоб контейнер прослуховував лише локальну адресу, а потім виконайте ./launcher rebuild app. Якщо зробити це після встановлення, доведеться перебудувати контейнер і на кілька хвилин зупинити сервіс. Тому визначтеся зі схемою до встановлення, а не після нього.

Який форум відповідає розміру вашої спільноти?

Правило вибору стосується людей, а не функцій.

  • До кількох сотень учасників, один модератор, 1 GB RAM: phpBB на SQLite або Flarum, якщо потрібен сучасний інтерфейс і є можливість використовувати MariaDB. Кожен із них є одним PHP-застосунком, який потрібно підтримувати в актуальному стані.
  • Спільнота зростає, два або більше модераторів, 4 GB RAM: Discourse. Рівні довіри та черга перевірки виправдовують використання ресурсів, щойно модерація перестає поміщатися в голові однієї людини.
  • Потрібніші живі розмови, ніж довговічні теми: NodeBB або прийміть, що це чат, і використовуйте замість нього Rocket.Chat у Docker Compose. Якщо на форумі через тиждень нічого не варто читати, це мав би бути чат-сервер.
  • Насправді потрібна документація, а не обговорення: жоден із цих варіантів. BookStack, Wiki.js або Outline краще відповідають цьому завданню, а форум із постійно повторюваними запитаннями зазвичай означає, що бракує wiki.
  • Ще визначаєте, що взагалі має працювати на цьому сервері: ширший список self-hosting-рішень на 2026 рік буде кращою відправною точкою, а порівняння self-hosted альтернатив Notion охоплює спільну область форумів і робочих просторів.

Незалежно від вибору, форум зберігає дані лише настільки надійно, наскільки надійною є остання відновлена резервна копія. Створюйте дамп бази даних за розкладом, копіюйте каталог uploads у межах того самого завдання та один раз відновіть результат в іншому місці, щоб перевірити придатність дампу. Заплановані резервні копії restic на VPS описують цю частину, і саме вона в цій конфігурації не залишає права на помилку.

FAQ

Які мінімальні вимоги до сервера для self-hosted форуму?

phpBB із SQLite працює на 1 GB RAM паралельно з іншими сервісами, оскільки окремий database server не потрібен. Для Flarum потрібно 1 GB RAM і MariaDB. NodeBB комфортно працює з 2 GB RAM і MongoDB. Discourse вказує 1 GB RAM зі swap і 10 GB дискового простору як мінімальні вимоги, але реалістичний мінімум — 2 GB RAM, а для активного форуму краще 4 GB. Причина в тому, що ./launcher rebuild app під час кожного оновлення перекомпілює assets у пам’яті, і саме тоді невеликий сервер може завершити роботу через обробник out of memory у ядрі.

Чи можна перенести форум phpBB у Discourse?

Так. Це найкраще підтримуваний варіант міграції з перелічених. Discourse містить script/import_scripts/phpbb3.rb, який потрібно запускати всередині контейнера на копії бази даних phpBB, а не на робочій базі. Переносяться користувачі, категорії, теми, повідомлення та вкладення. Стилі й розширення не переносяться, а URL старих тем змінюються. Тому до зміни DNS заздалегідь налаштуйте редиректи зі шляхів phpBB. Для великих форумів міграція може тривати кілька годин. Спочатку виконайте імпорт на тестовому сервері та виміряйте його тривалість.

Чому нові користувачі ніколи не отримують листа активації?

Більшість VPS-провайдерів блокують вихідний порт 25. Через це локальний mail server взагалі не може доставляти листи, а в журналі з’являється 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. Потім виконайте тестову реєстрацію та перевірте заголовок Authentication-Results отриманого повідомлення.

Яке self-hosted форумне програмне забезпечення потребує найменше модерації?

Discourse, оскільки потрібні інструменти входять до core, а не додаються окремими компонентами. Для нових облікових записів діє rate limit, доки користувачі не прочитають достатню кількість матеріалів. Скарги надходять до черги, де фіксується, хто їх опрацював. Плагін Akismet є офіційним. phpBB наближається до цього рівня після ввімкнення методу Question and Answer для захисту від спаму. Він самостійно блокує більшість автоматичних реєстрацій. Flarum і NodeBB покладаються на community extensions для таких самих завдань. Проте головний чинник не змінюється: обсяг модерації залежить від кількості людей, які публікують дописи, а не від програмного забезпечення, у якому вони це роблять.