diff --git a/docker/.env.example b/docker/.env.example index 1be4129b2d9..815bba38d59 100644 --- a/docker/.env.example +++ b/docker/.env.example @@ -13,12 +13,15 @@ HOST_NAME=http://localhost NODE_ENV=local MONGO_MAX_POOL_SIZE=500 MONGO_MIN_POOL_SIZE=100 +DOCKER_MONGO_PORT=27017 # MONGO USER MONGO_INITDB_ROOT_USERNAME=root # MONGO PASSWORD MONGO_INITDB_ROOT_PASSWORD=secret MONGO_URL=mongodb://root:secret@mongodb:27017/novu-db?authSource=admin REDIS_HOST=redis + +DOCKER_REDIS_SERVICE_PORT=6379 REDIS_PASSWORD= REDIS_CACHE_SERVICE_HOST= @@ -60,3 +63,5 @@ SENTRY_DSN= # change these values NEW_RELIC_APP_NAME= NEW_RELIC_LICENSE_KEY= + +DOCKER_LOCALSTACK_PORT=4566 diff --git a/docker/Readme.md b/docker/Readme.md index edffe85eeb3..23509dbbcc5 100644 --- a/docker/Readme.md +++ b/docker/Readme.md @@ -23,10 +23,10 @@ git clone https://github.com/novuhq/novu cd novu/docker # Copy the example env file -cp .env.example ./local/deployment/.env +cp .env.example ./local/.env # Start Novu -docker-compose -f ./local/deployment/docker-compose.yml up +docker-compose -f ./local/docker-compose.yml up ``` Now visit [http://127.0.0.1:4200](http://127.0.0.1:4200) to start using Novu. diff --git a/docker/enterprise/Readme.md b/docker/enterprise/Readme.md index 3bb60c9eb3a..13b2a2ebf01 100644 --- a/docker/enterprise/Readme.md +++ b/docker/enterprise/Readme.md @@ -36,16 +36,38 @@ docker-compose -f ./docker-compose.enterprise.yml up Now visit [http://127.0.0.1:4200](http://127.0.0.1:4200) to start using Novu. + + ## Secure Your Setup Though we provide some example secrets for getting started, it's highly recommended NOT to deploy your Novu setup using the defaults provided. Update the .env file with your own secrets, in particular, make sure you replace: JWT_SECRET: A secret key used by the API to generate JWT tokens. -## Redis Configuration +## Alterations + +### Redis Configuration You can configure Redis TLS by adding the following variables to the .env file and specifying the needed properties: REDIS_TLS={"servername":"localhost"} REDIS_CACHE_SERVICE_TLS={"servername":"localhost"} +### Running ARM Only +In order to force each service to run in ARM only, +you need to add the following tag `platform: linux/arm64` to +each of the services in their respective configuration files. +To do this, go through each service listed in your completed configuration +and add the ```platform: linux/arm64``` line. +This will ensure your services are run in ARM only. +Ex: +``` + redis: + platform: linux/arm64 + image: 'redis:alpine' + container_name: redis + restart: unless-stopped + logging: + driver: 'none' +``` + ## Configuration For simplicity, we made decisions that might not be optimal for production: - The database is on the same machine as the servers. diff --git a/docker/local/Readme.md b/docker/local/Readme.md deleted file mode 100644 index eab7c0d8a2c..00000000000 --- a/docker/local/Readme.md +++ /dev/null @@ -1,15 +0,0 @@ -## Running novu locally - -For a full guide on running novu locally for development needs, please read our guide here: https://docs.novu.co/community/run-in-local-machine - -### Advanced - Running with a Redis Cluster - -Novu has support for [redis cluster](https://redis.io/docs/management/scaling/), however you must set the following env variables to enable it: - -// To be determined - -In the local development example in the docker-compose.redis-cluster.yml file, the primary nodes are hard coded to 6391 through 6393 and -the secondary (read) node to 6394 through 6396 on localhost. -In addition, for the queue service there is a redis sentinel cluster that has ones primary and two read nodes -with append-only file enabled that run on ports 6381 through 6383 on localhost. -We have also set up redis commander on 5001 for you to be able to see the keys and statistics of the cluster. diff --git a/docker/local/deployment/docker-compose.yml b/docker/local/deployment/docker-compose.yml deleted file mode 100644 index 09e4f1a42ba..00000000000 --- a/docker/local/deployment/docker-compose.yml +++ /dev/null @@ -1,185 +0,0 @@ -version: '3.9' -name: novu -services: - redis: - image: 'redis:alpine' - container_name: redis - restart: unless-stopped - logging: - driver: 'none' - mongodb: - image: mongo - container_name: mongodb - restart: unless-stopped - logging: - driver: 'json-file' - options: - max-size: '50m' - max-file: '5' - environment: - - PUID=1000 - - PGID=1000 - - MONGO_INITDB_ROOT_USERNAME=${MONGO_INITDB_ROOT_USERNAME} - - MONGO_INITDB_ROOT_PASSWORD=${MONGO_INITDB_ROOT_PASSWORD} - volumes: - - mongodb:/data/db - ports: - - 27017:27017 - api: - image: 'ghcr.io/novuhq/novu/api:0.24.0' - depends_on: - - mongodb - - redis - container_name: api - restart: unless-stopped - logging: - driver: 'json-file' - options: - max-size: '50m' - max-file: '5' - environment: - NODE_ENV: ${NODE_ENV} - API_ROOT_URL: ${API_ROOT_URL} - DISABLE_USER_REGISTRATION: ${DISABLE_USER_REGISTRATION} - PORT: ${API_PORT} - FRONT_BASE_URL: ${FRONT_BASE_URL} - MONGO_URL: ${MONGO_URL} - MONGO_MIN_POOL_SIZE: ${MONGO_MIN_POOL_SIZE} - MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} - REDIS_HOST: ${REDIS_HOST} - REDIS_PORT: ${REDIS_PORT} - REDIS_PASSWORD: ${REDIS_PASSWORD} - REDIS_DB_INDEX: 2 - REDIS_CACHE_SERVICE_HOST: ${REDIS_CACHE_SERVICE_HOST} - REDIS_CACHE_SERVICE_PORT: ${REDIS_CACHE_SERVICE_PORT} - S3_LOCAL_STACK: ${S3_LOCAL_STACK} - S3_BUCKET_NAME: ${S3_BUCKET_NAME} - S3_REGION: ${S3_REGION} - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} - JWT_SECRET: ${JWT_SECRET} - STORE_ENCRYPTION_KEY: ${STORE_ENCRYPTION_KEY} - SENTRY_DSN: ${SENTRY_DSN} - NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} - NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} - API_CONTEXT_PATH: ${API_CONTEXT_PATH} - ports: - - '3000:3000' - worker: - image: 'ghcr.io/novuhq/novu/worker:0.24.0' - depends_on: - - mongodb - - redis - container_name: worker - restart: unless-stopped - logging: - driver: 'json-file' - options: - max-size: '50m' - max-file: '5' - environment: - NODE_ENV: ${NODE_ENV} - MONGO_URL: ${MONGO_URL} - MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} - REDIS_HOST: ${REDIS_HOST} - REDIS_PORT: ${REDIS_PORT} - REDIS_PASSWORD: ${REDIS_PASSWORD} - REDIS_DB_INDEX: 2 - REDIS_CACHE_SERVICE_HOST: ${REDIS_CACHE_SERVICE_HOST} - REDIS_CACHE_SERVICE_PORT: ${REDIS_CACHE_SERVICE_PORT} - S3_LOCAL_STACK: ${S3_LOCAL_STACK} - S3_BUCKET_NAME: ${S3_BUCKET_NAME} - S3_REGION: ${S3_REGION} - AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID} - AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY} - STORE_ENCRYPTION_KEY: ${STORE_ENCRYPTION_KEY} - SENTRY_DSN: ${SENTRY_DSN} - NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} - NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} - BROADCAST_QUEUE_CHUNK_SIZE: ${BROADCAST_QUEUE_CHUNK_SIZE} - MULTICAST_QUEUE_CHUNK_SIZE: ${MULTICAST_QUEUE_CHUNK_SIZE} - ws: - image: 'ghcr.io/novuhq/novu/ws:0.24.0' - depends_on: - - mongodb - - redis - container_name: ws - restart: unless-stopped - logging: - driver: 'json-file' - options: - max-size: '50m' - max-file: '5' - environment: - PORT: ${WS_PORT} - NODE_ENV: ${NODE_ENV} - MONGO_URL: ${MONGO_URL} - MONGO_MAX_POOL_SIZE: ${MONGO_MAX_POOL_SIZE} - REDIS_HOST: ${REDIS_HOST} - REDIS_PORT: ${REDIS_PORT} - REDIS_PASSWORD: ${REDIS_PASSWORD} - JWT_SECRET: ${JWT_SECRET} - WS_CONTEXT_PATH: ${WS_CONTEXT_PATH} - NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} - NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} - ports: - - '3002:3002' - web: - image: 'ghcr.io/novuhq/novu/web:0.24.0' - depends_on: - - api - - worker - container_name: web - restart: unless-stopped - logging: - driver: 'json-file' - options: - max-size: '50m' - max-file: '5' - environment: - REACT_APP_API_URL: ${API_ROOT_URL} - REACT_APP_ENVIRONMENT: ${NODE_ENV} - REACT_APP_WIDGET_EMBED_PATH: ${WIDGET_EMBED_PATH} - REACT_APP_DOCKER_HOSTED_ENV: 'true' - REACT_APP_WS_URL: ${REACT_APP_WS_URL} - ports: - - 4200:4200 - widget: - image: 'ghcr.io/novuhq/novu/widget:0.24.0' - depends_on: - - api - - worker - - web - container_name: widget - restart: unless-stopped - logging: - driver: 'json-file' - options: - max-size: '50m' - max-file: '5' - environment: - REACT_APP_API_URL: ${API_ROOT_URL} - REACT_APP_WS_URL: ${REACT_APP_WS_URL} - REACT_APP_ENVIRONMENT: ${NODE_ENV} - WIDGET_CONTEXT_PATH: ${WIDGET_CONTEXT_PATH} - ports: - - 4500:4500 - embed: - depends_on: - - widget - image: 'ghcr.io/novuhq/novu/embed:0.24.0' - container_name: embed - restart: unless-stopped - logging: - driver: 'json-file' - options: - max-size: '50m' - max-file: '5' - environment: - WIDGET_URL: ${WIDGET_URL} - NEW_RELIC_APP_NAME: ${NEW_RELIC_APP_NAME} - NEW_RELIC_LICENSE_KEY: ${NEW_RELIC_LICENSE_KEY} - ports: - - 4701:4701 -volumes: - mongodb: ~ diff --git a/docker/local/development/docker-compose.redis-cluster.yml b/docker/local/development/docker-compose.redis-cluster.yml deleted file mode 100644 index 72559636ac7..00000000000 --- a/docker/local/development/docker-compose.redis-cluster.yml +++ /dev/null @@ -1,242 +0,0 @@ -version: '3.1' - -services: - localstack: - container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}" - image: "localstack/localstack:0.14.5" - network_mode: bridge - environment: - - SERVICES=s3 - ports: - - "4566:4566" - volumes: - - "${TMPDIR:-/tmp/localstack}:/tmp/localstack" - - "/var/run/docker.sock:/var/run/docker.sock" - healthcheck: - test: "bash -c 'AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test aws --endpoint-url=http://127.0.0.1:4566 s3 ls'" - retries: 5 - interval: 10s - mongo: - container_name: "${MONGO_DOCKER_NAME-mongo_main}" - image: mongo - network_mode: bridge - ports: - - "27017:27017" - volumes: - - "${TMPDIR:-/tmp/mongo}:/db/data" - healthcheck: - test: "bash -c 'mongo --host 127.0.0.1:27017 --eval \"printjson(rs.status())\"'" - retries: 5 - interval: 10s - - redis_1: - image: 'redis:7-alpine' - container_name: redis_1 - ports: - - "6361:6379" - volumes: - - redis_1_data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] - networks: - redis_cluster_net: - ipv4_address: 173.18.0.2 - - redis_2: - image: 'redis:7-alpine' - container_name: redis_2 - ports: - - "6362:6379" - volumes: - - redis_2_data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] - networks: - redis_cluster_net: - ipv4_address: 173.18.0.3 - - redis_3: - image: 'redis:7-alpine' - container_name: redis_3 - ports: - - "6363:6379" - volumes: - - redis_3_data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] - networks: - redis_cluster_net: - ipv4_address: 173.18.0.4 - - redis_4: - image: 'redis:7-alpine' - container_name: redis_4 - ports: - - "6364:6379" - volumes: - - redis_4_data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] - networks: - redis_cluster_net: - ipv4_address: 173.18.0.5 - - redis_5: - image: 'redis:7-alpine' - container_name: redis_5 - ports: - - "6395:6379" - volumes: - - redis_5_data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] - networks: - redis_cluster_net: - ipv4_address: 173.18.0.6 - - redis_6: - image: 'redis:7-alpine' - container_name: redis_6 - ports: - - "6396:6379" - volumes: - - redis_6_data:/data - - ./redis/redis.conf:/usr/local/etc/redis/redis.conf - command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] - networks: - redis_cluster_net: - ipv4_address: 173.18.0.7 - - # Ephemeral container to create the Redis cluster connections. - # Once the setup is done, this container shuts down - # and the cluster can be used by the service app container - redis_cluster_init_1: - image: 'redis:7-alpine' - command: redis-cli --cluster create 173.18.0.2:6379 173.18.0.3:6379 173.18.0.4:6379 173.18.0.5:6379 173.18.0.6:6379 173.18.0.7:6379 --cluster-replicas 1 --cluster-yes - networks: - redis_cluster_net: - ipv4_address: 173.18.0.10 - depends_on: - - redis_1 - - redis_2 - - redis_3 - - redis_4 - - redis_5 - - redis_6 - - # Web UI to browse through our Redis data across all nodes - redis_commander: - image: rediscommander/redis-commander:latest - container_name: redis_web - environment: - REDIS_HOSTS: "local:redis_1:6379,local:redis_2:6379,local:redis_3:6379,local:redis_4:6379,local:redis_5:6379,local:redis_6:6379,local:redis_queue_1:6379,local:redis_queue_2:6379,local:redis_queue_3:6379" - ports: - - "5001:8081" - depends_on: - - redis_1 - - redis_2 - - redis_3 - - redis_4 - - redis_5 - - redis_6 - - redis_cluster_init_1 - - redis-master - - redis_queue_2 - - redis_queue_3 - networks: - redis_cluster_net: - ipv4_address: 173.18.0.9 - redis_queue_cluster_net: - ipv4_address: 173.19.0.9 - - redis-master: - image: 'redis:7-alpine' - container_name: redis_queue_1 - ports: - - "6381:6379" - volumes: - - redis_sentinel_data:/data - #command: [ "redis-server", "/usr/local/etc/redis/redis.conf" ] - networks: - redis_queue_cluster_net: - ipv4_address: 173.19.0.2 - - redis_queue_2: - image: 'redis:7-alpine' - container_name: redis_queue_2 - ports: - - "6382:6379" - volumes: - - redis_sentinel_data:/data - command: [ "redis-server", "--slaveof", "redis-master", "6379" ] - networks: - redis_queue_cluster_net: - ipv4_address: 173.19.0.3 - - redis_queue_3: - image: 'redis:7-alpine' - container_name: redis_queue_3 - ports: - - "6383:6379" - volumes: - - redis_sentinel_data:/data - command: [ "redis-server", "--slaveof", "redis-master", "6379" ] - networks: - redis_queue_cluster_net: - ipv4_address: 173.19.0.4 - - # Instance 1 - redis-sentinel: - build: - context: ./redis-sentinel - links: - - redis-master - networks: - redis_queue_cluster_net: - ipv4_address: 173.19.0.5 - - # Instance 2 - redis-sentinel2: - build: - context: ./redis-sentinel - links: - - redis-master - networks: - redis_queue_cluster_net: - ipv4_address: 173.19.0.6 - - # Instance 3 - redis-sentinel3: - build: - context: ./redis-sentinel - links: - - redis-master - networks: - redis_queue_cluster_net: - ipv4_address: 173.19.0.7 - -# Rename the default network, so we can easily identify it -# Across all containers -networks: - redis_queue_cluster_net: - driver: bridge - ipam: - driver: default - config: - - subnet: 173.19.0.0/16 - - redis_cluster_net: - driver: bridge - ipam: - driver: default - config: - - subnet: 173.18.0.0/16 - -volumes: - redis_1_data: {} - redis_2_data: {} - redis_3_data: {} - redis_4_data: {} - redis_5_data: {} - redis_6_data: {} - redis_sentinel_data: { } diff --git a/docker/local/development/docker-compose.yml b/docker/local/development/docker-compose.yml deleted file mode 100644 index 7b455a81961..00000000000 --- a/docker/local/development/docker-compose.yml +++ /dev/null @@ -1,40 +0,0 @@ -version: '3.1' - -services: - localstack: - container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}" - image: "localstack/localstack:0.14.5" - network_mode: bridge - environment: - - SERVICES=s3 - ports: - - "4566:4566" - volumes: - - "${TMPDIR:-/tmp/localstack}:/tmp/localstack" - - "/var/run/docker.sock:/var/run/docker.sock" - healthcheck: - test: "bash -c 'AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test aws --endpoint-url=http://127.0.0.1:4566 s3 ls'" - retries: 5 - interval: 10s - mongo: - container_name: "${MONGO_DOCKER_NAME-mongo_main}" - image: mongo - network_mode: bridge - ports: - - "27017:27017" - volumes: - - "${TMPDIR:-/tmp/mongo}:/db/data" - healthcheck: - test: "bash -c 'mongo --host 127.0.0.1:27017 --eval \"printjson(rs.status())\"'" - retries: 5 - interval: 10s - redis: - container_name: "${REDIS_DOCKER_NAME-redis_main}" - image: redis - network_mode: bridge - ports: - - "6379:6379" - healthcheck: - test: "bash -c 'redis-cli ping'" - retries: 5 - interval: 10s diff --git a/docker/local/development/redis-sentinel/Dockerfile b/docker/local/development/redis-sentinel/Dockerfile deleted file mode 100644 index 4b70fedd61c..00000000000 --- a/docker/local/development/redis-sentinel/Dockerfile +++ /dev/null @@ -1,19 +0,0 @@ -FROM redis:6-alpine - -ENV SENTINEL_QUORUM 2 -ENV SENTINEL_DOWN_AFTER 1000 -ENV SENTINEL_FAILOVER 1000 - -RUN mkdir -p /redis - -WORKDIR /redis - -COPY sentinel.conf . -COPY sentinel-entrypoint.sh /usr/local/bin/ - -RUN chown redis:redis /redis/* && \ - chmod +x /usr/local/bin/sentinel-entrypoint.sh - -EXPOSE 26379 - -ENTRYPOINT ["sentinel-entrypoint.sh"] diff --git a/docker/local/development/redis-sentinel/sentinel-entrypoint.sh b/docker/local/development/redis-sentinel/sentinel-entrypoint.sh deleted file mode 100644 index 1e6bed4801c..00000000000 --- a/docker/local/development/redis-sentinel/sentinel-entrypoint.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/sh - -sed -i "s/\$SENTINEL_QUORUM/$SENTINEL_QUORUM/g" /redis/sentinel.conf -sed -i "s/\$SENTINEL_DOWN_AFTER/$SENTINEL_DOWN_AFTER/g" /redis/sentinel.conf -sed -i "s/\$SENTINEL_FAILOVER/$SENTINEL_FAILOVER/g" /redis/sentinel.conf - -redis-server /redis/sentinel.conf --sentinel diff --git a/docker/local/development/redis-sentinel/sentinel.conf b/docker/local/development/redis-sentinel/sentinel.conf deleted file mode 100644 index cc50b28dae5..00000000000 --- a/docker/local/development/redis-sentinel/sentinel.conf +++ /dev/null @@ -1,9 +0,0 @@ -port 26379 - -dir /tmp - -sentinel resolve-hostnames yes -sentinel monitor redismaster redis-master 6379 $SENTINEL_QUORUM -sentinel down-after-milliseconds redismaster $SENTINEL_DOWN_AFTER -sentinel parallel-syncs redismaster 1 -sentinel failover-timeout redismaster $SENTINEL_FAILOVER diff --git a/docker/local/development/redis/redis.conf b/docker/local/development/redis/redis.conf deleted file mode 100644 index 9e07f28c895..00000000000 --- a/docker/local/development/redis/redis.conf +++ /dev/null @@ -1,5 +0,0 @@ -port 6379 -cluster-enabled yes -cluster-config-file nodes.conf -cluster-node-timeout 5000 -appendonly yes diff --git a/docker/local/development/docker-compose.development.yml b/docker/local/docker-compose.local.yml similarity index 100% rename from docker/local/development/docker-compose.development.yml rename to docker/local/docker-compose.local.yml diff --git a/docker/local/docker-compose.localstack.yml b/docker/local/docker-compose.localstack.yml deleted file mode 100644 index 2ccb6fa485f..00000000000 --- a/docker/local/docker-compose.localstack.yml +++ /dev/null @@ -1,18 +0,0 @@ -version: '3.1' - -services: - localstack: - container_name: "${LOCALSTACK_DOCKER_NAME-localstack_main}" - image: "localstack/localstack:0.14.5" - network_mode: bridge - environment: - - SERVICES=s3 - ports: - - "4566:4566" - volumes: - - "${TMPDIR:-/tmp/localstack}:/tmp/localstack" - - "/var/run/docker.sock:/var/run/docker.sock" - healthcheck: - test: "bash -c 'AWS_ACCESS_KEY_ID=test AWS_SECRET_ACCESS_KEY=test aws --endpoint-url=http://127.0.0.1:4566 s3 ls'" - retries: 15 - interval: 10s diff --git a/docker/local/development/docker-compose.monitoring.yml b/docker/local/docker-compose.yml similarity index 86% rename from docker/local/development/docker-compose.monitoring.yml rename to docker/local/docker-compose.yml index 938434cbfd6..d28b9bec29b 100644 --- a/docker/local/development/docker-compose.monitoring.yml +++ b/docker/local/docker-compose.yml @@ -8,7 +8,7 @@ services: environment: - SERVICES=s3 ports: - - "4566:4566" + - "${DOCKER_LOCALSTACK_PORT:-4566}:4566" volumes: - "${TMPDIR:-/tmp/localstack}:/tmp/localstack" - "/var/run/docker.sock:/var/run/docker.sock" @@ -21,7 +21,7 @@ services: image: mongo network_mode: bridge ports: - - "27017:27017" + - "${DOCKER_MONGO_PORT:-27017}:27017" volumes: - "${TMPDIR:-/tmp/mongo}:/db/data" healthcheck: @@ -33,13 +33,14 @@ services: image: redis network_mode: bridge ports: - - "6379:6379" + - "${DOCKER_REDIS_SERVICE_PORT:-6379}:6379" healthcheck: test: "bash -c 'redis-cli ping'" retries: 5 interval: 10s - pyroscope: image: grafana/pyroscope:latest ports: - "4040:4040" + profiles: + - optional