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

Установка Discourse на Debian 11 с Nginx и SSL

• 7 min read • DevOps • Обновлено 28 Nov 2025
Discourse на Debian 11: Nginx + SSL
Discourse на Debian 11: Nginx + SSL

К чему стремимся

Discourse — современная платформа обсуждений на Ruby, удобная как форум, чат или рассылка. В этой инструкции вы последовательно настроите Discourse в Docker, пропустите трафик через Nginx (порт 80 → Nginx, порт 8080 → Discourse) и подключите HTTPS с помощью Let’s Encrypt.

Важно: в примерах используется домен discourse.example.com — замените его на реальное имя вашего домена.

Логотип Discourse и пример интерфейса

Быстрые определения

  • Discourse: платформа обсуждений на Ruby/Rails с поддержкой плагинов.
  • Docker: контейнеризация приложений.
  • Nginx: обратный прокси и веб-сервер.
  • Certbot: клиент для получения сертификатов Let’s Encrypt.

Требования к системе

  • Операционная система: Debian 11.
  • Рекомендованная память: 2 ГБ RAM или больше. Discourse попробует создать swap на системах с 1 ГБ.
  • CPU: минимум 1 виртуальное ядро.
  • Непривилегированный пользователь с sudo.
  • Доменное имя (например, discourse.example.com), указывающее на IP сервера.

Факт-бокс — ключевые числа

  • RAM: 2 ГБ рекомендовано (1 ГБ допустимо с swap).
  • Порт Discourse в контейнере: 80 (внешний назначается 8080).
  • Путь для Discourse: /var/discourse.

TL;DR командный набор (чеклист перед началом)

  • Обновить систему: sudo apt update && sudo apt upgrade
  • Установить необходимые пакеты: nano, ufw, snapd и т.д.
  • Открыть порты: SSH, 80, 443
  • Установить Docker и добавить пользователя в группу docker
  • Клонировать /var/discourse из репозитория
  • Настроить containers/app.yml и выполнить ./launcher bootstrap/./launcher start

Подготовка сервера и установка базовых пакетов

Обновите систему и установите набор пакетов, которые понадобятся далее.

$ sudo apt update && sudo apt upgrade
$ sudo apt install nano ufw software-properties-common dirmngr apt-transport-https gnupg2 ca-certificates lsb-release debian-archive-keyring -y

Примечание: часть пакетов может уже быть установлена.

Шаг 1 — Настройка брандмауэра (UFW)

Debian обычно имеет ufw. Разрешите SSH, HTTP и HTTPS до включения:

$ sudo ufw status

(ожидаем Status: inactive)

$ sudo ufw allow OpenSSH
$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp
$ sudo ufw enable

Проверьте статус:

$ sudo ufw status

Ожидаемый вывод покажет OpenSSH, 80/tcp и 443/tcp в статусе ALLOW.

Примечание: если у вас нестандартный SSH-порт, разрешите именно его. В облачных провайдерах дополнительно настройте группы безопасности (security groups).

Шаг 2 — Установка Git

В исходной инструкции использовался dnf — на Debian это apt. Устанавливаем Git:

$ sudo apt install git -y

Проверяем версию:

$ git --version

Настройте глобальные параметры Git:

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]"

Шаг 3 — Установка Docker

Добавим официальный репозиторий Docker и установим пакеты.

$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
$ echo \
  "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
$ sudo apt update
$ sudo apt install docker-ce docker-ce-cli containerd.io -y

Проверка статуса Docker:

$ sudo systemctl status docker

Если хотите не вводить sudo при каждой команде docker:

$ sudo usermod -aG docker $(whoami)

Выйдите и войдите заново, чтобы изменения вступили в силу.

Важно: добавление пользователя в группу docker даёт фактически root-доступ к системе. Делайте это только для доверенных пользователей.

Шаг 4 — Клонирование Discourse Docker

$ sudo mkdir /var/discourse
$ sudo git clone https://github.com/discourse/discourse_docker.git /var/discourse

Перейдите в каталог /var/discourse и продолжайте.

Шаг 5 — Конфигурация Discourse

Скопируйте пример standalone.yml в контейнерную конфигурацию и отредактируйте её.

$ sudo cp samples/standalone.yml containers/app.yml
$ sudo nano containers/app.yml

Обязательные параметры:

  • DISCOURSE_HOSTNAME: домен (discourse.example.com).
  • DISCOURSE_DEVELOPER_EMAILS: e-mail администратора (обязательно для bootstrap).
  • SMTP-настройки: адрес, порт, логин, пароль — чтобы Discourse мог отправлять письма.

Пример фрагментов (как в файле):

DISCOURSE_HOSTNAME: 'discourse.example.com'
..
DISCOURSE_DEVELOPER_EMAILS: '[email protected]'
DISCOURSE_SMTP_ADDRESS: smtp.example.com
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: [email protected]
DISCOURSE_SMTP_PASSWORD: your_smtp_password
#DISCOURSE_SMTP_ENABLE_START_TLS: true
#DISCOURSE_SMTP_DOMAIN: discourse.example.com
DISCOURSE_NOTIFICATION_EMAIL: [email protected]

Измените expose:

expose:
  - "8080:80"   # http
  #- "443:443" # https

Это оставляет контейнер Discourse слушающим 80 внутри, но внешний порт для HTTP будет 8080 — Nginx будет проксировать трафик с 80/443.

Параметры памяти (если мало RAM):

db_shared_buffers: '128MB'
UNICORN_WORKERS: 2

Переменная db_shared_buffers обычно равна ≈25% от общей памяти.

GeoIP (опционально):

DISCOURSE_MAXMIND_LICENSE_KEY: your_maxmind_license_key

Сохраните и закройте файл (Ctrl+X, Y).

Шаг 6 — Запуск Discourse в контейнере

Из каталога /var/discourse выполните:

$ sudo ./launcher bootstrap app
$ sudo ./launcher start app

После запуска доступ к сайту будет возможен по адресу:

Экран настройки Discourse

Зарегистрируйте администратора — адрес администратора будет предзаполнен согласно app.yml.

Форма регистрации администратора

Подтвердите почту, если SMTP настроен верно.

Экран подтверждения по почте

Письмо подтверждения Discourse

После активации вы попадёте в мастер настройки Discourse.

Мастер настройки Discourse

Главная страница Discourse

Шаг 7 — Установка SSL (Let’s Encrypt + Certbot)

Установим snapd и certbot, затем получим сертификат.

$ sudo apt install snapd -y
$ sudo snap install core && sudo snap refresh core
$ sudo snap install --classic certbot
$ sudo ln -s /snap/bin/certbot /usr/bin/certbot
$ certbot --version

Получение сертификата (standalone режим — остановит любой процесс, слушающий 80 на машине на время верификации):

$ sudo certbot certonly --standalone --agree-tos --no-eff-email --staple-ocsp --preferred-challenges http -m [email protected] -d discourse.example.com

Сертификат появится в /etc/letsencrypt/live/discourse.example.com.

Генерация Diffie-Hellman:

$ sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048

Создайте веб-рут для webroot-валидации (если вы будете использовать webroot):

$ sudo mkdir -p /var/lib/letsencrypt

Скрипт ежедневного продления certbot (cron):

$ sudo nano /etc/cron.daily/certbot-renew

Вставьте:

#!/bin/sh
certbot renew --cert-name discourse.example.com --webroot -w /var/lib/letsencrypt/ --post-hook "systemctl reload nginx"
$ sudo chmod +x /etc/cron.daily/certbot-renew

Примечание: вместо cron можно использовать systemd timer или стандартный certbot timer, часто более надёжный.

Шаг 8 — Установка и настройка Nginx

Добавим официальный репозиторий Nginx и установим Nginx.

$ curl https://nginx.org/keys/nginx_signing.key | gpg --dearmor \
     | sudo tee /usr/share/keyrings/nginx-archive-keyring.gpg >/dev/null
$ echo "deb [signed-by=/usr/share/keyrings/nginx-archive-keyring.gpg arch=amd64] \
    http://nginx.org/packages/debian `lsb_release -cs` nginx" \
    | sudo tee /etc/apt/sources.list.d/nginx.list
$ sudo apt update
$ sudo apt install nginx -y

Проверьте версию:

$ sudo nginx -v

Создайте файл конфигурации для Discourse:

$ sudo nano /etc/nginx/conf.d/discourse.conf

Вставьте (замените discourse.example.com на ваш домен):

# enforce HTTPS
server {
    listen       80; 
    listen  [::]:80;
    server_name  discourse.example.com;
    return 301   https://$host$request_uri;
}
server {
    listen       443 ssl http2;
    listen  [::]:443 ssl http2;
    server_name  discourse.example.com;

    access_log  /var/log/nginx/discourse.access.log;
    error_log   /var/log/nginx/discourse.error.log;
    
    # SSL
    ssl_certificate      /etc/letsencrypt/live/discourse.example.com/fullchain.pem;
    ssl_certificate_key  /etc/letsencrypt/live/discourse.example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/discourse.example.com/chain.pem;
    ssl_session_timeout  5m;
    ssl_session_cache shared:MozSSL:10m;
    ssl_session_tickets off;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
    ssl_ecdh_curve X25519:prime256v1:secp384r1:secp521r1;
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_dhparam /etc/ssl/certs/dhparam.pem;
    resolver 8.8.8.8;
    
    client_max_body_size 100m;
    
    location / {
        proxy_pass http://discourse.example.com:8080/;
        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_set_header X-Real-IP $remote_addr;
    }    
}

Добавьте server_names_hash_bucket_size в nginx.conf (перед include /etc/nginx/conf.d/*.conf;):

server_names_hash_bucket_size  64;

Проверьте конфигурацию и перезапустите nginx:

$ sudo nginx -t
$ sudo systemctl start nginx

Совет по безопасности: регулярно обновляйте список шифров и параметры TLS. Периодически проверяйте ваш сайт через SSL Labs.

Шаг 9 — Команды обслуживания Discourse

Активировать администратора, если письмо не пришло:

$ cd /var/discourse
$ sudo ./launcher enter app
root@discourse-app:/var/www/discourse# rails c
[1] pry(main)> 
[1] pry(main)>  User.find_by_email("[email protected]")
# получите объект user, затем:
[2] pry(main)> user.approved = true
[3] pry(main)> user.save
[4] pry(main)> EmailToken.confirm(user.email_tokens.first.token)

Выйдите двумя командами exit.

Обновление Discourse «вручную» из командной строки:

$ cd /var/discourse
$ git pull
$ sudo ./launcher rebuild app

Остановка/логи:

$ sudo ./launcher stop
$ sudo ./launcher logs

Важно: ./launcher rebuild app удаляет контейнер и создаёт новый. Делайте бэкап перед критическими изменениями.

Критерии приёмки

Проверьте следующие пункты для успешной сдачи установки:

  • Домен корректно указывает на IP сервера и DNS распространён.
  • Сайт доступен по HTTPS и сертификат валиден.
  • Вход в админ-панель Discourse возможен, администратор активирован.
  • Отправка почты (SMTP) успешно работает — проверка активации почты.
  • Nginx проксирует запросы на порт 8080 и в логах нет критических ошибок.
  • Бэкап/restore механизмы настроены (через UI или облачное хранилище).

Рекомендации по безопасности и надёжности

  • Минимум прав для процессов; не запускайте административные команды под root, кроме операций, требующих прав.
  • Ограничьте доступ по IP к административным интерфейсам, если это возможно.
  • Настройте регулярную проверку обновлений для Debian, Docker и Nginx.
  • Используйте fail2ban для защиты SSH и админ-форм.
  • При использовании внешнего SMTP убедитесь, что учётные данные хранятся в безопасном месте и имеют ограниченный доступ.
  • Разместите бэкапы на удалённом хранилище (S3, GCS) и периодически проверяйте восстановление.

Резервное копирование и восстановление (обзор)

  • Создавайте резервные копии через админ-панель Discourse — Settings → Backups.
  • Для автоматизации загрузки используйте интеграцию с облачным хранилищем (S3).
  • Тестируйте восстановление на отдельной машине или тестовом контейнере.

Диагностика распространённых проблем

  • Сайт недоступен по HTTPS: проверьте DNS, наличие сертификатов в /etc/letsencrypt/live, логи nginx.
  • Ошибка LetsEncrypt: убедитесь, что порт 80/443 открыт и Nginx не мешает standalone-режиму certbot (или используйте webroot).
  • SMTP не отправляет почту: проверьте параметры в containers/app.yml, доступность SMTP-сервера и логи Discourse (./launcher logs).
  • Docker-контейнер не запускается: проверьте docker logs, свободное место на диске и версию Docker.

Быстрые команды для диагностики

# Проверить доступность порта 8080 локально
$ curl -I http://127.0.0.1:8080

# Логи nginx
$ sudo tail -n 200 /var/log/nginx/discourse.error.log

# Логи контейнера Discourse
$ cd /var/discourse
$ sudo ./launcher logs app

# Проверить сертификат
$ openssl s_client -connect discourse.example.com:443 -servername discourse.example.com

Шаблон: план отката (rollback)

  1. При обновлении создайте резервную копию через админ-панель Discourse.
  2. Перед rebuild — snapshot VPS (если поддерживается).
  3. Если rebuild сломал сервис: откатите snapshot или восстановите бэкап сайта, затем верните предыдущую версию кода с помощью git checkout.

Чеклист ролей (кто за что отвечает)

  • Системный администратор: установка ОС, Docker, Nginx, firewall, SSL.
  • Администратор сообщества: настройка Discourse, плагины, модерация, резервные копии.
  • DevOps инженеры: автоматизация развёртывания, CI/CD, мониторинг и алерты.

Mini-методология развёртывания (быстрый playbook)

  1. Подготовка: обновление, firewall, SSH.
  2. Установить Docker и Git; клонировать репозиторий Discourse.
  3. Настроить containers/app.yml (hostname, SMTP, expose).
  4. Bootstrap и старт контейнера.
  5. Получить SSL и настроить Nginx как обратный прокси.
  6. Проверки: доступность, почта, логирование.

Альтернативные подходы

  • Использовать готовый хостинг Discourse (managed) — меньше операций поддержки, но платно.
  • Развёртывать Discourse без Docker — более сложный вариант, требует ручной настройки Ruby/Rails/Redis/Postgres.
  • Проксирование через Traefik вместо Nginx — удобно для динамического маршрутизации и автоматического HTTPS.

Примеры ошибок и когда этот метод не подходит

  • Если у вас очень ограниченные ресурсы (менее 1 ГБ RAM) — производительность будет низкой.
  • Если вы не хотите управлять сертификатами и обновлениями — рассмотрите managed Discourse.

Decision flow (упрощённая схема диагностики)

flowchart TD
  A[Сайт не открывается по HTTPS] --> B{DNS корректен?}
  B -- Нет --> C[Исправить A-запись и подождать
распространения]
  B -- Да --> D{Сертификат установлен?}
  D -- Нет --> E[Запустить certbot, проверить логи]
  D -- Да --> F{Nginx проксирует на 8080?}
  F -- Нет --> G[Проверить /etc/nginx/conf.d/discourse.conf]
  F -- Да --> H[Проверить логи Discourse и Docker]

Соображения о GDPR и приватности

  • Discourse хранит пользовательские данные: имейте политику конфиденциальности и храните бэкапы безопасно.
  • Если планируете хранить логи и бэкапы в облаке (S3), настройте шифрование и управление доступом.

Краткое резюме

Вы установили Discourse в Docker на Debian 11, настроили Nginx как обратный прокси и подключили SSL из Let’s Encrypt. Включены рекомендации по безопасности, автоматическому продлению сертификатов, резервному копированию и диагностике проблем.

Если после выполнения шагов остаются вопросы — опишите точную команду и вывод ошибок, и вы получите более целевую помощь.

Поделиться: 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 быстро