@nestjs-mod/docker-compose
Version:
Docker Compose is a tool for defining and running multi-container applications. It is the key to unlocking a streamlined and efficient development and deployment experience. (Generator docker-compose.yml for https://docs.docker.com/compose)
688 lines (593 loc) • 93.5 kB
Markdown
# @nestjs-mod/docker-compose
Docker Compose is a tool for defining and running multi-container applications. It is the key to unlocking a streamlined and efficient development and deployment experience. (Generator docker-compose.yml for https://docs.docker.com/compose)
[![NPM version][npm-image]][npm-url] [![monthly downloads][downloads-image]][downloads-url] [![Telegram][telegram-image]][telegram-url] [![Discord][discord-image]][discord-url]
## Installation
```bash
npm i --save @nestjs-mod/docker-compose
```
## Modules
| Link | Category | Description |
| ---- | -------- | ----------- |
| [DockerCompose](#dockercompose) | infrastructure | Docker Compose is a tool for defining and running multi-container applications. It is the key to unlocking a streamlined and efficient development and deployment experience. (Generator docker-compose.yml for https://docs.docker.com/compose) |
| [DockerComposeAuthorizer](#dockercomposeauthorizer) | infrastructure | Authorizer is an open-source authentication and authorization solution for your applications. Bring your database and have complete control over the user information. You can self-host authorizer instances and connect to supported databases. (Generator for https://authorizer.dev in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose) |
| [DockerComposeMaildev](#dockercomposemaildev) | infrastructure | MailDev is a simple way to test your projects generated email during development, with an easy to use web interface that runs on your machine. (Generator for maildev in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose) |
| [DockerComposeMinio](#dockercomposeminio) | infrastructure | MinIO is a high-performance, S3 compatible object storage. (Generator for minio in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose) |
| [DockerComposeNats](#dockercomposenats) | infrastructure | NATS is an open source, lightweight and high-performance messaging system. It is ideal for distributed systems and supports modern cloud architectures and pub-sub, request-reply and queuing models. (Generator for nats in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose) |
| [DockerComposeNginx](#dockercomposenginx) | infrastructure | Nginx is a web server that can also be used as a reverse proxy, load balancer, mail proxy and HTTP cache. (Generator for nginx in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose) |
| [DockerComposePostgreSQL](#dockercomposepostgresql) | infrastructure | PostgreSQL (Postgres) is an open source object-relational database known for reliability and data integrity. ACID-compliant, it supports foreign keys, joins, views, triggers and stored procedures. (Generator for databases in docker-compose.yml for https://github.com/nestjs-mod/nestjs-mod-contrib/tree/master/libs/infrastructure/docker-compose) |
| [DockerComposeRedis](#dockercomposeredis) | infrastructure | The open-source, in-memory data store used by millions of developers as a cache, vector database, document database, streaming engine, and message broker. (Generator for redis in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose) |
| [DockerComposeSso](#dockercomposesso) | infrastructure | Single Sign-On on NestJS and Angular with webhooks and social authorization. (Generator for https://github.com/nestjs-mod/nestjs-mod-sso in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose) |
## Modules descriptions
### DockerCompose
Docker Compose is a tool for defining and running multi-container applications. It is the key to unlocking a streamlined and efficient development and deployment experience. (Generator docker-compose.yml for https://docs.docker.com/compose)
#### Use in NestJS-mod
An example you can see the full example here https://github.com/nestjs-mod/nestjs-mod-contrib/tree/master/apps/example-prisma-flyway or https://github.com/nestjs-mod/nestjs-mod-contrib/tree/master/apps/example-prisma.
```typescript
import { PACKAGE_JSON_FILE, ProjectUtils, bootstrapNestApplication } from '@nestjs-mod/common';
import { DOCKER_COMPOSE_FILE, DockerCompose } from '@nestjs-mod/docker-compose';
import { join } from 'path';
export const flywayPrismaFeatureName = 'flyway-prisma';
const rootFolder = join(__dirname, '..', '..', '..');
const appFolder = join(rootFolder, 'apps', 'example-prisma-flyway');
bootstrapNestApplication({
modules: {
system: [
ProjectUtils.forRoot({
staticConfiguration: {
applicationPackageJsonFile: join(
appFolder
PACKAGE_JSON_FILE
),
packageJsonFile: join(rootFolder, PACKAGE_JSON_FILE),
envFile: join(rootFolder, '.env'),
},
}),
],
infrastructure: [
DockerCompose.forRoot({
configuration: {
dockerComposeFileVersion: '3',
dockerComposeFile: join(appFolder, DOCKER_COMPOSE_FILE),
},
}),
],
},
});
```
After connecting the module to the application and `npm run build` and starting generation of documentation through `npm run docs:infrastructure`, you will have new files and scripts to run.
New scripts mostly `package.json`
```json
{
"scripts": {
"_____docker-compose infra_____": "_____docker-compose infra_____",
"docker-compose:start:example-prisma-flyway": "export COMPOSE_INTERACTIVE_NO_CLI=1 && docker compose -f ./apps/example-prisma-flyway/docker-compose.yml --compatibility up -d",
"docker-compose:stop:example-prisma-flyway": "export COMPOSE_INTERACTIVE_NO_CLI=1 && docker compose -f ./apps/example-prisma-flyway/docker-compose.yml down"
},
"scriptsComments": {
"docker-compose:start:example-prisma-flyway": [
"Running the docker-compose infrastructure for example-prisma-flyway"
],
"docker-compose:stop:example-prisma-flyway": [
"Stopping the docker-compose infrastructure for example-prisma-flyway"
]
}
}
```
Empty docker-compose file for application `docker-compose.yml` with real credenionals and add it to `.gitignore` file
```yaml
# Do not modify this file, it is generated using the DockerCompose module included with NestJS-mod.
version: '3'
```
Empty docker-compose file for application `docker-compose-example.yml` with fake credenionals
```yaml
# Do not modify this file, it is generated using the DockerCompose module included with NestJS-mod.
version: '3'
```
#### Shared providers
`ManualDockerComposeFeatures`
#### Configuration
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`dockerComposeFile`|Main file for docker-compose, the Compose specification establishes a standard for the definition of multi-container platform-agnostic applications|**isNotEmpty** (dockerComposeFile should not be empty)|-|-|
|`prodDockerComposeFile`|Main file for prod docker-compose, the Compose specification establishes a standard for the definition of multi-container platform-agnostic applications|**optional**|-|-|
|`exampleDockerComposeFile`|Example file for docker-compose, the Compose specification establishes a standard for the definition of multi-container platform-agnostic applications|**optional**|-|-|
|`prodDockerComposeEnvFile`|Dotenv file for prod docker-compose file|**optional**|-|-|
|`dockerComposeFileVersion`|Docker-compose file version. @see https://docs.docker.com/compose/compose-file/compose-versioning|**isNotEmpty** (dockerComposeFileVersion should not be empty)|```3```|-|
|`beforeSaveExampleDockerComposeFile`|Before save file for example docker-compose|**optional**|-|-|
|`beforeSaveDockerComposeFile`|Before save main file for docker-compose|**optional**|-|-|
|`beforeSaveProdDockerComposeFile`|Before save main file for prod docker-compose|**optional**|-|-|
|`beforeSaveDockerComposeEnvFile`|Method before save dotenv file for docker-compose file|**optional**|-|-|
|`beforeSaveProdDockerComposeEnvFile`|Method before save dotenv file for prod docker-compose file|**optional**|-|-|
#### Feature configuration
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`version`|The top-level version property is defined by the Compose Specification for backward compatibility. It is only informative. @see https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md|**optional**|-|-|
|`services`|A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. @see https://github.com/compose-spec/compose-spec/blob/master/05-services.md|**optional**|-|-|
|`networks`|Networks are the layer that allow services to communicate with each other. @see https://github.com/compose-spec/compose-spec/blob/master/06-networks.md|**optional**|-|-|
|`volumes`|Volumes are persistent data stores implemented by the container engine. @see https://github.com/compose-spec/compose-spec/blob/master/07-volumes.md|**optional**|-|-|
|`secrets`|Secrets are a flavor of Configs focusing on sensitive data, with specific constraint for this usage. @see https://github.com/compose-spec/compose-spec/blob/master/09-secrets.md|**optional**|-|-|
|`configs`|Configs allow services to adapt their behaviour without the need to rebuild a Docker image. @see https://github.com/compose-spec/compose-spec/blob/master/08-configs.md|**optional**|-|-|
#### Modules that use feature configuration
##### Feature module name: AUTHORIZER
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`version`|The top-level version property is defined by the Compose Specification for backward compatibility. It is only informative. @see https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md|**optional**|-|-|
|`services`|A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. @see https://github.com/compose-spec/compose-spec/blob/master/05-services.md|**optional**|-|```{"authorizer":{"image":"lakhansamani/authorizer:1.3.8","container_name":"authorizer","ports":["8080:8080"],"networks":["default-network"],"environment":{"DATABASE_NAME":"authorizer","PORT":8080,"COOKIE_NAME":"authorizer","DISABLE_PLAYGROUND":true,"ACCESS_TOKEN_EXPIRY_TIME":"30m","IMAGE":"lakhansamani/authorizer:1.3.8","EXTERNAL_CLIENT_PORT":8080,"ENV":"production","RESET_PASSWORD_URL":"/reset-password","ROLES":"user,admin","DEFAULT_ROLES":"user","JWT_ROLE_CLAIM":"role","ORGANIZATION_NAME":"Authorizer","ORGANIZATION_LOGO":"Authorizer Logo","COUCHBASE_BUCKET":"authorizer","COUCHBASE_BUCKET_RAM_QUOTA":1000,"COUCHBASE_SCOPE":"_default"},"keysOfEnvironmentsWithStaticValue":["featureName","image","networks","dependsOnServiceNames","env"],"tty":true,"restart":"always","depends_on":{}}}```|
|`networks`|Networks are the layer that allow services to communicate with each other. @see https://github.com/compose-spec/compose-spec/blob/master/06-networks.md|**optional**|-|```{"default-network":{"driver":"bridge"}}```|
|`volumes`|Volumes are persistent data stores implemented by the container engine. @see https://github.com/compose-spec/compose-spec/blob/master/07-volumes.md|**optional**|-|-|
|`secrets`|Secrets are a flavor of Configs focusing on sensitive data, with specific constraint for this usage. @see https://github.com/compose-spec/compose-spec/blob/master/09-secrets.md|**optional**|-|-|
|`configs`|Configs allow services to adapt their behaviour without the need to rebuild a Docker image. @see https://github.com/compose-spec/compose-spec/blob/master/08-configs.md|**optional**|-|-|
#### Modules that use feature configuration
##### Feature module name: MAILDEV
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`version`|The top-level version property is defined by the Compose Specification for backward compatibility. It is only informative. @see https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md|**optional**|-|-|
|`services`|A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. @see https://github.com/compose-spec/compose-spec/blob/master/05-services.md|**optional**|-|```{"maildev":{"image":"maildev/maildev:2.2.1","container_name":"maildev","ports":["1025:1025","1080:1080"],"networks":["default-network"],"environment":{"MAILDEV_SMTP_PORT":1025,"MAILDEV_WEB_PORT":1080},"keysOfEnvironmentsWithStaticValue":["featureName","image","networks","smtpPort","webPort"],"healthcheck":{"test":"wget -O - http://localhost:${MAILDEV_WEB_PORT}${MAILDEV_BASE_PATHNAME}/healthz || exit 1","interval":"10s","timeout":"5s","retries":5},"tty":true,"restart":"always"}}```|
|`networks`|Networks are the layer that allow services to communicate with each other. @see https://github.com/compose-spec/compose-spec/blob/master/06-networks.md|**optional**|-|```{"default-network":{"driver":"bridge"}}```|
|`volumes`|Volumes are persistent data stores implemented by the container engine. @see https://github.com/compose-spec/compose-spec/blob/master/07-volumes.md|**optional**|-|-|
|`secrets`|Secrets are a flavor of Configs focusing on sensitive data, with specific constraint for this usage. @see https://github.com/compose-spec/compose-spec/blob/master/09-secrets.md|**optional**|-|-|
|`configs`|Configs allow services to adapt their behaviour without the need to rebuild a Docker image. @see https://github.com/compose-spec/compose-spec/blob/master/08-configs.md|**optional**|-|-|
#### Modules that use feature configuration
##### Feature module name: POSTGRE_SQL
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`version`|The top-level version property is defined by the Compose Specification for backward compatibility. It is only informative. @see https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md|**optional**|-|-|
|`services`|A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. @see https://github.com/compose-spec/compose-spec/blob/master/05-services.md|**optional**|-|```{"postgre-sql":{"image":"bitnami/postgresql:15.5.0","container_name":"postgre-sql","volumes":["postgre-sql-volume:/bitnami/postgresql"],"ports":["5432:5432"],"networks":["default-network"],"healthcheck":{"test":["CMD-SHELL","pg_isready -U postgres"],"interval":"5s","timeout":"5s","retries":5},"tty":true,"restart":"always"}}```|
|`networks`|Networks are the layer that allow services to communicate with each other. @see https://github.com/compose-spec/compose-spec/blob/master/06-networks.md|**optional**|-|```{"default-network":{"driver":"bridge"}}```|
|`volumes`|Volumes are persistent data stores implemented by the container engine. @see https://github.com/compose-spec/compose-spec/blob/master/07-volumes.md|**optional**|-|```{"postgre-sql-volume":{"name":"postgre-sql-volume"}}```|
|`secrets`|Secrets are a flavor of Configs focusing on sensitive data, with specific constraint for this usage. @see https://github.com/compose-spec/compose-spec/blob/master/09-secrets.md|**optional**|-|-|
|`configs`|Configs allow services to adapt their behaviour without the need to rebuild a Docker image. @see https://github.com/compose-spec/compose-spec/blob/master/08-configs.md|**optional**|-|-|
#### Modules that use feature configuration
##### Feature module name: MINIO
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`version`|The top-level version property is defined by the Compose Specification for backward compatibility. It is only informative. @see https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md|**optional**|-|-|
|`services`|A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. @see https://github.com/compose-spec/compose-spec/blob/master/05-services.md|**optional**|-|```{"minio":{"image":"bitnami/minio:2024.2.9","container_name":"minio","volumes":["minio-volume:/bitnami/minio/data"],"ports":["9000:9000","9001:9001"],"networks":["default-network"],"environment":{},"keysOfEnvironmentsWithStaticValue":["featureName","image","networks","nginxBucketsLocations","nginxConfigContent","nginxConfigFolder","nginxLogsFolder"],"healthcheck":{"test":["CMD-SHELL","mc","ready","local"],"interval":"5s","timeout":"5s","retries":5},"tty":true,"restart":"always"}}```|
|`networks`|Networks are the layer that allow services to communicate with each other. @see https://github.com/compose-spec/compose-spec/blob/master/06-networks.md|**optional**|-|```{"default-network":{"driver":"bridge"}}```|
|`volumes`|Volumes are persistent data stores implemented by the container engine. @see https://github.com/compose-spec/compose-spec/blob/master/07-volumes.md|**optional**|-|```{"minio-volume":{"name":"minio-volume"}}```|
|`secrets`|Secrets are a flavor of Configs focusing on sensitive data, with specific constraint for this usage. @see https://github.com/compose-spec/compose-spec/blob/master/09-secrets.md|**optional**|-|-|
|`configs`|Configs allow services to adapt their behaviour without the need to rebuild a Docker image. @see https://github.com/compose-spec/compose-spec/blob/master/08-configs.md|**optional**|-|-|
#### Modules that use feature configuration
##### Feature module name: NGINX
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`version`|The top-level version property is defined by the Compose Specification for backward compatibility. It is only informative. @see https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md|**optional**|-|-|
|`services`|A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. @see https://github.com/compose-spec/compose-spec/blob/master/05-services.md|**optional**|-|```{"nginx":{"image":"nginx:alpine","container_name":"nginx","volumes":[],"ports":[],"networks":["default-network"],"tty":true,"restart":"always","depends_on":{}}}```|
|`networks`|Networks are the layer that allow services to communicate with each other. @see https://github.com/compose-spec/compose-spec/blob/master/06-networks.md|**optional**|-|```{"default-network":{"driver":"bridge"}}```|
|`volumes`|Volumes are persistent data stores implemented by the container engine. @see https://github.com/compose-spec/compose-spec/blob/master/07-volumes.md|**optional**|-|-|
|`secrets`|Secrets are a flavor of Configs focusing on sensitive data, with specific constraint for this usage. @see https://github.com/compose-spec/compose-spec/blob/master/09-secrets.md|**optional**|-|-|
|`configs`|Configs allow services to adapt their behaviour without the need to rebuild a Docker image. @see https://github.com/compose-spec/compose-spec/blob/master/08-configs.md|**optional**|-|-|
#### Modules that use feature configuration
##### Feature module name: NATS
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`version`|The top-level version property is defined by the Compose Specification for backward compatibility. It is only informative. @see https://github.com/compose-spec/compose-spec/blob/master/04-version-and-name.md|**optional**|-|-|
|`services`|A service is an abstract definition of a computing resource within an application which can be scaled or replaced independently from other components. @see https://github.com/compose-spec/compose-spec/blob/master/05-services.md|**optional**|-|```{"nats":{"image":"bitnami/nats:2.10.5","container_name":"nats","volumes":["nats-volume:/bitnami/nats/data"],"ports":["8222:8222","4222:4222"],"networks":["default-network"],"environment":{"NATS_EXTRA_ARGS":"-js"},"keysOfEnvironmentsWithStaticValue":["featureName","image","extraArgs","networks"],"tty":true,"restart":"always"}}```|
|`networks`|Networks are the layer that allow services to communicate with each other. @see https://github.com/compose-spec/compose-spec/blob/master/06-networks.md|**optional**|-|```{"default-network":{"driver":"bridge"}}```|
|`volumes`|Volumes are persistent data stores implemented by the container engine. @see https://github.com/compose-spec/compose-spec/blob/master/07-volumes.md|**optional**|-|```{"nats-volume":{"name":"nats-volume"}}```|
|`secrets`|Secrets are a flavor of Configs focusing on sensitive data, with specific constraint for this usage. @see https://github.com/compose-spec/compose-spec/blob/master/09-secrets.md|**optional**|-|-|
|`configs`|Configs allow services to adapt their behaviour without the need to rebuild a Docker image. @see https://github.com/compose-spec/compose-spec/blob/master/08-configs.md|**optional**|-|-|
[Back to Top](#modules)
---
### DockerComposeAuthorizer
Authorizer is an open-source authentication and authorization solution for your applications. Bring your database and have complete control over the user information. You can self-host authorizer instances and connect to supported databases. (Generator for https://authorizer.dev in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose)
#### Use in NestJS-mod
An example of using Maildev, you can see the full example here https://github.com/nestjs-mod/nestjs-mod-contrib/tree/master/apps/example-authorizer/INFRASTRUCTURE.MD.
```typescript
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
import { AuthorizerModule } from '@nestjs-mod/authorizer';
import {
DefaultNestApplicationInitializer,
DefaultNestApplicationListener,
InfrastructureMarkdownReportGenerator,
PACKAGE_JSON_FILE,
ProjectUtils,
bootstrapNestApplication,
isInfrastructureMode,
} from '@nestjs-mod/common';
import { DOCKER_COMPOSE_FILE, DockerCompose, DockerComposeAuthorizer, DockerComposePostgreSQL } from '@nestjs-mod/docker-compose';
import { join } from 'path';
import { adminSecret } from './app/app.constants';
import { AppModule } from './app/app.module';
const rootFolder = join(__dirname, '..', '..', '..');
const appFolder = join(rootFolder, 'apps', 'example-authorizer');
bootstrapNestApplication({
globalConfigurationOptions: { debug: true },
globalEnvironmentsOptions: { debug: true },
modules: {
system: [
ProjectUtils.forRoot({
staticConfiguration: {
applicationPackageJsonFile: join(__dirname, '..', '..', '..', 'apps/example-authorizer', PACKAGE_JSON_FILE),
packageJsonFile: join(rootFolder, PACKAGE_JSON_FILE),
envFile: join(rootFolder, 'apps', 'example-authorizer', '.env'),
},
}),
DefaultNestApplicationInitializer.forRoot(),
DefaultNestApplicationListener.forRoot({
staticConfiguration: {
// When running in infrastructure mode, the backend server does not start.
mode: isInfrastructureMode() ? 'silent' : 'listen',
},
}),
],
feature: [
AuthorizerModule.forRootAsync({
environments: {
authorizerURL: 'http://localhost:8080',
redirectURL: 'http://localhost:3000'
}
}),
AppModule.forRoot()
],
infrastructure: [
InfrastructureMarkdownReportGenerator.forRoot({
staticConfiguration: {
markdownFile: join(appFolder, 'INFRASTRUCTURE.MD'),
skipEmptySettings: true,
style: 'pretty',
},
}),
DockerCompose.forRoot({
configuration: {
dockerComposeFileVersion: '3',
dockerComposeFile: join(appFolder, DOCKER_COMPOSE_FILE),
},
}),
DockerComposePostgreSQL.forRoot({
staticEnvironments: {
rootDatabaseUrl: 'postgres://postgres:postgres_password@localhost:5432/postgres?schema=public'
}
}),
DockerComposeAuthorizer.forRoot({
staticEnvironments: {
databaseType: 'postgres',
databaseUrl: 'postgres://postgres:postgres_password@example-authorizer-postgre-sql:5432/postgres',
databaseName: 'authorizer',
adminSecret
}
}),
],
},
});
```
After connecting the module to the application and `npm run manual:prepare` and starting generation of documentation through `npm run docs:infrastructure:example-authorizer`, you will have new files and scripts to run.
New scripts mostly `package.json`
Add database options to docker-compose file for application `docker-compose.yml` with real credenionals and add it to `.gitignore` file
```yaml
# Do not modify this file, it is generated using the DockerCompose module included with NestJS-mod.
version: "3"
services:
example-authorizer-postgre-sql:
image: "bitnami/postgresql:15.5.0"
container_name: "example-authorizer-postgre-sql"
volumes:
- "example-authorizer-postgre-sql-volume:/bitnami/postgresql"
ports:
- "5432:5432"
networks:
- "example-authorizer-network"
healthcheck:
test:
- "CMD-SHELL"
- "pg_isready -U postgres"
interval: "5s"
timeout: "5s"
retries: 5
tty: true
restart: "always"
environment:
POSTGRESQL_USERNAME: "${EXAMPLE_AUTHORIZER_POSTGRE_SQL_POSTGRESQL_USERNAME}"
POSTGRESQL_PASSWORD: "${EXAMPLE_AUTHORIZER_POSTGRE_SQL_POSTGRESQL_PASSWORD}"
POSTGRESQL_DATABASE: "${EXAMPLE_AUTHORIZER_POSTGRE_SQL_POSTGRESQL_DATABASE}"
example-authorizer-authorizer:
image: "lakhansamani/authorizer:1.3.8"
container_name: "example-authorizer-authorizer"
ports:
- "8080:8080"
networks:
- "example-authorizer-network"
environment:
DATABASE_TYPE: "${EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_TYPE}"
DATABASE_URL: "${EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_URL}"
DATABASE_NAME: "${EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_NAME}"
ADMIN_SECRET: "${EXAMPLE_AUTHORIZER_AUTHORIZER_ADMIN_SECRET}"
PORT: "${EXAMPLE_AUTHORIZER_AUTHORIZER_PORT}"
COOKIE_NAME: "${EXAMPLE_AUTHORIZER_AUTHORIZER_COOKIE_NAME}"
DISABLE_PLAYGROUND: "${EXAMPLE_AUTHORIZER_AUTHORIZER_DISABLE_PLAYGROUND}"
ACCESS_TOKEN_EXPIRY_TIME: "${EXAMPLE_AUTHORIZER_AUTHORIZER_ACCESS_TOKEN_EXPIRY_TIME}"
IMAGE: "${EXAMPLE_AUTHORIZER_AUTHORIZER_IMAGE}"
EXTERNAL_CLIENT_PORT: "${EXAMPLE_AUTHORIZER_AUTHORIZER_EXTERNAL_CLIENT_PORT}"
ENV: "${EXAMPLE_AUTHORIZER_AUTHORIZER_ENV}"
RESET_PASSWORD_URL: "${EXAMPLE_AUTHORIZER_AUTHORIZER_RESET_PASSWORD_URL}"
ROLES: "${EXAMPLE_AUTHORIZER_AUTHORIZER_ROLES}"
DEFAULT_ROLES: "${EXAMPLE_AUTHORIZER_AUTHORIZER_DEFAULT_ROLES}"
JWT_ROLE_CLAIM: "${EXAMPLE_AUTHORIZER_AUTHORIZER_JWT_ROLE_CLAIM}"
ORGANIZATION_NAME: "${EXAMPLE_AUTHORIZER_AUTHORIZER_ORGANIZATION_NAME}"
ORGANIZATION_LOGO: "${EXAMPLE_AUTHORIZER_AUTHORIZER_ORGANIZATION_LOGO}"
COUCHBASE_BUCKET: "${EXAMPLE_AUTHORIZER_AUTHORIZER_COUCHBASE_BUCKET}"
COUCHBASE_BUCKET_RAM_QUOTA: "${EXAMPLE_AUTHORIZER_AUTHORIZER_COUCHBASE_BUCKET_RAM_QUOTA}"
COUCHBASE_SCOPE: "${EXAMPLE_AUTHORIZER_AUTHORIZER_COUCHBASE_SCOPE}"
tty: true
restart: "always"
depends_on: {}
networks:
example-authorizer-network:
driver: "bridge"
volumes:
example-authorizer-postgre-sql-volume:
name: "example-authorizer-postgre-sql-volume"
```
New environment variable
```bash
# example-authorizer-postgre-sql (generated)
EXAMPLE_AUTHORIZER_POSTGRE_SQL_POSTGRESQL_USERNAME=postgres
EXAMPLE_AUTHORIZER_POSTGRE_SQL_POSTGRESQL_PASSWORD=postgres_password
EXAMPLE_AUTHORIZER_POSTGRE_SQL_POSTGRESQL_DATABASE=postgres
# example-authorizer-authorizer (generated)
EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_TYPE=postgres
EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_URL=postgres://postgres:postgres_password@example-authorizer-postgre-sql:5432/postgres
EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_NAME=authorizer
EXAMPLE_AUTHORIZER_AUTHORIZER_ADMIN_SECRET=adminSecret
EXAMPLE_AUTHORIZER_AUTHORIZER_PORT=8080
EXAMPLE_AUTHORIZER_AUTHORIZER_COOKIE_NAME=authorizer
EXAMPLE_AUTHORIZER_AUTHORIZER_DISABLE_PLAYGROUND=true
EXAMPLE_AUTHORIZER_AUTHORIZER_ACCESS_TOKEN_EXPIRY_TIME=30m
EXAMPLE_AUTHORIZER_AUTHORIZER_IMAGE=
EXAMPLE_AUTHORIZER_AUTHORIZER_EXTERNAL_CLIENT_PORT=8080
EXAMPLE_AUTHORIZER_AUTHORIZER_ENV=
EXAMPLE_AUTHORIZER_AUTHORIZER_RESET_PASSWORD_URL=/reset-password
EXAMPLE_AUTHORIZER_AUTHORIZER_ROLES=user,admin
EXAMPLE_AUTHORIZER_AUTHORIZER_DEFAULT_ROLES=user
EXAMPLE_AUTHORIZER_AUTHORIZER_JWT_ROLE_CLAIM=role
EXAMPLE_AUTHORIZER_AUTHORIZER_ORGANIZATION_NAME=Authorizer
EXAMPLE_AUTHORIZER_AUTHORIZER_ORGANIZATION_LOGO='Authorizer Logo'
EXAMPLE_AUTHORIZER_AUTHORIZER_COUCHBASE_BUCKET=authorizer
EXAMPLE_AUTHORIZER_AUTHORIZER_COUCHBASE_BUCKET_RAM_QUOTA=1000
EXAMPLE_AUTHORIZER_AUTHORIZER_COUCHBASE_SCOPE=_default
# EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_URL (generated)
LOCALHOST_EXAMPLE_AUTHORIZER_AUTHORIZER_DATABASE_URL=postgres://postgres:postgres_password@localhost:5432/postgres
```
When launched in the infrastructure documentation generation mode, the module creates an `.env` file with a list of all required variables, as well as an example `example.env`, where you can enter example variable values.
#### Static environments
| Key | Description | Sources | Constraints | Default | Value |
| ------ | ----------- | ------- | ----------- | ------- | ----- |
|`adminSecret`|Super admin secret used to access the master data|`obj['adminSecret']`, `process.env['ADMIN_SECRET']`|**isNotEmpty** (adminSecret should not be empty)|-|-|
|`databaseType`|Which database you are using. Supported database types are postgres, mysql, planetscale, sqlite, sqlserver, mongodb, arangodb, yugabyte, mariadb, cassandradb, scylladb, couchbase, dynamodb|`obj['databaseType']`, `process.env['DATABASE_TYPE']`|**isNotEmpty** (databaseType should not be empty)|-|-|
|`databaseUrl`|Database connection string. In case of cluster url eg. for cassandra db, you can use comma separated IPs|`obj['databaseUrl']`, `process.env['DATABASE_URL']`|**isNotEmpty** (databaseUrl should not be empty)|-|-|
|`databaseName`|Name of database to connect to. This is useful in case of arangodb and mongodb. If not set, default value will be used|`obj['databaseName']`, `process.env['DATABASE_NAME']`|**optional**|```authorizer```|```authorizer```|
|`redisUrl`|Redis URL where sessions can be persisted false sessions will be stored in memory|`obj['redisUrl']`, `process.env['REDIS_URL']`|**optional**|-|-|
|`databasePort`|Port on which database connection should be made. This is used when DATABASE_URL is not mentioned. At the moment supported by cassandradb|`obj['databasePort']`, `process.env['DATABASE_PORT']`|**optional**|-|-|
|`databaseHost`|Host/IP on which database connection should be made. This is used when DATABASE_URL is not mentioned. At the moment supported by cassandradb type|`obj['databaseHost']`, `process.env['DATABASE_HOST']`|**optional**|-|-|
|`databaseUsername`|Username for the database access with permission to create tables and records. At the moment supported by cassandradb, scylladb type|`obj['databaseUsername']`, `process.env['DATABASE_USERNAME']`|**optional**|-|-|
|`databasePassword`|Password for the database access with permission to create tables and records. At the moment supported by cassandradb, scylladb type|`obj['databasePassword']`, `process.env['DATABASE_PASSWORD']`|**optional**|-|-|
|`databaseCert`|Base64 encoded certificate string used to make SSL connection. At the moment supported by cassandradb,scylladb type|`obj['databaseCert']`, `process.env['DATABASE_CERT']`|**optional**|-|-|
|`databaseCertKey`|Base64 encoded key string used to make SSL connection. At the moment supported by cassandradb,scylladb type|`obj['databaseCertKey']`, `process.env['DATABASE_CERT_KEY']`|**optional**|-|-|
|`databaseCaCert`|Base64 encoded CA certificate string used to make SSL connection. At the moment supported by cassandradb, scylladb type|`obj['databaseCaCert']`, `process.env['DATABASE_CA_CERT']`|**optional**|-|-|
|`port`|Port on which server should be running|`obj['port']`, `process.env['PORT']`|**optional**|```8080```|```8080```|
|`authorizerUrl`|Domain name of the server, eg https://authorizer.herokuapp.com|`obj['authorizerUrl']`, `process.env['AUTHORIZER_URL']`|**optional**|-|-|
|`cookieName`|Name of cookie to be set by server|`obj['cookieName']`, `process.env['COOKIE_NAME']`|**optional**|```authorizer```|```authorizer```|
|`smtpHost`|SMTP host is used to send email verification emails and forgot password emails false If not set email sending can fail|`obj['smtpHost']`, `process.env['SMTP_HOST']`|**optional**|-|-|
|`smtpPort`|SMTP Port is used along with SMTP host|`obj['smtpPort']`, `process.env['SMTP_PORT']`|**optional**|-|-|
|`smtpUsername`|Username for your smtp provider|`obj['smtpUsername']`, `process.env['SMTP_USERNAME']`|**optional**|-|-|
|`smtpPassword`|Password for your smt provider|`obj['smtpPassword']`, `process.env['SMTP_PASSWORD']`|**optional**|-|-|
|`senderEmail`|Email to be used in From section while sending emails|`obj['senderEmail']`, `process.env['SENDER_EMAIL']`|**optional**|-|-|
|`senderName`|Email sender name that is displayed in the inbox instead of just showing the email address|`obj['senderName']`, `process.env['SENDER_NAME']`|**optional**|-|-|
|`disablePlayground`|To disable playground|`obj['disablePlayground']`, `process.env['DISABLE_PLAYGROUND']`|**optional**|```true```|```true```|
|`accessTokenExpiryTime`|Time interval for how long access token will be expired in 1h15m15s format|`obj['accessTokenExpiryTime']`, `process.env['ACCESS_TOKEN_EXPIRY_TIME']`|**optional**|```30m```|```30m```|
|`awsAccessKeyId`|AWS access key used for connecting to dynamodb. Make sure access credentials has rights for dynamodb. Used with DATABASE_TYPE=dynamodb|`obj['awsAccessKeyId']`, `process.env['AWS_ACCESS_KEY_ID']`|**optional**|-|-|
|`awsSecretAccessKey`|AWS secret access key used for connecting to dynamodb. Make sure access credentials has rights for dynamodb. Used with DATABASE_TYPE=dynamodb|`obj['awsSecretAccessKey']`, `process.env['AWS_SECRET_ACCESS_KEY']`|**optional**|-|-|
|`googleClientId`|OAuth Google login client id|`obj['googleClientId']`, `process.env['GOOGLE_CLIENT_ID']`|**optional**|-|-|
|`googleClientSecret`|OAuth Google login client secret|`obj['googleClientSecret']`, `process.env['GOOGLE_CLIENT_SECRET']`|**optional**|-|-|
|`githubClientId`|OAuth Github login client id|`obj['githubClientId']`, `process.env['GITHUB_CLIENT_ID']`|**optional**|-|-|
|`githubClientSecret`|OAuth Github login client secret|`obj['githubClientSecret']`, `process.env['GITHUB_CLIENT_SECRET']`|**optional**|-|-|
|`facebookClientId`|OAuth Facebook login client id|`obj['facebookClientId']`, `process.env['FACEBOOK_CLIENT_ID']`|**optional**|-|-|
|`facebookClientSecret`|OAuth Facebook login client secret|`obj['facebookClientSecret']`, `process.env['FACEBOOK_CLIENT_SECRET']`|**optional**|-|-|
|`linkedinClientId`|OAuth LinkedIn login client id|`obj['linkedinClientId']`, `process.env['LINKEDIN_CLIENT_ID']`|**optional**|-|-|
|`linkedinClientSecret`|OAuth LinkedIn login client secret|`obj['linkedinClientSecret']`, `process.env['LINKEDIN_CLIENT_SECRET']`|**optional**|-|-|
|`appleClientId`|OAuth Apple login client id|`obj['appleClientId']`, `process.env['APPLE_CLIENT_ID']`|**optional**|-|-|
|`appleClientSecret`|OAuth Apple login client secret|`obj['appleClientSecret']`, `process.env['APPLE_CLIENT_SECRET']`|**optional**|-|-|
|`twitterClientId`|OAuth Twitter login client id|`obj['twitterClientId']`, `process.env['TWITTER_CLIENT_ID']`|**optional**|-|-|
|`twitterClientSecret`|OAuth Twitter login client secret|`obj['twitterClientSecret']`, `process.env['TWITTER_CLIENT_SECRET']`|**optional**|-|-|
|`microsoftClientId`|OAuth Microsoft login client id|`obj['microsoftClientId']`, `process.env['MICROSOFT_CLIENT_ID']`|**optional**|-|-|
|`microsoftClientSecret`|OAuth Microsoft login client secret|`obj['microsoftClientSecret']`, `process.env['MICROSOFT_CLIENT_SECRET']`|**optional**|-|-|
|`microsoftActiveDirectoryTenantId`|Microsoft Active Directory Tenant ID obtained from azure portal|`obj['microsoftActiveDirectoryTenantId']`, `process.env['MICROSOFT_ACTIVE_DIRECTORY_TENANT_ID']`|**optional**|-|-|
|`smtpLocalName`|-|`obj['smtpLocalName']`, `process.env['SMTP_LOCAL_NAME']`|**optional**|-|-|
|`jwtSecret`|-|`obj['jwtSecret']`, `process.env['JWT_SECRET']`|**optional**|-|-|
|`jwtPrivateKey`|-|`obj['jwtPrivateKey']`, `process.env['JWT_PRIVATE_KEY']`|**optional**|-|-|
|`jwtPublicKey`|-|`obj['jwtPublicKey']`, `process.env['JWT_PUBLIC_KEY']`|**optional**|-|-|
|`appUrl`|-|`obj['appUrl']`, `process.env['APP_URL']`|**optional**|-|-|
|`discordClientId`|-|`obj['discordClientId']`, `process.env['DISCORD_CLIENT_ID']`|**optional**|-|-|
|`discordClientSecret`|-|`obj['discordClientSecret']`, `process.env['DISCORD_CLIENT_SECRET']`|**optional**|-|-|
|`twitchClientId`|-|`obj['twitchClientId']`, `process.env['TWITCH_CLIENT_ID']`|**optional**|-|-|
|`twitchClientSecret`|-|`obj['twitchClientSecret']`, `process.env['TWITCH_CLIENT_SECRET']`|**optional**|-|-|
|`clientId`|-|`obj['clientId']`, `process.env['CLIENT_ID']`|**optional**|-|-|
|`clientSecret`|-|`obj['clientSecret']`, `process.env['CLIENT_SECRET']`|**optional**|-|-|
|`encryptionKey`|-|`obj['encryptionKey']`, `process.env['ENCRYPTION_KEY']`|**optional**|-|-|
|`isProd`|-|`obj['isProd']`, `process.env['IS_PROD']`|**optional**|-|-|
|`allowedOrigins`|-|`obj['allowedOrigins']`, `process.env['ALLOWED_ORIGINS']`|**optional**|-|-|
|`twilioApiKey`|-|`obj['twilioApiKey']`, `process.env['TWILIO_API_KEY']`|**optional**|-|-|
|`twilioApiSecret`|-|`obj['twilioApiSecret']`, `process.env['TWILIO_API_SECRET']`|**optional**|-|-|
|`twilioAccountSid`|-|`obj['twilioAccountSid']`, `process.env['TWILIO_ACCOUNT_SID']`|**optional**|-|-|
|`twilioSender`|-|`obj['twilioSender']`, `process.env['TWILIO_SENDER']`|**optional**|-|-|
#### Static configuration
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`image`|Docker image name|**optional**|```lakhansamani/authorizer:1.3.8```|-|
|`featureName`|Feature name for generate prefix to environments keys|**optional**|-|-|
|`networks`|Network, if not set networkNames have project name and driver=bridge|**optional**|-|-|
|`externalClientPort`|External port for sharing container|**optional**|```8080```|-|
|`dependsOnServiceNames`|Depends on services|**optional**|-|-|
|`env`|Which env you are running your server in. Supported envs production, development|**optional**|```production```|-|
|`resetPasswordUrl`|Reset password link, that can be used to send the correct forgot password link|**optional**|```/reset-password```|-|
|`disableBasicAuthentication`|Used to explicitly disable email and password based authentication|**optional**|-|-|
|`disableEmailVerification`|Used to disable the email verification while signing up|**optional**|-|-|
|`disableMagicLinkLogin`|Used to disable the password less login up|**optional**|-|-|
|`disableLoginPage`|Used to disable the default login page that comes with authorizer instance. This is helpful when user is building their custom login page|**optional**|-|-|
|`disableSignUp`|Used to disable the sign up feature. It is useful when you want to have beta release of your product and invite only limited users|**optional**|-|-|
|`roles`|Comma separated list of roles that your platform supports|**optional**|```user,admin```|-|
|`defaultRoles`|Comma separated list of roles that acts as Default roles which you would like to assign to users while they signup /login|**optional**|```user```|-|
|`protectedRoles`|Comma separated list of roles for which signup should be disabled. Example admin roles. This roles can only assigned manually via super admin like adminUpdateProfile|**optional**|-|-|
|`jwtRoleClaim`|Claim key that will be part of JWT token|**optional**|```role```|-|
|`organizationName`|Name of organization that you want on default login page|**optional**|```Authorizer```|-|
|`organizationLogo`|Logo of organization that you want on default login page|**optional**|```Authorizer Logo```|-|
|`customAccessTokenScript`|Javascript function to add extra keys to your JWT id token. This feature is developed using otto and only supports writing function in ES5. Check the sample here|**optional**|-|-|
|`awsRegion`|AWS, region id, where dynamod db tables are to be created. Used with DATABASE_TYPE=dynamodb|**optional**|-|-|
|`couchbaseBucket`|Bucket used for couchbase database. Used with DATABASE_TYPE=couchbase|**optional**|```authorizer```|-|
|`couchbaseBucketRamQuota`|RAM Quota for the bucket used for couchbase database. It has to be numeric value only. Used with DATABASE_TYPE=couchbase|**optional**|```1000```|-|
|`couchbaseScope`|Scope in which bucket is created. Used with DATABASE_TYPE=couchbase|**optional**|```_default```|-|
|`test`|-|**optional**|-|-|
|`envPath`|-|**optional**|-|-|
|`isEmailServiceEnabled`|-|**optional**|-|-|
|`isSmsServiceEnabled`|-|**optional**|-|-|
|`appCookieSecure`|-|**optional**|-|-|
|`adminCookieSecure`|-|**optional**|-|-|
|`jwtType`|-|**optional**|-|-|
|`jwk`|-|**optional**|-|-|
|`disableMobileBasicAuthentication`|-|**optional**|-|-|
|`disableRedisForEnv`|-|**optional**|-|-|
|`disableStrongPassword`|-|**optional**|-|-|
|`enforceMultiFactorAuthentication`|-|**optional**|-|-|
|`disableMultiFactorAuthentication`|-|**optional**|-|-|
|`disableTotpLogin`|-|**optional**|-|-|
|`disableMailOtpLogin`|-|**optional**|-|-|
|`disablePhoneVerification`|-|**optional**|-|-|
|`defaultAuthorizeResponseType`|-|**optional**|-|-|
|`defaultAuthorizeResponseMode`|-|**optional**|-|-|
[Back to Top](#modules)
---
### DockerComposeMaildev
MailDev is a simple way to test your projects generated email during development, with an easy to use web interface that runs on your machine. (Generator for maildev in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose)
#### Use in NestJS-mod
An example of using Maildev, you can see the full example here https://github.com/nestjs-mod/nestjs-mod-contrib/tree/master/apps/example-maildev.
```typescript
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0';
import {
DefaultNestApplicationInitializer,
DefaultNestApplicationListener,
InfrastructureMarkdownReportGenerator,
PACKAGE_JSON_FILE,
ProjectUtils,
bootstrapNestApplication,
isInfrastructureMode,
} from '@nestjs-mod/common';
import { DOCKER_COMPOSE_FILE, DockerCompose, DockerComposeMaildev } from '@nestjs-mod/docker-compose';
import { join } from 'path';
import { AppModule } from './app/app.module';
const rootFolder = join(__dirname, '..', '..', '..');
const appFolder = join(rootFolder, 'apps', 'example-maildev');
bootstrapNestApplication({
globalConfigurationOptions: { debug: true },
globalEnvironmentsOptions: { debug: true },
modules: {
system: [
ProjectUtils.forRoot({
staticConfiguration: {
applicationPackageJsonFile: join(__dirname, '..', '..', '..', 'apps/example-maildev', PACKAGE_JSON_FILE),
packageJsonFile: join(rootFolder, PACKAGE_JSON_FILE),
envFile: join(rootFolder, '.env'),
},
}),
DefaultNestApplicationInitializer.forRoot(),
DefaultNestApplicationListener.forRoot({
staticConfiguration: {
// When running in infrastructure mode, the backend server does not start.
mode: isInfrastructureMode() ? 'silent' : 'listen',
},
}),
],
feature: [AppModule.forRoot()],
infrastructure: [
InfrastructureMarkdownReportGenerator.forRoot({
staticConfiguration: {
markdownFile: join(appFolder, 'INFRASTRUCTURE.MD'),
skipEmptySettings: true,
style: 'pretty',
},
}),
DockerCompose.forRoot({
configuration: {
dockerComposeFileVersion: '3',
dockerComposeFile: join(appFolder, DOCKER_COMPOSE_FILE),
},
}),
DockerComposeMaildev.forRoot(),
],
},
});
```
After connecting the module to the application and `npm run build` and starting generation of documentation through `npm run docs:infrastructure`, you will have new files and scripts to run.
New scripts mostly `package.json`
Add database options to docker-compose file for application `docker-compose.yml` with real credenionals and add it to `.gitignore` file
```yaml
version: '3'
services:
example-maildev-maildev:
image: 'maildev/maildev:2.2.1'
container_name: 'example-maildev-maildev'
ports:
- '1025:1025'
- '1080:1080'
networks:
- 'example-maildev-network'
environment:
MAILDEV_SMTP_PORT: '1025'
MAILDEV_WEB_PORT: '1080'
healthcheck:
test: 'wget -O - http://localhost:${MAILDEV_WEB_PORT}${MAILDEV_BASE_PATHNAME}/healthz || exit 1'
interval: '10s'
timeout: '5s'
retries: 5
tty: true
restart: 'always'
networks:
example-maildev-network:
driver: 'bridge'
```
New environment variable
```bash
# example-maildev-maildev (generated)
EXAMPLE_MAILDEV_MAILDEV_MAILDEV_SMTP_PORT=1025
EXAMPLE_MAILDEV_MAILDEV_MAILDEV_WEB_PORT=1080
```
When launched in the infrastructure documentation generation mode, the module creates an `.env` file with a list of all required variables, as well as an example `example.env`, where you can enter example variable values.
#### Static environments
| Key | Description | Sources | Constraints | Default | Value |
| ------ | ----------- | ------- | ----------- | ------- | ----- |
|`maildevMailDirectory`|Directory for persisting mail.|`obj['maildevMailDirectory']`, `process.env['MAILDEV_MAIL_DIRECTORY']`|**optional**|-|-|
|`maildevHttps`|Switch from http to https protocol.|`obj['maildevHttps']`, `process.env['MAILDEV_HTTPS']`|**optional**|-|-|
|`maildevHttpsKey`|The file path to the ssl private key.|`obj['maildevHttpsKey']`, `process.env['MAILDEV_HTTPS_KEY']`|**optional**|-|-|
|`maildevHttpsCert`|The file path to the ssl cert file.|`obj['maildevHttpsCert']`, `process.env['MAILDEV_HTTPS_CERT']`|**optional**|-|-|
|`maildevIp`|IP Address to bind SMTP service to, defaults to :: (any IPv4/v6).|`obj['maildevIp']`, `process.env['MAILDEV_IP']`|**optional**|-|-|
|`maildevOutgoingHost`|SMTP host for outgoing mail.|`obj['maildevOutgoingHost']`, `process.env['MAILDEV_OUTGOING_HOST']`|**optional**|-|-|
|`maildevOutgoingPort`|SMTP port for outgoing mail.|`obj['maildevOutgoingPort']`, `process.env['MAILDEV_OUTGOING_PORT']`|**optional**|-|-|
|`maildevOutgoingUser`|SMTP user for outgoing mail.|`obj['maildevOutgoingUser']`, `process.env['MAILDEV_OUTGOING_USER']`|**optional**|-|-|
|`maildevOutgoingPass`|SMTP password for outgoing mail.|`obj['maildevOutgoingPass']`, `process.env['MAILDEV_OUTGOING_PASS']`|**optional**|-|**hidden**|
|`maildevOutgoingSecure`|Use SMTP SSL for outgoing mail.|`obj['maildevOutgoingSecure']`, `process.env['MAILDEV_OUTGOING_SECURE']`|**optional**|-|-|
|`maildevAutoRelay`|Use auto-relay mode. Optional relay email address.|`obj['maildevAutoRelay']`, `process.env['MAILDEV_AUTO_RELAY']`|**optional**|-|-|
|`maildevAutoRelayRules`|Filter rules for auto relay mode.|`obj['maildevAutoRelayRules']`, `process.env['MAILDEV_AUTO_RELAY_RULES']`|**optional**|-|-|
|`maildevIncomingUser`|SMTP user for incoming mail.|`obj['maildevIncomingUser']`, `process.env['MAILDEV_INCOMING_USER']`|**optional**|-|-|
|`maildevIncomingPass`|SMTP password for incoming mail.|`obj['maildevIncomingPass']`, `process.env['MAILDEV_INCOMING_PASS']`|**optional**|-|**hidden**|
|`maildevIncomingSecure`|Use SMTP SSL for incoming emails.|`obj['maildevIncomingSecure']`, `process.env['MAILDEV_INCOMING_SECURE']`|**optional**|-|-|
|`maildevIncomingCert`|Cert file location for incoming SSL.|`obj['maildevIncomingCert']`, `process.env['MAILDEV_INCOMING_CERT']`|**optional**|-|-|
|`maildevIncomingKey`|Key file location for incoming SSL.|`obj['maildevIncomingKey']`, `process.env['MAILDEV_INCOMING_KEY']`|**optional**|-|-|
|`maildevWebIp`|IP Address to bind HTTP service to, defaults to --ip.|`obj['maildevWebIp']`, `process.env['MAILDEV_WEB_IP']`|**optional**|-|-|
|`maildevWebUser`|HTTP user for GUI.|`obj['maildevWebUser']`, `process.env['MAILDEV_WEB_USER']`|**optional**|-|-|
|`maildevWebPass`|HTTP password for GUI.|`obj['maildevWebPass']`, `process.env['MAILDEV_WEB_PASS']`|**optional**|-|**hidden**|
|`maildevBasePathname`|Base path for URLs.|`obj['maildevBasePathname']`, `process.env['MAILDEV_BASE_PATHNAME']`|**optional**|-|-|
|`maildevDisableWeb`|Disable the use of the web interface. Useful for unit testing.|`obj['maildevDisableWeb']`, `process.env['MAILDEV_DISABLE_WEB']`|**optional**|-|-|
|`maildevHideExtensions`|Comma separated list of SMTP extensions to NOT advertise (SMTPUTF8, PIPELINING, 8BITMIME).|`obj['maildevHideExtensions']`, `process.env['MAILDEV_HIDE_EXTENSIONS']`|**optional**|-|-|
#### Static configuration
| Key | Description | Constraints | Default | Value |
| ------ | ----------- | ----------- | ------- | ----- |
|`image`|Docker image name|**optional**|```maildev/maildev:2.2.1```|-|
|`featureName`|Feature name for generate prefix to environments keys|**optional**|-|-|
|`networks`|Network, if not set networkNames have project name and driver=bridge.|**optional**|-|-|
|`smtpPort`|SMTP port to catch mail|**optional**|```1025```|-|
|`webPort`|Port to run the Web GUI.|**optional**|```1080```|-|
[Back to Top](#modules)
---
### DockerComposeMinio
MinIO is a high-performance, S3 compatible object storage. (Generator for minio in docker-compose.yml for https://www.npmjs.com/package/@nestjs-mod/docker-compose)
#### Use in NestJS-mod
An example of