¿Cómo puedo editar directamente la base de datos de Discourse desde una GUI?

Estoy buscando alguna utilidad fácil de usar que pueda ejecutar consultas SQL para organizar globalmente mi base de datos actual, que contiene publicaciones y usuarios importados de dos foros antiguos. Por ejemplo, eliminar temas, agregar ciertas etiquetas a todas las publicaciones que contengan una cadena específica en el título, eliminar usuarios o cambiar accesos cuando los perfiles de usuario no cumplan ciertos criterios, etc.

¿Existe algo similar a phpMyAdmin que pueda editar una copia de seguridad SQL de un administrador de Discourse? ¿O incluso funcionar con una instancia de Discourse en vivo?

Puedo ver que hay un plugin que permite ejecutar consultas dentro de Discourse, pero parece que no permite realizar cambios en los datos.

Descargar una copia de seguridad (sin archivos subidos) y restaurarla en una instancia local de PostgreSQL, que puedes consultar con pgAdmin3, es tu mejor opción.

Sí, el complemento Data Explorer no permite realizar cambios. Pero sugiero que empieces con eso de todos modos. Puedes ejecutar consultas para identificar si tienes problemas y luego ejecutar consultas para seleccionar los registros que necesitan ser modificados. De esta manera, estarás protegido contra daños accidentales a tu base de datos.

Asumo que ya estás ejecutando el sistema en producción, por lo que sería muy cauteloso al modificar la base de datos sin algún tipo de aprobación por parte del equipo de Discourse.

Una vez que estés familiarizado con la base de datos de Discourse y conozcas la magnitud del problema, podrás considerar tus opciones para realizar los cambios. Es posible que descubras que puedes hacerlo todo desde Discourse. O quizás tengas tan pocos cambios que la línea de comandos sea suficiente.

¡Gracias, Falco!

Soy un principiante absoluto cuando se trata de usar cualquier cosa que no implique hacer clic y arrastrar.

Sin embargo, he logrado configurar una instancia local de Discourse (en Windows 10) siguiendo las guías oficiales (sin entender casi nada), así que supongo que en algún lugar habrá instrucciones para instalar pgAdmin3 en el mismo lugar.

Pregunta tonta, pero ¿esta instancia de Discourse offline es a la que debo restaurar el archivo SQL exportado (o hay alguna otra forma de ‘restaurar’ un archivo de copia de seguridad de la base de datos de Discourse en PostgreSQL)?

Y, una vez restaurado, ¿cómo puedo consultarlo? Es decir, ¿dónde y cómo apunto pgAdmin3 a la base de datos en una instancia de Discourse en ejecución? ¿Dónde reside físicamente la base de datos de una instancia de Discourse en ejecución? ¿El hecho de que la instancia de Discourse esté en ejecución bloquea la base de datos de alguna manera?

No logro ver ningún archivo que corresponda claramente a una base de datos entre los archivos de mi servidor local en el directorio ~/var/discourse.

Gracias, Remah.

Me estoy autoalojando Discourse, por lo que no tengo acceso al equipo de Discourse.
Estoy configurando y ejecutando un foro para una pequeña comunidad, de manera puramente voluntaria (es decir, sin presupuesto), y estoy importando datos de foros de MyBB y Yahoo Groups. Estos últimos han introducido, por ejemplo, un montón de notificaciones de correo electrónico automáticas y antiguas generadas por la administración como temas en Discourse, que son bastante irrelevantes en este contexto.

Es probable que necesite realizar pruebas y cambios globales de manera esporádica e incremental, a medida que descubra nuevos problemas; de ahí el deseo de minimizar la curva de aprendizaje y cualquier cosa basada en la línea de comandos.

Vi tu nombre de dominio y te visité por primera vez, así que entiendo en cierta medida tu situación. Por cierto, estoy en Wellington, configurando y usando activamente algunos foros privados para organizaciones benéficas.

Dado tu tiempo y experiencia limitados, te sugiero comenzar con las herramientas más simples y fáciles de usar, y solo pasar al siguiente nivel si te ves obligado. Dominar algo más que el nivel inicial, que es simplemente usar Discourse, tiene un costo muy alto. Puede ser increíblemente potente cuando se usa como está diseñado.

  1. La interfaz gráfica de Discourse con las funciones que de todos modos necesitarás dominar.

    • Familiarízate con lo que necesitas usar en Discourse. Es posible que descubras que puedes hacer el 99% de lo que necesitas sin ir más allá. Así que quizás no necesites avanzar más.

    • Prioriza los problemas visibles reales.
      Por ejemplo, tus antiguas notificaciones por correo electrónico podrían no ser un gran problema. Si son irrelevantes, como está diseñado, perderán relevancia en Discourse a medida que se creen temas más pertinentes. Lo más importante es poner tu foro en funcionamiento correctamente, más que resolver todos los errores de datos.
      Entonces, ¿cuántas de estas notificaciones automáticas por correo electrónico se han convertido en temas?

  2. El complemento Date Explorer te será útil, por lo que es el siguiente paso para comprender mejor la base de datos e identificar qué podría necesitar hacerse. Más adelante te ayudará con los informes, pero no es absolutamente necesario.

    • No poder realizar cambios actúa como una red de seguridad, ya que hace unos años muchos usuarios dañaban sus datos con actualizaciones precipitadas.

    • Las consultas que generas para identificar los registros problemáticos están a un paso de SQL para modificar la base de datos.

  3. La opción final probablemente sea la línea de comandos y los scripts para modificar tu base de datos.

    • Preferiría correr el riesgo de mostrar datos incorrectos antes que arriesgarme a dañar la base de datos modificándola manualmente. Eso puede crear una bomba de tiempo, ya que algunas corrupciones de datos podrían no identificarse a tiempo.

    • Usar Data Explorer te dará resultados de consulta que son ejemplos reales de datos y números cuantificables de registros. Es más probable que obtengas una respuesta correcta del equipo y otros expertos si pueden comprender tus datos y lo que intentas lograr. Entonces podrán asesorarte sobre la forma más sencilla y segura de actualizar la base de datos.

    • Gran parte de lo que necesitas probablemente ya esté en temas existentes, ya que otros sitios enfrentan problemas similares. Así que solo estarás copiando el conocimiento difícilmente adquirido por otra persona.

Exacto. Simplemente no modifiques la base de datos directamente. Te arrepentirás algún día.

Gracias, Remah.

Todo suena como consejos sensatos.
Podría ser capaz de obtener una solución parcial mediante crowdsourcing si logro convencer a algunos usuarios de que escaneen y marquen manualmente los temas para su eliminación.

Por ahora, el sitio en el dominio es esencialmente un marcador de posición en blanco mientras un freelancer ajusta el proceso de importación desde los foros antiguos (ajustando en particular el script de importación para MyBB, con la esperanza de que los campos de perfil de usuario personalizados que configuré allí se importen junto con los usuarios y sus publicaciones. También espero que se analice correctamente el MyCode en algunas publicaciones de MyBB (actualmente los códigos de formato son visibles).

Perdí una semana intentando infructuosamente esta importación por mí mismo, pero simplemente no pude configurar un entorno de desarrollo con todos los requisitos previos necesarios para hacerlo, ni desde una instancia de Ubuntu en Windows 10 ni desde una instancia basada en DigitalOcean, siguiendo la guía oficial para el uso del script de importación de MyBB.

Después de luchar dolorosamente, resolviendo un mensaje de error tras otro, finalmente me topé con un muro infranqueable en ambos casos cuando se trataba de hacer accesible la base de datos SQL al ejecutar el comando final de Ruby on Rails que iniciaría la importación.

Linux y Ruby parecen haber sido escritos por sádicos para masoquistas; ambos son asombrosamente frágiles y arcanos. ¡En un entorno así, las probabilidades de problemas catastróficos al manipular bases de datos parecen ser altas!

Te compadezco.

Quédate siendo administrador del foro. :+1:

La facilidad de uso siempre ha sido deficiente en ese entorno. Creo que la línea de comandos es más importante que nunca, incluso más que hace 20 años.

Pero por eso me gusta Discourse. El equipo se esfuerza por hacer que el núcleo de Discourse sea significativamente más amigable. Desafortunadamente, migrar es una opción de alta tecnología.

Casi con seguridad es mejor hacerlo desde la consola de Rails.

Supongo que eso podría depender de tu criterio para definir ‘mejor’.
En mi caso, al ser un principiante, la curva de aprendizaje más baja posible y la mínima complejidad de acceso para alguien que normalmente no tiene configurado un entorno de desarrollo y que no sabe nada sobre Ruby (ni tampoco sobre Linux) serían prioridades altas. Podría ser diferente si tuviera alguna otra razón (y tiempo) para ponerme al día con estas cosas… En un mundo perfecto, existiría alguna aplicación local con interfaz gráfica para Windows que pudiera interrogar directamente mi configuración de Discourse alojada en Digital Ocean…

Si decides no realizar los cambios directamente en la base de datos, quizás encuentres útiles algunos de los comandos descritos en este tema: Administrative Bulk Operations. Por ejemplo, se detallan cómo etiquetar temas desde la consola de Rails. Lo más importante es hacer una copia de seguridad de la base de datos de tu sitio antes de ejecutar cualquier comando.

Mi criterio para «mejor» es «mucho menos probable que deje tu base de datos en un estado roto o completamente inutilizable». Como eres un «principiante», no sabes qué tablas deben actualizarse cuando haces… algo.

Como lo hagas, asegúrate de hacer copias de seguridad frecuentes.

Un punto válido: intentaré buscar otras alternativas en primer lugar.
Mi ignorancia representa un gran riesgo en ambos escenarios, pero ¿es cierto afirmar que realizar cambios en la base de datos mediante Ruby será más seguro que intentar los mismos cambios usando pgAdmin4?

Se ha mencionado el riesgo de causar daños que no se notan de inmediato; ¿hay algo en un enfoque frente al otro que pueda influir en ese riesgo?

En el fondo de mi mente, si alguna vez decido correr el riesgo (tras realizar las copias de seguridad adecuadas), imagino una instancia de pgAdmin4 ejecutándose en mi droplet de Digital Ocean, a la que pueda acceder directamente mediante una URL en el navegador, en lugar de hacerlo a través de ventanas de consola CLI, eliminando así varias capas de complejidad (asumiendo que esto sea incluso posible).

Básicamente sí. Ruby realiza varias operaciones mágicas para asegurar que se haga lo correcto. Por ejemplo, si destruyes (eliminas) algo de un modelo, sabe cuándo y qué otros elementos deberían eliminarse. Hay muchas cosas “seguras” que puedes hacer con SQL puro, pero casi siempre lo hago en Rails si es posible.

Ah, eso es bueno saberlo, ¡gracias!

Eso parece potencialmente muy útil, ¡gracias!

Cómo resolví ‘¿Cómo puedo editar directamente la base de datos de Discourse desde una interfaz gráfica?’ ya que no se respondió con lo que buscaba.

:warning: No hagas esto en una máquina de producción.

Esto utiliza la herramienta de administración recomendada por PostgreSQL, pgAdmin 4.

Esto se realizó en mi máquina local para aprender más sobre Discourse, por ejemplo: instalar, configurar, optimizar, desarrollar plugins, usar la API, webhooks, etc.

Nota: Discourse se instaló en Ubuntu 18.04 en WSL 2 en Windows 10 según la Guía para principiantes para instalar Discourse en Windows 10 para desarrollo.

Nota: WSL 2 no incluye systemd. Problema 457.

Usando Instalar pgAdmin 4 en Ubuntu 20.04/18.04/16.04 como plantilla.

Usando BASH

$ echo "deb http://apt.postgresql.org/pub/repos/apt/ `lsb_release -cs`-pgdg main" |sudo tee  /etc/apt/sources.list.d/pgdg.list
deb http://apt.postgresql.org/pub/repos/apt/ bionic-pgdg main
$ sudo apt update
$ sudo apt install pgadmin4 pgadmin4-apache2

Correo de usuario de pgAdmin4: postgres@localhost
Contraseña de pgAdmin4: <password 1>

$ sudo /etc/init.d/apache2 restart
$ sudo ufw allow http
$ sudo ufw allow https
$ hostname -I

Registrar <address>

$ whoami

Registrar <user name>

Este siguiente paso puede no ser necesario, ya que no sabía cómo obtener la contraseña de un usuario de la base de datos de Postgres, dado que no soy un experto en PostgreSQL, ni si existía otra forma de configurar el inicio de sesión de la base de datos necesario para pgadmin4.

$ psql postgres

Usando PSQL

postgres=# ALTER ROLE <user name> '<password 2>' WITH PASSWORD '<password 2>'; -- Corregido para que sea válido

Usando un navegador de Internet

http://<address>/pgadmin4

usuario: postgres@localhost
contraseña: <password 1>

Una vez que pgAdmin4 se inicia

Usando pgAdmin4

Crear una conexión de servidor

Pestaña: General
   Nombre: Desarrollo de Discourse
   Grupo de servidores: Servidores
Pestaña: Conexión
   Host: localhost
   Puerto: 5432
   Base de datos de mantenimiento: postgres
   Nombre de usuario: <user name>
   Contraseña: <password 2>

Esto no es perfecto, pero funciona y es mejor que nada. Comentarios y sugerencias bienvenidos.


Ronda extra

PostgreSQL
Catálogo de software - Herramientas de administración/desarrollo

Encuentro que para la mayoría de las acciones es más fácil y un poco más seguro acceder a la consola de Rails en lugar de interactuar directamente con la base de datos.

O, si lo que quieres hacer es cambiar la contraseña de un usuario (oh, eso no es lo que intentabas hacer, pero sigue siendo un buen ejemplo), ejecuta:

cd /var/discourse
./launcher enter app
rake admin:create

A pesar de su nombre, esa tarea de rake te permitirá:

  • Crear un usuario (pero no hay problema si el usuario ya existe)
  • Cambiar la contraseña (pero no es obligatorio)
  • Convertir al usuario en administrador (pero no es obligatorio).

Consulta Operaciones administrativas masivas para ver más ejemplos.

Pero aquí tienes algunos:

users=User.all
me=User.find_by_username ('pfaffman')
me=User.find_by_email('jay@literatecomputing.com')
UserEmail.create!(user: me, email: 'myotheraddress@somewhereelse.com')
posts_with_uploads=Post.where("raw like '%upload%' ")
Group.create(
  name: "mygreatgroup",
  automatic_membership_email_domains: 'literatecomputing.com',
  primary_group: true,
  title: "Literate Computing Staff",
  grant_trust_level: 4,
  flair_url: 'https://example.com/path.icon.png'
)

Gracias por la retroalimentación. Algo más para que yo aprenda.

Aunque tengo décadas de experiencia en desarrollo, nunca he usado Ruby ni Rails. De hecho, empecé a programar con tarjetas perforadas en la universidad y, personalmente, con un Atari 800.