Не пытайтесь использовать образ из репозитория. Забудьте про контейнеры. Потребуется ручная сборка. Минимум внешних зависимостей. Только чистая система, без абстракций.
Для начала: нужны Ruby (не ниже 3.2), PostgreSQL (версии 13 или 14), Redis, Node.js и Yarn. Работать всё это будет под отдельным пользователем. Никаких root-запусков приложений. Строгая изоляция. Пример создания:
adduser --disabled-login discourse
usermod -aG sudo discourse
Если Ruby из пакетов – будет страдание. Берите rbenv или rvm. Rbenv стабильнее, меньше побочных эффектов. Ставим вручную:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc
exec $SHELL
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 3.2.2
rbenv global 3.2.2
Внимание! Система должна быть без snapd, без flatpak, без ненужных сервисов. Оставьте только systemd, openssh и необходимые демоны.
PostgreSQL ставится из официального репозитория PGDG. Версия из стандартных пакетов устарела. Redis – из стандартного, но обязательно вручную проверьте supervised systemd в конфиге, иначе не запустится корректно.
Node.js – только LTS. Через nvm, если не хотите словить конфликт с системными модулями. Yarn – без альтернатив, без npm-экспериментов. Ставить строго по инструкции с их официального сайта. Никаких apt install yarn – он не тот.
Важно помнить: если вы не отключите автоматическую очистку tmp, сервер будет падать после каждого перезапуска. Убедитесь, что tmpfs выключен.
Следующий шаг – клонирование исходников. Только через git clone, только в домашнюю директорию пользователя. Никаких системных путей. Иначе проблемы с правами, конфликтами и будущими апдейтами неизбежны.
Работаем строго по логике Linux: один сервис – один пользователь. Все конфиги в ~/config, логи – в ~/log, pid-файлы – в ~/tmp/pids. Никаких /var/www, никаких apache2. Только NGINX. Настроенный вручную, с proxy_pass и gzip_static.
Почта – через SMTP. Без sendmail, без postfix. Лучше всего внешний SMTP-провайдер. Сразу проверьте SPF, DKIM, DMARC. Без них письма будут летать в никуда. Или вообще не улетят.
И да. Забудьте про красивые интерфейсы. Это не WordPress. Любая ошибка – это баг в консоли. Ошибка в gem – пересобирайте. Ошибка в yarn – удаляйте node_modules и начинайте заново.
Содержание статьи
Подготовка системы и установка зависимостей для сборки Discourse
Удалите snapd. Сразу. Без него меньше мусора, меньше конфликтов. И никакого flatpak. Только APT, только базовая система.
Обновите ядро и репозитории:
apt update && apt upgrade -y
apt install -y build-essential curl git libssl-dev libreadline-dev zlib1g-dev libpq-dev libxml2-dev libxslt1-dev libyaml-dev libffi-dev libgdbm-dev autoconf bison libncurses5-dev pkg-config libjemalloc-dev
Создайте отдельного пользователя. Он будет собирать и запускать сервис. Не root. Не sudo. Только изолированная среда:
adduser --disabled-login discourse
usermod -aG sudo discourse
Переключитесь на этого пользователя. Всё остальное делается под ним:
su - discourse
Ставим Ruby. Только через rbenv. Через apt получите устаревшую версию и сломанный gem. Никаких компромиссов:
git clone https://github.com/rbenv/rbenv.git ~/.rbenv
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc
echo 'eval "$(rbenv init - bash)"' >> ~/.bashrc
exec $SHELL
git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv install 3.2.2
rbenv global 3.2.2
Проверьте:
ruby -v
Ожидаем 3.2.2. Ни шагом ниже.
Теперь PostgreSQL. Из репозиториев PGDG. Версия по умолчанию устаревшая и несовместимая:
sudo sh -c 'echo "deb http://apt.postgresql.org/pub/repos/apt $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
wget --quiet -O - https://www.postgresql.org/media/keys/ACCC4CF8.asc | sudo apt-key add -
sudo apt update
sudo apt install -y postgresql-14
Активируйте и запустите:
sudo systemctl enable postgresql
sudo systemctl start postgresql
Важно! Отключите auto-clean tmp. Discourse не любит, когда её tmp чистят за неё. Особенно после перезагрузки.
Далее Redis. Стандартный пакет подойдет:
sudo apt install -y redis-server
Измените supervised в /etc/redis/redis.conf на systemd. Иначе не запустится корректно:
supervised systemd
Проверьте, что работает:
redis-cli ping
Должно вернуть: PONG
Node.js. Только LTS. Только через nvm. Через apt получите мертвую версию и баги в сборке JS-части:
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.7/install.sh | bash
source ~/.bashrc
nvm install --lts
Теперь Yarn. Опять же – не через apt:
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update && sudo apt install -y yarn
Помните: если используете прокси или кастомный DNS, могут быть проблемы при сборке frontend. Разрешайте всё на 443 напрямую.
На этом этапе система готова к клонированию репозитория и сборке проекта. Всё, что дальше – это уже не подготовка, а война с конфигами, port-binding и логикой reverse-proxy.
Сборка и настройка Discourse без использования Docker
Склонировать исходный код – не проблема. Настроить так, чтобы оно работало – вот где начинается мясо. Используйте репозиторий с официального GitHub:
git clone https://github.com/discourse/discourse.git ~/app
cd ~/app
Переключитесь на стабильную ветку. Разработка вам не нужна:
git checkout stable
Далее – установка Ruby-библиотек. Только через bundler. Только в пользовательский каталог. Если начнёт тянуть системные gem – всё, игра окончена:
gem install bundler
bundle config set --local path 'vendor/bundle'
bundle install
Любая ошибка на этом этапе – перепроверьте версию Ruby. Ниже 3.2.2 ничего не будет работать. Не уговаривайте систему, не ищите обходы.
Теперь frontend. Webpacker не используется. Всё на Ember. Ставим зависимости через Yarn:
yarn install
Запустить сборку статики:
RAILS_ENV=production bundle exec rake assets:precompile
Далее база. Создайте пользователя PostgreSQL и базу. Делается один раз:
sudo -u postgres createuser --createdb --superuser discourse
sudo -u postgres createdb discourse
Настройки соединения в config/database.yml. Пример:
production:
adapter: postgresql
encoding: unicode
database: discourse
pool: 10
username: discourse
password: ваш_пароль
host: localhost
Создайте файл .env или используйте config/discourse.conf для переменных окружения. Обязательные: DISCOURSE_HOSTNAME, UNICORN_PORT, RAILS_ENV.
Инициализация базы:
RAILS_ENV=production bundle exec rake db:migrate
RAILS_ENV=production bundle exec rake db:seed
Важно! Не используйте SQLite. Не пытайтесь обмануть систему. Только PostgreSQL. Иначе всё развалится.
Тестовый запуск приложения:
RAILS_ENV=production bundle exec rails server -b 0.0.0.0 -p 3000
Работает? Отлично. Теперь думайте про автозапуск. Самый простой способ – systemd unit. Пример:
[Unit]
Description=Discourse app
After=network.target
[Service]
Type=simple
User=discourse
WorkingDirectory=/home/discourse/app
Environment=RAILS_ENV=production
ExecStart=/home/discourse/.rbenv/shims/bundle exec rails server -b 0.0.0.0 -p 3000
Restart=always
[Install]
WantedBy=multi-user.target
Сохраните в /etc/systemd/system/discourse.service. Активируйте:
sudo systemctl daemon-reexec
sudo systemctl enable discourse.service
sudo systemctl start discourse.service
Помните: если не соберёте frontend до конца – получите пустой интерфейс. JS не скомпилируется – не будет кнопок, не будет даже логина.
На этом этапе система функциональна. Но работать напрямую на 3000 порту – абсурд. Дальше – настройка nginx и TLS. Без прокси frontend падает при первом же запросе.
Настройка веб-сервера и почтовой отправки для Discourse
NGINX обязателен. Apache не годится. Ни по производительности, ни по совместимости. Устанавливаем через APT:
sudo apt install -y nginx
Переходим к конфигурации. Никаких готовых шаблонов. Только вручную. Пример для домена forum.example.com:
server {
listen 80;
server_name forum.example.com;
wasmEditlocation / {
proxy_pass http://127.0.0.1:3000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_redirect off;
}
}
Активируйте конфигурацию, перезапустите службу:
sudo ln -s /etc/nginx/sites-available/forum /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl restart nginx
Далее – TLS. Без шифрования не будет регистрации, не будет авторизации, не будет нормальной работы. Используйте certbot:
sudo apt install -y certbot python3-certbot-nginx
sudo certbot --nginx -d forum.example.com
Внимание! После установки TLS необходимо выставить force_https в конфиге на true. Иначе браузеры будут срывать соединения.
Теперь SMTP. Только внешний сервис. Mailgun, Postmark, SendGrid – выбирайте. Не поднимайте локальный postfix. Слишком много нюансов, слишком много провалов в доставке.
Пример настроек через переменные окружения в .env:
SMTP_ADDRESS=smtp.sendgrid.net
SMTP_PORT=587
SMTP_USER_NAME=apikey
SMTP_PASSWORD=SG.xxxxxxxx
SMTP_DOMAIN=example.com
SMTP_AUTH_METHOD=login
SMTP_ENABLE_START_TLS=true
Не забудьте прописать SPF, DKIM, DMARC. Без этого письма будут попадать в spam или блокироваться. DNS-записи – обязательны.
Помните: если при первом запуске не отправится письмо подтверждения – доступ к админке будет невозможен. Почта – это не опция, а требование.
Проверьте отправку:
RAILS_ENV=production bundle exec rails c
В консоли:
Jobs.enqueue(:test_email, user_id: 1)
Если всё уходит – значит, можно спать. Если нет – разбирайтесь с логами. Смотрите log/production.log и /var/log/nginx/error.log. Не гадайте. Читайте логи. Они говорят всё.

