Search code examples
nginxpgadmin-4

pgadmin4 wont work in specific location behind nginx


I got some trouble: pgadmin working perfect behind nginx in location /, but it wont work behind location /pgadmin Work great:

location / {
         proxy_http_version 1.1;
         proxy_set_header X-Real-IP  $remote_addr;
         proxy_set_header X-Forwarded-For $remote_addr;
         proxy_set_header Host $host;

         proxy_pass         http://127.0.0.1:5050;
}

Wont work:

location /pgadmin {
         proxy_http_version 1.1;
         proxy_set_header X-Real-IP  $remote_addr;
         proxy_set_header X-Forwarded-For $remote_addr;
         proxy_set_header Host $host;

         proxy_pass         http://127.0.0.1:5050;
}

May be i need some specific rewrite?


Solution

  • For version pgAdmin 4 v3.0, until the issue is actually fixed, here's a quick command-line hack based on this.

    cat > quickfix.txt <<THE_END
    class ReverseProxied(object):
        def __init__(self, app):
            self.app = app
        def __call__(self, environ, start_response):
            script_name = environ.get("HTTP_X_SCRIPT_NAME", "")
            if script_name:
                environ["SCRIPT_NAME"] = script_name
                path_info = environ["PATH_INFO"]
                if path_info.startswith(script_name):
                    environ["PATH_INFO"] = path_info[len(script_name):]
            scheme = environ.get("HTTP_X_SCHEME", "")
            if scheme:
                environ["wsgi.url_scheme"] = scheme
            return self.app(environ, start_response)
    app.wsgi_app = ReverseProxied(app.wsgi_app)
    
    THE_END
    
    sudo sed -i '/app = create_app()/r quickfix.txt' /usr/local/lib/python3.5/dist-packages/pgadmin4/pgAdmin4.py
    rm quickfix.txt
    

    The commands above insert a piece of code into the file /usr/local/lib/python3.5/dist-packages/pgadmin4/pgAdmin4.py, right after the line app = create_app().

    Also, make sure the path to pgAdmin4.py on your system is correct. You may need to adjust the snippet above.

    Then, configure nginx as follows:

    location /pgadmin-web/ {
            proxy_pass http://127.0.0.1:5050/;
            proxy_redirect      off;
            proxy_set_header    Host                    $host;
            proxy_set_header    X-Real-IP               $remote_addr;
            proxy_set_header    X-Forwarded-For         $proxy_add_x_forwarded_for;
            proxy_set_header    X-Forwarded-Proto       $scheme;
            proxy_set_header    X-Script-Name           /pgadmin-web;
    }
    

    For reference, also have a look at pgAdmin4.py on GitHub.