Back to Openproject

Configuring a custom database server

docs/installation-and-operations/configuration/database/README.md

17.3.111.0 KB
Original Source

Configuring a custom database server

Package-based installation

Simply run sudo openproject reconfigure, and when the database wizard is displayed, select the Use an existing PostgreSQL database option and fill in the required details (cf the initial configuration section).

Setting a custom database URL

In some cases, you need flexibility in how you define the URL (e.g., specifying more options specific to PostgreSQL or using SSL certificates). In that case, you can pass the database URL as an environment variable instead:

shell
openproject config:set DATABASE_URL=postgres://user:pass@host:port/dbname

Then, you need to run openproject reconfigure and select "Skip" for the database wizard. Otherwise the wizard will override your DATABASE_URL environment variable again.

Docker-based installation

If you run the all-in-one container, you can simply pass a custom DATABASE_URL environment variable on the docker command-line, which could point to an external database.

Example:

shell
docker run -d ... -e DATABASE_URL=postgres://user:pass@host:port/dbname openproject/openproject:17

Best practice is using the file docker-compose.override.yml. If you run the Compose based docker stack, you can simply override the DATABASE_URL environment variable, and remove the db service from the docker-compose.yml file, but because by pulling a new version docker-compose.yml might get replaced. Then you can restart the stack with:

shell
docker-compose down
docker-compose up -d

In both cases the seeder will be run when you (re)launch OpenProject to make sure that the database gets the migrations and demo data as well.

Setting DATABASE_URL and options separately

OpenProject will merge the settings from DATABASE_URL with manually specified environment options. Here are the supported options:

Environment variableDefaultDescriptionDocumentation
DATABASE_URL
OPENPROJECT_DB_URLURL style passing of database optionshttps://guides.rubyonrails.org/configuring.html#configuring-a-database
OPENPROJECT_DB_ENCODINGunicodeEncoding of the databaseShould be left at unicode unless you really know what you're doing.
OPENPROJECT_DB_POOLConnection pool counthttps://guides.rubyonrails.org/configuring.html#database-pooling
OPENPROJECT_DB_USERNAMEDatabase username, if not presented in URL abovehttps://guides.rubyonrails.org/configuring.html#configuring-a-database
OPENPROJECT_DB_PASSWORDDatabase password, if not presented in URL abovehttps://guides.rubyonrails.org/configuring.html#configuring-a-database
OPENPROJECT_DB_APPLICATION_NAMEopenprojectPostgreSQL application name optionhttps://www.postgresql.org/docs/13/libpq-connect.html#LIBPQ-CONNECT-APPLICATION-NAME
OPENPROJECT_DB_STATEMENT_TIMEOUT90sDefault statement timeout before connection statements are terminatedhttps://www.postgresql.org/docs/current/runtime-config-client.html#GUC-STATEMENT-TIMEOUT
OPENPROJECT_DB_REQUIRE_AUTHUses libpq defaultSpecifies the authentication method that the client requires from the server.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-REQUIRE-AUTH
OPENPROJECT_DB_CHANNEL_BINDINGUses libpq defaultThis option controls the client's use of channel binding.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-CHANNEL-BINDING
OPENPROJECT_DB_CONNECT_TIMEOUTUses libpq defaultMaximum time to wait while connecting, in seconds (write as a decimal integer, e.g., 10).https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-CONNECT-TIMEOUT
OPENPROJECT_DB_CLIENT_ENCODINGUses libpq defaultThis sets the client_encoding configuration parameter for this connection.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-CLIENT-ENCODING
OPENPROJECT_DB_KEEPALIVESUses libpq defaultControls whether client-side TCP keepalives are used. The default value is 1, meaning on, but you can change this to 0, meaning off, if keepalives are not wanted.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-KEEPALIVES
OPENPROJECT_DB_KEEPALIVES_IDLEUses libpq defaultControls the number of seconds of inactivity after which TCP should send a keepalive message to the server.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-KEEPALIVES-IDLE
OPENPROJECT_DB_KEEPALIVES_INTERVALUses libpq defaultControls the number of seconds after which a TCP keepalive message that is not acknowledged by the server should be retransmitted.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-KEEPALIVES-INTERVAL
OPENPROJECT_DB_KEEPALIVES_COUNTUses libpq defaultControls the number of TCP keepalives that can be lost before the client's connection to the server is considered dead.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-KEEPALIVES-COUNT
OPENPROJECT_DB_REPLICATIONUses libpq defaultThis option determines whether the connection should use the replication protocol instead of the normal protocol.https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-REPLICATION
OPENPROJECT_DB_GSSENCMODEUses libpq defaultThis option determines whether or with what priority a secure GSS TCP/IP connection will be negotiated with the server. (prefer)https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-GSSENCMODE
OPENPROJECT_DB_SSLMODEUses libpq defaulthttps://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLMODE
OPENPROJECT_DB_SSLCOMPRESSIONUses libpq defaulthttps://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSLCOMPRESSION
OPENPROJECT_DB_SSL_MIN_PROTOCOL_VERSIONUses libpq defaulthttps://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNECT-SSL-MIN-PROTOCOL-VERSION

Using SSL/TLS with a PostgreSQL database

By default, the packaged installation installs a local database and does not use SSL encryption. If you provide a custom PostgreSQL database that supports SSL/TLS connections for servers and/or clients, you can pass the options as part of the DATABASE_URL. See the above guides on how to set this environment variable for Docker or packaged installations.

The most import option is the sslmode parameter. Set this to the appropriate mode as defined in the PostgreSQL documentation. For example, to require a SSL connection with full verification of the server certificate, you can add it to the database URL:

shell
DATABASE_URL=postgres://user:pass@host:port/dbname?sslmode=require-full&sslcert=/path/to/postgresql.cert

Alternatively, for better readability, you can set these parameters with separate environment variables:

Environment variableDefaultDescriptionPostgreSQL documentation
OPENPROJECT_DB_SSLMODEpreferconnection mode for SSL. Seesslmode
OPENPROJECT_DB_SSLCOMPRESSION0If set to 1, data sent over SSL connections will be compressedsslcompression
OPENPROJECT_DB_SSLCERT~/.postgresql/postgresql.crtPath to certificatesslcert
OPENPROJECT_DB_SSLKEY~/.postgresql/postgresql.keyPath to certificate keysslkey
OPENPROJECT_DB_SSLPASSWORDPassword to certificate keysslpassword
OPENPROJECT_DB_SSLROOTCERT~/.postgresql/root.crtPath to CAsslrootcert
OPENPROJECT_DB_SSLCRL~/.postgresql/root.crlPath to revocation listsslcrl
OPENPROJECT_DB_SSL_MIN_PROTOCOL_VERSIONUses libpq defaultsee here
text
="prefer" # disable, allow, prefer, require, verify-ca, verify-full
="0" # 0 or 1
="~/.postgresql/postgresql.crt" # Path to the certificate
="~/.postgresql/postgresql.key" # Path to the certificate private key
="" # Password for the certificate key, if any
="~/.postgresql/root.crt" # Path to CA
="~/.postgresql/root.crl" # Path to revocation list

PostgreSQL supports a wide variety of options in its connection string. This is not specific to OpenProject or Rails. See this guide for more information.