Pg_admin nach upgrade auf Suse 15.2 funktioniert nicht mehr

Ich hatte pgAdmin 4.1 mit PostgreSQL10 unter Suse Linux 15.1 erfolgreich am Laufen.
Nach dem Upgrade von Suse Linux auf 15.2 bekomme ich beim connect an den pgadmin-Server folgenden Fehler:

# Internal Server Error

The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.

Im Logfile finde ich folgendes.

2021-07-27 13:36:02,410: ERROR	werkzeug:	Error on request:
Traceback (most recent call last):
  File "/usr/lib/python3.6/site-packages/werkzeug/serving.py", line 271, in run_wsgi
    execute(self.server.app)
  File "/usr/lib/python3.6/site-packages/werkzeug/serving.py", line 259, in execute
    application_iter = app(environ, start_response)
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 2309, in __call__
    return self.wsgi_app(environ, start_response)
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 2295, in wsgi_app
    response = self.handle_exception(e)
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1741, in handle_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 2292, in wsgi_app
    response = self.full_dispatch_request()
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1815, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1718, in handle_user_exception
    reraise(exc_type, exc_value, tb)
  File "/usr/lib/python3.6/site-packages/flask/_compat.py", line 35, in reraise
    raise value
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1813, in full_dispatch_request
    rv = self.dispatch_request()
  File "/usr/lib/python3.6/site-packages/flask/app.py", line 1799, in dispatch_request
    return self.view_functions[rule.endpoint](**req.view_args)
  File "/usr/lib/python3.6/site-packages/flask/views.py", line 88, in view
    return self.dispatch_request(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/pgadmin4-web/pgadmin/browser/utils.py", line 259, in dispatch_request
    return method(*args, **kwargs)
  File "/usr/lib/python3.6/site-packages/pgadmin4-web/pgadmin/browser/server_groups/servers/__init__.py", line 1105, in connect
    in_recovery, wal_paused = recovery_state(conn, manager.version)
  File "/usr/lib/python3.6/site-packages/pgadmin4-web/pgadmin/browser/server_groups/servers/__init__.py", line 51, in recovery_state
    status, result = connection.execute_dict(recovery_check_sql)
  File "/usr/lib/python3.6/site-packages/pgadmin4-web/pgadmin/utils/driver/psycopg2/connection.py", line 1199, in execute_dict
    desc.to_dict() for desc in cur.ordered_description()
  File "/usr/lib/python3.6/site-packages/pgadmin4-web/pgadmin/utils/driver/psycopg2/connection.py", line 1199, in <listcomp>
    desc.to_dict() for desc in cur.ordered_description()
  File "/usr/lib/python3.6/site-packages/pgadmin4-web/pgadmin/utils/driver/psycopg2/cursor.py", line 94, in to_dict
    ores = OrderedDict(self.orig_col._asdict())
AttributeError: 'psycopg2.extensions.Column' object has no attribute '_asdict'

Der PostgreSQL-Server ist aktiv und ich kann mich dort anmelden und ich sehe auch alle Datenbanken dieses Servers. Ich kann auch mit den Datenbanken arbeiten.

Hat jemand eine Idee, woran der Fehler liegen kann ?
Vielen Dank !

Rüdiger

Welche Version psycopg2 verwendest du? Ich nehme normalerweise nicht die Versionen aus dem Repo sondern mache eine virtuelle Umgebung und binde die Module mit pip ein.

Viele Grüße
Uwe

Uwe,
es ist bei mir psycopg2 2.8.5 installiert. Das sagt jedenfalls pip.
Ich habe die pgAdmin 4.1 mit Yast installiert unter Suse 15.1, da war alles gut. Nach dem upgrade auf 15.2 kam der Fehler. Meinst Du, daß ich die Versionen löschen soll und z.b. pgadmin4-5.5-py3-none-any.whl mit pip installieren soll, so nach dem Motto pip install pgadmin4-5.5-py3-none-any.whl.

Rüdiger

Ich lass meist die Finger von den Webapplikationen, die bei Suse im Repository zu finden sind. Oft sind die auch nicht so wirklich aktuell. Ich komm jedenfalls besser damit klar wenn ich Sachen wie PgAdmin oder Nextcloud etc. selbst installiere. Insofern kannst du das ja einfach mal probieren, PgAdmin in einer eigenen virt. Umgebung laufen zu lassen. Löschen musst du da für den Anfang nichts. Viel Zeit braucht man dafür eigentlich auch nicht.
Speziell bei Python hat man dann auch den Vorteil einer sauberen Installation und kann ggf. auch mehrere Pythonversionen nebeneinander betreiben.

Uwe,
vielen Dank für Deinen Hinweis. Ich habe mir ein Environment eingerichtet. Ich kämpfe noch mit Zugriffsrechten für Apache2. Ich melde mich, sobald ich Erfolg habe.

Rüdiger

PGAdmin hat so ein paar zusätzliche Verzeichnisse irgendwo, da braucht wwwrun:www auch Schreibrechte.

Gruß Uwe

Uwe,
ich bin jetzt soweit, daß ich pgadmin4-5 aufrufen und mit damit arbeiten kann, allerdings ist der Aufruf nicht so wie ich mir das gedacht habe. Ich muß pgadmin4 auf dem bin-Verzeichnis des Environments aufrufen (./pgadmin4) danach kann ich im Firefox über 127.0.0.1:5050 den pgAdmin aktivieren. Ich dachte ich kann den pgadmin einfach im Browser mit 127.0.0.1:5050 aufrufen.
Kann man das irgendwo konfigurieren oder habe ich da irgendwo einen Fehler gemacht ?

Gruß,
Rüdiger

Naja, starten muß der schon irgend wie. Du kannst das aus dem bin-Verzeichnis machen, dann läuft er in seinem eigenen Server-Prozess (für Produktiv nicht zu empfehlen). Dss kannst du auch automatisieren, so das er beim Booten oder Login gestartet wird. Oder du bindest ihn in die Apache- (oder was auch immer)-Konfig mit mod_wsgi ein. Dann geht das mit der URL im Browser, sofern der Webserver läuft.
https://www.pgadmin.org/docs/pgadmin4/development/server_deployment.html

Uwe,
vielen Dank für Deinen Tipp. Ich habe es aber leider noch nicht hinbekommen den pgadmin aus dem Firefox aus zu starten.
Ich denke apache läuft:

Eisele@kuchen:~> systemctl status apache2 
● apache2.service - The Apache Webserver
   Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; vendor preset: disabled)
   Active: active (running) since Tue 2021-08-03 09:46:19 CEST; 7min ago
 Main PID: 1532 (httpd-prefork)
   Status: "Processing requests..."
    Tasks: 34
   CGroup: /system.slice/apache2.service
           ├─1532 /usr/sbin/httpd-prefork -DSYSCONFIG -Dpgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//>
           ├─1760 /usr/sbin/httpd-prefork -DSYSCONFIG -Dpgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//>
           ├─1762 /usr/sbin/httpd-prefork -DSYSCONFIG -Dpgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//>
           ├─1763 /usr/sbin/httpd-prefork -DSYSCONFIG -Dpgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//>
           ├─1764 /usr/sbin/httpd-prefork -DSYSCONFIG -Dpgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//>
           ├─1765 /usr/sbin/httpd-prefork -DSYSCONFIG -Dpgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//>
           └─1766 /usr/sbin/httpd-prefork -DSYSCONFIG -Dpgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//>

Warning: Journal has been rotated since unit was started. Log output is incomplete or unavailable.

meine pgadmin4.conf sieht so aus: Die Datei befindet sich auf /etc/apache2/conf.d

#
#
#  pgadmin4.conf
#  
# Änderungen 30-Jul-2021
#
# auskommentiert
LoadModule wsgi_module modules/mod_wsgi.so

<VirtualHost *:80>
# localhost geändert in kuchen
# 30-jul-2021
    ServerName kuchen 


    WSGIDaemonProcess pgadmin processes=1 threads=25 python-home=/home/Eisele/Eisele/Layered/python3/environments/pgadmin45/env/
    WSGIScriptAlias / /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi


    <Directory "/home/Eisele/Eisele/Layered/python3/environments/pgadmin45/env/lib/python3.6/site-packages/pgadmin4/">
        WSGIProcessGroup pgadmin
        WSGIApplicationGroup %{GLOBAL}
 #       <IfModule mod_authz_core.c>
 #               # Apache 2.4
                 Options Indexes MultiViews
                AllowOverride None
                Require all granted
 #        </IfModule>
 #       <IfModule !mod_authz_core.c>
 #               # Apache 2.2
 #               Order Deny,Allow
 #               Deny from All
 #               Allow from 127.0.0.1
 #               Allow from ::1
 #       </IfModule>
    </Directory>
</VirtualHost>

Die pgAdmin4.wsgi sieht so aus.

##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2021, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################

import os
import sys

if sys.version_info < (3, 4):
    raise Exception('This application must be run under Python 3.4 or later.')

import builtins

root = os.path.dirname(os.path.realpath(__file__))
if sys.path[0] != root:
    sys.path.insert(0, root)

# Ensure the global server mode is set.
builtins.SERVER_MODE = True

import config

# When running it as a WSGI application, directory for the configuration file
# must present.
if not os.path.exists(os.path.dirname(config.SQLITE_PATH)):
    raise Exception(
        """
Required configuration file is not present!
Please run setup.py first!"""
    )

from pgAdmin4 import app as application

Rüdiger

Was passiert, wenn du im Browser http://localhost aufrufst? Sind im Apache-Log Fehlermeldungen? Der User, unter dem der Webserver läuft braucht ggf. Schreibrechte im Installationsverzeichnis der PGAdmin.

Viele Grüße
Uwe

Uwe,
von dem Subdirectory python3 abwärts, sieht es so aus:

ls -ltr python3
total 4
drwxr-xr-x 5 wwwrun www 4096 Jul 30 11:36 environments

bei http://localhost, bekomme ich den Fehler

Zugriff verweigert!

Der Zugriff auf das angeforderte Verzeichnis ist nicht möglich. Entweder ist kein Index-Dokument vorhanden oder das Verzeichnis ist zugriffsgeschützt.

Sofern Sie dies für eine Fehlfunktion des Servers halten, informieren Sie bitte den Webmaster hierüber.
Error 403
localhost
Apache 

Im Logfile steht folgendes:

tail error_log
[Tue Aug 03 10:27:18.027746 2021] [authz_core:error] [pid 1765] [client 127.0.0.1:47976] AH01630: client denied by server configuration: /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib, referer: http://localhost/
[Tue Aug 03 10:33:17.911354 2021] [mpm_prefork:notice] [pid 1532] AH00170: caught SIGWINCH, shutting down gracefully
[Tue Aug 03 10:33:18.005338 2021] [so:warn] [pid 5358] AH01574: module wsgi_module is already loaded, skipping
AH00557: httpd-prefork: apr_sockaddr_info_get() failed for kuchen.softeis
AH00558: httpd-prefork: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
[Tue Aug 03 10:33:18.020074 2021] [ssl:warn] [pid 5358] AH01873: Init: Session Cache is not configured [hint: SSLSessionCache]
[Tue Aug 03 10:33:18.021888 2021] [mpm_prefork:notice] [pid 5358] AH00163: Apache/2.4.43 (Linux/SUSE) OpenSSL/1.1.1d mod_wsgi/4.5.18 Python/2.7 configured -- resuming normal operations
[Tue Aug 03 10:33:18.021944 2021] [core:notice] [pid 5358] AH00094: Command line: '/usr/sbin/httpd-prefork -D SYSCONFIG -D pgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -D SYSTEMD -D FOREGROUND'
[Tue Aug 03 10:33:34.524228 2021] [authz_core:error] [pid 5368] [client 127.0.0.1:47986] AH01630: client denied by server configuration: /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib
[Tue Aug 03 10:38:54.117504 2021] [authz_core:error] [pid 5371] [client 127.0.0.1:48000] AH01630: client denied by server configuration: /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib

Was ich nicht verstehe ist diese Zeile:

/home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib

Dieses Directory /lib gibt es nicht, und ich finde nicht wo diese Definition herkommt :-((

Gruß,
Rüdiger

Ich würde mal vermuten, dass dies im Verzeichnis der virtuellen Umgebung sein sollte.

Grüße
Uwe

Ich dachte die virtuelle Umgebung ist das hier.

/home/Eisele/Eisele/Layered/python3/environments/pgadmin45/env

Ich habe eben das lib-Verzeichnis nach

/home/Eisele/Eisele/Layered/python3/environments/pgadmin45/env/lib

kopiert und bekomme jetzt im error_log diese Meldung.

[Tue Aug 03 11:38:44.447881 2021] [mpm_prefork:notice] [pid 6090] AH00170: caught SIGWINCH, shutting down gracefully
[Tue Aug 03 11:38:44.517503 2021] [so:warn] [pid 6908] AH01574: module wsgi_module is already loaded, skipping
AH00557: httpd-prefork: apr_sockaddr_info_get() failed for kuchen.softeis
AH00558: httpd-prefork: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName' directive globally to suppress this message
[Tue Aug 03 11:38:44.554908 2021] [ssl:warn] [pid 6908] AH01873: Init: Session Cache is not configured [hint: SSLSessionCache]
[Tue Aug 03 11:38:44.556791 2021] [mpm_prefork:notice] [pid 6908] AH00163: Apache/2.4.43 (Linux/SUSE) OpenSSL/1.1.1d mod_wsgi/4.5.18 Python/2.7 configured -- resuming normal operations
[Tue Aug 03 11:38:44.556856 2021] [core:notice] [pid 6908] AH00094: Command line: '/usr/sbin/httpd-prefork -D SYSCONFIG -D pgadmin4.conf -C PidFile /var/run/httpd.pid -C Include /etc/apache2/sysconfig.d//loadmodule.conf -C Include /etc/apache2/sysconfig.d//global.conf -f /etc/apache2/httpd.conf -c Include /etc/apache2/sysconfig.d//include.conf -D SYSTEMD -D FOREGROUND'
[Tue Aug 03 11:39:07.063527 2021] [authz_core:error] [pid 6921] [client 127.0.0.1:48242] AH01630: client denied by server configuration: /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi

und die Berechtigungen sehen so aus:

-rwxr-xr-x 1 wwwrun www 949 Aug  3 11:06 /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi

Ensprechend deiner Apache-Konfig sollte hier die venv zu finden sein:

/home/Eisele/Eisele/Layered/python3/environments/pgadmin45

Die hat dann Unterverzeichnisse wie bin, lib etc. Dort sind dann auch die Pythonpakete und das wsgi-Skript. Darauf braucht dann der Apache die entsprechenden Rechte. Zusätzlich werden noch ggf Verzeichnisse unter /var benötigt, wo auch Rechte gesetzt sein müssen.

Da ich gerade auch damit beschäftigt bin, kurz mein Vorgehen:

cd [da-wo-die-venv-sein-soll]
python3 -m venv pg4env
cd pg4env
./bin/pip install --upgrade pip
./bin/pip install pgadmin4

Danach hab ich noch die Konfiguration angepasst, so dass sie auf die alten Files zeigt und kann dann mit ./bin/pgadmin zumindest mal die Installation starten, so dass sie über Port 5050 erreichbar ist. Jetzt hab ich auch noch ein Problem, dass wsgi offenbar den angegebenen Python-Pfad nicht benutzt.
Ich hoff das war ein bisschen hilfreich.
Gruß Uwe

Uwe,
das Starten von

./<environment>/bin/pgadmin4

und dann über

localhost:5050 

funktioniert.
Was nicht funktioniert ist der Aufruf http://localhost, sowie es z.B. hier steht

https://www.digitalocean.com/community/tutorials/how-to-install-configure-pgadmin4-server-mode

aber diese Beschreibung ist für Ubuntu und da ist die Sache ja ein bißchen anders als bei SuSe.
Hier wird z.B. das Directory /etc/apache2/sites-available/ erwähnt, welches es bei SuSe nicht gibt, dort heißt es config.d

Rüdiger

Wie sieht denn die Ausgabe von

namei -l /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi

aus?
Ich vermute ein Berechtigungs-Problem in einem übergeordneten Verzeichnis.
Ich lege diese Dinge immer unter /srv/www/htdocs oder /opt ab.
Unterhalb von /home hatte ich auch schon mal Probleme dieser Art.

kuchen:~ # namei -l /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi
f: /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi
drwxr-xr-x root   root  /
drwxr-xr-x root   root  home
drwxr-xr-x Eisele users Eisele
drwxr-xr-x Eisele users Eisele
drwxr-xr-x Eisele users Layered
drwxr-xr-x wwwrun www   python3
drwxr-xr-x wwwrun www   environments
drwxr-xr-x wwwrun www   pgadmin45
drwxr-xr-x wwwrun www   lib
drwxr-xr-x wwwrun www   python3.6
drwxr-xr-x wwwrun www   site-packages
drwxr-xr-x wwwrun www   pgadmin4
-rwxr-xr-x wwwrun www   pgAdmin4.wsgi
kuchen:~ # 

Meinst Du, daß ich das gesamte Environment unter /srv/www/htdocs/ erzeugen soll ?

Rüdiger

Rein der Ordnung und der Zugriffsrechte wegen lege ich die Dinge die ich über den Webserver verteilen will unter /srv/www/htdocs ab. Macht die Sache einfacher. Im home ist das deutlich nerviger.
Im Moment hab ich da aber auch Probleme mit dem wsgi-Skript, werd dich dabei auch auf dem laufenden halten.

Grüße Uwe

Eigentlich sieht es gut aus, von den Berechtigungen. Probiere mal folgendes, eventuell als root:
sudo -u wwwrun cat /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi

Dieses Kommando versucht als User wwwrun dies wsgi-Datei auszulesen und auszugeben. Sollte der Inhalt in der Konsole angezeigt werden, liegt es nicht an den Berechtigungen. Zumindest bei dieser Datei.

Hat funktioneiert

sudo -u wwwrun cat /home/Eisele/Eisele/Layered/python3/environments/pgadmin45/lib/python3.6/site-packages/pgadmin4/pgAdmin4.wsgi
##########################################################################
#
# pgAdmin 4 - PostgreSQL Tools
#
# Copyright (C) 2013 - 2021, The pgAdmin Development Team
# This software is released under the PostgreSQL Licence
#
##########################################################################

import os
import sys

if sys.version_info < (3, 4):
    raise Exception('This application must be run under Python 3.4 or later.')

import builtins

root = os.path.dirname(os.path.realpath(__file__))
if sys.path[0] != root:
    sys.path.insert(0, root)

# Ensure the global server mode is set.
builtins.SERVER_MODE = True

import config

# When running it as a WSGI application, directory for the configuration file
# must present.
if not os.path.exists(os.path.dirname(config.SQLITE_PATH)):
    raise Exception(
        """
Required configuration file is not present!
Please run setup.py first!"""
    )

from pgAdmin4 import app as application