mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			563 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			563 lines
		
	
	
		
			34 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| ---
 | |
| title: Configuring Unleash
 | |
| ---
 | |
| 
 | |
| import Tabs from '@theme/Tabs'; import TabItem from '@theme/TabItem';
 | |
| 
 | |
| > This is the guide on how to configure **Unleash v5 self-hosted**.
 | |
| 
 | |
| ## Must configure
 | |
| 
 | |
| ### Database
 | |
| 
 | |
| In order for Unleash server to work, you need a running database and its connection details. See
 | |
| the [database configuration section](#database-configuration) for the available options and configuration details.
 | |
| 
 | |
| ## Nice to configure
 | |
| 
 | |
| ### Unleash URL {#unleash-url}
 | |
| 
 | |
| - Configured with `UNLEASH_URL` ** Should be set to the public discoverable URL of your instance, so if your instance is
 | |
|   accessed by your users at `https://unleash.mysite.com` use that. ** If you're deploying this to a subpath, include the
 | |
|   subpath in this. So `https://mysite.com/unleash` will also be correct.
 | |
| - Used to create
 | |
|     - Reset password URLs
 | |
|     - Welcome link for new users
 | |
|     - Links in events for our Slack, Microsoft Teams and Datadog integrations
 | |
| 
 | |
| ### Email server details {#email-server-details}
 | |
| 
 | |
| Used to send reset-password mails and welcome mails when onboarding new users. <br /> **NOTE** - If this is not
 | |
| configured, you will not be able to allow your users to reset their own passwords.
 | |
| 
 | |
| For [more details, see here](./email-service.md)
 | |
| 
 | |
| ### Minimum and recommended specifications
 | |
| 
 | |
| #### Minimum
 | |
| 
 | |
| | Resource | Request | Limit |
 | |
| |----------|---------|-------|
 | |
| | CPU      | 250m    | 500m  |
 | |
| | Memory   | 200Mi   | 400Mi |
 | |
| 
 | |
| #### Recommended
 | |
| 
 | |
| | Resource | Request | Limit |
 | |
| |----------|---------|-------|
 | |
| | CPU      | 500m    | 1000m |
 | |
| | Memory   | 512Mi   | 1Gi   |
 | |
| 
 | |
| ## Further customization
 | |
| 
 | |
| In order to customize "anything" in Unleash you need to
 | |
| use [Unleash from Node.js](./getting-started#option-three---from-nodejs) or start
 | |
| the [docker image](./getting-started.md#option-one---use-docker) with environment variables.
 | |
| 
 | |
| ```js
 | |
| const unleash = require('unleash-server');
 | |
| 
 | |
| const unleashOptions = {
 | |
|     db: {
 | |
|         user: 'unleash_user',
 | |
|         password: 'password',
 | |
|         host: 'localhost',
 | |
|         port: 5432,
 | |
|         database: 'unleash',
 | |
|         ssl: false,
 | |
|         pool: {
 | |
|             min: 0,
 | |
|             max: 4,
 | |
|             idleTimeoutMillis: 30000,
 | |
|         },
 | |
|     },
 | |
|     enableRequestLogger: true,
 | |
| };
 | |
| 
 | |
| unleash.start(unleashOptions);
 | |
| ```
 | |
| 
 | |
| **Available Unleash options include:**
 | |
| 
 | |
| - **authentication** - (object) - An object for configuring/implementing custom admin authentication
 | |
| 
 | |
|     - `enableApiToken` / `AUTH_ENABLE_API_TOKEN`:  `boolean` — Should unleash require API tokens for access? Defaults
 | |
|       to `true`.
 | |
|     - `type` / `AUTH_TYPE`: `string` — What kind of authentication to use. Possible values
 | |
|         - `open-source` - Sign in with username and password. This is the default value.
 | |
|         - `custom` - If implementing your own authentication hook, use this
 | |
|         - `demo` - Only requires an email to sign in (was default in v3)
 | |
|         - `none` - _Deprecated_ Turn off authentication completely. If no API token is provided towards /`api/client`
 | |
|           or `/api/frontend` you will receive configuration for the "default" environment. We generally recommend you
 | |
|           use the `demo` type for simple, insecure usage of Unleash. This auth type has many known limitations,
 | |
|           particularly related to personalized capabilities such as favorites.
 | |
|     - `customAuthHandler`: function `(app: any, config: IUnleashConfig): void` — custom express middleware handling
 | |
|       authentication. Used when type is set to `custom`. Can not be set via environment variables.
 | |
|     - `initialAdminUser`: `{ username: string, password: string} | undefined` — The initial admin username and password - Defaults to `admin` and `unleash4all`, respectively. Can be set using the `UNLEASH_DEFAULT_ADMIN_USERNAME` and `UNLEASH_DEFAULT_ADMIN_PASSWORD` environment variables.
 | |
|     - `initApiTokens` / `INIT_ADMIN_API_TOKENS`, `INIT_CLIENT_API_TOKENS`,
 | |
|           and `INIT_FRONTEND_API_TOKENS`: `ApiTokens[]` — Array of API tokens to create on startup. The tokens will only
 | |
|           be created if the database doesn't already contain any API tokens. Example:
 | |
| 
 | |
|       ```ts
 | |
|       [
 | |
|         {
 | |
|           environment: '*',
 | |
|           project: '*',
 | |
|           secret: '*:*.964a287e1b728cb5f4f3e0120df92cb5',
 | |
|           type: ApiTokenType.ADMIN,
 | |
|           username: 'some-user',
 | |
|         },
 | |
|       ];
 | |
|       ```
 | |
| 
 | |
|       The tokens can be of any API token type. Note that _admin_ tokens **must** target all environments and projects (
 | |
|       i.e. use `'*'` for `environments` and `project` and start the secret with `*:*.`).
 | |
| 
 | |
|       You can also use the environment variables `INIT_ADMIN_API_TOKENS`, `INIT_CLIENT_API_TOKENS`,
 | |
|       and `INIT_FRONTEND_API_TOKENS`. All variables require a comma-separated list of API tokens to initialize (for
 | |
|       instance `*:*.some-random-string, *:*.some-other-token`). The tokens found
 | |
|       in `INIT_ADMIN_API_TOKENS`, `INIT_CLIENT_API_TOKENS`, and `INIT_FRONTEND_API_TOKENS` will be created as admin,
 | |
|       client, and frontend tokens respectively, and Unleash will assign usernames automatically.
 | |
| 
 | |
|     -  `demoAllowAdminLogin` / `AUTH_DEMO_ALLOW_ADMIN_LOGIN`: `boolean` — Allows you to log in as the admin user when running Unleash with the `demo` auth type. To log in as the admin user, use `admin` as your email. Defaults to `false`.
 | |
| 
 | |
| - **databaseUrl** - (_deprecated_) the postgres database url to connect to. Only used if _db_ object is not specified,
 | |
|   and overrides the _db_ object and any environment variables that change parts of it (like `DATABASE_SSL`). Should
 | |
|   include username/password. This value may also be set via the `DATABASE_URL` environment variable. Alternatively, if
 | |
|   you would like to read the database url from a file, you may set the `DATABASE_URL_FILE` environment variable with the
 | |
|   full file path. The contents of the file must be the database url exactly.
 | |
| - **db** - The database configuration object. See [the database configuration section](#database-configuration) for a
 | |
|   full overview of the available properties.
 | |
| - **disableLegacyFeaturesApi** (boolean) - whether to disable
 | |
|   the [legacy features API](/reference/api/legacy/unleash/admin/features.md). Defaults
 | |
|   to `false` (`DISABLE_LEGACY_FEATURES_API`). Introduced in Unleash 4.6.
 | |
| - **email** - the email object configuring an SMTP server for sending welcome mails and password reset mails
 | |
|     - `host` - The server URL to your SMTP server
 | |
|     - `port` - Which port the SMTP server is running on. Defaults to 465 (Secure SMTP)
 | |
|     - `secure` (boolean) - Whether to use SMTPS or not.
 | |
|     - `sender` - Which email should be set as sender of mails being sent from Unleash?
 | |
|     - `smtpuser` - Username for your SMTP server
 | |
|     - `smtppass` - Password for your SMTP server
 | |
| - ~~eventHook~~ (`function(event, data)`) - (_deprecated in Unleash 4.3_ in favor of
 | |
|   the [Webhook integration](/reference/integrations/webhook.md). **Removed in Unleash 5**) If provided, this function
 | |
|   will be invoked whenever a feature is mutated. The possible values for `event`
 | |
|   are `'feature-created'`, `'feature-archived'` and `'feature-revived'`. The `data` argument contains information about
 | |
|   the mutation. Its fields are `type` (string) - the event type (same as `event`); `createdBy` (string) - the user who
 | |
|   performed the mutation; `data` - the contents of the change. The contents in `data` differs based on the event type;
 | |
|   For `'feature-archived'` and `'feature-revived'`, the only field will be `name` - the name of the feature.
 | |
|   For `'feature-created'` the data follows a schema defined in the
 | |
|   code [here](https://github.com/Unleash/unleash/blob/7b7f0b84e8cddd5880dcf29c231672113224b9a7/src/lib/schema/feature-schema.ts#L77).
 | |
|   See an [api here](/reference/api/legacy/unleash/admin/events).
 | |
| - **getLogger** (function) - Used to register a [custom log provider](#how-do-i-configure-the-log-output).
 | |
| - **logLevel** (`debug` | `info` | `warn` | `error` | `fatal`) - The lowest level to log at, also configurable using
 | |
|   environment variable `LOG_LEVEL`.
 | |
| - **enableRequestLogger** (boolean) - use this to enable logging for requested urls and response codes (default: false).
 | |
| - **preHook** (function) - this is a hook if you need to provide any middlewares to express before `unleash` adds any.
 | |
|   Express app instance is injected as first argument.
 | |
| - **preRouterHook** (function) - use this to register custom express middlewares before the `unleash` specific routers
 | |
|   are added.
 | |
| - **secureHeaders** (boolean) - use this to enable security headers (HSTS, CSP, etc) when serving Unleash from HTTPS.
 | |
|   Can also be configured through the environment variable `SECURE_HEADERS`.
 | |
| - **additionalCspAllowedDomains** (CspAllowedDomains) - use this when you want to enable security headers but have
 | |
|   additional domains you need to allow traffic to. You can set the following environment variables:
 | |
|     - `CSP_ALLOWED_DEFAULT` to allow new defaultSrc (comma separated list)
 | |
|     - `CSP_ALLOWED_FONT` to allow new fontSrc (comma separated list)
 | |
|     - `CSP_ALLOWED_STYLE` to allow new styleSrc (comma separated list)
 | |
|     - `CSP_ALLOWED_SCRIPT` to allow new scriptSrc (comma separated list)
 | |
|     - `CSP_ALLOWED_IMG` to allow new imgSrc (comma separated list)
 | |
|     - `CSP_ALLOWED_CONNECT` to allow new connectSrc (comma separated list)
 | |
|     - `CSP_ALLOWED_FRAME` to allow new frameSrc (comma separated listed)
 | |
|     - `CSP_ALLOWED_MEDIA` to allow new mediaSrc (comma separated list)
 | |
|     - `CSP_ALLOWED_OBJECT` to allow new objectSrc (comma separated list)
 | |
| - **server** - The server config object taking the following properties
 | |
|     - _port_ - which port the unleash-server should bind to. If port is omitted or is 0, the operating system will
 | |
|       assign an arbitrary unused port. Will be ignored if pipe is specified. This value may also be set via
 | |
|       the `HTTP_PORT` environment variable
 | |
|     - _host_ - which host the unleash-server should bind to. If host is omitted, the server will accept connections on
 | |
|       the unspecified IPv6 address (::) when IPv6 is available, or the unspecified IPv4 address (0.0.0.0) otherwise.
 | |
|       This value may also be set via the `HTTP_HOST` environment variable
 | |
|     - _pipe_ - parameter to identify IPC endpoints.
 | |
|       See https://nodejs.org/api/net.html#net_identifying_paths_for_ipc_connections for more details
 | |
|     - _serverMetrics_ (boolean) - use this option to turn on/off prometheus metrics.
 | |
|     - _baseUriPath_ (string) - use to register a base path for all routes on the application. For
 | |
|       example `/my/unleash/base` (note the starting /). Defaults to `/`. Can also be configured through the environment
 | |
|       variable `BASE_URI_PATH`.
 | |
|     - _unleashUrl_ (string) - Used to specify the official URL this instance of Unleash can be accessed at for an end
 | |
|       user. Can also be configured through the environment variable `UNLEASH_URL`.
 | |
|     - _gracefulShutdownEnable_: (boolean) - Used to control if Unleash should shutdown gracefully (close connections,
 | |
|       stop tasks,). Defaults to true. `GRACEFUL_SHUTDOWN_ENABLE`
 | |
|     - _gracefulShutdownTimeout_: (number) - Used to control the timeout, in milliseconds, for shutdown Unleash
 | |
|       gracefully. Will kill all connections regardless if this timeout is exceeded. Defaults to
 | |
|       1000ms `GRACEFUL_SHUTDOWN_TIMEOUT`
 | |
|     - _enableScheduledCreatedByMigration_: (boolean) - Schedules migrations that fills the field created_by_user_id for
 | |
|       past events and features. It does it gradually in chunks and runs every 15 minutes so it doesn't affect the
 | |
|       application's performance. Defaults to false. **NOTE:** If your installation started with Unleash v5.8 or later,
 | |
|       you should not need this flag! `ENABLE_SCHEDULED_CREATED_BY_MIGRATION`
 | |
| - **session** - The session config object takes the following options:
 | |
|     - _ttlHours_ (number) - The number of hours a user session is allowed to live before a new sign-in is required.
 | |
|       Defaults to 48 hours. `SESSION_TTL_HOURS`
 | |
|     - _clearSiteDataOnLogout_ (boolean) - When `true`, a logout action will return a Clear Site Data response header
 | |
|       instructing the browser to clear all cookies on the same domain Unleash is running on. If disabled unleash will
 | |
|       only destroy and clear the session cookie. Defaults to _true_. `SESSION_CLEAR_SITE_DATA_ON_LOGOUT`
 | |
|     - _cookieName_ - Name of the cookies used to hold the session id. Defaults to 'unleash-session'.
 | |
|     - _maxParallelSessions_ - The maximum number of parallel user sessions with password based login. `MAX_PARALLEL_SESSIONS`
 | |
| - **ui** (object) - Set of UI specific overrides. You may set the following keys: `environment`, `slogan`.
 | |
| - **versionCheck** - the object deciding where to check for latest version
 | |
|     - `url` - The url to check version (Defaults to `https://version.unleash.run`) - Overridable
 | |
|       with (`UNLEASH_VERSION_URL`)
 | |
|     - `enable` - Whether version checking is enabled (defaults to true) - Overridable with (`CHECK_VERSION`) (if
 | |
|       anything other than `true`, does not check)
 | |
| - **environmentEnableOverrides** - A list of environment names to force enable at startup. This is feature should be
 | |
|   used with caution. When passed a list, this will enable each environment in that list and disable all other
 | |
|   environments. You can't use this to disable all environments, passing an empty list will do nothing. If one of the
 | |
|   given environments is not already enabled on startup then it will also enable projects and toggles for that
 | |
|   environment. Note that if one of the passed environments doesn't already exist this will do nothing aside from log a
 | |
|   warning.
 | |
| - **clientFeatureCaching** - configuring memoization of the /api/client/features endpoint
 | |
|     - `enabled` - set to true by default - Overridable with (`CLIENT_FEATURE_CACHING_ENABLED`)
 | |
|     - `maxAge` - the time to cache features, set to 600 milliseconds by default - Overridable
 | |
|       with (`CLIENT_FEATURE_CACHING_MAXAGE`) ) (accepts milliseconds)
 | |
| - **frontendApi** - Configuration options for the [Unleash front-end API](/reference/front-end-api.md).
 | |
|     - `refreshIntervalInMs` - how often (in milliseconds) front-end clients should refresh their data from the cache.
 | |
|       Overridable with the `FRONTEND_API_REFRESH_INTERVAL_MS` environment variable.
 | |
| - **accessControlMaxAge** - You can configure the max-age of the Access-Control-Max-Age header. Defaults to 86400
 | |
|   seconds. Overridable with the `ACCESS_CONTROL_MAX_AGE` environment variable.
 | |
| - **responseTimeWithAppNameKillSwitch** - use this to disable metrics with app names. This is enabled by default but may
 | |
|   increase the cardinality of metrics causing Unleash memory usage to grow if your app name is randomly generated (which
 | |
|   is not recommended). Overridable with the `UNLEASH_RESPONSE_TIME_WITH_APP_NAME_KILL_SWITCH` environment variable.
 | |
| - **disableCompression** - Disables Express compression middleware, useful when configuring the application in a
 | |
|   serverless environment. Defaults to `false`. Overridable with the `SERVER_DISABLE_COMPRESSION` environment variable.
 | |
| - **keepAliveTimeout** - Use this to tweak connection keepalive timeout in seconds. Useful for hosted situations where
 | |
|   you need to make sure your connections are closed before terminating the instance. Defaults to `15`. Overridable with
 | |
|   the `SERVER_KEEPALIVE_TIMEOUT` environment variable.
 | |
|   You can also set the environment variable `ENABLED_ENVIRONMENTS` to a comma delimited string of environment names to
 | |
|   override environments.
 | |
| - **metricsRateLimiting** - Use the following to tweak the rate limits
 | |
|   for `/api/client/register`, `/api/client/metrics`, `/api/frontend/register` and `/api/frontend/metrics` POST endpoints
 | |
|     - `clientMetricsMaxPerMinute` - How many requests per minute per IP is allowed against POST `/api/client/metrics`
 | |
|       before returning 429. Set to 6000 by default (100rps) - Overridable with `REGISTER_CLIENT_RATE_LIMIT_PER_MINUTE`
 | |
|       environment variable
 | |
|     - `clientRegisterMaxPerMinute` - How many requests per minute per IP is allowed against POST `/api/client/register`
 | |
|       before returning 429. Set to 6000 by default (100rps) - Overridable with `CLIENT_METRICS_RATE_LIMIT_PER_MINUTE`
 | |
|       environment variable
 | |
|     - `frontendMetricsMaxPerMinute` - How many requests per minute per IP is allowed against
 | |
|       POST `/api/frontend/metrics` before returning 429. Set to 6000 by default (100rps) - Overridable
 | |
|       with `FRONTEND_METRICS_RATE_LIMIT_PER_MINUTE` environment variable
 | |
|     - `frontendRegisterMaxPerMinute` - How many requests per minute per IP is allowed against
 | |
|       POST `/api/frontend/register` before returning 429. Set to 6000 by default (100rps) - Overridable
 | |
|       with `REGISTER_FRONTEND_RATE_LIMIT_PER_MINUTE` environment variable
 | |
| - **rateLimiting** - Use the following to tweak the rate limits for `POST /auth/simple` (Password-based login)
 | |
|   and `POST /api/admin/user-admin` (Creating users)
 | |
|     - `simpleLoginMaxPerMinute` - How many requests per minute per IP is allowed against POST `/auth/simple` before
 | |
|       returning 429. Set to 10 by default - Overridable with `SIMPLE_LOGIN_LIMIT_PER_MINUTE` environment variable
 | |
|     - `createUserMaxPerMinute` - How many requests per minute per IP is allowed against POST `/api/admin/user-admin`
 | |
|       before returning 429. Set to 20 by default - Overridable with `CREATE_USER_RATE_LIMIT_PER_MINUTE` environment
 | |
|       variable
 | |
| 
 | |
| ### Disabling Auto-Start {#disabling-auto-start}
 | |
| 
 | |
| If you're using Unleash as part of a larger express app, you can disable the automatic server start by
 | |
| calling `server.create`. It takes the same options as `server.start`, but will not begin listening for connections.
 | |
| 
 | |
| ```js
 | |
| const express = require('express');
 | |
| const unleash = require('unleash-server');
 | |
| const app = express();
 | |
| 
 | |
| const start = async () => {
 | |
|     const instance = await unleash.create({
 | |
|         databaseUrl: 'postgres://unleash_user:password@localhost:5432/unleash',
 | |
|     });
 | |
|     app.use(instance.app);
 | |
|     console.log(`Unleash app generated and attached to parent application`);
 | |
| };
 | |
| 
 | |
| start();
 | |
| ```
 | |
| 
 | |
| ### Graceful shutdown {#shutdown-unleash}
 | |
| 
 | |
| > PS! Unleash will listen for the `SIGINT` signal and automatically trigger graceful shutdown of Unleash.
 | |
| 
 | |
| If you need to stop Unleash (close database connections, and stop running Unleash tasks) you may use the stop function.
 | |
| Be aware that it is not possible to restart the Unleash instance after stopping it, but you can create a new instance of
 | |
| Unleash.
 | |
| 
 | |
| ```js
 | |
| const express = require('express');
 | |
| const unleash = require('unleash-server');
 | |
| const app = express();
 | |
| 
 | |
| const start = async () => {
 | |
|     const instance = await unleash.start({
 | |
|         databaseUrl: 'postgres://unleash_user:password@localhost:5432/unleash',
 | |
|         port: 4242,
 | |
|     });
 | |
| 
 | |
|     //Sometime later
 | |
|     await instance.stop();
 | |
|     console.log('Unleash has now stopped');
 | |
| };
 | |
| 
 | |
| start();
 | |
| ```
 | |
| 
 | |
| ### Segment limits {#segments}
 | |
| 
 | |
| :::caution
 | |
| 
 | |
| Changing segment limits could have a negative impact on the performance of Unleash SDKs and cause network congestion.
 | |
| Think twice before changing these values.
 | |
| 
 | |
| :::
 | |
| 
 | |
| Some facets of the [segments feature](/reference/segments.mdx) can be customized via environment variables. This lets
 | |
| you change the [segment limits](/reference/segments.mdx#segment-limits) that Unleash uses.
 | |
| 
 | |
| `UNLEASH_STRATEGY_SEGMENTS_LIMIT` controls the maximum number of segments that can be applied to a single strategy. The
 | |
| default is 5.
 | |
| 
 | |
| `UNLEASH_SEGMENT_VALUES_LIMIT` controls the maximum number of values that you can assign across a segment's constraints.
 | |
| The default is 1000 (Since v5.1.0; it was 100 before v5.1.0)
 | |
| 
 | |
| ## Securing Unleash {#securing-unleash}
 | |
| 
 | |
| You can integrate Unleash with your authentication provider (OAuth 2.0). Read more
 | |
| about [securing unleash](./securing-unleash.md).
 | |
| 
 | |
| ## How do I configure the log output? {#how-do-i-configure-the-log-output}
 | |
| 
 | |
| By default, `unleash` uses [log4js](https://github.com/nomiddlename/log4js-node) to log important information. It is
 | |
| possible to swap out the logger provider (only when using Unleash programmatically). You do this by providing an
 | |
| implementation of the **getLogger** function as This enables filtering of log levels and easy redirection of output
 | |
| streams.
 | |
| 
 | |
| ```javascript
 | |
| function getLogger(name) {
 | |
|     // do something with the name
 | |
|     return {
 | |
|         debug: console.log,
 | |
|         info: console.log,
 | |
|         warn: console.log,
 | |
|         error: console.error,
 | |
|     };
 | |
| }
 | |
| ```
 | |
| 
 | |
| The logger interface with its `debug`, `info`, `warn` and `error` methods expects format string support as seen
 | |
| in `debug` or the JavaScript `console` object. Many commonly used logging implementations cover this API, e.g., bunyan,
 | |
| pino or winston.
 | |
| 
 | |
| ## Database configuration
 | |
| 
 | |
| :::info
 | |
| 
 | |
| In-code configuration values take precedence over environment values: If you provide a database username both via
 | |
| environment variables and in code with the Unleash options object, Unleash will use the in-code username.
 | |
| 
 | |
| :::
 | |
| 
 | |
| You cannot run the Unleash server without a database. You must provide Unleash with database connection details for it
 | |
| to start correctly.
 | |
| 
 | |
| The available options are listed in the table below. Options can be specified either via JavaScript (only when starting
 | |
| Unleash via code) or via environment variables. The "property name" column below gives the name of the property on the
 | |
| Unleash options' `db` object.
 | |
| 
 | |
| | Property name            | Environment variable               | Default value                                    | Description                                                                                                                                                                    |
 | |
| |--------------------------|------------------------------------|--------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
 | |
| | `user`                   | `DATABASE_USERNAME`                | `unleash_user`                                   | The database username.                                                                                                                                                         |
 | |
| | `password`               | `DATABASE_PASSWORD`                | `password`                                       | The database password.                                                                                                                                                         |
 | |
| | `host`                   | `DATABASE_HOST`                    | `localhost`                                      | The database hostname.                                                                                                                                                         |
 | |
| | `port`                   | `DATABASE_PORT`                    | `5432`                                           | The database port.                                                                                                                                                             |
 | |
| | `database`               | `DATABASE_NAME`                    | `unleash`                                        | The name of the database.                                                                                                                                                      |
 | |
| | `ssl`                    | `DATABASE_SSL`                     | N/A                                              | An object describing SSL options. In code, provide a regular JavaScript object. When using the environment variable, provide a **stringified JSON object**.                    |
 | |
| |                          | `DATABASE_SSL_CA_CONFIG`           | N/A                                              | JSON file representing the SSL options, needs 4 keys set, `rejectUnauthorized`, `ca`, `cert`, `key`. the `ca`, `cert` and `key` keys needs to be ssl certificates as a string. |
 | |
| |                          | `DATABASE_SSL_CA_FILE`             | N/A                                              | A path to a valid SSL CA file in `pem` format. Sets the `ca` key of the ssl object. See [https://node-postgres.com/features/ssl](pg docs)                                      |
 | |
| |                          | `DATABASE_SSL_CERT_FILE`           | N/A                                              | A path to a valid SSL Cert file in `pem` format. Sets the `cert` key of the ssl object. See [https://node-postgres.com/features/ssl](pg docs)                                  |
 | |
| |                          | `DATABASE_SSL_KEY_FILE`            | N/A                                              | A path to a valid SSL key file in `pem` format. Sets the `key` key of the ssl object. See [https://node-postgres.com/features/ssl](pg docs)                                    |
 | |
| |                          | `DATABASE_SSL_REJECT_UNAUTHORIZED` | true if CA, CERT and KEY is set, false otherwise | If you use SSL connections to postgres, don't set this to false. It will turn off the security check of SSL. See [https://node-postgres.com/features/ssl](pg docs)             |
 | |
| | `pool`                   | N/A (use the below variables)      |                                                  | An object describing database pool options. With environment variables, use the options below directly.                                                                        |
 | |
| | `pool.min`               | `DATABASE_POOL_MIN`                | 0                                                | The minimum number of connections in the connection pool.                                                                                                                      |
 | |
| | `pool.max`               | `DATABASE_POOL_MAX`                | 4                                                | The maximum number of connections in the connection pool.                                                                                                                      |
 | |
| | `pool.idleTimeoutMillis` | `DATABASE_POOL_IDLE_TIMEOUT_MS`    | 30000                                            | The amount of time (in milliseconds) that a connection must be idle for before it is marked as a candidate for eviction.                                                       |
 | |
| | `applicationName`        | `DATABASE_APPLICATION_NAME`        | `unleash`                                        | The name of the application that created this Client instance.                                                                                                                 |
 | |
| | `schema`                 | `DATABASE_SCHEMA`                  | `public`                                         | The schema to use in the database.                                                                                                                                             |
 | |
| | `disableMigration`       | `DATABASE_DISABLE_MIGRATION`       | false                                            | The option not to use database migration.                                                                                                                                      |
 | |
| 
 | |
| Alternatively, you can use a
 | |
| single-host [libpq connection string](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING) to
 | |
| connect to the database. You can provide it directly or from a file by using one of the below options. In JavaScript,
 | |
| these are top-level properties of the root configuration object, _not_ the `db` object.
 | |
| 
 | |
| | Property name     | Environment variable | Default value | Description                                                                                                                                                                                                                                           |
 | |
| |-------------------|----------------------|---------------|-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------|
 | |
| | `databaseUrl`     | `DATABASE_URL`       | N/A           | A string that matches a single-host [libpq connection string](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING), such as `postgres://USER:PASSWORD@HOST:PORT/DATABASE`. Unleash does **not** support using multiple hosts. |
 | |
| | `databaseUrlFile` | `DATABASE_URL_FILE`  | N/A           | The path to a file that contains a [libpq connection string](https://www.postgresql.org/docs/current/libpq-connect.html#LIBPQ-CONNSTRING).                                                                                                            |
 | |
| 
 | |
| Below is an example JavaScript configuration object.
 | |
| 
 | |
| ```js
 | |
| const unleashOptions = {
 | |
|     databaseUrl: 'postgres:/USER:PASSWORD@HOST:PORT/DATABASE',
 | |
|     databaseUrlFile: '/path/to/file',
 | |
|     db: {
 | |
|         user: 'unleash_user',
 | |
|         password: 'password',
 | |
|         host: 'localhost',
 | |
|         port: 5432,
 | |
|         database: 'unleash',
 | |
|         ssl: false,
 | |
|         pool: {
 | |
|             min: 0,
 | |
|             max: 4,
 | |
|             idleTimeoutMillis: 30000,
 | |
|         },
 | |
|     },
 | |
| };
 | |
| ```
 | |
| 
 | |
| ### `db.ssl` vs `DATABASE_SSL` options
 | |
| 
 | |
| When initializing Unleash from code, you'll provide the `db.ssl` option as a JavaScript object. As such, any functions
 | |
| will get evaluated before the object is used for configuration. When using the `DATABASE_SSL` environment variable, you
 | |
| must provide the value as a stringified JSON object. The object will get parsed before being used for configuration, but
 | |
| no further evaluation will take place.
 | |
| 
 | |
| If you want to read content from a file, you should either initialize Unleash via JavaScript or manually interpolate the
 | |
| required values into the environment variable:
 | |
| 
 | |
| <Tabs groupId="db-configuration-options">
 | |
| 
 | |
| <TabItem value="js" label="JavaScript" default>
 | |
| 
 | |
| ```js title="Reading from the file system in JavaScript"
 | |
| const unleashOptions = {
 | |
|     db: {
 | |
|         // other options omitted for brevity
 | |
|         ssl: {
 | |
|             ca: fs.readFileSync('/path/to/server-certificates/root.crt').toString(),
 | |
|         },
 | |
|     },
 | |
| };
 | |
| ```
 | |
| 
 | |
| </TabItem>
 | |
| 
 | |
| <TabItem value="env" label="Environment variables (bash)">
 | |
| 
 | |
| ```bash title="Reading from the file system with bash"
 | |
| DATABASE_SSL="{ \"ca\": \"$(cat /path/to/server-certificates/root.crt)\" }"
 | |
| ```
 | |
| 
 | |
| </TabItem>
 | |
| 
 | |
| </Tabs>
 | |
| 
 | |
| ### Enabling self-signed certificates
 | |
| 
 | |
| To use self-signed certificates, you should set the SSL property `rejectUnauthorized` to `false` and set the `ca`
 | |
| property to the value of the certificate:
 | |
| 
 | |
| <Tabs groupId="db-configuration-options">
 | |
| 
 | |
| <TabItem value="js" label="JavaScript" default>
 | |
| 
 | |
| ```js title="Enable self-signed certificates"
 | |
| const unleashOptions = {
 | |
|     db: {
 | |
|         // other options omitted for brevity
 | |
|         ssl: {
 | |
|             rejectUnauthorized: false,
 | |
|             ca: fs.readFileSync('/path/to/server-certificates/root.crt').toString(),
 | |
|         },
 | |
|     },
 | |
| };
 | |
| ```
 | |
| 
 | |
| </TabItem>
 | |
| 
 | |
| <TabItem value="env" label="Environment variables (bash)">
 | |
| 
 | |
| ```bash title="Enable self-signed certificates"
 | |
| DATABASE_SSL="{ \"rejectUnauthorized\": false, \"ca\": \"$(cat /path/to/server-certificates/root.crt)\" }"
 | |
| ```
 | |
| 
 | |
| </TabItem>
 | |
| 
 | |
| </Tabs>
 | |
| 
 | |
| Visit [the node-postgres library's SSL section](https://node-postgres.com/features/ssl) for more information.
 | |
| 
 | |
| ### Supported Postgres SSL modes
 | |
| 
 | |
| Unleash builds directly on the [node-postgres library](https://node-postgres.com/features/ssl), so we support all the
 | |
| same SSL modes that they support. As of version 8 (released on February 25th
 | |
| 2020), [node-postgres no longer supports all sslmodes](https://node-postgres.com/announcements#2020-02-25). For this
 | |
| reason, Unleash cannot support all of Postgres' SSL modes. Specifically, Unleash **does not support** `sslmode=prefer`.
 | |
| Instead you must know whether you require an SSL connection ahead of time.
 | |
| 
 | |
| ### Recommended PostgreSQL spec
 | |
| 
 | |
| For PostgreSQL we recommend running with at least 1 CPU and at least 1Gi of memory, as well as at least 5Gi of SSD storage. From the cloud providers, look at:
 | |
| 
 | |
| | Provider | Machine                        |
 | |
| |----------|--------------------------------|
 | |
| | AWS      | db.t4g.small (2CPU / 2GB mem)  |
 | |
| | Azure    | B2s (2CPU / 4GB mem )          |
 | |
| | GCP      | 2 CPU / 4GB mem                |
 | |
| 
 | |
| Unleash SAAS runs on db.t4g.small and we're happy with that.
 | |
| 
 | |
| 
 | |
| ### Troubleshooting: database pooling connection timeouts {#database-pooling-connection-timeouts}
 | |
| 
 | |
| - Check the default values of connection pool about idle session handling.
 | |
| 
 | |
| - If you have a network component which closes idle sessions on the TCP layer, make sure that the connection
 | |
|   pool's `idleTimeoutMillis` setting is lower than the `timespan` setting. If it isn't, then the network component will
 | |
|   close the connection.
 | |
| 
 | |
| ### Troubleshooting: missing metrics from connected Edge instances
 | |
| 
 | |
| If you're on Unleash 5.9.0 or newer, you might encounter issues with metrics from connected Edge instances. There are
 | |
| two solutions to this, the recommended way and the one that will work for 5.9.0 but probably not for later versions
 | |
| 
 | |
| #### Recommended
 | |
| 
 | |
| - Make sure you're using the latest Edge, at least v17.0.0
 | |
| - Make sure you have at least one valid client token configured. Either using the `--token` flag on startup, or via
 | |
|   connecting an SDK with a valid token
 | |
| 
 | |
| #### Works in 5.9.0
 | |
| 
 | |
| - If you absolutely cannot upgrade your Edge instances to v17.0.0 or newer you can start Unleash with the environmental
 | |
|   flag `UNLEASH_EXPERIMENTAL_EDGE_BULK_METRICS` set to `true`
 | |
| - This will re-enable an endpoint that was disabled in 5.9.0 to allow users that cannot upgrade Edge just now to stay on
 | |
|   an old Edge version, but still get client metrics.
 | |
| 
 | |
| ### Proxying requests from Unleash
 | |
| 
 | |
| You can configure proxy services that intercept all outgoing requests from Unleash. This lets you use the Microsoft
 | |
| Teams or the Webhook integration for external services, even if the internet can only be reached via a proxy on your
 | |
| machine or container (for example if restricted by a firewall or similiar).
 | |
| 
 | |
| As an example, here's how you could do it using the [node-global-proxy](https://www.npmjs.com/package/node-global-proxy)
 | |
| package:
 | |
| 
 | |
| ```
 | |
| const proxy = require("node-global-proxy").default;
 | |
| 
 | |
| proxy.setConfig({
 | |
|     http: "http://user:password@url:8080",      //proxy adress, replace values as needed
 | |
|     //https: "https://user:password@url:1080",  //if a https proxy is needed
 | |
|   });
 | |
| 
 | |
| proxy.start();      //this starts the proxy, after this call all requests will be proxied
 | |
| ```
 | |
| 
 | |
| Using above code-snippet, every outgoing request from unleash or its integrations will be subsequently routed through
 | |
| set proxy. If the proxy routing needs to be bypassed or stopped, its possible to stop it by using
 | |
| 
 | |
| `proxy.stop();`
 |