Flarum в Docker Compose: готовый файл
Классические форумные движки вроде phpBB и vBulletin тяжело смотрятся в 2026 году — старый UI, слабая мобильная адаптация, лишний вес. Flarum решает эту проблему: он лёгкий, быстрый и построен как SPA поверх PHP-бэкенда. Ниже — рабочий docker-compose.yml, который поднимает Flarum вместе с MariaDB и Nginx одной командой, без ручной возни с зависимостями PHP на хосте.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что такое Flarum и зачем его контейнеризировать
Flarum — форум-движок нового поколения от создателей esoTalk и части команды flarum.org, написанный на PHP (Laravel-компоненты под капотом) с фронтендом на Mithril.js. В отличие от Discourse, который тянет Ruby, Redis, Postgres и Sidekiq и требует от 2 ГБ RAM, Flarum спокойно работает на 1 ГБ и не просит отдельного воркера для фоновых задач.
Плюсы для установки в Docker:
- Один PHP-процесс + одна база — минимум сервисов в compose-файле.
- Расширения (extensions) ставятся через встроенный маркетплейс из админки, без пересборки образа в большинстве случаев.
- Frontend — статический SPA-бандл, отдаётся тем же Nginx, что и API.
Минус, который стоит знать заранее: Flarum до сих пор чувствителен к правам на файлы — движок пишет кеш и собранные ассеты в собственную директорию storage/, и если это не docker volume с правильным владельцем, будете ловить непонятные 500-е после каждого перезапуска контейнера.
Что понадобится перед стартом
- VPS с Docker и Docker Compose v2 (
docker compose versionдолжен отвечать без ошибок). Если Docker ещё не стоит — вот пошаговая установка Docker с нуля. - Домен, у которого A-запись указывает на IP сервера. Flarum жёстко привязывается к
FORUM_URLпри установке — сменить домен потом можно, но придётся руками лезть в базу иconfig.php, так что лучше сразу настроить домен и DNS. - Минимум 1 vCPU / 1 ГБ RAM для форума с небольшой нагрузкой; 2 ГБ — комфортный запас, если планируете держать на том же сервере ещё что-то (почту, мониторинг).
- Открытые 80 и 443 порты — их займёт reverse proxy для HTTPS.
Мы соберём Flarum не из стороннего образа «всё в одном», а из официального способа установки — через Composer поверх php-fpm, с отдельным Nginx и MariaDB. Так вы получаете контроль над версией PHP, набором расширений и полную свободу в апдейтах, без зависимости от того, обновляет ли автор community-образа теги.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверГотовый docker-compose.yml
Структура проекта:
flarum/
├── docker-compose.yml
├── Dockerfile
├── nginx/
│ └── default.conf
└── app/ # сюда Composer поставит Flarum, папка будет volume
docker-compose.yml:
services:
app:
build: .
container_name: flarum_app
restart: unless-stopped
volumes:
- ./app:/var/www/flarum
environment:
- PHP_MEMORY_LIMIT=256M
depends_on:
- db
networks:
- flarum_net
web:
image: nginx:1.27-alpine
container_name: flarum_web
restart: unless-stopped
ports:
- "8080:80"
volumes:
- ./app:/var/www/flarum
- ./nginx/default.conf:/etc/nginx/conf.d/default.conf:ro
depends_on:
- app
networks:
- flarum_net
db:
image: mariadb:11
container_name: flarum_db
restart: unless-stopped
environment:
- MARIADB_DATABASE=flarum
- MARIADB_USER=flarum
- MARIADB_PASSWORD=change_me_strong_password
- MARIADB_ROOT_PASSWORD=change_me_root_password
volumes:
- db_data:/var/lib/mysql
networks:
- flarum_net
volumes:
db_data:
networks:
flarum_net:
Dockerfile (собирает PHP-FPM с нужными расширениями и ставит Flarum через Composer):
FROM php:8.3-fpm-alpine
RUN apk add --no-cache \
icu-dev libzip-dev libpng-dev freetype-dev libjpeg-turbo-dev \
curl git unzip \
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
&& docker-php-ext-install -j$(nproc) \
pdo_mysql intl zip gd opcache
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
WORKDIR /var/www/flarum
# Ставим Flarum только если папка ещё пустая (при первом старте на пустом volume)
COPY docker-entrypoint.sh /usr/local/bin/
RUN chmod +x /usr/local/bin/docker-entrypoint.sh
ENTRYPOINT ["docker-entrypoint.sh"]
CMD ["php-fpm"]
docker-entrypoint.sh — ставит Flarum при первом запуске на пустой volume и выставляет права:
#!/bin/sh
set -e
if [ ! -f /var/www/flarum/composer.json ]; then
echo "Flarum не найден, ставим через Composer..."
composer create-project flarum/flarum . --no-interaction
fi
chown -R www-data:www-data /var/www/flarum/storage /var/www/flarum/public/assets 2>/dev/null || true
exec "$@"
Не забудьте chmod +x docker-entrypoint.sh на хосте до сборки.
nginx/default.conf:
server {
listen 80;
server_name _;
root /var/www/flarum/public;
index index.php;
client_max_body_size 20m;
location / {
try_files $uri $uri/ /index.php?$query_string;
}
location ~ \.php$ {
fastcgi_pass app:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
}
location ~ /\.(?!well-known) {
deny all;
}
}
Поднимаем:
docker compose up -d --build
docker compose logs -f app
Первый запуск займёт минуту-две — Composer скачивает зависимости Flarum и Laravel-компоненты внутрь ./app на хосте.
Установка через веб-мастер
Когда контейнеры поднялись, откройте http://ваш-домен:8080 (или просто http://IP:8080, если домен ещё не привязан) — Flarum покажет мастер установки. Понадобится:
- Database settings — хост
db, порт3306, имя базыflarum, пользователь и пароль — те же, что задали вMARIADB_USER/MARIADB_PASSWORD. - Administrator account — логин, email, пароль администратора форума.
- Forum settings — title и
Base URL. Здесь укажите итоговый адрес сhttps://, даже если пока проверяете по HTTP — после подключения SSL менять URL постфактум неприятно.
После установки мастер запишет config.php в корень app/ — он попадёт в volume и переживёт пересоздание контейнера. Сразу зайдите в админку (/admin) и проверьте раздел Basics → Base URL, если что-то не так с адресом.
HTTPS и домен через reverse proxy
Текущий compose отдаёт форум на 8080 без TLS — это нормально для проверки, но продакшен без HTTPS не варианты: браузеры будут ругаться, а куки сессии Flarum по умолчанию помечены Secure после включения forceHttps в настройках.
Проще всего добавить перед связкой Traefik или Caddy с автоматическим Let's Encrypt — оба варианта разобраны в отдельных материалах: Traefik как reverse proxy для Docker и Caddy с авто-SSL — частые ошибки и решения. Логика одна: прокси слушает 80/443, терминирует TLS и проксирует трафик на flarum_web:80 внутри той же docker-сети. После этого в docker-compose.yml порт 8080:80 у сервиса web можно убрать вовсе и оставить только внутреннюю сеть — наружу торчит уже прокси.
Общая логика построения такого compose-стека с несколькими сервисами и продакшен-настройками разобрана в статье про Docker Compose для продакшена — частые ошибки, рекомендую свериться перед выкладкой на боевой сервер.
Почта, расширения и обновление Flarum
Почта. Без исходящей почты не заработают подтверждение email и сброс пароля. Настраивается в Admin → Mail: SMTP-хост, порт (обычно 587 с STARTTLS), логин и пароль. Если используете внешний SMTP-сервис — просто впишите его данные, отдельный почтовый контейнер не нужен.
Расширения. Ставятся из Admin → Extensions → Discover — Flarum сам выполняет composer require внутри контейнера и переключает нужные флаги. Для этого контейнеру app нужен доступ в интернет и права на запись в app/ — при нашей схеме это выполняется автоматически, так как весь каталог смонтирован как volume с правами www-data.
Обновление ядра и расширений — из той же админки (кнопка Update) либо руками:
docker compose exec app composer update --with-all-dependencies
docker compose exec app php flarum migrate
docker compose exec app php flarum cache:clear
Перед обновлением обязательно снимите бэкап базы и папки app/ — Composer-апдейт иногда ломает совместимость сторонних расширений при мажорных релизах Flarum.
Бэкапы и типичные проблемы
Бэкапить нужно две вещи: базу MariaDB и папку app/ (там хранятся загруженные файлы, аватары, config.php и установленные расширения).
# Дамп базы
docker compose exec db mysqldump -u flarum -p flarum > flarum_$(date +%F).sql
# Архив данных приложения
tar czf flarum_app_$(date +%F).tar.gz ./app
Общие подходы к бэкапу MySQL-совместимых баз в контейнерах и типичные грабли разобраны в статье бэкап MySQL на сервере — частые ошибки, а по docker volume — в материале бэкап Docker volume — частые ошибки.
Частые проблемы, с которыми сталкиваются при первом запуске:
| Симптом | Причина | Решение |
|---|---|---|
| 500 ошибка сразу после установки | Нет прав на storage/ | Проверить chown www-data в entrypoint, пересоздать контейнер app |
| Белая страница вместо форума | JS-бандл не собрался или не отдаётся Nginx | Проверить docker compose logs web, путь root в nginx-конфиге |
| «502 Bad Gateway» | Nginx не видит php-fpm | Сверить имя сервиса app и порт 9000 в fastcgi_pass |
| После рестарта контейнера форум «забыл» настройки | app/ не был смонтирован как volume | Убедиться, что в compose есть ./app:/var/www/flarum у обоих сервисов |
| Расширения не ставятся из админки | Нет доступа в интернет из контейнера или нет прав записи | Проверить сеть контейнера и владельца файлов в app/ |
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Нужен ли Redis для Flarum?
Нет, по умолчанию Flarum использует файловый или database-кеш, Redis — опциональное ускорение при большой посещаемости, ставится отдельным сервисом в compose при необходимости.
Можно ли использовать PostgreSQL вместо MariaDB?
Flarum официально поддерживает только MySQL/MariaDB, PostgreSQL не заявлен как поддерживаемая СУБД.
Сколько RAM реально нужно под небольшой форум?
Для старта хватает 1 ГБ на все три контейнера (app, web, db), но с ростом базы данных и трафика комфортнее закладывать 2 ГБ, особенно если MariaDB держит несколько лет истории сообщений.
Как перенести существующий Flarum-форум в этот docker-compose?
Скопируйте старую папку с установкой Flarum вместо ./app, импортируйте дамп базы в контейнер db и поправьте config.php под новые хост/логин базы (db, flarum, ваш пароль).
Обязательно ли собирать свой Dockerfile, а не взять готовый образ из Docker Hub?
Нет, есть community-образы с уже собранным Flarum, но они не всегда быстро обновляются под новые версии PHP и ядра — самостоятельная сборка даёт предсказуемость на продакшене.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →