Skip to content

🐛 Bug Report: Windows Docker consumes all system resources #8706

@ramazansancar

Description

@ramazansancar

📜 Description

I'm experiencing this issue when I try to launch a project using Docker Compose on my Windows 10 machine. However, once it's running, it consumes significant resources, rendering the computer unusable.

When we tried it on a Linux server with the same configuration, it worked without issue.

My current system information:

13th Gen Intel(R) Core(TM) i5-13500H (12 Core / 16 Thread)
32 GB 3200MHz RAM
1 TB m.2 SSD

👟 Reproduction steps

  1. Download the images by creating a Docker compose file using Windows. (A sample Docker compose file is below.)
  2. Run the relevant command to start the project with the Docker compose file.
docker compose -f "docker-compose.yml" up -d --build "novu_redis" "novu_mongodb" "novu_api" "novu_worker" "novu_ws" "novu_dashboard"
  1. After running it, you will see that it is using a lot of system resources.

👍 Expected behavior

Works without consuming too much system resources

👎 Actual Behavior with Screenshots

Image Image Image

Novu version

Novu OS v2.3.0 (Dockerize)

npm version

node version

📃 Provide any additional context for the Bug.

docker-compose.yml:

novu_redis:
    image: 'redis:alpine'
    container_name: novu_redis
    restart: unless-stopped
    logging:
      driver: 'json-file' # Enabled json-file logging with limits for consistency
      options:
        max-size: '50m'
        max-file: '5'
    healthcheck:
      test: ['CMD', 'redis-cli', 'ping']
      interval: 10s
      timeout: 5s
      retries: 5
    ports:
      - ${NOVU_DOCKER_REDIS_SERVICE_PORT}:${NOVU_DOCKER_REDIS_SERVICE_PORT}

  novu_mongodb:
    image: mongo:8.0.3
    container_name: novu_mongodb
    restart: unless-stopped
    logging:
      driver: 'json-file'
      options:
        max-size: '50m'
        max-file: '5'
    environment:
      - PUID=1000
      - PGID=1000
      - MONGO_INITDB_ROOT_USERNAME=${NOVU_MONGO_INITDB_ROOT_USERNAME}
      - MONGO_INITDB_ROOT_PASSWORD=${NOVU_MONGO_INITDB_ROOT_PASSWORD}
    volumes:
      - novu_mongodb:/data/db
    ports:
      - 27017:27017
    healthcheck:
      test: ['CMD', 'mongo', '--eval', "db.adminCommand('ping')"]
      interval: 10s
      timeout: 5s
      retries: 5

  novu_api:
    image: 'ghcr.io/novuhq/novu/api:2.3.0'
    depends_on:
      - novu_mongodb
      - novu_redis
    container_name: novu_api
    restart: unless-stopped
    logging:
      driver: 'json-file'
      options:
        max-size: '50m'
        max-file: '5'
    environment:
      NODE_ENV: ${NODE_ENV}
      API_ROOT_URL: ${NOVU_API_ROOT_URL}
      PORT: ${NOVU_API_PORT}
      FRONT_BASE_URL: ${NOVU_FRONT_BASE_URL}
      MONGO_URL: ${NOVU_MONGO_URL}
      MONGO_MIN_POOL_SIZE: ${NOVU_MONGO_MIN_POOL_SIZE}
      MONGO_MAX_POOL_SIZE: ${NOVU_MONGO_MAX_POOL_SIZE}
      REDIS_HOST: ${NOVU_REDIS_HOST}
      REDIS_PORT: ${NOVU_REDIS_PORT}
      REDIS_PASSWORD: ${NOVU_REDIS_PASSWORD}
      REDIS_DB_INDEX: 2
      REDIS_CACHE_SERVICE_HOST: ${NOVU_REDIS_CACHE_SERVICE_HOST}
      REDIS_CACHE_SERVICE_PORT: ${NOVU_REDIS_CACHE_SERVICE_PORT}
      S3_LOCAL_STACK: ${NOVU_S3_LOCAL_STACK}
      S3_BUCKET_NAME: ${NOVU_S3_BUCKET_NAME}
      S3_REGION: ${NOVU_S3_REGION}
      AWS_ACCESS_KEY_ID: ${NOVU_AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${NOVU_AWS_SECRET_ACCESS_KEY}
      JWT_SECRET: ${NOVU_JWT_SECRET}
      STORE_ENCRYPTION_KEY: ${NOVU_STORE_ENCRYPTION_KEY}
      NOVU_SECRET_KEY: ${NOVU_SECRET_KEY}
      SUBSCRIBER_WIDGET_JWT_EXPIRATION_TIME: ${NOVU_SUBSCRIBER_WIDGET_JWT_EXPIRATION_TIME}
      SENTRY_DSN: ${NOVU_SENTRY_DSN}
      NEW_RELIC_ENABLED: ${NOVU_NEW_RELIC_ENABLED}
      NEW_RELIC_APP_NAME: ${NOVU_NEW_RELIC_APP_NAME}
      NEW_RELIC_LICENSE_KEY: ${NOVU_NEW_RELIC_LICENSE_KEY}
      API_CONTEXT_PATH: ${NOVU_API_CONTEXT_PATH}
      MONGO_AUTO_CREATE_INDEXES: ${NOVU_MONGO_AUTO_CREATE_INDEXES}
      IS_API_IDEMPOTENCY_ENABLED: ${NOVU_IS_API_IDEMPOTENCY_ENABLED}
      IS_API_RATE_LIMITING_ENABLED: ${NOVU_IS_API_RATE_LIMITING_ENABLED}
      IS_NEW_MESSAGES_API_RESPONSE_ENABLED: ${NOVU_IS_NEW_MESSAGES_API_RESPONSE_ENABLED}
      IS_V2_ENABLED: ${NOVU_IS_V2_ENABLED}
    ports:
      - ${NOVU_API_PORT}:${NOVU_API_PORT}

  novu_worker:
    image: 'ghcr.io/novuhq/novu/worker:2.3.0'
    depends_on:
      - novu_mongodb
      - novu_redis
    container_name: novu_worker
    restart: unless-stopped
    logging:
      driver: 'json-file'
      options:
        max-size: '50m'
        max-file: '5'
    environment:
      NODE_ENV: ${NODE_ENV}
      MONGO_URL: ${NOVU_MONGO_URL}
      MONGO_MIN_POOL_SIZE: ${NOVU_MONGO_MIN_POOL_SIZE}
      MONGO_MAX_POOL_SIZE: ${NOVU_MONGO_MAX_POOL_SIZE}
      REDIS_HOST: ${NOVU_REDIS_HOST}
      REDIS_PORT: ${NOVU_REDIS_PORT}
      REDIS_PASSWORD: ${NOVU_REDIS_PASSWORD}
      REDIS_DB_INDEX: 2
      REDIS_CACHE_SERVICE_HOST: ${NOVU_REDIS_CACHE_SERVICE_HOST}
      REDIS_CACHE_SERVICE_PORT: ${NOVU_REDIS_CACHE_SERVICE_PORT}
      S3_LOCAL_STACK: ${NOVU_S3_LOCAL_STACK}
      S3_BUCKET_NAME: ${NOVU_S3_BUCKET_NAME}
      S3_REGION: ${NOVU_S3_REGION}
      AWS_ACCESS_KEY_ID: ${NOVU_AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${NOVU_AWS_SECRET_ACCESS_KEY}
      STORE_ENCRYPTION_KEY: ${NOVU_STORE_ENCRYPTION_KEY}
      SUBSCRIBER_WIDGET_JWT_EXPIRATION_TIME: ${NOVU_SUBSCRIBER_WIDGET_JWT_EXPIRATION_TIME}
      SENTRY_DSN: ${NOVU_SENTRY_DSN}
      NEW_RELIC_ENABLED: ${NOVU_NEW_RELIC_ENABLED}
      NEW_RELIC_APP_NAME: ${NOVU_NEW_RELIC_APP_NAME}
      NEW_RELIC_LICENSE_KEY: ${NOVU_NEW_RELIC_LICENSE_KEY}
      BROADCAST_QUEUE_CHUNK_SIZE: ${NOVU_BROADCAST_QUEUE_CHUNK_SIZE}
      MULTICAST_QUEUE_CHUNK_SIZE: ${NOVU_MULTICAST_QUEUE_CHUNK_SIZE}
      API_ROOT_URL: http://novu_api:${NOVU_API_PORT}
      IS_EMAIL_INLINE_CSS_DISABLED: ${NOVU_IS_EMAIL_INLINE_CSS_DISABLED}
      IS_USE_MERGED_DIGEST_ID_ENABLED: ${NOVU_IS_USE_MERGED_DIGEST_ID_ENABLED}

  novu_ws:
    image: 'ghcr.io/novuhq/novu/ws:2.3.0'
    depends_on:
      - novu_mongodb
      - novu_redis
    container_name: novu_ws
    restart: unless-stopped
    logging:
      driver: 'json-file'
      options:
        max-size: '50m'
        max-file: '5'
    environment:
      PORT: ${NOVU_WS_PORT}
      NODE_ENV: ${NODE_ENV}
      MONGO_URL: ${NOVU_MONGO_URL}
      MONGO_MIN_POOL_SIZE: ${NOVU_MONGO_MIN_POOL_SIZE}
      MONGO_MAX_POOL_SIZE: ${NOVU_MONGO_MAX_POOL_SIZE}
      REDIS_HOST: ${NOVU_REDIS_HOST}
      REDIS_PORT: ${NOVU_REDIS_PORT}
      REDIS_PASSWORD: ${NOVU_REDIS_PASSWORD}
      JWT_SECRET: ${NOVU_JWT_SECRET}
      WS_CONTEXT_PATH: ${NOVU_WS_CONTEXT_PATH}
      NEW_RELIC_ENABLED: ${NOVU_NEW_RELIC_ENABLED}
      NEW_RELIC_APP_NAME: ${NOVU_NEW_RELIC_APP_NAME}
      NEW_RELIC_LICENSE_KEY: ${NOVU_NEW_RELIC_LICENSE_KEY}
    ports:
      - ${NOVU_WS_PORT}:${NOVU_WS_PORT}

  novu_dashboard:
    image: 'ghcr.io/novuhq/novu/dashboard:2.3.0'
    depends_on:
      - novu_api
      - novu_worker
    container_name: novu_dashboard
    restart: unless-stopped
    logging:
      driver: 'json-file'
      options:
        max-size: '50m'
        max-file: '5'
    environment:
      VITE_API_HOSTNAME: ${NOVU_VITE_API_HOSTNAME}
      VITE_SELF_HOSTED: true
      VITE_WEBSOCKET_HOSTNAME: ${NOVU_VITE_WEBSOCKET_HOSTNAME}
      VITE_LEGACY_DASHBOARD_URL: ${NOVU_VITE_LEGACY_DASHBOARD_URL}
    ports:
      - 2000:4000

.env

# Secrets
# YOU MUST CHANGE THESE BEFORE GOING INTO PRODUCTION
# used as a secret to verify the JWT token signature
NOVU_JWT_SECRET=your-secret
# expressed in seconds or a string describing a time span [zeit/ms](https://github.com/zeit/ms.js).  Eg: 60, "2 days", "10h", "7d"
NOVU_SUBSCRIBER_WIDGET_JWT_EXPIRATION_TIME=15d
# used to encrypt/decrypt the provider credentials
NOVU_STORE_ENCRYPTION_KEY=<ENCRYPTION_KEY_MUST_BE_32_LONG>

# Random generated secret key.
NOVU_SECRET_KEY=<RANDOM_GENERATED_SECRET_KEY>

# Host
NOVU_HOST_NAME=http://localhost

# General
# available values 'dev', 'test', 'production', 'ci', 'local'
NODE_ENV=local
NOVU_MONGO_MAX_POOL_SIZE=10
NOVU_MONGO_MIN_POOL_SIZE=5

# MONGO USER
NOVU_MONGO_INITDB_ROOT_USERNAME=root
# MONGO PASSWORD
NOVU_MONGO_INITDB_ROOT_PASSWORD=secret
NOVU_MONGO_URL=mongodb://${NOVU_MONGO_INITDB_ROOT_USERNAME}:${NOVU_MONGO_INITDB_ROOT_PASSWORD}@novu_mongodb:27017/novu-db?authSource=admin
NOVU_MONGO_AUTO_CREATE_INDEXES=true

NOVU_REDIS_HOST=novu_redis

NOVU_DOCKER_REDIS_SERVICE_PORT=6379
NOVU_REDIS_PASSWORD=
NOVU_REDIS_CACHE_SERVICE_HOST=

# AWS
NOVU_S3_LOCAL_STACK=${NOVU_HOST_NAME}:4566
NOVU_S3_BUCKET_NAME=novu-local
NOVU_S3_REGION=us-east-1
NOVU_AWS_ACCESS_KEY_ID=test
NOVU_AWS_SECRET_ACCESS_KEY=test

# Ports
NOVU_API_PORT=3000
NOVU_REDIS_PORT=6379
NOVU_REDIS_CACHE_SERVICE_PORT=6379
NOVU_WS_PORT=3002

# Root URL
NOVU_VITE_API_HOSTNAME=${NOVU_HOST_NAME}:3000
NOVU_VITE_WEBSOCKET_HOSTNAME=${NOVU_HOST_NAME}:3002
# The VITE_LEGACY_DASHBOARD_URL must be set to the host and port of your web container.
NOVU_API_ROOT_URL=${NOVU_HOST_NAME}:3000
NOVU_FRONT_BASE_URL=${NOVU_HOST_NAME}:(4000|4200)
NOVU_IS_API_IDEMPOTENCY_ENABLED=false
NOVU_IS_API_RATE_LIMITING_ENABLED=false
NOVU_IS_NEW_MESSAGES_API_RESPONSE_ENABLED=true
NOVU_IS_V2_ENABLED=true
NOVU_IS_CONTROLS_AUTOCOMPLETE_ENABLED=false
NOVU_IS_WORKFLOW_NODE_PREVIEW_ENABLED=false
NOVU_IS_ENHANCED_DIGEST_ENABLED=-false
NOVU_IS_EMAIL_INLINE_CSS_DISABLED=false
NOVU_IS_USE_MERGED_DIGEST_ID_ENABLED=false


# Analytics
NOVU_SENTRY_DSN=

# update these values in case you are using New Relic, by default New Relic is disabled
NOVU_NEW_RELIC_ENABLED=false
NOVU_NEW_RELIC_APP_NAME="NEW_RELIC_APP_NAME"
NOVU_NEW_RELIC_LICENSE_KEY="NEW_RELIC_LICENSE_KEY"

NOVU_BROADCAST_QUEUE_CHUNK_SIZE=100
NOVU_MULTICAST_QUEUE_CHUNK_SIZE=100

👀 Have you spent some time to check if this bug has been raised before?

  • I checked and didn't find a similar issue

🏢 Have you read the Contributing Guidelines?

Are you willing to submit PR?

None

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions