# PgJSON session backend

This backend is the recommended one for production installations of LemonLDAP::NG.

## Prerequisites

First, make sure you have installed the `DBD::Pg` perl module.

On Debian-based distributions

    apt install libdbd-pg-perl libapache-session-browseable-perl

On Fedora-based distributions

    yum install 'perl(DBD::Pg)' 'perl(Apache::Session::Browseable)'

The minimum required version of PostgreSQL is 9.3 with support for JSON column types

Make sure you are using at least version 1.2.9 of `Apache::Session::Browseable`, this might require installing it from Debian Backports or CPAN.

## Create database schema

You can find the database schema in `/usr/share/lemonldap-ng/ressources/sessions.pg.sql`.

## LemonLDAP::NG configuration

Go in the Manager and set the session module to `Apache::Session::Browseable::PgJSON` for each session type you intend to use:

- `General parameters` » `Sessions` » `Session storage` » `Apache::Session module`

- `General parameters` » `Sessions` » `Persistent sessions` » `Apache::Session module`

- `CAS Service` » `CAS sessions module name`

- `OpenID Connect Service` » `Sessions` » `Sessions module name`

- `SAML2 Service` » `Advanced` » `SAML sessions module name`

Then, set the following module options:

Parameter name | Comment | Example
--- | --- | ---
DataSource | The DBI string | `dbi:Pg:database=lemonldap-ng`
UserName | The database username | `lemonldapng`
Password | The database password | `mysuperpassword`
TableName | Table name (optional) | `sessions`
Commit | This setting is mandatory for PostgreSQL to work | `1`

Tip

Unlike other browseable modules, Pg::JSON does not require an `Index` parameter

Tip

We recommend adding the tcp_user_timeout and keepalives_idle options to the DBI string Refer to the full list of PostgreSQL connection options

### Patroni support

Starting from version 1.3.17, Apache::Session::Browseable provides a direct Patroni PostgreSQL cluster

This works like PgJSON but can take an additional parameter `PatroniUrl` which lists the Patroni servers available, then if there is a failure, the driver will check for Patroni API to find the PostgreSQL leader and change its `DataSource` to use it. To use it, set `Apache::Session::Browseable::Patroni` as Sessions module and set corresponding options. Example:

Parameters | Example | Comment
--- | --- | ---
DataSource | `dbi:Pg:database=lemonldap-ng` | Unless an error occurs, the driver will use this data source
UserName | `lemonldapng` |
Password | `mysuperpassword` |
TableName | `sessions` |
Commit | `1` | This setting is mandatory for PostgreSQL to work
PatroniUrl | `http://172.16.1.2:8008/cluster http://172.16.1.3:8008/cluster` | List here all `*/cluster` APIs