Установка Discourse на Debian 11 с Nginx и SSL
К чему стремимся
Discourse — современная платформа обсуждений на Ruby, удобная как форум, чат или рассылка. В этой инструкции вы последовательно настроите Discourse в Docker, пропустите трафик через Nginx (порт 80 → Nginx, порт 8080 → Discourse) и подключите HTTPS с помощью Let’s Encrypt.
Важно: в примерах используется домен discourse.example.com — замените его на реальное имя вашего домена.

Быстрые определения
- 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После запуска доступ к сайту будет возможен по адресу:

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

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


После активации вы попадёте в мастер настройки 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)
- При обновлении создайте резервную копию через админ-панель Discourse.
- Перед rebuild — snapshot VPS (если поддерживается).
- Если rebuild сломал сервис: откатите snapshot или восстановите бэкап сайта, затем верните предыдущую версию кода с помощью git checkout.
Чеклист ролей (кто за что отвечает)
- Системный администратор: установка ОС, Docker, Nginx, firewall, SSL.
- Администратор сообщества: настройка Discourse, плагины, модерация, резервные копии.
- DevOps инженеры: автоматизация развёртывания, CI/CD, мониторинг и алерты.
Mini-методология развёртывания (быстрый playbook)
- Подготовка: обновление, firewall, SSH.
- Установить Docker и Git; клонировать репозиторий Discourse.
- Настроить containers/app.yml (hostname, SMTP, expose).
- Bootstrap и старт контейнера.
- Получить SSL и настроить Nginx как обратный прокси.
- Проверки: доступность, почта, логирование.
Альтернативные подходы
- Использовать готовый хостинг 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. Включены рекомендации по безопасности, автоматическому продлению сертификатов, резервному копированию и диагностике проблем.
Если после выполнения шагов остаются вопросы — опишите точную команду и вывод ошибок, и вы получите более целевую помощь.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента