Olá do Gitpod! (instalando no Google Cloud + configuração automatizada de desenvolvimento)

Olá, comunidade Discourse! :wave:

Trabalho no gitpod.io, uma IDE gratuita de um clique para o GitHub. Atualmente usamos o Spectrum para nossa comunidade, mas estamos enfrentando alguns problemas e adoríamos levantar uma instância do Discourse para testá-la e, possivelmente, migrar.

Gostaríamos de usar nossa conta do Google Cloud para isso, se possível. Poderia, por favor, me indicar o caminho certo? Por exemplo, o novo Google Cloud Run é uma boa opção para executar uma instância do Discourse?

Além disso, como nossa missão é automatizar totalmente todas as configurações de desenvolvimento (pelo menos para projetos de código aberto), gostaria de contribuir com uma configuração totalmente automatizada do Discourse, permitindo que contribuidores iniciem um ambiente Discourse pronto para codificação online com um único clique (em vez de ler longas listas de instruções de configuração e instalar/configurar manualmente várias dependências no seu dispositivo atual). Já comecei a trabalhar nisso com base na excelente configuração automatizada do Discourse para o Janitor de @notriddle (oi!).

No entanto, estou enfrentando um problema: recentemente, as instruções de configuração falham devido à falta de uma tabela “polls”. Ainda não tenho certeza de como corrigir isso, mas continuarei investigando. Apenas achei válido mencionar aqui.

Pode ser, mas não é tão simples. O Discourse não é um container sem estado, que é exatamente para o que o Google Cloud Run foi projetado. Portanto, você precisará de uma maneira de adicionar algum tipo de Volume Persistente para os dados mantidos no Discourse (uploads, avatares, banco de dados).

Eu usaria uma instância normal do Google Compute e pronto. Com algum tipo de script ou ferramentas de gerenciamento de infraestrutura, você deve conseguir automatizar a implantação de novas instâncias do Discourse. Este guia Install Discourse on Ubuntu or Debian for Development também pode ajudá-lo.

Quais instruções de configuração você está usando? Se a tabela “polls” estiver faltando, isso sugere que você não executou as migrações do plugin. Elas devem ser executadas automaticamente no modo de desenvolvimento. No modo de teste, você precisa adicionar LOAD_PLUGINS=1 antes do comando rake db:migrate.

Obrigado pelas respostas @marianord e @david!

Isso parece mais razoável do que usar o Cloud Run, já que extrair todo o estado dos contêineres do Discourse pode levar algum tempo. Obrigado por me indicar o guia! Vou tentar segui-lo para configurar uma instância do Compute e retornarei aqui com meus resultados.

Estou seguindo https://github.com/discourse/discourse/blob/master/docs/DEVELOPER-ADVANCED.md.

O erro exato que vi foi:

== Seed from /workspace/discourse/db/fixtures/990_settings.rb
Discourse hostname: localhost is not a valid domain for emails!

== Seed from /workspace/discourse/db/fixtures/990_topics.rb
rake aborted!
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "polls" does not exist
LINE 8:  WHERE a.attrelid = '"polls"'::regclass
                            ^

Ao tentar fazer:

bundle exec rake db:create db:migrate &&
RAILS_ENV=test bundle exec rake db:create db:migrate

Também experimentei adicionar esta linha:

RAILS_ENV=development bundle exec rake db:create db:migrate

mas sem sucesso.

Muito obrigado pela dica! Vou tentar isso e também retornarei aqui. (Desculpe por fazer duas perguntas em uma! Espero que isso não torne a discussão muito confusa.)

A instalação para desenvolvedores é muito mais lenta e projetada para… desenvolvimento. Portanto, você deve seguir as instruções de instalação padrão. É bastante fácil automatizá-la. Meu serviço de instalação agora está totalmente automatizado (exceto pelas configurações de DNS exigidas pelo Mailgun, pois não tenho controle sobre o DNS do cliente).

A parte difícil da instalação é a configuração de e-mail.

Além disso, instalação e manutenção são coisas diferentes.

Obrigado, @pfaffman! Desculpe pela confusão; eu misturei duas coisas na minha mensagem original: 1) instalar o Discourse para a comunidade Gitpod e 2) automatizar a configuração de desenvolvimento para desenvolvedores e contribuidores do Discourse. Felizmente, estou seguindo o guia de desenvolvedor para o item 2), não para o 1). :sweat_smile:

@david Hmm, infelizmente, com:

bundle exec rake db:create db:migrate &&
RAILS_ENV=test LOAD_PLUGINS=1 bundle exec rake db:create db:migrate

Ainda falha com:

== Seed from /workspace/discourse/db/fixtures/990_settings.rb
Discourse hostname: localhost is not a valid domain for emails!

== Seed from /workspace/discourse/db/fixtures/990_topics.rb
rake aborted!
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  relation "polls" does not exist
LINE 8:  WHERE a.attrelid = '"polls"'::regclass
                            ^

Eu entendi corretamente sua sugestão? Você teria outras ideias sobre como corrigir isso? (Tentei excluir as tabelas antes, mas falhou com um erro diferente que não me lembro. Estou disposto a tentar novamente, no entanto.)

Além disso, esqueci de mencionar que minhas instruções de configuração funcionaram até a semana passada ou mais ou menos, então o erro apareceu recentemente após um rebase do Discourse. Acho que foi após a migração para o Rails 6, talvez? DEV: Upgrade Discourse to Rails 6 (#8083) · discourse/discourse@32b8a2c · GitHub

Apenas para informação, você pode reproduzir facilmente o erro tentando abrir meu fork do Discourse no Gitpod: Dashboard. Você verá minha configuração automatizada falhar e obter um ambiente interativo onde é possível tentar vários comandos do Discourse no Terminal.

@sam Parece que FIX: Rails 6 multisite migrations and plugin migrations · discourse/discourse@025d4ee · GitHub quebrou algo.

Ao contrário da mensagem do commit, acredito que as migrações de plugin estavam funcionando antes deste commit. Elas não estão mais. Não importa se LOAD_PLUGINS=1 é fornecido ou não — as migrações de plugin não estão sendo executadas no meu ambiente de desenvolvimento.

Acredito que seja por causa disso:

--- a/lib/plugin/instance.rb
+++ b/lib/plugin/instance.rb
@@ -516,7 +516,7 @@ class Plugin::Instance
     Rake.add_rakelib(File.dirname(path) + "/lib/tasks")
 
     # Automatically include migrations
-    migration_paths = Rails.configuration.paths["db/migrate"]
+    migration_paths = ActiveRecord::Migrator.migrations_paths
     migration_paths << File.dirname(path) + "/db/migrate"
 
     unless Discourse.skip_post_deployment_migrations?

Então, isso é INSTALL-cloud.

Imagine que houvesse um contêiner Docker incluído com o Discourse e você pudesse simplesmente usá-lo sem instalar nada.

Já vi esse erro na migração de multisite; no banco de dados de dev/test está tudo certo. Vou depurá-lo cuidadosamente hoje.

Para:

Isso deve fazer com que os ambientes de desenvolvimento se comportem corretamente ao seguir os guias.

@kris.kotlarek, você pode dar uma olhada nesse commit… por que o dump do esquema → carregamento parou de funcionar no Rails 6 com nossos plugins?

Claro, vou verificar isso hoje à noite.

Acho que encontrei o problema para ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: relation "polls" does not exist
Quando load_config é avaliado na criação do banco de dados, ele sobrescreve migrations_paths

Então, é isso que acontece quando tentamos avaliar db:create e db:migrate ao mesmo tempo:

No entanto, se os executarmos separadamente, os caminhos estão corretos:

Acho que temos duas opções aqui:

  1. Alterar os guias e recomendar o uso de dois comandos separadamente
  2. Aplicar um monkey patch e usar ||=

O que você acha?

Isso vai resolver?

RAILS_ENV=test bin/rake db:migrate
RAILS_ENV=test bin/rake db:schema:dump
dropdb discourse_test
createdb discourse_test
RAILS_ENV=test bin/rake db:schema:load
RAILS_ENV=test bin/rake db:migrate

Isso resolveria o problema original sobre a tabela polls ausente mencionada aqui: Hello from Gitpod! (installing on google cloud + automated dev setup) - #4 by jankeromnes
O mesmo problema foi mencionado nesse tópico: Install Discourse on Ubuntu or Debian for Development - #320

Comecei a depurar aquele código sobre a população do banco de dados de testes, mas me perdi. Por algum motivo, após o esquema ser carregado, ao chamar db:migrate, o Rails ainda tenta avaliar as migrações e recebemos um erro de que a tabela já existe. Até agora, não consegui encontrar um motivo.

Entendi, vamos ajustar os guias então por enquanto para o OP

Muito obrigado por investigar esse bug! :+1: Vou usar as instruções atualizadas para contorná-lo por enquanto.

Aha, interessante, obrigado! Vou dar uma olhada nos Dockerfiles de desenvolvimento existentes para ver se eles podem simplesmente ser iniciados com um clique pelo Gitpod. :smile: Isso seria legal.

Curiosamente, separar db:create e db:migrate em dois comandos distintos, como sugerido em Install Discourse on Ubuntu or Debian for Development - #321, também “funcionou”.

(Mas agora, DISCOURSE_DEV_HOST=.gitpod.io bundle exec rails s -b 0.0.0.0 parece entrar em um loop de reinício com:

/workspace/.rvm/gems/activesupport-6.0.0/lib/active_support/dependencies.rb:551:in `load_missing_constant': Unable to autoload constant Version, expected /workspace/discourse/lib/version.rb to define it (LoadError)

e o servidor web começou a bloquear novamente minha URL de pré-visualização do Gitpod:

Blocked host: 3000-a8a71720-4c30-466b-aea5-5344c97c4e94.ws-eu0.gitpod.io

)

Criei um pull request com uma correção para esse problema: FIX: Remove Versions from Active Record warm up by KrisKotlarek · Pull Request #8105 · discourse/discourse · GitHub

Você poderia verificar se isso resolve o problema na sua máquina? (Está funcionando agora no meu ambiente local)

Acabei de alterar essa variável de ambiente para adicionar um ‘s’ no final

https://review.discourse.org/t/dev-support-multiple-hosts-in-dev/5713

Olá, Jan. Se você tiver tempo, tenho curiosidade sobre quais foram os problemas ou o que não funcionou como você esperava no Spectrum.

Tenho acompanhado um pouco o Spectrum, lendo sobre ele de vez em quando.

(Tentei enviar uma mensagem privada sobre isso, mas, por algum motivo, quando clico no seu perfil, não há o botão de enviar mensagem privada.)