I figured this out just moments after writing to this list, actually.

libpq, the Postgresql Library used by Dovecot, will actually use the environment variables listed below if their corresponding parameters are not provided in the connection string:

  https://www.postgresql.org/docs/8.1/libpq-envars.html

As such, these modifications will allow postgres connection using environment variables.

dovecot.conf:

  import_environment = PGUSER PGDATABASE PGPASSWORD

dovecot-sql.conf.ext:

  connect = host=mail-passdb.mail.svc.cluster.local

Then, set the env variables PGUSER, PGDATABASE, PGPASSWORD in the container.

Best regards,
Eirik Rye

On 04/12/2019 13:22, Eirik Rye via dovecot wrote:
Hi,

We are trying to set up a Dovecot Docker image with dynamic database configuration based on environment variables, however the variables do not appear to be expanded in the "connect=" string of the SQL config.

The documentation states that environment variables, being listed under global variables, work "everywhere":


https://doc.dovecot.org/configuration_manual/config_file/config_variables/#variables-global

However, the source code for driver-pgsql.c indicates that the connect string is never expanded:


https://github.com/dovecot/core/blob/master/src/lib-sql/driver-pgsql.c#L297

For reference, this is my configuration. dovecot.conf:

   import_environment = PASSDB_USER PASSDB_DBNAME PASSDB_PASSWORD
   passdb {
     override_fields = proxy=y
     driver = sql
     args = /etc/dovecot/dovecot-sql.conf.ext
   }

/etc/dovecot/dovecot-sql.conf.ext:

   driver = pgsql
  connect = host=mail-passdb dbname=%{env:PASSDB_DBNAME} user=%{env:PASSDB_USER} password=%{env:PASSDB_PASSWORD}

Does anyone have any suggestions for how to connect to a database without hardcoding the connection parameters in the Dovecot config, which does not involve patching driver-pgsql.c to make the variable expansion?

Best regards,
Eirik Rye


--
Eirik

Reply via email to