Установка Discourse на CentOS 7 с Nginx и бесплатным SSL Let's Encrypt
Установка Discourse на CentOS 7 в контейнере Docker с Nginx как обратным прокси и бесплатным SSL от Let’s Encrypt. Подход включает: установка Docker, клонирование официального скрипта Discourse, правка шаблона containers/app.yml (порт, hostname, SMTP), генерация сертификата letsencrypt, настройка Nginx и запуск через launcher. В статье — подробный пошаговый план, чек‑листы, сценарии отладки и рекомендации по безопасности.
Введение
Discourse — свободное ПО для форумов и рассылок, написанное на Ruby и JavaScript. Его часто разворачивают в контейнерах Docker и ставят за обратным прокси (Nginx) для упрощения SSL и масштабирования. В этом руководстве показан процесс развёртывания на CentOS 7: от установки Docker до запуска и дополнительных настроек (SMTP, SSL, Nginx).
Важно: для корректной работы требуются корневые права на сервере и рабочая SMTP‑учётная запись (Mailgun, SendGrid, Mailjet и др.).
Содержание (основные шаги)
- Установка Docker на CentOS 7
- Установка и конфигурация Discourse (Docker/launcher)
- Получение SSL‑сертификата от Let’s Encrypt
- Настройка Nginx как обратного прокси для Discourse
- Первоначальная веб‑установка и создание администратора
- Дополнительная конфигурация, устранение проблем и безопасность
Что потребуется
- Сервер с CentOS 7
- root/права sudo
- Доменное имя (A/AAAA запись, указывающая на сервер)
- SMTP‑аккаунт для подтверждения почты
Термины в одну строку
- Docker: система контейнеризации приложений.
- Nginx: веб‑сервер и обратный прокси.
- launcher: утилита в официальном образе Discourse для управления контейнерами.
- Let’s Encrypt: бесплатный центр сертификации (ACME).
Шаг 1 — Установка Docker на CentOS 7
Discourse удобно запускать внутри Docker‑контейнера. На CentOS 7 можно установить движок Docker одним скриптом от официального проекта.
Выполните:
wget -qO- https://get.docker.com/ | shЕсли у вас отсутствует wget, установите его:
yum -y install wgetЗапустите и включите Docker при старте системы:
systemctl start docker
systemctl enable dockerПроверьте статус:
systemctl status docker
Совет: если вы используете облачный провайдер, убедитесь, что в правилах сети/фаервола открыт ssh и доступ по HTTP/HTTPS (позже при настройке Nginx).
Шаг 2 — Установка и конфигурация Discourse
Клонируйте официальный репозиторий с Docker‑скриптами Discourse и подготовьте контейнер.
Установите git:
yum -y install gitСоздайте рабочую папку и клонируйте скрипты:
mkdir -p /var/discourse
git clone https://github.com/discourse/discourse_docker.git /var/discourseПерейдите в папку и скопируйте образец конфигурации:
cd /var/discourse
cp samples/standalone.yml containers/app.yml
Откройте файл для редактирования:
vim containers/app.ymlПараметры портов и прокси
В нашем варианте Nginx будет принимать HTTPS на 443 и проксировать запросы в контейнер. Поэтому контейнеру Discourse достаточно слушать HTTP (порт 80). На хосте откроем нестандартный порт 2045 и пробросим его к 80 контейнера.
Найдите и отредактируйте секцию expose так, чтобы получилось примерно:
expose:
- "2045:80" # http
# - "443:443" # https(Мы отключаем проксирование HTTPS контейнером, чтобы терминировать TLS на Nginx.)
Укажите домен и email разработчика
В файле containers/app.yml задайте имя хоста (обязательно) и email администратора:
DISCOURSE_HOSTNAME: 'discourse.example.com'
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'Замените discourse.example.com на ваш реальный домен.
SMTP‑конфигурация
Для отправки писем (регистрация, восстановление пароля) Discourse требует рабочий SMTP. Раскомментируйте и заполните поля SMTP. Пример для Mailgun:
DISCOURSE_SMTP_ADDRESS: smtp.mailgun.org
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: [email protected]
DISCOURSE_SMTP_PASSWORD: mypasswordВажно: неверные SMTP‑данные — самая частая причина, по которой вы не будете получать email с подтверждениями.
Сохраните файл.
Сборка и запуск контейнера
Сборка:
sudo ./launcher bootstrap appЗапуск:
sudo ./launcher start appПроверьте список контейнеров и проброшенные порты:
docker ps -a
netstat -plntu

Если контейнер запущен и слушает порт 2045 на хосте — можно переходить к получению SSL и настройке Nginx.
Шаг 3 — Получение SSL‑сертификата от Let’s Encrypt
Мы будем принимать только HTTPS на Nginx. Для этого генерируем бесплатный сертификат от Let’s Encrypt.
Установите клиента Letsencrypt (в старых инструкциях это утилита letsencrypt; в новых — certbot; на CentOS 7 возможны варианты пакетов).
yum -y install letsencryptОткройте порт 80/443 в firewalld (или настройте security group провайдера):
firewall-cmd --add-service=http --permanent
firewall-cmd --add-service=https --permanent
firewall-cmd --reload
Запустите интерактивное получение сертификата:
letsencrypt certonlyВыберите вариант, который предлагает утилита (например, временный веб‑сервер для проверки), подтвердите email и укажите ваш домен (discourse.example.com). После успешного выполнения сертификаты будут в /etc/letsencrypt/live/<ваш_домен>/

Совет: добавьте автоматическое обновление сертификатов в cron или systemd timer, например letsencrypt renew и перезагрузка Nginx после обновления.
Шаг 4 — Установка и настройка Nginx как обратного прокси
Установим Nginx из EPEL и настроим безопасные SSL‑параметры и проксирование к контейнеру, слушающему на порт 2045.
Установка EPEL и nginx:
yum -y install epel-release
yum -y install nginxПерейдите в директорию конфигурации:
cd /etc/nginx/Создайте общий SSL‑файл ssl.conf с рекомендуемыми опциями:
vim ssl.confВставьте:
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;
ssl_protocols TLSv1.2;
ssl_ciphers EECDH+AESGCM:EECDH+AES;
ssl_ecdh_curve secp384r1;
ssl_prefer_server_ciphers on;
ssl_stapling on;
ssl_stapling_verify on;
add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;Сохраните файл.
Создайте виртуальный хост для вашего домена:
vim conf.d/discourse.confВставьте:
server {
listen 80; listen [::]:80;
server_name discourse.example.com;
# Redirect HTTP to HTTPS
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name discourse.example.com;
# SSL
ssl_certificate /etc/letsencrypt/live/discourse.example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/discourse.example.com/privkey.pem;
include /etc/nginx/ssl.conf;
# Reverse proxy to Discourse (container на порту 2045)
location / {
proxy_pass http://discourse.example.com:2045/;
proxy_set_header Host $http_host;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect http://discourse.example.com:2045/ https://discourse.example.com;
}
}Замените discourse.example.com на ваш домен, при необходимости скорректируйте пути к сертификатам.
Проверка конфигурации и перезапуск:
nginx -t
systemctl restart nginx
Проверьте, что ваш домен отвечает по HTTPS.
Шаг 5 — Веб‑установщик Discourse и создание администратора
Откройте браузер и перейдите на https://discourse.example.com — вы будете перенаправлены на HTTPS. Следуйте веб‑интерфейсу: нажмите Register и создайте администратора.

При регистрации Discourse отправляет письмо подтверждения на указанный email. Если почта не приходит — проверьте SMTP‑параметры (app.yml). Если почта не настроена, можно временно активировать админа вручную.

После подтверждения вы попадёте на приветственную страницу и в админ‑панель.

Шаг 6 — Дополнительная конфигурация и отладка
Если вы не получили письмо с подтверждением
- Проверьте, что в containers/app.yml указаны корректные SMTP параметры.
- Убедитесь, что SMTP провайдер не блокирует отправку (часто для новых аккаунтов требуется подтверждение домена в Mailgun/SendGrid).
- Временно активируйте админа из контейнера:
cd /var/discourse
./launcher enter app
rails c
u = User.last
u.admin = true
u.activate
u.saveПосле этого сможете войти в интерфейс.
Логи и диагностика контейнера
- Просмотр логов приложения:
./launcher logs app- Повторная пересборка контейнера (после правок app.yml):
./launcher rebuild appВажно: rebuild заново соберёт контейнеры — это прервет сервис на время сборки.
Практические рекомендации по безопасности
- Отключите прямой доступ к контейнеру из интернета — проксируйте через Nginx.
- Обновляйте Docker и дискурс‑образ по мере выхода обновлений.
- Настройте автоматическое обновление сертификата Let’s Encrypt: добавьте cron
0 3 * * * /usr/bin/letsencrypt renew --quiet && systemctl reload nginx. - Минимизируйте привилегии: не запускайте другие сервисы на хосте, который обслуживает форумы с высокой активностью.
- Регулярно делайте бекапы базы данных Discourse и папки /var/discourse/shared/ (включая attachments).
План действий — сжатый SOP для инжиниринга
- Подготовка сервера: обновление, открытие SSH.
- Установка Docker и git.
- Клонирование /var/discourse и правка containers/app.yml.
- Bootstrap и запуск launcher.
- Генерация SSL (letsencrypt certonly).
- Установка Nginx и настройка прокси/SSL.
- Тест SSL и веб‑инсталлятор.
- Настройка cron для обновления сертификатов и бекапов.
Чек‑лист по ролям
DevOps:
- Установлен Docker
- Контейнер запущен и слушает порт 2045
- Nginx настроен и валидно завершает TLS
- SSL сертификат корректно размещён и имеет cron‑обновление
Администратор форума:
- Создан администратор и активирован
- Настроена почта (SMTP) и подтверждение доменов в провайдере
- Настроены политики безопасности (пароли, 2FA для админов)
Разработчик/Интегратор:
- Установлены плагины, тестированы в staging окружении
- Настроен резервный канал оповещений при падении сервиса
Когда этот подход не подходит (критерии отказа)
- У вас уже есть развёрнутая инфраструктура с Kubernetes и требуется управление на уровне k8s — тогда стоит развернуть Discourse как набор Kubernetes‑подов.
- Требуется масштабирование с географическим балансировщиком на уровне приложения — контейнер + простой Nginx может не покрыть всех сценариев.
- Нужны комплексные кастомизации ядра Discourse — возможно предпочтительней деплой на виртуальной машине с полноценной CI/CD.
Альтернативные подходы
- Установка Discourse без Docker — не рекомендуется официально, но возможна для опытных администраторов.
- Развёртывание на Ubuntu/Debian — официальные инструкции Discourse чаще ориентированы на Debian‑семейство и могут быть более свежими.
- Использование managed‑услуг (например, DiscourseCloud или хостинг‑провайдеров) — если не хотите управлять инфрастуктурой.
Стратегия тестирования и контроль приёмки
Критерии приёмки:
- Домен отвечает по HTTPS и валидно завершает TLS для основного имени.
- Пользователь может зарегистрироваться и подтвердить почту (или администратор активирован вручную).
- Веб‑панель администратора доступна и показывает работающий сайт.
- Резервное копирование настроено и проверено (восстановление одного топика).
Тесты:
- Функциональный: регистрация и подтверждение почты; создание топика, комментария, загрузка изображения.
- Нагрузочный: базовый smoke‑test 50 параллельных пользователей (при необходимости масштабирования).
- Безопасность: сканирование на уязвимости web‑интерфейса.
Резервное копирование и откат
Резервируйте папку /var/discourse/shared/standalone и экспортируйте дамп базы данных Postgres внутри контейнера.
Простой сценарий бэкапа:
- ./launcher enter app
- rake posts:backups:create (если настроено)
- Копирование /var/discourse/shared/backup/* на внешнее хранилище
Для отката восстановите самый свежий бекап через интерфейс восстановления Discourse или напрямую в контейнере.
Мини‑справочник команд (cheat sheet)
- Проверить контейнеры:
docker ps -a - Логи приложения:
./launcher logs app - Войти в контейнер:
./launcher enter app - Пересборка контейнера:
./launcher rebuild app - Проверка nginx:
nginx -t - Перезапуск nginx:
systemctl restart nginx - Обновление сертификатов:
letsencrypt renew(и перезагрузка nginx)
Короткая справка по безопасности SSL
- Используйте TLSv1.2 как минимум. При возможности добавьте TLSv1.3.
- Включите HSTS (в конфигурации выше) — будьте осторожны с preload до полного тестирования.
- Настройте OCSP stapling и регулярную проверку цепочки сертификатов.
Политика конфиденциальности и почта (коротко)
Discourse хранит адреса электронной почты и персональные данные участников. Убедитесь, что ваша политика обработки данных соответствует требованиям локального законодательства (например, GDPR для пользователей из ЕС): информируйте пользователей, собирайте согласие и предоставляйте возможность удаления аккаунта и данных.
Краткие рекомендации по миграции/совместимости
- Если вы переносите форум на другой домен, обновите переменную DISCOURSE_HOSTNAME и пересоберите контейнер.
- При переносе на другой хост — перенесите /var/discourse/shared и бекапы БД.
Резюме
Вы установили Discourse на CentOS 7, запустили его в Docker и настроили Nginx как обратный прокси с бесплатным SSL от Let’s Encrypt. Дополнительно рассмотрены сценарии отладки, безопасность, резервное копирование и чек‑листы по ролям.
Важно: тестируйте все изменения в staging среде перед применением в production и следите за обновлениями Discourse и зависимостей.
Полезные ссылки
Критерии приёмки
- HTTPS корректно настроен и валиден
- Администратор создан и активирован
- Письма из форума доставляются (SMTP работает)
Факт‑бокс — ключевые числа
- Порт прокси на хосте: 2045 (в примере)
- Порт внутри контейнера: 80
- Пути сертификатов: /etc/letsencrypt/live/<ваш_домен>/
Однострочный глоссарий
- launcher: скрипт управления контейнером Discourse в /var/discourse/launcher.
Завершение
Если нужна помощь с адаптацией конфигурации под вашу инфраструктуру (firewall, SELinux, балансировщики нагрузки), опишите окружение — подготовлю конкретный план действий.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента