Установка Flarum на VPS: пошаговая настройка PHP и MariaDB
Узнайте, как развернуть Flarum на VPS с использованием Composer и MariaDB. Руководство описывает настройку nginx для директории 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 может разместить его рядом с любыми другими сервисами. Если выбор ещё не сделан, более широкий обзор ПО для форумов с self-hosted размещением охватывает остальные варианты.
Данное руководство ориентировано на установку Flarum 1.x, в настоящее время это серия 1.8. По состоянию на август 2026 года Flarum 2.0 всё ещё находится в статусе кандидата на релиз, поэтому для форума, от которого зависят другие пользователи, следует использовать версию 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, поэтому пакеты из официальных репозиториев дистрибутива полностью соответствуют требованиям без необходимости подключения сторонних источников. Flarum требует следующие расширения PHP: curl, dom, fileinfo, gd, json, mbstring, openssl, pdo_mysql, tokenizer и zip. Также необходим доступ к командной оболочке, так как использование 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 mariadbCREATE 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-инъекции в стороннем расширении не позволит злоумышленнику прочитать другие ваши базы данных. Кодировка также имеет значение: 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 приводит к тому, что файлы в vendor/ и storage/ становятся собственностью root. В результате 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Последняя команда переключает вас в оболочку пользователя flarum, находящегося в /srv/flarum. Все команды до конца руководства выполняются от его имени, если они не начинаются с sudo.
composer create-project flarum/flarum:^1.8.0 .Ограничение ^1.8.0 фиксирует версию. Оно разрешает установку патч-релизов 1.8.x и блокирует обновление до 2.0, что необходимо, пока версия 2.0 находится в статусе release candidate. Composer загружает каркас приложения, разрешает зависимости flarum/core и создает файлы public/, storage/, vendor/, composer.json и скрипт командной строки flarum.
На VPS с малым объемом памяти этот этап часто завершается сбоем, причем два разных типа ошибок выглядят одинаково. PHP Fatal error: Allowed memory size of 134217728 bytes exhausted — это встроенный лимит memory_limit в PHP; добавление COMPOSER_MEMORY_LIMIT=-1 перед командой снимает это ограничение для одного запуска. Если команда Killed завершается без вывода ошибки PHP, значит, сработал механизм OOM Killer (out-of-memory killer) ядра Linux, что можно подтвердить с помощью dmesg | tail. В этом случае серверу действительно не хватает оперативной памяти, поэтому необходимо добавить swap: увеличение лимита PHP только усугубит ситуацию, так как PHP запросит еще больше памяти до того, как вмешается ядро.
Почему только /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] = 17Msudo systemctl restart php8.3-fpm
ls -l /run/php/php8.3-fpm-flarum.sockСокет должен быть указан как srw-rw---- 1 www-data www-data. Главный процесс работает от имени root и создает сокет, поэтому он может передать права владения пользователю www-data, в то время как рабочие процессы (workers) будут запущены от flarum. Если сокет отсутствует, sudo journalctl -u php8.3-fpm -n 30 выведет сообщение о том, что FPM отклонил запрос. pm = ondemand запускает рабочие процессы только при поступлении запроса, поэтому неактивный форум практически не потребляет оперативную память между посещениями.
Блок server в nginx
Flarum включает в себя фрагмент конфигурации nginx, расположенный в корне проекта и называемый .nginx.conf. Он содержит правила перезаписи (rewrite), заголовки кэширования и настройки сжатия. Используйте директиву include вместо копирования содержимого, чтобы при обновлении 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 nginxnginx -t должен отвечать на запросы syntax is ok и test is successful. Строку include часто забывают добавить, и её отсутствие приводит к очень специфическому симптому: главная страница загружается корректно, но при переходе по любой ссылке на обсуждение nginx возвращает ошибку 404. Flarum обрабатывает URL вида /d/1-hello-world внутри PHP. Поскольку этот путь не является реальным файлом на диске, без правила try_files $uri $uri/ /index.php?$query_string из фрагмента nginx пытается найти каталог с именем d, не находит его и возвращает 404 до того, как запрос доходит до PHP. В Apache аналогичная маршрутизация обеспечивается файлом .htaccess, который уже находится в public/; он работает только в том случае, если в соответствующем блоке <Directory> установлена директива AllowOverride All.
Добавьте TLS перед запуском установщика
Настройте сертификаты сейчас, а не после установки. Flarum записывает свой базовый URL в config.php во время инсталляции, используя адрес из вашего браузера. Если вы установите систему через http://, все URL ресурсов, которые Flarum сгенерирует впоследствии, будут начинаться с http://. В результате, после добавления TLS (transport layer security), браузер заблокирует эти запросы как смешанный контент (mixed content), и форум загрузится как нестилизованный текст без 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, и будет недоступен для всех остальных учетных записей на сервере. Затем проверьте установку через командную строку.
php flarum infoЭта команда выведет версию ядра, версию PHP, список включенных расширений, используемый почтовый драйвер и пути к файлам. Это первое, что нужно выполнить при возникновении неполадок, и первое, что у вас спросят при обращении за технической поддержкой.
Почему письма для регистрации и сброса пароля не доходят без уведомлений об ошибках
Этот раздел определяет, выживет ли ваш форум в первую неделю работы. Первые два письма, которые отправляет новый форум — это подтверждение регистрации и сброс пароля. Оба отправляются в тот самый момент, когда незнакомый пользователь решает, является ли ваше сообщество настоящим. Оба могут не дойти без каких-либо уведомлений. Человек, не получивший письмо, не сможет вам сообщить об этом, а на панели администратора не появится никаких предупреждений.
В Flarum предусмотрено четыре драйвера почты, которые настраиваются в разделе Administration, а затем Email: smtp, mail, mailgun и log. Выберите smtp и укажите почтовый сервис, который гарантированно доставляет письма. Драйвер mail передает сообщение локальному бинарному файлу sendmail, которого нет на свежеустановленной Ubuntu VPS, поэтому сообщение никуда не уходит, а ошибка не генерируется. Драйвер log записывает тело сообщения в storage/logs/ и вообще ничего не отправляет, так как предназначен для разработки.
Сохраните настройки, а затем нажмите кнопку Send Test Mail на той же странице. Эта кнопка — единственный способ получить обратную связь, поэтому используйте её до того, как приглашать кого-либо. Если сообщение не пришло, изучите лог.
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 для вашего домена попадают в папку спама или отбрасываются без уведомления о недоставке. В результате в вашем логе будет указана успешная отправка, а получатель ничего не увидит. В статье Надежная отправка почты из self-hosted приложений описано, какие 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 update отказывается обновлять 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 ГБ ОЗУ?
Да, для небольшого сообщества. В обычном режиме работы Flarum — это PHP-FPM, отвечающий на запросы, и MariaDB. При использовании pm = ondemand PHP-воркеры существуют только в момент обработки запроса. Пиковая нагрузка приходится на установку: composer create-project вычисляет весь граф зависимостей в оперативной памяти, и именно на этом этапе процесс чаще всего завершается из-за out-of-memory killer. Перед установкой создайте файл подкачки (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, которая игнорируется, если в блоке <Directory> не задано AllowOverride All.
Почему после включения HTTPS на форуме пропало всё оформление?
Flarum сохраняет базовый URL в config.php, который фиксируется при запуске установщика. Если вы устанавливали систему по обычному HTTP, Flarum продолжает генерировать URL ресурсов с http://. Браузер блокирует их как смешанный контент (mixed content) на HTTPS-странице, из-за чего отображается только нестилизованный текст. Измените значение ключа url в файле /srv/flarum/config.php на адрес https:// и выполните php flarum cache:clear от имени пользователя, которому принадлежат файлы.
Почему никто не получает письма с подтверждением регистрации?
Сначала проверьте драйвер почты. Драйвер mail требует наличия локального бинарного файла sendmail, которого нет на чистой VPS с Ubuntu, а драйвер log записывает письма в storage/logs/ и никуда их не отправляет. Переключитесь на smtp, используйте порт 587 с шифрованием tls, так как большинство провайдеров блокируют исходящий 25 порт, и нажмите Send Test Mail. Если в логах отправка успешна, а письмо не приходит, проблема в доставляемости, а не в настройках: опубликуйте SPF и DKIM записи для вашего домена отправителя.
Стоит ли устанавливать Flarum 1.8 или 2.0?
Устанавливайте 1.8. По состоянию на август 2026 года Flarum 2.0 является релиз-кандидатом. Более того, многие расширения всё ещё содержат ограничение flarum/core, которое ограничивает их версией 1.x. Установка 2.0 сегодня означает использование форума, расширения которого невозможно обновить одновременно — это именно та ошибка, для диагностики которой существует composer why-not. Зафиксируйте версию через flarum/flarum:^1.8.0 и вернитесь к вопросу обновления, когда расширения, от которых вы зависите, выпустят версии для 2.0.