<html>
  <head>

    <meta http-equiv="content-type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-text-flowed" style="font-family: -moz-fixed;
      font-size: 13px;" lang="x-unicode">Hi,
      <br>
      <br>
      I'm trying to make QGIS Server to serve projects from PostgreSQL
      database on the web.
      <br>
      Could anyone tell me please, is it possible to do that, or I can
      serve only files?
      <br>
      <br>
      The general workflow should look like this:
      <br>
      <br>
      1. Operators with QGIS Desktop are connecting to PostgreSQL, and
      create/modify projects in it.
      <br>
      No files are involved. This part works, I was able to save test
      project on one system, and open it on the other.
      <br>
      <br>
      2. After finishing project creation/modification, Operators send a
      link to it to the consumers/implementors.
      <br>
      The idea is to be able to view the project in a browser on any
      device. No editing is needed, at least at this moment.
      <br>
      I've installed QGIS Server on the same host as PostgreSQL, set
      nginx/related stuff, and tested that it successfully serves file
      project.
      <br>
      Then I've tried to get the project from database. qgis user, under
      which QGIS server is run, was allowed passwordless connection to
      PostgreSQL via localhost.
      <br>
      <br>
      Having test URL for file like this
      <br>
      <a class="moz-txt-link-freetext"
href="https://domain.com/qgisserver/cgi-bin/qgis_mapserv.fcgi?LAYERS=countries&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG:4326&WIDTH=400&HEIGHT=200&BBOX=-90,-180,90,180&MAP=/home/qgis/projects/world.qgs">https://domain.com/qgisserver/cgi-bin/qgis_mapserv.fcgi?LAYERS=countries&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG:4326&WIDTH=400&HEIGHT=200&BBOX=-90,-180,90,180&MAP=/home/qgis/projects/world.qgs</a>
      <br>
      <br>
      I've replaced file path with naive PostgreSQL URL like this
      <br>
      <a class="moz-txt-link-freetext"
href="https://domain.com/qgisserver/cgi-bin/qgis_mapserv.fcgi?LAYERS=countries&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG:4326&WIDTH=400&HEIGHT=200&BBOX=-90,-180,90,180&MAP=postgresql://127.0.0.1:5432?sslmode=disable&dbname=qgis&schema=world&project=world">https://domain.com/qgisserver/cgi-bin/qgis_mapserv.fcgi?LAYERS=countries&SERVICE=WMS&VERSION=1.3.0&REQUEST=GetMap&CRS=EPSG:4326&WIDTH=400&HEIGHT=200&BBOX=-90,-180,90,180&MAP=postgresql://127.0.0.1:5432?sslmode=disable&dbname=qgis&schema=world&project=world</a>
      <br>
      But got this error:
      <br>
      <br>
      <ServerException>
      <br>
      Project file error. For OWS services: please provide a SERVICE and
      a MAP parameter pointing to a valid QGIS project file
      <br>
      </ServerException>
      <br>
      <br>
      The error says that QGIS Server wants file, no mentions about
      database.
      <br>
      On other hand, documentation below says that for MAP parameter
      either file path or PostgreSQL URL is needed, so it should work?
      <br>
      <br>
      <a class="moz-txt-link-freetext"
href="https://docs.qgis.org/3.34/en/docs/server_manual/config.html#qgis-server-envvar">https://docs.qgis.org/3.34/en/docs/server_manual/config.html#qgis-server-envvar</a>
      <br>
      QGIS_PROJECT_FILE
      <br>
      The .qgs or .qgz project file, normally passed as a parameter in
      the query string (with MAP), you can also set it as an environment
      variable (for example by using mod_rewrite Apache module).
      <br>
      <br>
      **Note that you may also indicate a project stored in
      PostgreSQL**, e.g.
postgresql://localhost:5432?sslmode=disable&dbname=mydb&schema=myschema&project=myproject
      or inside a geopackage file, e.g.
      geopackage:/path/to/geopackage/file.gpkg?projectName=myProjectName.
      <br>
      <br>
      <br>
      Searching in the Internet for the error above, I've found this bug
      report
      <br>
      <a class="moz-txt-link-freetext"
        href="https://github.com/qgis/QGIS/issues/31192">https://github.com/qgis/QGIS/issues/31192</a>
      <br>
      <br>
      From which I've got the idea to encode PostgreSQL URL in test URL,
      but it didn't work with the same error as above.
      <br>
      Also, it looks like report author is connecting with QGIS Desktop
      to QGIS Server, not browser, so this is not my case?
      <br>
      Also-also, as I've stuck with nginx for unrelated to QGIS reasons,
      I cannot test proposed there Apache rewrite magic.
      <br>
      <br>
      I've tried to see if there is anything useful in QGIS Server logs,
      but there are no any related messages in them.
      <br>
      I've set QGIS_SERVER_LOG_PROFILE to true, but that didn't change
      anything. I see my request to QGIS server only in nginx logs, but
      nothing in QGIS Server logs, and no even failed connection
      attempts in PostgreSQL logs.
      <br>
      <br>
      So, is there any way to have PostreSQL projects served via QGIS
      Server, or I can use only files? <span class="moz-smiley-s1"
        title=":)"></span>
      <br>
    </div>
  </body>
</html>