UNPKG

@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
# @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