¡Hola desde Gitpod! (instalación en Google Cloud + configuración automatizada de desarrollo)

¡Hola comunidad de Discourse! :wave:

Trabajo en gitpod.io, un IDE gratuito de un clic para GitHub. Actualmente usamos Spectrum para nuestra comunidad, pero tenemos algunos problemas con él y nos encantaría levantar una instancia de Discourse para probarla y, posiblemente, migrar.

Nos gustaría usar nuestra cuenta de Google Cloud para ello, si es posible. ¿Podrías indicarme la dirección correcta? Por ejemplo, ¿es el nuevo Google Cloud Run una buena opción para ejecutar una instancia de Discourse?

Además, dado que nuestra misión es automatizar por completo todas las configuraciones de desarrollo (al menos para proyectos de código abierto), me gustaría contribuir con una configuración totalmente automatizada para Discourse, permitiendo a los colaboradores iniciar un entorno de Discourse listo para codificar en línea con un solo clic (en lugar de leer largas listas de instrucciones de configuración e instalar/configurar manualmente una serie de dependencias en su dispositivo actual). Ya he comenzado a trabajar en esto basándome en la excelente configuración automatizada de Discourse para Janitor de @notriddle (¡hola!).

Sin embargo, actualmente me enfrento a un problema, ya que recientemente las instrucciones de configuración fallan por falta de una tabla “polls”. No estoy seguro de cómo solucionarlo aún, pero seguiré investigando. Solo pensé en mencionarlo aquí.

Podría serlo, pero no es tan sencillo. Discourse no es un contenedor sin estado, que es precisamente para lo que está diseñado Google Cloud Run; por lo tanto, necesitarás una forma de agregar algún tipo de volumen persistente para los datos que almacena Discourse (archivos subidos, avatares, base de datos).

Yo usaría una instancia normal de Google Compute y punto. Con algún tipo de script o herramientas de gestión de infraestructura, deberías poder automatizar el despliegue de nuevas instancias de Discourse. Esta guía también podría ayudarte: Install Discourse on Ubuntu or Debian for Development

¿Qué instrucciones de configuración estás utilizando? Si falta la tabla polls, sugiere que no has ejecutado las migraciones del plugin. Deberían ejecutarse automáticamente en modo de desarrollo. En modo de prueba, necesitas agregar LOAD_PLUGINS=1 antes del comando rake db:migrate

¡Gracias por vuestras respuestas @marianord y @david!

Eso suena más razonable que usar Cloud Run, ya que extraer todo el estado de los contenedores de Discourse podría llevar algún tiempo. ¡Gracias por señalarme la guía! Intentaré seguirla para configurar una instancia de Compute y volveré aquí con mis hallazgos.

Estoy siguiendo https://github.com/discourse/discourse/blob/master/docs/DEVELOPER-ADVANCED.md.

El error exacto que vi fue:

== 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
                            ^

Mientras intentaba hacer:

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

También probé añadiendo esta línea:

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

pero sin éxito.

¡Muchas gracias por el consejo! Lo probaré y también volveré aquí con novedades. (Perdón por hacer dos preguntas en una. Espero que no haga la discusión demasiado confusa.)

La instalación para desarrolladores es mucho más lenta y está diseñada para… el desarrollo. Por lo tanto, querrás seguir las instrucciones de instalación estándar. Es bastante fácil automatizarla. Mi servicio de instalación está ahora completamente automatizado (excepto por la configuración DNS requerida por Mailgun, ya que no tengo control sobre el DNS del cliente).

La parte difícil de la instalación es la configuración del correo.

Además, la instalación y el mantenimiento son cosas diferentes.

¡Gracias @pfaffman! Perdón por la confusión, mezclé dos cosas en mi mensaje original: 1) instalar Discourse para la comunidad de Gitpod, y 2) automatizar la configuración de desarrollo para desarrolladores y contribuyentes de Discourse. Afortunadamente, estoy siguiendo la guía de desarrolladores para el punto 2), no para el 1). :sweat_smile:

@david Hmm, desafortunadamente, con:

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

Aún falla con:

== 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
                            ^

¿Entendí correctamente tu sugerencia? ¿Tendrías otras ideas sobre cómo solucionarlo? (Intenté eliminar las tablas antes, pero falló con un error diferente que no recuerdo. Aunque estoy dispuesto a intentarlo de nuevo.)

Además, olvidé mencionar que mis instrucciones de configuración funcionaron hasta la semana pasada más o menos, así que el error apareció recientemente después de un rebase de Discourse. Creo que fue después de la migración a Rails 6, ¿quizás? DEV: Upgrade Discourse to Rails 6 (#8083) · discourse/discourse@32b8a2c · GitHub

Para tu información, puedes reproducir fácilmente el error intentando abrir mi fork de Discourse en Gitpod: Dashboard . Verás que mi configuración automatizada falla y obtendrás un entorno interactivo donde se pueden probar varios comandos de Discourse en la Terminal.

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

Contrario al mensaje del commit, creo que las migraciones de los plugins funcionaban antes de este commit. Ya no lo hacen. No importa si se proporciona LOAD_PLUGINS=1 o no: las migraciones de los plugins no se están ejecutando en mi entorno de desarrollo.

Creo que es debido a esto:

--- 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")
 
     # Incluir migraciones automáticamente
-    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?

Eso es INSTALL-cloud.

Imagina que hubiera un contenedor Docker incluido con Discourse y que pudieras usarlo sin instalar nada.

He visto este error en la migración multisitio; en la base de datos de desarrollo/pruebas funciona bien. Voy a depurarlo cuidadosamente hoy.

Para:

Esto debería hacer que los entornos de desarrollo se comporten correctamente al seguir las guías.

@kris.kotlarek, ¿podrías revisar ese commit… por qué dejó de funcionar el volcado del esquema → carga en Rails 6 con nuestros plugins?

Claro, lo revisaré esta noche

Creo que he encontrado el problema: ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: la relación "polls" no existe
Cuando load_config se evalúa durante la creación de la base de datos, sobrescribe migrations_paths.

Así es como ocurre esto cuando intentamos ejecutar db:create y db:migrate al mismo tiempo:

Sin embargo, si los ejecutamos por separado, las rutas están bien:

Creo que tenemos dos opciones:

  1. Cambiar las guías y recomendar usar los dos comandos por separado.
  2. Hacer un monkey patch y usar ||=.

¿Qué opinas?

¿Eso solucionará el problema?

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

Esto solucionaría el problema original sobre la tabla polls que falta, mencionado aquí: Hello from Gitpod! (installing on google cloud + automated dev setup) - #4 by jankeromnes
El mismo problema se mencionó en ese tema: Install Discourse on Ubuntu or Debian for Development - #320

Comencé a depurar ese código sobre la población de la base de datos de pruebas, pero me perdí. Por alguna razón, después de cargar el esquema, al llamar a db:migrate, Rails aún intenta evaluar las migraciones y recibimos un error indicando que la tabla ya existe. Hasta ahora, no he podido encontrar una razón.

Vale, ajustemos las guías por ahora para el OP.

¡Muchas gracias por investigar este error! :+1: Por ahora usaré las instrucciones actualizadas para solucionarlo.

¡Ajá, interesante, gracias! Revisaré los Dockerfiles de desarrollo existentes para ver si se pueden iniciar con un solo clic en Gitpod. :smile: Eso sería genial.

Curiosamente, dividir db:create y db:migrate en dos comandos separados, como se sugiere en Install Discourse on Ubuntu or Debian for Development - #321, también “funcionó”.

(Pero ahora, DISCOURSE_DEV_HOST=.gitpod.io bundle exec rails s -b 0.0.0.0 parece entrar en un ciclo de reinicios con:

/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)

y el servidor web volvió a bloquear mi URL de vista previa de Gitpod:

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

)

He creado un pull request con una solución para ese problema: FIX: Remove Versions from Active Record warm up by KrisKotlarek · Pull Request #8105 · discourse/discourse · GitHub

¿Podrías verificar si eso resuelve el problema en tu máquina? (En mi entorno local ya funciona).

Acabo de cambiar esa variable de entorno para que termine con una s

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

Hola Jan, si tienes tiempo, me da curiosidad saber cuáles fueron los problemas o qué no funcionó como esperabas con Spectrum.

He estado siguiendo un poco a Spectrum, leyendo sobre ellos de vez en cuando.

(Intenté enviarte un mensaje privado sobre esto, pero por alguna razón, cuando hago clic en tu perfil, no hay un botón para enviar un mensaje privado.)