Notas sobre a instalação do Discourse no Ubuntu 20.04

Estou com problemas na etapa bundle install. Este erro continua aparecendo.

(... )
Instalando sassc-rails 2.1.2
Instalando discourse-ember-rails 0.18.6
Gem::Ext::BuildError: ERRO: Falha ao compilar a extensão nativa do gem.

    diretório atual: /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
verificando t_open() em -lnsl... não
verificando socket() em -lsocket... não
verificando openssl/ssl.h... sim
verificando CRYPTO_malloc() em -lcrypto... sim
verificando SSL_new() em -lssl... sim
verificando LIBRESSL_VERSION_NUMBER em openssl/opensslv.h... não
verificando OpenSSL version >= 1.0.1 e < 3.0.0... não
*** extconf.rb falhou ***
Não foi possível criar o Makefile por algum motivo, provavelmente falta de bibliotecas
e/ou cabeçalhos necessários. Verifique o arquivo mkmf.log para mais detalhes. Você pode
precisar de opções de configuração.

Opções de configuração fornecidas:
	--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 or LibreSSL >= 2.5.0 is
required (RuntimeError)

Para ver por que essa extensão falhou ao compilar, verifique o arquivo mkmf.log que pode
ser encontrado aqui:

  /home/archie/gems/extensions/x86_64-linux/3.0.0/openssl-2.2.1/mkmf.log
  
extconf failed, exit code 1

Arquivos Gem permanecerão instalados em /home/archie/gems/gems/openssl-2.2.1 para
inspeção.
Resultados registrados em
/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'

Ocorreu um erro ao instalar openssl (2.2.1), e o Bundler não pode
continuar.

No Gemfile:
  cose foi resolvido para 1.2.0, que depende de
    openssl-signature_algorithm foi resolvido para 1.1.1, que depende de
      openssl
3 curtidas

Recentemente, também me deparei com um problema semelhante ao do @Sonosus e descobri que ele estava sendo causado pela versão mais recente do Ubuntu (20.04) que vem pré-instalada com OpenSSL 3.0.2. Essa situação também pode estar presente com outras versões do Ubuntu/Debian que vêm pré-instaladas com OpenSSL. Se você estiver encontrando isso, provavelmente desejará compilar uma versão anterior do OpenSSL a partir do código-fonte (usei OpenSSL-1.1.1n) e, em seguida, executar novamente o comando bundle install. Essencialmente, esta mensagem de erro é sobre OpenSSL >= 1.0.1, < 3.0.0, e descobre-se que 1.1 é a única alternativa.

Você também vai querer verificar qual versão do Ruby você está usando com ruby --version. O Discourse ainda usa Ruby 2, então se você estiver usando Ruby 3.x ou posterior, precisará usar uma versão anterior. Dependendo de como você está instalando o Ruby, é provável que você encontre um problema semelhante de OpenSSL ao instalar uma versão anterior, então eu recomendaria usar um gerenciador de versão para Ruby aqui, e eu descobri que o Ruby 2.7.6 é atualmente a melhor versão para usar com o Discourse.

Após instalar uma nova instância do Ubuntu 20.04, aqui está o que fiz para que bundle install fosse executado corretamente:

Instalar Dependências do Discourse, asdf e Clonar o 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

Configurar Banco de Dados

Crie a role com o mesmo nome do seu nome de usuário do sistema Ubuntu:

sudo -u postgres createuser -s "$USER"

Instalar OpenSSL-1.1.1n a partir do Código-Fonte

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

Em seguida, adicionei a seguinte linha ao meu arquivo .bashrc

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

Enquanto estamos aqui, também adicionei as seguintes linhas para asdf

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

Salve e saia, e então

source ~/.bashrc

Instalar Ruby 2.7.6

asdf plugin add ruby
asdf install ruby 2.7.6

Você pode estar pronto para executar bundle install agora, no entanto, encontrei alguns outros problemas durante o processo de instalação do Discourse que mencionarei aqui para referência, caso isso aconteça com mais alguém.

Ocorreu um erro ao instalar mini_racer

Ao executar bundle install, continuei encontrando erros após instalar o OpenSSL-1.1.1n e o Ruby 2.7.6

Ocorreu um erro ao instalar mini_racer (0.6.1), e o Bundler não pode continuar.

O que pode ser resolvido editando a seguinte linha na sua versão local do discourse/Gemfile:

E substituindo-a por

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

Após esta etapa, consegui executar bundle install com sucesso.

Isso é semelhante a um problema que ocorre no MacOS sobre o qual você pode ler mais aqui

Arquivo ou diretório não encontrado - convert

Nas etapas posteriores da instalação do Discourse, também encontrei o seguinte problema ao executar bundle exec rake autospec

Falhas:
  1. AboutController.index deve exibir a página sobre para o usuário logado quando login_required for true
    Falha/Erro: expect(response.status).to eq(200)

    esperado: 200
    obtido: 500

      (comparado usando ==)
    #./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)>'
    #---------------------
    #---Causado por:---
    # Errno::ENOENT
    #  Arquivo ou diretório não encontrado - convert
    # ./lib/letter_avatar.rb:105:in ``'

Este erro significa que o pacote ImageMagick não está instalado (ele fornece o binário convert)

Supostamente, este script no início do processo de instalação do Discourse deveria ter todos os pacotes necessários, mas parece que este pode ter sido excluído.

Finalmente, após instalar ImageMagick com sudo apt install imagemagick, consegui colocar meu servidor Discourse em funcionamento com sucesso!

Espero que esta informação seja útil para quem estiver passando por este processo e tendo alguns problemas. :smile:

5 curtidas

Obrigado por isso, vou tentar em algum momento e ver como vai.

1 curtida