Гид по технологиям

Установка Discourse на CentOS 7 с Nginx и бесплатным SSL Let's Encrypt

• 8 min read • DevOps • Обновлено 19 Nov 2025
Установка Discourse на CentOS 7 с Nginx и Let's Encrypt
Установка Discourse на CentOS 7 с Nginx и 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

Сервис 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

Clone discourse docker

Откройте файл для редактирования:

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

Launch Discourse Check if discourse is running

Если контейнер запущен и слушает порт 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

Generate Lets encrypt SSL certificate

Запустите интерактивное получение сертификата:

letsencrypt certonly

Выберите вариант, который предлагает утилита (например, временный веб‑сервер для проверки), подтвердите email и укажите ваш домен (discourse.example.com). После успешного выполнения сертификаты будут в /etc/letsencrypt/live/<ваш_домен>/

letsencrypt certonly command SSL certificate has been created

Совет: добавьте автоматическое обновление сертификатов в 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

Test nginx config and restart nginx

Проверьте, что ваш домен отвечает по HTTPS.

Шаг 5 — Веб‑установщик Discourse и создание администратора

Откройте браузер и перейдите на https://discourse.example.com — вы будете перенаправлены на HTTPS. Следуйте веб‑интерфейсу: нажмите Register и создайте администратора.

Discourse web installer

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

Register admin account

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

activate account Discourse successfully installed Discourse dashboard

Шаг 6 — Дополнительная конфигурация и отладка

Если вы не получили письмо с подтверждением

  1. Проверьте, что в containers/app.yml указаны корректные SMTP параметры.
  2. Убедитесь, что SMTP провайдер не блокирует отправку (часто для новых аккаунтов требуется подтверждение домена в Mailgun/SendGrid).
  3. Временно активируйте админа из контейнера:
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 для инжиниринга

  1. Подготовка сервера: обновление, открытие SSH.
  2. Установка Docker и git.
  3. Клонирование /var/discourse и правка containers/app.yml.
  4. Bootstrap и запуск launcher.
  5. Генерация SSL (letsencrypt certonly).
  6. Установка Nginx и настройка прокси/SSL.
  7. Тест SSL и веб‑инсталлятор.
  8. Настройка 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 внутри контейнера.

Простой сценарий бэкапа:

  1. ./launcher enter app
  2. rake posts:backups:create (если настроено)
  3. Копирование /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, балансировщики нагрузки), опишите окружение — подготовлю конкретный план действий.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро