Moviendo la base de datos postgres a un servidor central: error de compilación

Hola,

Actualmente estoy migrando de una configuración clásica de dos contenedores (contenedores web_only y data separados) a una configuración donde la base de datos está alojada en un servidor de base de datos central (no dentro de un contenedor docker).

La base de datos central se creó a partir del volcado dump.sql que forma parte del archivo de copia de seguridad. El docker compose web_only.yaml utiliza

conectar a la base de datos postgres central

DISCOURSE_DB_SOCKET: ‘’
DISCOURSE_DB_USERNAME: discourse
DISCOURSE_DB_PASSWORD: xxxx
DISCOURSE_DB_HOST: 10.10.10.xx
DISCOURSE_DB_NAME: discourse

Durante la compilación de web_only, obtengo el siguiente error:

FALLÓ
--------------------
Pups::ExecError: cd /var/www/discourse && su discourse -c 'bundle exec rake db:migrate' falló con el retorno #<Process::Status: pid 741 exit 1>
Ubicación del fallo: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec falló con los parámetros {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
falló el arranque con el código de salida 1
** FALLÓ EL ARRANQUE ** por favor, desplázate hacia arriba y busca mensajes de error anteriores, puede haber más de uno.

Se puede acceder al host de la base de datos con estos datos. ¿Alguna idea de lo que está pasando aquí? La misma compilación con el contenedor de base de datos estándar finaliza con éxito.

¿Está seguro de que la base de datos remota está disponible desde el servidor? Parece que no lo está. ¿Puede hacer telnet al puerto de la base de datos desde la máquina del servidor web?

Hola Jay,

Seguí el hilo de Falco en Configure Discourse to use a separate PostgreSQL server El servidor de base de datos está disponible desde la VM:

root@docker2:/var/discourse# pg_isready -d discourse -h 10.10.10.18 -p 5432 -U discourse    
10.10.10.18:5432 - Verbindungen werden angenommen

(se aceptan conexiones)

El nombre de la base de datos, el usuario y la contraseña en web_only.yml también son correctos. El error de compilación es

FAILED
--------------------
Pups::ExecError: cd /var/www/discourse &amp;&amp; su discourse -c 'bundle exec rake db:migrate' failed with return #&lt;Process:
:Status: pid 829 exit 1&gt;
Location of failure: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
exec failed with the params {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migra
te'"]}
bootstrap failed with exit code 1

No soy un experto en Ruby, así que necesitaría ayuda para depurar a partir del error que aparece aquí.

Adiós, Thommie

En ese caso:

¿Qué plugins tienes? ¿Tienes el plugin de IA?

¿Qué versión de postgres estás ejecutando?

  • PostgreSQL 13.12
  • sin plugin de IA
  • plugins:
cmd:
          - git clone https://github.com/discourse/docker_manager.git
          - git clone https://github.com/discourse/discourse-shared-edits.git
          - git clone https://github.com/discourse/discourse-chat-integration
          - git clone https://github.com/discourse/wp-discourse
          - git clone https://github.com/discourse/discourse-openid-connect
          - git clone https://github.com/discourse/discourse-calendar
          - git clone https://github.com/discourse/discourse-data-explorer
          - git clone https://github.com/paviliondev/discourse-events
          - git clone https://github.com/paviliondev/discourse-locations
          - git clone https://github.com/discourse/discourse-reactions
          - git clone https://github.com/discourse/discourse-chat
          - git clone https://github.com/discourse/discourse-voting.git
          - git clone https://github.com/discourse/discourse-user-notes.git
          - git clone https://github.com/discourse/discourse-solved.git
          - git clone https://github.com/discourse/discourse-footnote.git
          - git clone https://github.com/discourse/discourse-docs.git
          - git clone https://github.com/discourse/discourse-docs-card-filter.git
          - git clone https://github.com/discourse/discourse-assign.git
          - git clone https://github.com/discourse/discourse-templates.git
          - git clone https://github.com/discourse/discourse-saved-searches.git
          - git clone https://github.com/discourse/discourse-tooltips
          - git clone https://github.com/nathan-nz/discourse-wikified-posts
          - git clone https://github.com/discourse/discourse-post-voting.git
          - git clone https://github.com/discourse/discourse-encrypt.git
          - git clone https://github.com/discourse/discourse-zoom.git
          - git clone https://github.com/discourse/discourse-spoiler-alert.git
          - git clone https://github.com/discourse/discourse-category-experts.git

¿Puedes

?

El mensaje de error exacto en la traza de la pila nos dirá exactamente cuál es el problema :smile:

¿Tu plan es deshacerte del contenedor de datos?

1 me gusta

código de error:

> FALLÓ
> --------------------
> Pups::ExecError: cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate' falló con retorno #<Process::Status: pid 816 exit 1>
> Ubicación del fallo: /usr/local/lib/ruby/gems/3.2.0/gems/pups-1.2.1/lib/pups/exec_command.rb:132:in `spawn'
> exec falló con los parámetros {"cd"=>"$home", "hook"=>"db_migrate", "cmd"=>["su discourse -c 'bundle exec rake db:migrate'"]}
> bootstrap falló con el código de salida 1

En el nuevo sistema, los datos deberán provenir de la base de datos central en lugar de la base de datos de Docker, si es posible.

Me pregunto si tener esto configurado en un valor en blanco en lugar de no establecido causará problemas.

En cualquier caso, publique la salida completa.

1 me gusta

el log de compilación completo después de

./launcher rebuild web_only

web_only_build.zip (9.4 KB)

el yaml

web_only.zip (2.4 KB)

En cuanto a DISCOURSE_DB_SOCKET: ‘’: como usamos una conexión remota, supongo que el valor del socket no es relevante en ambos casos (datos dockerizados o datos remotos)

1 me gusta

El error estaba más arriba en el registro de compilación:

…
docker_manager ya está en la última versión compatible
wp-discourse ya está en la última versión compatible

I, [2023-11-10T21:08:17.388213 #1]  INFO -- : cd /var/www/discourse & su discourse -c 'bundle exec rake db:migrate'
El nombre del plugin es 'discourse-topic-voting', pero el directorio del plugin se llama 'discourse-voting'
rake abortado!
ActiveRecord::StatementInvalid: PG::InsufficientPrivilege: ERROR:  permiso denegado para la tabla users (ActiveRecord::StatementInvalid)

¡Así que buenas noticias! Se está conectando bien, son los permisos de la base de datos los que necesitan ajustarse.

2 Me gusta

Hmmmm, extraño, el usuario de la base de datos discourse tiene

postgres=# GRANT ALL ON DATABASE discourse TO discourse;

en el servidor postgres central. ¿Necesitamos algo más para este rol?

Eso no afecta a las tablas existentes.

De memoria, quizás:

ALTER DATABASE "discourse" OWNER TO "discourse";

o:

ALTER DEFAULT PRIVILEGES IN SCHEMA "public" GRANT ALL ON TABLES TO "discourse";

Los registros de postgres también deberían indicarte con más detalle qué operaciones están fallando.

4 Me gusta

… ok ok, parece que tengo algunos problemas más de permisos aquí, mira /var/log/postgresql/postgresql-13-main.log:

2023-11-10 22:07:58.371 UTC [196127] postgres@postgres STATEMENT:  ALTER DEFAULT PRIVILEGES IN SCHEMA 'public' GRANT ALL ON TABLES TO 'discourse';
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse ERROR:  permission denied for table site_settings
2023-11-10 22:10:18.270 UTC [196160] discourse@discourse STATEMENT:  SELECT name, data_type, value FROM site_settings
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse ERROR:  permission denied for table users
2023-11-10 22:10:18.313 UTC [196160] discourse@discourse STATEMENT:  SELECT COUNT(*) FROM (SELECT 1 AS one FROM \"users\" LIMIT 20) subquery_for_count

OK, como siempre, fue un “problema de capa 8” :smiling_face_with_tear:
Ya tenía una base de datos de discourse en postgres, pero el usuario/rol de discourse no tenía todos los privilegios requeridos sobre ella. Y me perdí algunas diferencias importantes de “comportamiento” entre mariadb y postgres…

Ahora recreé todo: usuario, base de datos, permisos para el usuario/rol (incluyendo ALTER DEFAULT PRIVILEGES FOR ROLE discourse IN SCHEMA public GRANT ALL ON TABLES TO “discourse”; para que coincida con las tablas creadas por este usuario en el futuro)

La compilación terminó y la instancia funciona bien con el servidor postgres remoto, así que está lista para importar la copia de seguridad de la instancia anterior.

4 Me gusta

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.