Установка Discourse на CentOS 8 с помощью Docker

Краткое введение
Discourse — свободная платформа для современных форумов. Подходит для почтовых списков, форумов, длинных чатов и прочего. В бэкенде используется Ruby on Rails, фронтенд на Ember.js, база данных — PostgreSQL, кеш — Redis. В этом руководстве мы разберём установку с помощью Docker на CentOS 8.
Основные варианты развёртывания
- Docker (рекомендуется для простого и быстрого развёртывания).
- Нативная установка (более гибкая, требует больше знаний Ruby/Postgres/Redis).
- Управляемые облачные решения (подходит, если не хотите администрировать сервер).
Требования и предпосылки
- Сервер с CentOS 8 (root-доступ).
- Действующее доменное имя, направленное на IP сервера.
- Доступ к SMTP (для подтверждений email).
- Минимум 4 ГБ RAM и 2 физических CPU (рекомендуется для небольшого сообщества).
- Открытые порты 80 и 443 в брандмауэре.
Полезная памятка: Discourse использует Docker-контейнер, внутри которого развернут Rails, PostgreSQL и Redis — вам нужно следить за ресурсами хоста и резервным копированием /var/discourse.
Шаг 1. Установка Docker
Docker не всегда присутствует в стандартном репозитории CentOS 8, поэтому добавим официальный репозиторий и установим пакет:
dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repoЗатем установите Docker:
dnf install docker-ce --nobestЗапустите сервис и включите автозагрузку:
systemctl start docker
systemctl enable dockerПроверьте версию Docker:
docker --version(В примере ожидается вывод примерно вида: Docker version 20.10.1, build 831ebea).
Важно: на CentOS 8 SELinux может блокировать некоторые действия контейнеров. Если вы столкнётесь с проблемами прав доступа, проверьте /var/log/audit/audit.log и рассмотрите настройку boolean для контейнеров или временное перевод SELinux в режим permissive для диагностики.
Шаг 2. Загрузка и подготовка Discourse
Создайте каталог для Discourse и клонируйте официальный репозиторий с шаблонами Docker:
mkdir /opt/discoursegit clone https://github.com/discourse/discourse_docker.git /opt/discourseПерейдите в каталог и запустите скрипт установки:
cd /opt/discourse
./discourse-setupВо время выполнения вам предложат ввести FQDN (полное доменное имя), email администратора и параметры SMTP. Пример интерактивного вывода и запросов из скрипта:
which: no docker.io in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
which: no docker.io in (/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin)
Ports 80 and 443 are free for use
'samples/standalone.yml' -> 'containers/app.yml'
Found 4GB of memory and 2 physical CPU cores
setting db_shared_buffers = 1024MB
setting UNICORN_WORKERS = 4
containers/app.yml memory parameters updated.
Hostname for your Discourse? [discourse.example.com]: discourse.linuxbuz.com
Далее скрипт запросит SMTP-сервер, порт, логин и пароль. Пример вопросов и сводной проверки:
Checking your domain name . . .
Connection to discourse.linuxbuz.com succeeded.
Email address for admin account(s)? [[email protected],[email protected]]: [email protected]
SMTP server address? [smtp.example.com]: smtp.gmail.com
SMTP port? [587]:
SMTP user name? [[email protected]]: [email protected]
SMTP password? [pa$$word]: yourpassword
Optional email address for Let's Encrypt warnings? (ENTER to skip) [[email protected]]: [email protected]
Does this look right?
Подтвердите ввод и начнётся сборка и запуск контейнера. Скрипт создаст контейнер с именем app и пробросит порты 80 и 443.
Пример команды docker run, которую запустит скрипт (оставлено как исходный вывод):
+ /usr/bin/docker run --shm-size=512m -d --restart=always -e LANG=en_US.UTF-8 -e RAILS_ENV=production -e UNICORN_WORKERS=4 -e UNICORN_SIDEKIQS=1 -e RUBY_GLOBAL_METHOD_CACHE_SIZE=131072 -e RUBY_GC_HEAP_GROWTH_MAX_SLOTS=40000 -e RUBY_GC_HEAP_INIT_SLOTS=400000 -e RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=1.5 -e DISCOURSE_DB_SOCKET=/var/run/postgresql -e DISCOURSE_DB_HOST= -e DISCOURSE_DB_PORT= -e LETSENCRYPT_DIR=/shared/letsencrypt -e DISCOURSE_HOSTNAME=discourse.linuxbuz.com -e [email protected] -e DISCOURSE_SMTP_ADDRESS=smtp.gmail.com -e DISCOURSE_SMTP_PORT=587 -e [email protected] -e DISCOURSE_SMTP_PASSWORD=yourpassword -e [email protected] -h centos8-app -e DOCKER_HOST_IP=172.17.0.1 --name app -t -p 80:80 -p 443:443 -v /var/discourse/shared/standalone:/shared -v /var/discourse/shared/standalone/log/var-log:/var/log --mac-address 02:e0:37:60:d3:09 local_discourse/app /sbin/boot
ab3bdf3c169d47d9ff06052f48ff078d46393f1152b651b9fd3354594cc38714
Проверьте запущенные контейнеры:
docker psОжидаемый вывод содержит контейнер app, проброшенные порты 80 и 443:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ab3bdf3c169d local_discourse/app "/sbin/boot" 22 seconds ago Up 21 seconds 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp app
Шаг 3. Доступ к веб-интерфейсу
Откройте браузер по адресу https://ваш-домен и вы перейдёте на страницу настройки Discourse. Интерфейс предложит регистрацию администратора и подтверждение email.

Нажмите кнопку Register и заполните форму регистрации администратора.

После регистрации вы получите письмо для активации аккаунта.

Проверка и отладка
- Логи контейнера: docker logs app
- Проверка соединения SMTP: используйте swaks или telnet для проверки подключения к SMTP-серверу.
- Проверка брандмауэра: firewall-cmd –list-all –zone=public и откройте 80/443 если нужно.
- SELinux: audit2why и setenforce 0 для временной диагностики.
Частые проблемы и когда они встречаются:
- Ошибка Let’s Encrypt: проверьте, что домен указывает на IP сервера и порт 80 открыт.
- Ошибки SMTP: неверные логин/пароль или блокировка со стороны провайдера (например, Gmail может требовать App Password или OAuth).
- Недостаточно памяти: контейнеры могут падать при нехватке RAM — добавьте swap или увеличьте ОЗУ.
Безопасность и эксплуатация
- Настройте автоматическое обновление образов и периодическую проверку CVE для образа Discourse.
- Бэкап: копируйте /var/discourse/shared/standalone/backups и базу данных PostgreSQL.
- HTTPS: используйте встроенную поддержку Let’s Encrypt (скрипт предложит адрес для уведомлений).
- Ограничьте доступ к SSH и настройте fail2ban.
Рекомендация: периодически тестируйте восстановление из резервной копии на тестовом сервере.
Альтернативные подходы и когда выбирать их
- Нативная установка на хосте: если нужно тонко настраивать Ruby/ểmiddleware.
- Kubernetes: для крупных сообществ с требованием высокой доступности.
- Управляемый хостинг: если хотите избежать админской нагрузки.
Чек-листы ролей
Для администратора сервера:
- DNS A-запись указывает на сервер.
- Порты 80/443 открыты.
- Установлен Docker и включён.
- Резервное копирование настроено.
Для администратора Discourse:
- SMTP работает и письма доходят.
- Создана и подтверждена учётная запись администратора.
- Проверены настройки Let’s Encrypt и политики паролей.
Критерии приёмки
- Сайт доступен по HTTPS без предупреждений.
- Регистрация администратора проходит и подтверждение по email успешно.
- Контейнер app в статусе Up и слушает порты 80/443.
- Резервная копия успешно создаётся и восстанавливается на тестовом хосте.
Мини-методология поддержки (SOP)
- Проверить состояние Docker: systemctl status docker; docker ps.
- Просмотреть логи приложения: docker logs app –tail 200.
- Выполнить проверку SMTP и DNS.
- При необходимости восстановить из последней резервной копии.
Короткий глоссарий
- FQDN — полное доменное имя сервера.
- SMTP — протокол для отправки почты.
- SELinux — подсистема безопасности Linux.
Ресурсы и примечания
- Официальный репозиторий Discourse: https://github.com/discourse/discourse_docker
- Документация по Docker и CentOS 8.
Заключение
Поздравляем — вы установили Discourse на CentOS 8 с помощью Docker. Проверьте SMTP и HTTPS, настройте бэкапы и мониторинг. Если требуется масштабирование, рассмотрите переход на Kubernetes или выделение внешних сервисов для PostgreSQL и Redis.
Вопросы и проблемы: опишите шаг, результат и логи — это ускорит диагностику.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента