Установка программного обеспечения для форума Discourse на Ubuntu без использования Docker

Не пытайтесь использовать образ из репозитория. Забудьте про контейнеры. Потребуется ручная сборка. Минимум внешних зависимостей. Только чистая система, без абстракций.

Для начала: нужны 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, только базовая система.

Читайте также:  Настройка балансировки нагрузки HAProxy на основе URL

Обновите ядро и репозитории:


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:

Читайте также:  Команда Chattr в Linux с примерами


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. Пример:

Читайте также:  Установка Red OS в режиме LiveUSB


[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. Не гадайте. Читайте логи. Они говорят всё.