version: "3.3"
services:
  ###############################################################################
  # Redis
  ###############################################################################
  redis:
    image: redis:5
    expose:
      - "$REDIS_PORT"
    volumes:
      - "./data/redis:/data"
    command:
      - "bash"
      - "-c"
      - "docker-entrypoint.sh --requirepass $AUTHENTICATOR_TOKEN_DB_PASSWORD"
    networks:
      - net
  ###############################################################################
  # Mongo
  ###############################################################################
  mongo:
    image: mongo:3.6
    expose:
      - "$MONGO_PORT"
    volumes:
      - "./data/mongodb:/data/db"
    networks:
      - net
  ###############################################################################
  # NGINX
  ###############################################################################
  nginx:
    image: nginx:1.17
    volumes:
      - ./config/nginx/etc/conf.d/prod.conf:/etc/nginx/conf.d/default.template
    ports:
      - "$NGINX_PORT:$NGINX_PORT"
    environment:
      - FRONTEND_PORT=$FRONTEND_PORT
      - AUTHENTICATOR_PORT=$AUTHENTICATOR_PORT
      - PDFGENERATOR_PORT=$PDFGENERATOR_PORT
      - API_PORT=$API_PORT
      - NGINX_PORT=$NGINX_PORT
    command:
      - "bin/bash"
      - "-c"
      - "envsubst '$${NGINX_PORT},$${API_PORT},$${AUTHENTICATOR_PORT},$${FRONTEND_PORT},$${PDFGENERATOR_PORT}' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && cat /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"
    networks:
      - net
    depends_on:
      - frontend
      - authenticator
  ###############################################################################
  # RabbitMQ
  ###############################################################################
  # Don't need RabbitMQ for now
  # rabbitmq:
  #   image: rabbitmq:3-management
  #   hostname: 'rabbitmq'
  #   environment:
  #     - RABBITMQ_DEFAULT_USER=$RABBITMQ_USER
  #     - RABBITMQ_DEFAULT_PASS=$RABBITMQ_PASS
  #   expose:
  #     - '$RABBITMQ_PORT'
  #   ports:
  #     - '$RABBITMQ_MANAGEMENT_PORT:15672'
  #   labels:
  #     NAME: "rabbitmq1"
  #   networks:
  #     - net
  ###############################################################################
  # Authenticator
  ###############################################################################
  authenticator:
    image: mre/authenticator:latest
    environment:
      - NODE_ENV
      - PORT=$AUTHENTICATOR_PORT
      - LOGGER_LEVEL=$LOGGER_LEVEL
      - TOKEN_DB_URL=$AUTHENTICATOR_TOKEN_DB_URL
      - TOKEN_DB_PASSWORD=$AUTHENTICATOR_TOKEN_DB_PASSWORD
      - ACCESS_TOKEN_SECRET=$AUTHENTICATOR_ACCESS_TOKEN_SECRET
      - REFRESH_TOKEN_SECRET=$AUTHENTICATOR_REFRESH_TOKEN_SECRET
      - RESET_TOKEN_SECRET=$AUTHENTICATOR_RESET_TOKEN_SECRET
      - BASE_DB_URL=$BASE_DB_URL
      - EMAILER_URL=$EMAILER_URL
      - SIGNUP=$SIGNUP
    expose:
      - "$AUTHENTICATOR_PORT"
    networks:
      - net
    depends_on:
      - redis
      - mongo
      - emailer
  ###############################################################################
  # PDFGenerator
  ###############################################################################
  pdfgenerator:
    image: mre/pdfgenerator:latest
    environment:
      - NODE_ENV
      - PORT=$PDFGENERATOR_PORT
      - LOGGER_LEVEL=$LOGGER_LEVEL
      - MONGO_URL=$BASE_DB_URL
      - ACCESS_TOKEN_SECRET=$AUTHENTICATOR_ACCESS_TOKEN_SECRET
      - CIPHER_KEY=$CIPHER_KEY
      - CIPHER_IV_KEY=$CIPHER_IV_KEY
    expose:
      - "$PDFGENERATOR_PORT"
    networks:
      - net
    depends_on:
      - mongo
  ###############################################################################
  # Emailer
  ###############################################################################
  emailer:
    image: mre/emailer:latest
    environment:
      - NODE_ENV
      - ALLOW_SENDING_EMAILS=$ALLOW_SENDING_EMAILS
      - PORT=$EMAILER_PORT
      - LOGGER_LEVEL=$LOGGER_LEVEL
      - APP_NAME=$APP_NAME
      - APP_URL=$APP_URL
      - MONGO_URL=$BASE_DB_URL
      - CIPHER_KEY=$CIPHER_KEY
      - CIPHER_IV_KEY=$CIPHER_IV_KEY
      - PDFGENERATOR_URL=$PDFGENERATOR_URL
      - MAILGUN_API_KEY=$MAILGUN_API_KEY
      - MAILGUN_DOMAIN=$MAILGUN_DOMAIN
      - EMAIL_FROM=$EMAIL_FROM
      - EMAIL_REPLY_TO=$EMAIL_REPLY_TO
      - EMAIL_BCC=$EMAIL_BCC
    expose:
      - "$EMAILER_PORT"
    networks:
      - net
    depends_on:
      - mongo
      - pdfgenerator
  ###############################################################################
  # api
  ###############################################################################
  api:
    image: mre/api:latest
    environment:
      - NODE_ENV
      - PORT=$API_PORT
      - LOGGER_LEVEL=$LOGGER_LEVEL
      - SIGNUP=$SIGNUP
      - MONGO_URL=$BASE_DB_URL
      - DEMO_MODE=$DEMO_MODE
      - EMAILER_URL=$EMAILER_URL
      - PDFGENERATOR_URL=$PDFGENERATOR_URL
      - RESTORE_DB=$RESTORE_DB
      - ACCESS_TOKEN_SECRET=$AUTHENTICATOR_ACCESS_TOKEN_SECRET
      - REFRESH_TOKEN_SECRET=$AUTHENTICATOR_REFRESH_TOKEN_SECRET
      - CIPHER_KEY=$CIPHER_KEY
      - CIPHER_IV_KEY=$CIPHER_IV_KEY
    expose:
      - "$API_PORT"
    networks:
      - net
    depends_on:
      - mongo
      - emailer
      - pdfgenerator
  ###############################################################################
  # Frontend
  ###############################################################################
  frontend:
    build:
      args:
        - BASE_PATH=$BASE_PATH
    image: mre/frontend:latest
    environment:
      - NODE_ENV
      - PORT=$FRONTEND_PORT
      - LOGGER_LEVEL=$LOGGER_LEVEL
      - APP_NAME=$APP_NAME
      - BASE_PATH=$BASE_PATH
      - API_URL=$API_URL
      - DOCKER_API_URL=$DOCKER_API_URL
      - DEMO_MODE=$DEMO_MODE
      - SIGNUP=$SIGNUP
    expose:
      - "$FRONTEND_PORT"
    extra_hosts:
      - "host.docker.internal:host-gateway"
    networks:
      - net
    depends_on:
      - api
      - authenticator
###############################################################################
# microservices network
###############################################################################
networks:
  net:
    driver: bridge
