Skip to main content

Overview

The MTB Backend API supports three database clients: SQLite, MySQL, and PostgreSQL. Database configuration is managed through environment variables defined in config/database.ts.

Database Client Selection

Choose your database client using the DATABASE_CLIENT environment variable.
DATABASE_CLIENT
string
default:"sqlite"
The database client to use. Supported values: sqlite, mysql, postgres
DATABASE_CLIENT=sqlite
DATABASE_FILENAME=.tmp/data.db

SQLite Configuration

SQLite is the default database client, ideal for development and testing.

Environment Variables

DATABASE_FILENAME
string
default:".tmp/data.db"
The path to the SQLite database file, relative to the project root
SQLite is great for development but not recommended for production deployments with high traffic.

MySQL Configuration

MySQL requires connection credentials and supports SSL configuration.

Connection Settings

DATABASE_HOST
string
default:"localhost"
MySQL server hostname or IP address
DATABASE_PORT
integer
default:"3306"
MySQL server port number
DATABASE_NAME
string
default:"strapi"
Name of the database to connect to
DATABASE_USERNAME
string
default:"strapi"
MySQL user for authentication
DATABASE_PASSWORD
string
default:"strapi"
MySQL password for authentication

SSL Configuration

DATABASE_SSL
boolean
default:"false"
Enable SSL/TLS connection to the database
DATABASE_SSL_KEY
string
Path to SSL client key file
DATABASE_SSL_CERT
string
Path to SSL client certificate file
DATABASE_SSL_CA
string
Path to SSL certificate authority file
DATABASE_SSL_CAPATH
string
Path to directory containing CA certificates
DATABASE_SSL_CIPHER
string
List of allowed SSL ciphers
DATABASE_SSL_REJECT_UNAUTHORIZED
boolean
default:"true"
Reject connections with invalid SSL certificates

Connection Pool

DATABASE_POOL_MIN
integer
default:"2"
Minimum number of connections in the pool
DATABASE_POOL_MAX
integer
default:"10"
Maximum number of connections in the pool
Always use strong passwords and enable SSL for production MySQL deployments.

PostgreSQL Configuration

PostgreSQL supports both connection strings and individual parameters.

Connection Settings

DATABASE_URL
string
Full PostgreSQL connection string (alternative to individual parameters)
DATABASE_HOST
string
default:"localhost"
PostgreSQL server hostname or IP address
DATABASE_PORT
integer
default:"5432"
PostgreSQL server port number
DATABASE_NAME
string
default:"strapi"
Name of the database to connect to
DATABASE_USERNAME
string
default:"strapi"
PostgreSQL user for authentication
DATABASE_PASSWORD
string
default:"strapi"
PostgreSQL password for authentication
DATABASE_SCHEMA
string
default:"public"
PostgreSQL schema to use

SSL Configuration

PostgreSQL supports the same SSL configuration options as MySQL:
DATABASE_SSL
boolean
default:"false"
Enable SSL/TLS connection to the database
DATABASE_SSL_KEY
string
Path to SSL client key file
DATABASE_SSL_CERT
string
Path to SSL client certificate file
DATABASE_SSL_CA
string
Path to SSL certificate authority file
DATABASE_SSL_CAPATH
string
Path to directory containing CA certificates
DATABASE_SSL_CIPHER
string
List of allowed SSL ciphers
DATABASE_SSL_REJECT_UNAUTHORIZED
boolean
default:"true"
Reject connections with invalid SSL certificates

Connection Pool

DATABASE_POOL_MIN
integer
default:"2"
Minimum number of connections in the pool
DATABASE_POOL_MAX
integer
default:"10"
Maximum number of connections in the pool
DATABASE_CLIENT=postgres
DATABASE_URL=postgresql://user:password@localhost:5432/database

Global Connection Settings

These settings apply to all database clients.
DATABASE_CONNECTION_TIMEOUT
integer
default:"60000"
Timeout in milliseconds for acquiring a connection from the pool

Example Configuration

import path from 'path';

export default ({ env }) => {
  const client = env('DATABASE_CLIENT', 'sqlite');

  const connections = {
    mysql: {
      connection: {
        host: env('DATABASE_HOST', 'localhost'),
        port: env.int('DATABASE_PORT', 3306),
        database: env('DATABASE_NAME', 'strapi'),
        user: env('DATABASE_USERNAME', 'strapi'),
        password: env('DATABASE_PASSWORD', 'strapi'),
        ssl: env.bool('DATABASE_SSL', false) && {
          key: env('DATABASE_SSL_KEY', undefined),
          cert: env('DATABASE_SSL_CERT', undefined),
          ca: env('DATABASE_SSL_CA', undefined),
          rejectUnauthorized: env.bool('DATABASE_SSL_REJECT_UNAUTHORIZED', true),
        },
      },
      pool: { 
        min: env.int('DATABASE_POOL_MIN', 2), 
        max: env.int('DATABASE_POOL_MAX', 10) 
      },
    },
    postgres: {
      connection: {
        connectionString: env('DATABASE_URL'),
        host: env('DATABASE_HOST', 'localhost'),
        port: env.int('DATABASE_PORT', 5432),
        database: env('DATABASE_NAME', 'strapi'),
        user: env('DATABASE_USERNAME', 'strapi'),
        password: env('DATABASE_PASSWORD', 'strapi'),
        schema: env('DATABASE_SCHEMA', 'public'),
      },
      pool: { 
        min: env.int('DATABASE_POOL_MIN', 2), 
        max: env.int('DATABASE_POOL_MAX', 10) 
      },
    },
    sqlite: {
      connection: {
        filename: path.join(
          __dirname, 
          '..', 
          '..', 
          env('DATABASE_FILENAME', '.tmp/data.db')
        ),
      },
      useNullAsDefault: true,
    },
  };

  return {
    connection: {
      client,
      ...connections[client],
      acquireConnectionTimeout: env.int('DATABASE_CONNECTION_TIMEOUT', 60000),
    },
  };
};

Build docs developers (and LLMs) love