MAATRIX / Блог / Flarum в Docker Compose: готовый файл

Flarum в Docker Compose: готовый файл

MAATRIX

Классические форумные движки вроде 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 ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.

Перейти в сообщество →