Заметки об установке Discourse на Ubuntu 20.04

У меня возникли проблемы на этапе bundle install. Эта ошибка продолжает появляться.

(...)
Установка sassc-rails 2.1.2
Установка discourse-ember-rails 0.18.6
Gem::Ext::BuildError: ОШИБКА: Не удалось создать нативное расширение gem.

    текущая директория: /home/archie/gems/gems/openssl-2.2.1/ext/openssl
/usr/bin/ruby3.0 -I /usr/lib/ruby/vendor_ruby -r
./siteconf20220430-16096-soaves.rb extconf.rb
проверка наличия t_open() в -lnsl... нет
проверка наличия socket() в -lsocket... нет
проверка наличия openssl/ssl.h... да
проверка наличия CRYPTO_malloc() в -lcrypto... да
проверка наличия SSL_new() в -lssl... да
проверка наличия LIBRESSL_VERSION_NUMBER в openssl/opensslv.h... нет
проверка версии OpenSSL >= 1.0.1 и < 3.0.0... нет
*** extconf.rb завершена с ошибкой ***
Не удалось создать Makefile по какой-то причине, вероятно, из-за отсутствия необходимых
библиотек и/или заголовочных файлов. Проверьте файл mkmf.log для получения более подробной информации. Возможно,
вам потребуются параметры конфигурации.

Предоставленные параметры конфигурации:
	--with-opt-dir
	--without-opt-dir
	--with-opt-include
	--without-opt-include=${opt-dir}/include
	--with-opt-lib
	--without-opt-lib=${opt-dir}/lib
	--with-make-prog
	--without-make-prog
	--srcdir=.
	--curdir
	--ruby=/usr/bin/$(RUBY_BASE_NAME)3.0
	--with-openssl-dir
	--without-openssl-dir
	--with-openssl-include
	--without-openssl-include=${openssl-dir}/include
	--with-openssl-lib
	--without-openssl-lib=${openssl-dir}/lib
	--with-kerberos-dir
	--without-kerberos-dir
	--with-kerberos-include
	--without-kerberos-include=${kerberos-dir}/include
	--with-kerberos-lib
	--without-kerberos-lib=${kerberos-dir}/lib
	--with-debug
	--without-debug
	--enable-debug
	--disable-debug
	--with-nsl-dir
	--without-nsl-dir
	--with-nsl-include
	--without-nsl-include=${nsl-dir}/include
	--with-nsl-lib
	--without-nsl-lib=${nsl-dir}/lib
	--with-nsllib
	--without-nsllib
	--with-socket-dir
	--without-socket-dir
	--with-socket-include
	--without-socket-include=${socket-dir}/include
	--with-socket-lib
	--without-socket-lib=${socket-dir}/lib
	--with-socketlib
	--without-socketlib
	--with-openssl-config
	--without-openssl-config
	--with-pkg-config
	--without-pkg-config
	--with-crypto-dir
	--without-crypto-dir
	--with-crypto-include
	--without-crypto-include=${crypto-dir}/include
	--with-crypto-lib
	--without-crypto-lib=${crypto-dir}/lib
	--with-cryptolib
	--without-cryptolib
	--with-ssl-dir
	--without-ssl-dir
	--with-ssl-include
	--without-ssl-include=${ssl-dir}/include
	--with-ssl-lib
	--without-ssl-lib=${ssl-dir}/lib
	--with-ssllib
	--without-ssllib
extconf.rb:113:in `<main>': Требуется OpenSSL >= 1.0.1, < 3.0.0 или LibreSSL >= 2.5.0 (RuntimeError)

Чтобы увидеть, почему это расширение не удалось скомпилировать, проверьте файл mkmf.log, который можно
найти здесь:

  /home/archie/gems/extensions/x86_64-linux/3.0.0/openssl-2.2.1/mkmf.log

extconf завершилась с ошибкой, код выхода 1

Файлы gem останутся установленными в /home/archie/gems/gems/openssl-2.2.1 для
проверки.
Результаты записаны в
/home/archie/gems/extensions/x86_64-linux/3.0.0/openssl-2.2.1/gem_make.out

  /usr/lib/ruby/vendor_ruby/rubygems/ext/builder.rb:95:in `run'
/usr/lib/ruby/vendor_ruby/rubygems/ext/ext_conf_builder.rb:47:in `block in
build'
  /usr/lib/ruby/3.0.0/tempfile.rb:317:in `open'
  /usr/lib/ruby/vendor_ruby/rubygems/ext/ext_conf_builder.rb:26:in `build'
  /usr/lib/ruby/vendor_ruby/rubygems/ext/builder.rb:161:in `build_extension'
/usr/lib/ruby/vendor_ruby/rubygems/ext/builder.rb:195:in `block in
build_extensions'
  /usr/lib/ruby/vendor_ruby/rubygems/ext/builder.rb:192:in `each'
  /usr/lib/ruby/vendor_ruby/rubygems/ext/builder.rb:192:in `build_extensions'
  /usr/lib/ruby/vendor_ruby/rubygems/installer.rb:847:in `build_extensions'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/rubygems_gem_installer.rb:71:in
`build_extensions'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/rubygems_gem_installer.rb:28:in
`install'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/source/rubygems.rb:204:in
`install'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/installer/gem_installer.rb:54:in
`install'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/installer/gem_installer.rb:16:in
`install_from_spec'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/installer/parallel_installer.rb:186:in
`do_install'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/installer/parallel_installer.rb:177:in
`block in worker_pool'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/worker.rb:62:in
`apply_func'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/worker.rb:57:in
`block in process_queue'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/worker.rb:54:in
`loop'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/worker.rb:54:in
`process_queue'
/usr/share/rubygems-integration/all/gems/bundler-2.3.5/lib/bundler/worker.rb:91:in
`block (2 levels) in create_threads'

При установке openssl (2.2.1) произошла ошибка, и Bundler не может
продолжить работу.

В файле Gemfile:
  cose был разрешён как 1.2.0, который зависит от
    openssl-signature_algorithm был разрешён как 1.1.1, который зависит от
      openssl

Я тоже недавно столкнулся с проблемой, похожей на ту, что у @Sonosus, и выяснил, что она вызвана тем, что в последней версии Ubuntu (20.04) по умолчанию предустановлен OpenSSL 3.0.2. Эта ситуация может также наблюдаться в других версиях Ubuntu/Debian, где OpenSSL установлен по умолчанию. Если вы столкнулись с этим, вам, скорее всего, потребуется скомпилировать более раннюю версию OpenSSL из исходного кода (я использовал OpenSSL-1.1.1n), а затем снова запустить команду bundle install. По сути, эта ошибка связана с требованием OpenSSL >= 1.0.1, < 3.0.0, и оказывается, что 1.1 — единственная альтернатива.

Также стоит проверить версию Ruby с помощью команды ruby --version. Discourse всё ещё использует Ruby 2, поэтому, если вы используете Ruby 3.x или новее, вам понадобится более ранняя версия. В зависимости от способа установки Ruby вы, вероятно, столкнётесь с аналогичной проблемой OpenSSL при установке более ранней версии, поэтому я рекомендую использовать менеджер версий для Ruby. На данный момент лучшей версией для работы с Discourse является Ruby 2.7.6.

После установки чистой версии Ubuntu 20.04 вот что я сделал, чтобы bundle install запустился корректно:

Установка зависимостей Discourse, asdf и клонирование репозитория Discourse

bash <(wget -qO- https://raw.githubusercontent.com/discourse/install-rails/master/linux)
sudo apt install build-essential checkinstall zlib1g-dev
git clone https://github.com/asdf-vm/asdf.git ~/.asdf --branch v0.10.0
git clone https://github.com/discourse/discourse.git ~/discourse

Настройка базы данных

Создайте роль с тем же именем, что и имя пользователя вашей системы Ubuntu:

sudo -u postgres createuser -s "$USER"

Установка OpenSSL-1.1.1n из исходного кода

wget https://www.openssl.org/source/openssl-1.1.1n.tar.gz
tar -zxf openssl-1.1.1n.tar.gz && cd openssl-1.1.1n
./config --prefix=/opt/openssl-1.1.1n --openssldir=/opt/openssl-1.1.1n shared zlib
make
make test
make install
sudo rm -rf /opt/openssl-1.1.1n/certs
sudo ln -s /etc/ssl/certs /opt/openssl-1.1.1n

Затем я добавил следующую строку в свой файл .bashrc:

export RUBY_CONFIGURE_OPTS="--with-openssl-dir=/opt/openssl-1.1.1n/"

Пока мы здесь, я также добавил следующие строки для asdf:

. $HOME/.asdf/asdf.sh
. $HOME/.asdf/completions/asdf.bash

Сохраните и выйдите, затем выполните:

source ~/.bashrc

Установка Ruby 2.7.6

asdf plugin add ruby
asdf install ruby 2.7.6

Теперь вы, возможно, сможете запустить bundle install, однако у меня возникло ещё несколько проблем в процессе установки Discourse, о которых я упомяну здесь для справки, если они возникнут у кого-то ещё.

Ошибка при установке mini_racer

При запуске bundle install после установки OpenSSL-1.1.1n и Ruby 2.7.6 я постоянно сталкивался с ошибкой:

An error occurred while installing mini_racer (0.6.1), and Bundler cannot continue.

Это можно исправить, отредактировав следующую строку в локальной версии файла Gemfile в репозитории discourse:

И заменив её на:

gem 'mini_racer', github: 'rubyjs/mini_racer', branch: 'refs/pull/186/head'

После этого шага мне удалось успешно запустить bundle install.

Это похоже на проблему, возникающую в MacOS, о которой можно прочитать подробнее здесь

Нет такого файла или каталога - convert

На более поздних этапах установки Discourse я также столкнулся со следующей проблемой при запуске bundle exec rake autospec:

Failures: 
  1. AboutController.index should display the about page for logged in user when login_required is true
    Failure/Error: expect(response.status).to eq(200)

    expected: 200
    got: 500

      (compared using ==)
    #./spec/requests/about_controller_spec.rb:27:in 'block (3 levels) in <main>'
    #./spec/rails_helper.rb:277:in 'block (2 levels) in <top (required)>
    #---------------------
    #---Caused by:---
    # Errno::ENOENT
    #  No such file or directory - convert
    # ./lib/letter_avatar.rb:105:in ``'

Эта ошибка означает, что пакет ImageMagick не установлен (он предоставляет исполняемый файл convert).

Согласно документации, этот скрипт в начале процесса установки Discourse должен устанавливать все необходимые пакеты, но, похоже, этот был исключён.

Наконец, после установки ImageMagick с помощью команды sudo apt install imagemagick мне удалось успешно запустить свой сервер Discourse!

Надеюсь, эта информация будет полезна всем, кто проходит через этот процесс и сталкивается с трудностями. :smile:

Спасибо! В какой-то момент я попробую и посмотрю, как всё получится.