Как установить и настроить Discourse на VPS
Если вы делаете сообщество для open-source проекта, продукта или комьюнити и устали от того, что старые форумные движки выглядят как привет из 2008 года — Discourse решает это за один вечер. Он даёт репутацию, теги, доверительные уровни, живые уведомления и SSO из коробки, но ставится не через apt install, а через собственный Docker-лаунчер с непривычной логикой пересборки образа при каждом изменении конфига. Ниже — рабочий процесс установки на чистый VPS без пропущенных шагов и без розовых очков: где спотыкается почти каждый, кто делает это впервые.
Содержание
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →Что нужно подготовить перед установкой
Discourse — не лёгкий Rails-скрипт, а полноценное production-приложение с Ruby on Rails, PostgreSQL, Redis и Sidekiq внутри одного контейнера. Официальная документация просит от 2 ГБ RAM, но это тот случай, когда «работает» и «работает без нервотрёпки при ребилде» — разные вещи.
Минимальный набор:
- VPS с 2 ядрами и 4 ГБ RAM (2 ГБ хватает только для маленьких сообществ с ограниченной нагрузкой, и ребилд образа на них может упасть по памяти — на этот случай пригодится swap);
- 20+ ГБ SSD — образ Discourse сам по себе тяжёлый, плюс аплоады, плюс бэкапы;
- чистый Ubuntu 24.04 или Debian 12;
- домен, у которого A-запись уже смотрит на IP сервера (без домена и рабочего DNS Let's Encrypt внутри Discourse не выпустит сертификат);
- открытые порты 80 и 443 наружу — Discourse сам поднимает nginx внутри контейнера и слушает их напрямую, отдельный внешний реверс-прокси не обязателен;
- рабочий SMTP-relay — сторонний (Mailgun, SendGrid, Postmark, Amazon SES) или свой Postfix — без него Discourse не отправит ни одного письма, включая письмо активации первого админа.
Docker и Docker Compose на сервере должны быть установлены заранее — если ещё не разворачивали Docker на этом VPS, порядок действий описан в статье про установку Docker с нуля на Ubuntu 24.04.
Клонируем discourse_docker и запускаем мастер
Discourse официально распространяется как git-репозиторий с шаблонами Docker-образа, а не как готовый образ на Docker Hub — так проще кастомизировать сборку под свои плагины.
sudo -s
mkdir -p /var/discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourse
cd /var/discourse
git pull
Дальше запускаем интерактивный установщик — он сам сгенерирует app.yml по вашим ответам:
./discourse-setup
Мастер спросит:
- Hostname — домен форума, например
forum.example.com; - Developer emails — email, который получит права администратора автоматически при первой регистрации;
- SMTP address/port/username/password — данные вашего почтового relay;
- Notification email address — адрес, с которого форум будет слать письма (
noreply@forum.example.com); - Let's Encrypt account email — на него придут уведомления об истечении сертификата.
После ответов на все вопросы скрипт спросит подтверждение и сразу запустит ./launcher bootstrap app — первую сборку образа, которая обычно занимает 5–15 минут в зависимости от мощности VPS и скорости сети. Если процесс падает с ошибкой нехватки памяти на этапе assets:precompile — это почти всегда голая RAM без swap, о котором писали выше.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверЧто в итоге лежит в app.yml
Даже если вы прошли мастер, полезно понимать структуру файла /var/discourse/containers/app.yml — именно в него потом придётся руками вносить изменения (плагины, лимиты, дополнительные переменные).
Ключевые блоки:
templates:
- "templates/postgres.template.yml"
- "templates/redis.template.yml"
- "templates/web.template.yml"
- "templates/web.ssl.template.yml"
- "templates/web.letsencrypt.ssl.template.yml"
expose:
- "80:80"
- "443:443"
env:
DISCOURSE_HOSTNAME: forum.example.com
DISCOURSE_DEVELOPER_EMAILS: 'admin@example.com'
DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: postmaster@forum.example.com
DISCOURSE_SMTP_PASSWORD: "пароль_из_личного_кабинета_smtp"
LETSENCRYPT_ACCOUNT_EMAIL: admin@example.com
volumes:
- volume:
host: /var/discourse/shared/standalone
guest: /shared
- volume:
host: /var/discourse/shared/standalone/log/var-log
guest: /var/log
Обратите внимание на подключённые тома PostgreSQL и Redis — они живут внутри одного контейнера app, но данные хранятся на хосте в /var/discourse/shared/standalone, а не в эфемерном слое контейнера. Это важно держать в голове при бэкапах и переезде на другой сервер.
SMTP — место, где ломается почти каждая первая установка
Без рабочей отправки почты Discourse формально запустится, но окажется бесполезным: не придёт письмо активации первому админу, не будут работать уведомления, приглашения, восстановление пароля. Большинство хостинг-провайдеров, включая обычные VPS, по умолчанию блокируют исходящий 25-й порт для защиты от спама — поэтому свой Postfix как relay для Discourse часто требует отдельной настройки и прогретого IP, а начинающим проще подключить внешний транзакционный SMTP-сервис с бесплатным лимитом на первые тысячи писем в месяц.
Проверить, что почта реально уходит, можно прямо из контейнера:
cd /var/discourse
./launcher enter app
rails c
В открывшейся Rails-консоли:
Email::Sender.new(TestMailer.send_test('ваш_email@example.com'), :test_message).send
Если письмо не пришло — сначала проверьте логи доставки в самом сервисе SMTP (у большинства провайдеров есть журнал отправок в личном кабинете), а если используете собственный сервер как relay — статья про недоставку почты с сервера разбирает частые причины: закрытый исходящий 25-й порт, отсутствующие SPF/DKIM записи, PTR-запись, не совпадающая с hostname.
SSL, домен и перезапуск после правок
Сертификат Let's Encrypt Discourse получает и обновляет сам через встроенный шаблон web.letsencrypt.ssl.template.yml, отдельно поднимать certbot не нужно — это отличается от классической схемы «свой nginx + Let's Encrypt руками», принятой для большинства других сайтов на VPS. Условие одно: домен должен резолвиться на IP сервера ещё до бутстрапа контейнера, иначе валидация ACME challenge не пройдёт.
Любое изменение app.yml — не hot reload, а полная пересборка:
cd /var/discourse
./launcher rebuild app
Команда останавливает старый контейнер, собирает новый образ с учётом изменённых переменных и запускает его — на это уходит несколько минут простоя форума. Для рутинных операций без изменения конфига есть более лёгкие команды:
./launcher stop app
./launcher start app
./launcher restart app
./launcher logs app
Обновление самого Discourse до новой версии делается двумя способами: через веб-интерфейс /admin/upgrade (проще, подходит для большинства) или через ./launcher rebuild app после git pull в /var/discourse — второй способ обязателен, если вы добавляли кастомные плагины через app.yml.
Бэкапы и настройка под ресурсы конкретного VPS
Discourse умеет бэкапить сам себя целиком — базу, аплоады и настройки — через /admin/backups в веб-интерфейсе, файл сохраняется в /var/discourse/shared/standalone/backups. Для регулярных автоматических бэкапов на внешнее хранилище (S3-совместимое) настройки задаются там же, в разделе Backups админки, без правки app.yml. Если вы уже используете на других серверах отдельное решение вроде restic или BorgBackup для копирования вовне — том /var/discourse/shared/standalone можно добавить в существующий сценарий бэкапа как обычную директорию, как описано в статье про установку и настройку BorgBackup.
Число воркеров Unicorn (Rails-процессов, обрабатывающих запросы) стоит подогнать под реальную память сервера — по умолчанию мастер ставит значение, рассчитанное на 4 ГБ. Если у вас меньше, лучше явно ограничить:
env:
UNICORN_WORKERS: 2
Слишком большое число воркеров на маленьком VPS приводит к тому, что Linux OOM killer будет периодически убивать процессы Discourse под нагрузкой — в логах ./launcher logs app это видно как внезапные рестарты unicorn без явной ошибки в приложении.
Плагины (SSO, Discourse Chat интеграции, кастомные темы) добавляются не через админку файлами, а через git-хуки в app.yml:
hooks:
after_code:
- exec:
cd: $home/plugins
cmd:
- git clone https://github.com/discourse/docker_manager.git
После добавления — снова полный ./launcher rebuild app, без него плагин не подхватится.
Нужен сервер под эту задачу?
Разверните VPS MAATRIX за пару минут: NVMe, AMD EPYC, root-доступ, локации UK, США, Франция и РФ. Оплата картой РФ и по СБП.
Арендовать серверНужны сами нейросети для контента?
Генерируйте изображения, видео и озвучку нейросетями на falapi.io — десятки моделей в одном окне. Оплата картой РФ и по СБП.
Частые вопросы
Можно ли запустить Discourse без домена, только по IP?
Технически можно указать IP как hostname, но Let's Encrypt так сертификат не выпустит, а часть функций (email-ссылки, SSO) полагается на постоянный домен. Для продакшена домен обязателен.
Почему ребилд занимает так долго на слабом VPS?
Сборка образа компилирует ассеты Rails и ставит гемы — это CPU- и memory-intensive процесс. На 2 ядрах и 4 ГБ обычно укладывается в 10–15 минут, но точное время зависит от загрузки сервера и скорости сети — ориентируйтесь на этот диапазон, а не на секунды.
Что делать, если после rebuild контейнер не стартует?
Сначала смотрите ./launcher logs app — там видна первопричина: чаще всего это синтаксическая ошибка в app.yml (неверные отступы YAML) или недоступный SMTP/PostgreSQL при старте.
Нужен ли отдельный nginx на хосте перед Discourse?
Нет, если Discourse — единственное приложение на этом порту 80/443. Если на сервере уже крутятся другие сайты и нужен общий реверс-прокси перед несколькими контейнерами, тогда пригодится связка с nginx как реверс-прокси, но это отдельная и не самая тривиальная схема — придётся отключать встроенный nginx-шаблон Discourse.
Discourse точно требует именно 2+ ГБ RAM, а не меньше?
Формально стартует и на 1 ГБ со swap, но ребилд образа и работа Sidekiq под реальной нагрузкой на таком объёме памяти будут регулярно упираться в лимиты — для стабильной работы закладывайте от 4 ГБ.
Обсудить статью, задать вопрос или начать новую тему
Есть вопрос по этой статье, идея для обсуждения или просто хотите поделиться опытом? Сообщество MAATRIX ждёт. Для общения, пожалуйста, зарегистрируйтесь в нашем личном кабинете.
Перейти в сообщество →