Discourse на Ubuntu 24.04: пошаговая установка
Если вы выбираете движок для форума open-source проекта или сообщества, рано или поздно упрётесь в Discourse — с репутацией пользователей, тегами, встроенной модерацией и нормальным поиском вместо phpBB-наследия девяностых. Официальный способ установки — один Docker-контейнер со всем стеком внутри, и это одновременно и плюс (меньше ручной настройки), и источник вопросов, если раньше вы разворачивали сайты «по старинке». Ниже — рабочий процесс установки на чистый Ubuntu 24.04, без сокращений и с объяснением, что где может пойти не так.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Требования к серверу и подготовка
Discourse — не лёгкий движок. Ruby on Rails, PostgreSQL, Redis и Sidekiq для фоновых задач работают в одном контейнере, и это ощутимо ест память при сборке образа и в рантайме.
Минимальные требования, с которыми проект реально стартует и не падает при первой волне пользователей:
| Параметр | Минимум | Рекомендуется для продакшена |
|---|---|---|
| RAM | 2 ГБ + своп | 4 ГБ и больше |
| CPU | 1 vCPU | 2 vCPU |
| Диск | 25 ГБ SSD | 40+ ГБ SSD |
| ОС | Ubuntu 24.04 LTS | Ubuntu 24.04 LTS |
На 2 ГБ RAM сборка контейнера (./launcher bootstrap app) без свопа может просто убиться OOM-киллером — это частая причина «зависшей на полпути» установки. Если память впритык, сначала настройте своп: как и почему — в статье про настройку swap на Ubuntu 24.04. 1–2 ГБ свопа на диске SSD достаточно, чтобы сборка не падала, даже если постоянно она не понадобится.
Кроме сервера вам нужны:
- Домен, у которого A-запись указывает на IP сервера (Discourse официально не поддерживает установку без домена — SSL и email-ссылки завязаны на него);
- SMTP-доступ для исходящей почты (регистрация, уведомления, восстановление пароля) — свой почтовый сервер на том же IP для этого не годится, ниже объясню почему;
- root-доступ по SSH к чистому серверу.
Если с доменом и DNS раньше не работали — есть отдельный разбор про настройку домена и DNS с нуля.
Устанавливаем Docker
Discourse ставится и обновляется через собственный докер-образ, поэтому Docker Engine — обязательное условие. Если на сервере его ещё нет:
apt update && apt upgrade -y
apt install -y ca-certificates curl gnupg
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] \
https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo "$VERSION_CODENAME") stable" \
> /etc/apt/sources.list.d/docker.list
apt update
apt install -y docker-ce docker-ce-cli containerd.io docker-compose-plugin
Проверьте, что демон запущен:
systemctl status docker
docker --version
Подробный разбор с объяснением каждого шага и типичными граблями — в статье про установку Docker на Ubuntu 24.04 с нуля. Discourse не использует docker-compose напрямую — вместо этого у проекта свой обвязочный скрипт launcher, который живёт внутри репозитория discourse_docker.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверКлонируем discourse_docker и настраиваем app.yml
Официальный репозиторий разворачивается в /var/discourse:
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
chmod 700 containers
Discourse даёт интерактивный мастер настройки — discourse-setup, который сам сгенерирует containers/app.yml с базовыми параметрами:
./discourse-setup
Мастер спросит:
- Hostname — домен, на который указывает A-запись (например,
forum.example.com); - Email администратора — на него придёт письмо для создания первого аккаунта;
- SMTP-сервер, порт, логин, пароль, отправитель — без этого письма из Discourse просто не уйдут;
- Кол-во UNICORN-воркеров (веб-процессов) — по умолчанию мастер сам прикидывает исходя из объёма памяти, трогать не обязательно.
Если хотите настроить всё вручную или подправить готовый файл — он лежит в containers/app.yml и представляет собой обычный YAML с переменными окружения контейнера. Ключевые блоки, которые обычно правят руками:
env:
DISCOURSE_HOSTNAME: forum.example.com
DISCOURSE_DEVELOPER_EMAILS: 'admin@example.com'
DISCOURSE_SMTP_ADDRESS: smtp.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: postmaster@example.com
DISCOURSE_SMTP_PASSWORD: "пароль_приложения"
DISCOURSE_SMTP_ENABLE_START_TLS: true
LETSENCRYPT_ACCOUNT_EMAIL: admin@example.com
Обратите внимание на отступы — YAML к ним чувствителен, лишний пробел ломает парсинг при следующей пересборке.
Настройка почты: почему не свой Postfix на этом же сервере
Это частая ошибка новичков: ставят рядом с Discourse ещё и почтовый сервер на том же IP, и первые же письма улетают в спам. У свежего сервера без репутации, без правильных SPF/DKIM/DMARC и часто с IP из «серого» диапазона хостера почта до Gmail и Mail.ru просто не доходит или падает в спам-фильтр.
Практичный вариант — вынести отправку на внешний SMTP-сервис (свой почтовый сервер на отдельном домене/IP с прогретой репутацией, либо транзакционный SMTP-провайдер). Если хотите разобраться, чем самостоятельный Postfix отличается от готового решения и когда какой вариант оправдан — есть сравнение Postfix и mailcow для сервера. Если решите поднимать почту сами — пошаговая инструкция по установке Postfix на Ubuntu 24.04 тоже под рукой.
Проверить, что SMTP реально работает, можно ещё до бутстрапа контейнера — в мастере discourse-setup есть шаг отправки тестового письма.
Собираем и запускаем контейнер
Когда app.yml готов, запускаем сборку — она компилирует ассеты Rails, накатывает миграции PostgreSQL и настраивает Redis внутри контейнера. Процесс занимает от 10 до 25+ минут в зависимости от мощности CPU и диска:
cd /var/discourse
./launcher bootstrap app
./launcher start app
Если сборка падает с ошибкой нехватки памяти (Killed в логе или signal 9) — верните своп и повторите. Если всё прошло штатно, контейнер поднимет nginx внутри себя и начнёт слушать 80/443 порты хоста. Убедитесь, что порты не заняты другим веб-сервером:
ss -tulpn | grep -E ':80|:443'
Если на сервере уже стоит системный nginx — либо снимите его с этих портов, либо настройте reverse-proxy перед контейнером (тогда SSL внутри Discourse отключается через DOCKER_USE_SSL: false, и сертификат выпускает внешний nginx — логика разобрана в статье про nginx как reverse-proxy на Ubuntu 24.04). Для большинства небольших форумов проще довериться встроенному nginx и Let's Encrypt из app.yml — они настраиваются автоматически при указанном LETSENCRYPT_ACCOUNT_EMAIL.
После старта откройте https://forum.example.com — если DNS уже распространился, увидите мастер первичной настройки Discourse: создание админ-аккаунта (ссылка приходит на почту, указанную как DISCOURSE_DEVELOPER_EMAILS), название форума, категории по умолчанию.
После установки: что настроить сразу
Несколько вещей, которые лучше сделать в первый день, а не откладывать:
- Firewall. Оставьте открытыми только 22 (SSH), 80 и 443. Быстрый разбор — настройка UFW-файрвола на Ubuntu 24.04.
- Бэкапы. У Discourse есть встроенный бэкап через админку (
/admin/backups) — снимок базы и загруженных файлов в один архив, можно настроить расписание и выгрузку в S3-совместимое хранилище. Это защищает данные форума, но не сам сервер целиком — если хотите резервировать VPS полностью на уровне диска, посмотрите на автоматические бэкапы на Ubuntu 24.04. - Категории и группы. Настройте структуру разделов под тематику сообщества до открытия регистрации — переносить темы между категориями потом дольше, чем спроектировать сразу.
- Плагины. Discourse ставит официальные плагины (например,
discourse-solved,discourse-akismet) черезapp.yml, добавлением строки в блокhooksи повторным./launcher rebuild app. Смена набора плагинов = пересборка контейнера, а не просто рестарт. - Rate limits и защита от спам-регистраций. В
/admin/settingsвключите approve для новых аккаунтов вручную или через инвайты, если форум приватный.
Обновление движка делается той же командой, что и первичная сборка:
cd /var/discourse
git pull
./launcher rebuild app
rebuild пересобирает образ и переносит данные (они хранятся в отдельном volume вне контейнера), поэтому обновление безопасно даже на проде — но перед мажорными версиями всё же снимите бэкап через админку.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли поставить Discourse без Docker?
Официально — нет, разработчики поддерживают только контейнерную установку. «Голая» установка на Ruby/Rails технически возможна, но без поддержки сообщества и с риском разъехаться с апстримом при каждом обновлении.
Хватит ли 2 ГБ RAM для небольшого форума на 50–100 человек?
С правильно настроенным свопом — да, для старта хватит, но сборка контейнера будет медленнее и почта/поиск при пиковой нагрузке могут подтормаживать. Для комфортной работы закладывайте 4 ГБ.
Почему письма не приходят даже с настроенным SMTP?
Чаще всего причина не в Discourse, а в самом SMTP: неверный пароль приложения (для Gmail/Yandex нужен именно пароль приложения, а не основной), закрытый исходящий порт 587 у хостера, либо письма реально уходят, но падают в спам — проверьте SPF/DKIM у домена отправителя.
Как перенести Discourse на другой сервер?
Через встроенный бэкап: снимаете архив в /admin/backups на старом сервере, разворачиваете чистый Discourse на новом по этой же инструкции, а на шаге после ./launcher bootstrap app восстанавливаете архив через тот же раздел админки.
Нужен ли отдельный сервер под PostgreSQL и Redis?
Для форумов до нескольких тысяч активных пользователей в месяц — нет, всё живёт в одном контейнере без проблем. Вынос БД на отдельный сервер имеет смысл только при действительно высокой нагрузке или требованиях по отказоустойчивости.
Discourse поддерживает вход через соцсети?
Да, в app.yml включаются DISCOURSE_ENABLE_*_LOGINS для Google, GitHub, Discord, Twitter и других — каждый провайдер требует своих OAuth-ключей, которые заводятся в консоли соответствующего сервиса.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →