diff --git a/.env.example b/.env.example new file mode 100644 index 000000000..0858d27cd --- /dev/null +++ b/.env.example @@ -0,0 +1,34 @@ +# Mail +MAIL_HOST= +MAIL_USERNAME= +MAIL_PASSWORD= +MAIL_PORT= +MAIL_SECURE= +MAIL_FROM_NAME= +MAIL_FROM_ADDRESS= + +# Database +DB_USER= +DB_HOST= +DB_PASSWORD= +DB_CHARSET= + +# System database +SYSTEM_DB_NAME=bigcapital_system + +# Tenants databases +TENANT_DB_NAME_PERFIX=bigcapital_tenant_ + +# MongoDB +MONGODB_DATABASE_URL=mongodb://localhost/bigcapital + +# Authentication +JWT_SECRET=b0JDZW56RnV6aEthb0RGPXVEcUI + +# Application +BASE_URL=https://bigcapital.ly +CONTACT_US_MAIL=support@bigcapital.ly + +# Agendash +AGENDASH_AUTH_USER=agendash +AGENDASH_AUTH_PASSWORD=123123 diff --git a/.github/workflows/build-deploy-container.yml b/.github/workflows/build-deploy-container.yml new file mode 100644 index 000000000..141368426 --- /dev/null +++ b/.github/workflows/build-deploy-container.yml @@ -0,0 +1,81 @@ +# This workflow will build a docker container, publish it to Github Registry. +name: Build and Deploy Docker Container +on: + release: + types: [created] + workflow_dispatch: + +env: + REGISTRY: ghcr.io + WEBAPP_IMAGE_NAME: bigcapital/bigcapital-webapp + SERVER_IMAGE_NAME: bigcapital/bigcapital-server + +jobs: + build-publish-webapp: + name: Build and deploy webapp container + runs-on: ubuntu-latest + environment: production + steps: + - name: Checkout + uses: actions/checkout@v2 + + # Login to Container registry. + - name: Log in to the Container registry + uses: docker/login-action@v1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GH_TOKEN }} + + - name: Extract metadata (tags, labels) for Docker + id: meta + uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 + with: + images: ${{ env.REGISTRY }}/${{ env.WEBAPP_IMAGE_NAME }} + + # Builds and push the Docker image. + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: . + file: ./packages/webapp/Dockerfile + push: true + tags: ghcr.io/bigcapitalhq/webapp:latest + labels: ${{ steps.meta.outputs.labels }} + + # Send notification to Slack channel. + - name: Slack Notification built and published webapp container successfully. + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} + + build-publish-server: + name: Build and deploy server container + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + + # Login to Container registry. + - name: Log in to the Container registry + uses: docker/login-action@v1 + with: + registry: ${{ env.REGISTRY }} + username: ${{ github.actor }} + password: ${{ secrets.GH_TOKEN }} + + # Builds and push the Docker image. + - name: Build and push Docker image + uses: docker/build-push-action@v2 + with: + context: ./ + file: ./packages/server/Dockerfile + push: true + tags: ghcr.io/bigcapitalhq/server:latest + labels: ${{ steps.meta.outputs.labels }} + + # Send notification to Slack channel. + - name: Slack Notification built and published server container successfully. + uses: rtCamp/action-slack-notify@v2 + env: + SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} \ No newline at end of file diff --git a/.github/workflows/docker-build.yml b/.github/workflows/docker-build.yml deleted file mode 100644 index 4795384c4..000000000 --- a/.github/workflows/docker-build.yml +++ /dev/null @@ -1,64 +0,0 @@ -# This workflow will build a docker container, publish it to Google Container Registry, and deploy it to GKE when a release is created -# -# To configure this workflow: -# -# 1. Ensure that your repository contains the necessary configuration for your Google Kubernetes Engine cluster, including deployment.yml, kustomization.yml, service.yml, etc. -# -# 2. Set up secrets in your workspace: GKE_PROJECT with the name of the project and GKE_SA_KEY with the Base64 encoded JSON service account key (https://github.com/GoogleCloudPlatform/github-actions/tree/docs/service-account-key/setup-gcloud#inputs). -# -# 3. Change the values for the GKE_ZONE, GKE_CLUSTER, IMAGE, and DEPLOYMENT_NAME environment variables (below). -# -# For more support on how to run the workflow, please visit https://github.com/google-github-actions/setup-gcloud/tree/master/example-workflows/gke - -name: Build and Deploy Docker Container - -on: - release: - types: [created] - workflow_dispatch: - -env: - REGISTRY: ghcr.io - IMAGE_NAME: abouhuolia/bigcapital-webapp - -jobs: - setup-build-publish-deploy: - name: Setup, Build, Publish, and Deploy - runs-on: ubuntu-latest - environment: production - - steps: - - name: Checkout - uses: actions/checkout@v2 - - # Login to Container registry. - - name: Log in to the Container registry - uses: docker/login-action@v1 - with: - registry: ${{ env.REGISTRY }} - username: ${{ github.actor }} - password: ${{ secrets.GH_TOKEN }} - - - name: Extract metadata (tags, labels) for Docker - id: meta - uses: docker/metadata-action@98669ae865ea3cffbcbaa878cf57c20bbf1c6c38 - with: - images: ${{ env.REGISTRY }}/${{ env.IMAGE_NAME }} - - # Builds and push the Docker image. - - name: Build and push Docker image - uses: docker/build-push-action@v2 - with: - context: . - file: ./packages/webapp/Dockerfile - push: true - tags: ghcr.io/bigcapitalhq/webapp:latest - labels: ${{ steps.meta.outputs.labels }} - # Send notification to Slack channel. - - name: Slack Notification built and published successfully. - uses: rtCamp/action-slack-notify@v2 - env: - SLACK_WEBHOOK: ${{ secrets.SLACK_WEBHOOK }} - - - diff --git a/.gitignore b/.gitignore index 478576915..9796bfc5d 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ node_modules/ -data \ No newline at end of file +data +.env \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 000000000..7ef73215f --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,116 @@ +# This is a production version of the Bigcapital docker-compose.yml file. + +version: '3.3' + +services: + nginx: + container_name: bigcapital-nginx-gateway + build: + context: ./docker/nginx + args: + - SERVER_PROXY_PORT=3000 + - WEB_SSL=false + - SELF_SIGNED=false + volumes: + - ./data/logs/nginx/:/var/log/nginx + - ./docker/certbot/certs/:/var/certs + ports: + - "80:80" + - "443:443" + tty: true + depends_on: + - server + - webapp + + webapp: + container_name: bigcapital-webapp + image: ghcr.io/bigcapitalhq/webapp:latest + + server: + container_name: bigcapital-server + image: ghcr.io/bigcapitalhq/server:latest + links: + - mysql + - mongo + - redis + depends_on: + - mysql + - mongo + - redis + environment: + # Mail + - MAIL_HOST=${MAIL_HOST} + - MAIL_USERNAME=${MAIL_USERNAM} + - MAIL_PASSWORD=${MAIL_PASSWORD} + - MAIL_PORT=${MAIL_PORT} + - MAIL_SECURE=${MAIL_SECURE} + - MAIL_FROM_NAME=${MAIL_FROM_NAME} + - MAIL_FROM_ADDRESS=${MAIL_FROM_ADDRESS} + + # Database + - DB_HOST=mysql + - DB_USER=${DB_USER} + - DB_PASSWORD=${DB_PASSWORD} + - DB_CHARSET=${DB_CHARSET} + + # System database + - SYSTEM_DB_NAME=${SYSTEM_DB_NAME} + + # Tenants databases + - TENANT_DB_NAME_PERFIX=${TENANT_DB_NAME_PERFIX} + + # Authentication + - JWT_SECRET=${JWT_SECRET} + + # MongoDB + - MONGODB_DATABASE_URL=mongodb://mongo/bigcapital + + # Application + - BASE_URL=${BASE_URL} + + # Agendash + - AGENDASH_AUTH_USER=${AGENDASH_AUTH_USER} + - AGENDASH_AUTH_PASSWORD=${AGENDASH_AUTH_PASSWORD} + + database_migration: + container_name: bigcapital-database-migration + build: + context: ./ + dockerfile: docker/migration/Dockerfile + args: + - DB_HOST=mysql + - DB_USER=${DB_USER} + - DB_PASSWORD=${DB_PASSWORD} + - DB_CHARSET=${DB_CHARSET} + - SYSTEM_DB_NAME=${SYSTEM_DB_NAME} + + mysql: + container_name: bigcapital-mysql + build: + context: ./docker/mysql + args: + - MYSQL_DATABASE=${SYSTEM_DB_NAME} + - MYSQL_USER=${DB_NAME} + - MYSQL_PASSWORD=${DB_PASSWORD} + - MYSQL_ROOT_PASSWORD=${DB_PASSWORD} + volumes: + - ./data/mysql/:/var/lib/mysql + expose: + - '3306' + + mongo: + container_name: bigcapital-mongo + build: ./docker/mongo + expose: + - '27017' + volumes: + - ./data/mongo/:/var/lib/mongodb + + redis: + container_name: bigcapital-redis + build: + context: ./docker/redis + expose: + - "6379" + volumes: + - ./data/redis:/data \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index f88ca19b3..f0dacfbd1 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,3 +1,8 @@ +# WARNING! +# This is a development version of THE Bigcapital docker-compose.yml file. +# Avoid using this file in your production environment. +# We're exposing here sensitive ports and mounting code volumes for rapid development and debugging of the server stack. + version: '3.3' services: @@ -5,10 +10,10 @@ services: build: context: ./docker/mysql args: - - MYSQL_DATABASE=bigcapital_system - - MYSQL_USER=default_user - - MYSQL_PASSWORD=secret - - MYSQL_ROOT_PASSWORD=root + - MYSQL_DATABASE=${SYSTEM_DB_NAME} + - MYSQL_USER=${DB_NAME} + - MYSQL_PASSWORD=${DB_PASSWORD} + - MYSQL_ROOT_PASSWORD=${DB_PASSWORD} volumes: - ./data/mysql/:/var/lib/mysql expose: diff --git a/docker/migration/Dockerfile b/docker/migration/Dockerfile new file mode 100644 index 000000000..817379495 --- /dev/null +++ b/docker/migration/Dockerfile @@ -0,0 +1,57 @@ +FROM node:14.20-alpine as build + +USER root +RUN apk update && \ + apk upgrade && \ + apk add git + +RUN apk add --no-cache bash + +ARG DB_HOST= \ + DB_USER= \ + DB_PASSWORD= \ + DB_CHARSET= \ + # System database. + SYSTEM_DB_NAME= \ + SYSTEM_DB_PASSWORD= \ + SYSTEM_DB_USER= \ + SYSTEM_DB_HOST= \ + SYSTEM_DB_CHARSET= + +ENV DB_HOST=$DB_HOST \ + DB_USER=$DB_USER \ + DB_PASSWORD=$DB_PASSWORD \ + DB_CHARSET=$DB_CHARSET \ + # System database. + SYSTEM_DB_HOST=$SYSTEM_DB_HOST \ + SYSTEM_DB_USER=$SYSTEM_DB_USER \ + SYSTEM_DB_PASSWORD=$SYSTEM_DB_PASSWORD \ + SYSTEM_DB_NAME=$SYSTEM_DB_NAME \ + SYSTEM_DB_CHARSET=$SYSTEM_DB_CHARSET + +# Create app directory. +WORKDIR /app + +RUN chown node:node / + +# Copy application dependency manifests to the container image. +COPY ./package*.json ./ +COPY ./packages/server/package*.json ./packages/server/ + +COPY ./lerna.json ./lerna.json + +# Install app dependencies for production. +RUN npm install +RUN npm run bootstrap + +COPY --chown=node:node ./packages/server ./packages/server + +# Build the server package. +RUN npm run build:server + +# Change working dir to the server package. +WORKDIR /app/packages/server +RUN git clone https://github.com/vishnubob/wait-for-it.git + +# Once we listen the mysql port run the migration task. +CMD ["./wait-for-it/wait-for-it.sh", "mysql:3306", "--", "node", "./build/commands.js", "system:migrate:latest"] \ No newline at end of file diff --git a/docker/nginx/Dockerfile b/docker/nginx/Dockerfile new file mode 100644 index 000000000..c48d3a8c5 --- /dev/null +++ b/docker/nginx/Dockerfile @@ -0,0 +1,21 @@ +FROM nginx:1.11 + +RUN mkdir /etc/nginx/sites-available && rm /etc/nginx/conf.d/default.conf +ADD nginx.conf /etc/nginx/ + +COPY scripts /root/scripts/ +COPY certs /etc/ssl/ + +COPY sites /etc/nginx/templates + +ARG SERVER_PROXY_PORT=3000 +ARG WEB_SSL=false +ARG SELF_SIGNED=false + +ENV SERVER_PROXY_PORT=$SERVER_PROXY_PORT +ENV WEB_SSL=$WEB_SSL +ENV SELF_SIGNED=$SELF_SIGNED + +RUN /bin/bash /root/scripts/build-nginx.sh + +CMD nginx \ No newline at end of file diff --git a/docker/nginx/certs/.gitkeep b/docker/nginx/certs/.gitkeep new file mode 100644 index 000000000..e69de29bb diff --git a/docker/nginx/nginx.conf b/docker/nginx/nginx.conf new file mode 100644 index 000000000..593fc336d --- /dev/null +++ b/docker/nginx/nginx.conf @@ -0,0 +1,33 @@ +user www-data; +worker_processes auto; +pid /run/nginx.pid; +daemon off; + +events { + worker_connections 2048; + use epoll; +} + +http { + server_tokens off; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 15; + types_hash_max_size 2048; + client_max_body_size 20M; + open_file_cache max=100; + gzip on; + gzip_disable "msie6"; + + ssl_protocols TLSv1 TLSv1.1 TLSv1.2; + ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS'; + + include /etc/nginx/mime.types; + default_type application/octet-stream; + + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-available/*; + access_log /var/log/nginx/access.log; + error_log /var/log/nginx/error.log; +} \ No newline at end of file diff --git a/docker/nginx/scripts/build-nginx.sh b/docker/nginx/scripts/build-nginx.sh new file mode 100644 index 000000000..ae47d3498 --- /dev/null +++ b/docker/nginx/scripts/build-nginx.sh @@ -0,0 +1,9 @@ +#!/bin/bash + +for conf in /etc/nginx/templates/*.conf; do + mv $conf "/etc/nginx/sites-available/"$(basename $conf) > /dev/null +done + +for template in /etc/nginx/templates/*.template; do + envsubst < $template > "/etc/nginx/sites-available/"$(basename $template)".conf" +done \ No newline at end of file diff --git a/docker/nginx/sites/server.template b/docker/nginx/sites/server.template new file mode 100644 index 000000000..fa962501c --- /dev/null +++ b/docker/nginx/sites/server.template @@ -0,0 +1,16 @@ +server { + listen 80 default_server; + + location /api { + proxy_pass http://server:${SERVER_PROXY_PORT}; + } + + location / { + proxy_pass http://webapp; + } + + location /.well-known/acme-challenge/ { + root /var/www/letsencrypt/; + log_not_found off; + } +} \ No newline at end of file diff --git a/packages/server/.env.example b/packages/server/.env.example deleted file mode 100644 index 482b7d991..000000000 --- a/packages/server/.env.example +++ /dev/null @@ -1,41 +0,0 @@ -MAIL_HOST=smtp.mailtrap.io -MAIL_USERNAME=842f331d3dc005 -MAIL_PASSWORD=172f97b34f1a17 -MAIL_PORT=587 -MAIL_SECURE=false -MAIL_FROM_NAME=Bigcapital -MAIL_FROM_ADDRESS=noreply@sender.bigcapital.ly - -SYSTEM_DB_CLIENT=mysql -SYSTEM_DB_HOST=127.0.0.1 -SYSTEM_DB_USER=root -SYSTEM_DB_PASSWORD=root -SYSTEM_DB_NAME=bigcapital_system -SYSTEM_MIGRATIONS_DIR=./src/system/migrations -SYSTEM_SEEDS_DIR=./src/system/seeds - -TENANT_DB_CLIENT=mysql -TENANT_DB_NAME_PERFIX=bigcapital_tenant_ -TENANT_DB_HOST=127.0.0.1 -TENANT_DB_PASSWORD=root -TENANT_DB_USER=root -TENANT_DB_CHARSET=utf8 -TENANT_MIGRATIONS_DIR=src/database/migrations -TENANT_SEEDS_DIR=src/database/seeds/core - -DB_MANAGER_SUPER_USER=root -DB_MANAGER_SUPER_PASSWORD=root - -MONGODB_DATABASE_URL=mongodb://localhost/bigcapital - -JWT_SECRET=b0JDZW56RnV6aEthb0RGPXVEcUI - -CONTACT_US_MAIL=support@bigcapital.ly -BASE_URL=https://bigcapital.ly - -LICENSES_AUTH_USER=root -LICENSES_AUTH_PASSWORD=root - -AGENDASH_AUTH_USER=agendash -AGENDASH_AUTH_PASSWORD=123123 -BROWSER_WS_ENDPOINT=ws://localhost:4080/ \ No newline at end of file diff --git a/packages/server/Dockerfile b/packages/server/Dockerfile new file mode 100644 index 000000000..aebf36981 --- /dev/null +++ b/packages/server/Dockerfile @@ -0,0 +1,93 @@ +FROM node:14.20-alpine as build + +USER root + +ARG MAIL_HOST= \ + MAIL_USERNAME= \ + MAIL_PASSWORD= \ + MAIL_PORT= \ + MAIL_SECURE= \ + MAIL_FROM_NAME= \ + MAIL_FROM_ADDRESS= \ + # Database + DB_HOST= \ + DB_USER= \ + DB_PASSWORD= \ + DB_CHARSET= \ + # System database. + SYSTEM_DB_NAME= \ + SYSTEM_DB_PASSWORD= \ + SYSTEM_DB_USER= \ + SYSTEM_DB_HOST= \ + SYSTEM_DB_CHARSET= \ + # Tenant databases. + TENANT_DB_USER= \ + TENANT_DB_PASSWORD= \ + TENANT_DB_HOST= \ + TENANT_DB_NAME_PERFIX= \ + TENANT_DB_CHARSET= \ + # MongoDB + MONGODB_DATABASE_URL= \ + # Authentication + JWT_SECRET= \ + # Application + BASE_URL= \ + # Agendash + AGENDASH_AUTH_USER=agendash \ + AGENDASH_AUTH_PASSWORD=123123 + +ENV MAIL_HOST=$MAIL_HOST \ + MAIL_USERNAME=$MAIL_USERNAME \ + MAIL_PASSWORD=$MAIL_PASSWORD \ + MAIL_PORT=$MAIL_PORT \ + MAIL_SECURE=$MAIL_SECURE \ + MAIL_FROM_NAME=$MAIL_FROM_NAME \ + MAIL_FROM_ADDRESS=$MAIL_FROM_ADDRESS \ + # Database + DB_HOST=$DB_HOST \ + DB_USER=$DB_USER \ + DB_PASSWORD=$DB_PASSWORD \ + DB_CHARSET=$DB_CHARSET \ + # System database. + SYSTEM_DB_HOST=$SYSTEM_DB_HOST \ + SYSTEM_DB_USER=$SYSTEM_DB_USER \ + SYSTEM_DB_PASSWORD=$SYSTEM_DB_PASSWORD \ + SYSTEM_DB_NAME=$SYSTEM_DB_NAME \ + SYSTEM_DB_CHARSET=$SYSTEM_DB_CHARSET \ + # Tenant databases. + TENANT_DB_NAME_PERFIX=$TENANT_DB_NAME_PERFIX \ + TENANT_DB_HOST=$TENANT_DB_HOST \ + TENANT_DB_PASSWORD=$TENANT_DB_PASSWORD \ + TENANT_DB_USER=$TENANT_DB_USER \ + TENANT_DB_CHARSET=$TENANT_DB_CHARSET \ + # Authentication + JWT_SECRET=$JWT_SECRET \ + # Agendash + AGENDASH_AUTH_USER=$AGENDASH_AUTH_USER \ + AGENDASH_AUTH_PASSWORD=$AGENDASH_AUTH_PASSWORD \ + # MongoDB + MONGODB_DATABASE_URL=$MONGODB_DATABASE_URL \ + # Application + BASE_URL=$BASE_URL + +# Create app directory. +WORKDIR /app + +RUN chown node:node / + +# Copy application dependency manifests to the container image. +COPY ./package*.json ./ +COPY ./packages/server/package*.json ./packages/server/ + +COPY ./lerna.json ./lerna.json + +# Install app dependencies for production. +RUN npm install +RUN npm run bootstrap + +COPY --chown=node:node ./packages/server ./packages/server + +# # Creates a "dist" folder with the production build +RUN npm run build:server --skip-nx-cache + +CMD [ "node", "./packages/server/build/index.js" ] \ No newline at end of file diff --git a/packages/server/src/config/index.ts b/packages/server/src/config/index.ts index 9563d914c..51c32c779 100644 --- a/packages/server/src/config/index.ts +++ b/packages/server/src/config/index.ts @@ -1,13 +1,8 @@ import dotenv from 'dotenv'; -// Set the NODE_ENV to 'development' by default -// process.env.NODE_ENV = process.env.NODE_ENV || 'development'; - -const envFound = dotenv.config(); -if (envFound.error) { - // This error should crash whole process - throw new Error("⚠️ Couldn't find .env file ⚠️"); -} +dotenv.config({ + path: '../../.env', +}); module.exports = { /** @@ -19,36 +14,38 @@ module.exports = { * System database configuration. */ system: { - db_client: process.env.SYSTEM_DB_CLIENT, - db_host: process.env.SYSTEM_DB_HOST, - db_user: process.env.SYSTEM_DB_USER, - db_password: process.env.SYSTEM_DB_PASSWORD, + db_client: process.env.SYSTEM_DB_CLIENT || process.env.DB_CLIENT || 'mysql', + db_host: process.env.SYSTEM_DB_HOST || process.env.DB_HOST, + db_user: process.env.SYSTEM_DB_USER || process.env.DB_USER, + db_password: process.env.SYSTEM_DB_PASSWORD || process.env.DB_PASSWORD, db_name: process.env.SYSTEM_DB_NAME, - charset: process.env.SYSTEM_DB_CHARSET, - migrations_dir: process.env.SYSTEM_MIGRATIONS_DIR, - seeds_dir: process.env.SYSTEM_SEEDS_DIR, + charset: process.env.SYSTEM_DB_CHARSET || process.env.DB_CHARSET, + migrations_dir: + process.env.SYSTEM_MIGRATIONS_DIR || './src/system/migrations', + seeds_dir: process.env.SYSTEM_SEEDS_DIR || './src/system/seeds', }, /** * Tenant database configuration. */ tenant: { - db_client: process.env.TENANT_DB_CLIENT, + db_client: process.env.TENANT_DB_CLIENT || process.env.DB_CLIENT || 'mysql', db_name_prefix: process.env.TENANT_DB_NAME_PERFIX, - db_host: process.env.TENANT_DB_HOST, - db_user: process.env.TENANT_DB_USER, - db_password: process.env.TENANT_DB_PASSWORD, - charset: process.env.TENANT_DB_CHARSET, - migrations_dir: process.env.TENANT_MIGRATIONS_DIR, - seeds_dir: process.env.TENANT_SEEDS_DIR, + db_host: process.env.TENANT_DB_HOST || process.env.DB_HOST, + db_user: process.env.TENANT_DB_USER || process.env.DB_USER, + db_password: process.env.TENANT_DB_PASSWORD || process.env.DB_PASSWORD, + charset: process.env.TENANT_DB_CHARSET || process.env.DB_CHARSET, + migrations_dir: + process.env.TENANT_MIGRATIONS_DIR || './src/database/migrations', + seeds_dir: process.env.TENANT_SEEDS_DIR || './src/database/seeds/core', }, /** * Databases manager config. */ manager: { - superUser: process.env.DB_MANAGER_SUPER_USER, - superPassword: process.env.DB_MANAGER_SUPER_PASSWORD, + superUser: process.env.SYSTEM_DB_USER || process.env.DB_USER, + superPassword: process.env.SYSTEM_DB_PASSWORD || process.env.DB_PASSWORD, }, /** @@ -119,14 +116,6 @@ module.exports = { prefix: '/api', }, - /** - * Licenses api basic authentication. - */ - licensesAuth: { - user: process.env.LICENSES_AUTH_USER, - password: process.env.LICENSES_AUTH_PASSWORD, - }, - /** * Redis storage configuration. */