Merge pull request #1 from ShvaykaD/feature/valkey

This commit is contained in:
Sumin Denys 2025-05-28 09:55:35 +03:00 committed by GitHub
commit 79e60cca7b
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
13 changed files with 172 additions and 232 deletions

View File

@ -19,11 +19,11 @@ In order to set database type change the value of `DATABASE` variable in `.env`
In order to set cache type change the value of `CACHE` variable in `.env` file to one of the following: In order to set cache type change the value of `CACHE` variable in `.env` file to one of the following:
- `redis` - use Redis standalone cache (1 node - 1 master); - `valkey` - use Valkey standalone cache (1 node - 1 primary);
- `redis-cluster` - use Redis cluster cache (6 nodes - 3 masters, 3 slaves); - `valkey-cluster` - use Valkey cluster cache (6 nodes - 3 primaries, 3 replicas);
- `redis-sentinel` - use Redis sentinel cache (3 nodes - 1 master, 1 slave, 1 sentinel) - `valkey-sentinel` - use Valkey sentinel cache (3 nodes - 1 primary, 1 replica, 1 sentinel)
**NOTE**: According to the cache type corresponding docker service will be deployed (see `docker-compose.redis.yml`, `docker-compose.redis-cluster.yml`, `docker-compose.redis-sentinel.yml` for details). **NOTE**: According to the cache type corresponding docker service will be deployed (see `docker-compose.valkey.yml`, `docker-compose.valkey-cluster.yml`, `docker-compose.valkey-sentinel.yml` for details).
Execute the following command to create log folders for the services and chown of these folders to the docker container users. Execute the following command to create log folders for the services and chown of these folders to the docker container users.
To be able to change user, **chown** command is used, which requires sudo permissions (script will request password for a sudo access): To be able to change user, **chown** command is used, which requires sudo permissions (script will request password for a sudo access):

View File

@ -31,10 +31,10 @@ services:
volumes: volumes:
valkey-sentinel-data-primary: valkey-sentinel-data-primary:
external: external:
name: ${VALKEY_SENTINEL_DATA_VOLUME_MASTER} name: ${VALKEY_SENTINEL_DATA_VOLUME_PRIMARY}
valkey-sentinel-data-replica: valkey-sentinel-data-replica:
external: external:
name: ${VALKEY_SENTINEL_DATA_VOLUME_SLAVE} name: ${VALKEY_SENTINEL_DATA_VOLUME_REPLICA}
valkey-sentinel-data-sentinel: valkey-sentinel-data-sentinel:
external: external:
name: ${VALKEY_SENTINEL_DATA_VOLUME_SENTINEL} name: ${VALKEY_SENTINEL_DATA_VOLUME_SENTINEL}

View File

@ -18,19 +18,19 @@ As result, in REPOSITORY column, next images should be present:
thingsboard/tb-web-ui thingsboard/tb-web-ui
thingsboard/tb-js-executor thingsboard/tb-js-executor
- Run the black box tests (without ui tests) in the [msa/black-box-tests](../black-box-tests) directory with Redis standalone: - Run the black box tests (without ui tests) in the [msa/black-box-tests](../black-box-tests) directory with Valkey standalone:
mvn clean install -DblackBoxTests.skip=false mvn clean install -DblackBoxTests.skip=false
- Run the black box tests (without ui tests) in the [msa/black-box-tests](../black-box-tests) directory with Redis standalone with TLS: - Run the black box tests (without ui tests) in the [msa/black-box-tests](../black-box-tests) directory with Valkey standalone with TLS:
mvn clean install -DblackBoxTests.skip=false -DblackBoxTests.redisSsl=true mvn clean install -DblackBoxTests.skip=false -DblackBoxTests.redisSsl=true
- Run the black box tests in the [msa/black-box-tests](../black-box-tests) directory with Redis cluster: - Run the black box tests in the [msa/black-box-tests](../black-box-tests) directory with the Valkey cluster:
mvn clean install -DblackBoxTests.skip=false -DblackBoxTests.redisCluster=true mvn clean install -DblackBoxTests.skip=false -DblackBoxTests.redisCluster=true
- Run the black box tests in the [msa/black-box-tests](../black-box-tests) directory with Redis sentinel: - Run the black box tests in the [msa/black-box-tests](../black-box-tests) directory with Valkey sentinel:
mvn clean install -DblackBoxTests.skip=false -DblackBoxTests.redisSentinel=true mvn clean install -DblackBoxTests.skip=false -DblackBoxTests.redisSentinel=true

View File

@ -42,9 +42,9 @@ import static org.testng.Assert.fail;
@Slf4j @Slf4j
public class ContainerTestSuite { public class ContainerTestSuite {
final static boolean IS_REDIS_CLUSTER = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisCluster")); final static boolean IS_VALKEY_CLUSTER = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisCluster"));
final static boolean IS_REDIS_SENTINEL = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisSentinel")); final static boolean IS_VALKEY_SENTINEL = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisSentinel"));
final static boolean IS_REDIS_SSL = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisSsl")); final static boolean IS_VALKEY_SSL = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisSsl"));
final static boolean IS_HYBRID_MODE = Boolean.parseBoolean(System.getProperty("blackBoxTests.hybridMode")); final static boolean IS_HYBRID_MODE = Boolean.parseBoolean(System.getProperty("blackBoxTests.hybridMode"));
final static String QUEUE_TYPE = System.getProperty("blackBoxTests.queue", "kafka"); final static String QUEUE_TYPE = System.getProperty("blackBoxTests.queue", "kafka");
private static final String SOURCE_DIR = "./../../docker/"; private static final String SOURCE_DIR = "./../../docker/";
@ -82,9 +82,9 @@ public class ContainerTestSuite {
public void start() { public void start() {
installTb = new ThingsBoardDbInstaller(); installTb = new ThingsBoardDbInstaller();
installTb.createVolumes(); installTb.createVolumes();
log.info("System property of blackBoxTests.redisCluster is {}", IS_REDIS_CLUSTER); log.info("System property of blackBoxTests.redisCluster is {}", IS_VALKEY_CLUSTER);
log.info("System property of blackBoxTests.redisSentinel is {}", IS_REDIS_SENTINEL); log.info("System property of blackBoxTests.redisSentinel is {}", IS_VALKEY_SENTINEL);
log.info("System property of blackBoxTests.redisSsl is {}", IS_REDIS_SSL); log.info("System property of blackBoxTests.redisSsl is {}", IS_VALKEY_SSL);
log.info("System property of blackBoxTests.hybridMode is {}", IS_HYBRID_MODE); log.info("System property of blackBoxTests.hybridMode is {}", IS_HYBRID_MODE);
boolean skipTailChildContainers = Boolean.parseBoolean(System.getProperty("blackBoxTests.skipTailChildContainers")); boolean skipTailChildContainers = Boolean.parseBoolean(System.getProperty("blackBoxTests.skipTailChildContainers"));
try { try {
@ -107,10 +107,10 @@ public class ContainerTestSuite {
} }
} }
if (IS_REDIS_SSL) { if (IS_VALKEY_SSL) {
addToFile(targetDir, "cache-redis.env", addToFile(targetDir, "cache-valkey.env",
Map.of("TB_REDIS_SSL_ENABLED", "true", Map.of("TB_REDIS_SSL_ENABLED", "true",
"TB_REDIS_SSL_PEM_CERT", "/redis/certs/redisCA.crt")); "TB_REDIS_SSL_PEM_CERT", "/valkey/certs/valkeyCA.crt"));
} }
List<File> composeFiles = new ArrayList<>(Arrays.asList( List<File> composeFiles = new ArrayList<>(Arrays.asList(
@ -123,8 +123,8 @@ public class ContainerTestSuite {
new File(targetDir + (IS_HYBRID_MODE ? "docker-compose.hybrid-test-extras.yml" : "docker-compose.postgres-test-extras.yml")), new File(targetDir + (IS_HYBRID_MODE ? "docker-compose.hybrid-test-extras.yml" : "docker-compose.postgres-test-extras.yml")),
new File(targetDir + "docker-compose.postgres.volumes.yml"), new File(targetDir + "docker-compose.postgres.volumes.yml"),
new File(targetDir + "docker-compose." + QUEUE_TYPE + ".yml"), new File(targetDir + "docker-compose." + QUEUE_TYPE + ".yml"),
new File(targetDir + resolveRedisComposeFile()), new File(targetDir + resolveValkeyComposeFile()),
new File(targetDir + resolveRedisComposeVolumesFile()), new File(targetDir + resolveValkeyComposeVolumesFile()),
new File(targetDir + ("docker-selenium.yml")) new File(targetDir + ("docker-selenium.yml"))
)); ));
@ -198,30 +198,30 @@ public class ContainerTestSuite {
} }
} }
private static String resolveRedisComposeFile() { private static String resolveValkeyComposeFile() {
if (IS_REDIS_CLUSTER) { if (IS_VALKEY_CLUSTER) {
return "docker-compose.redis-cluster.yml"; return "docker-compose.valkey-cluster.yml";
} }
if (IS_REDIS_SENTINEL) { if (IS_VALKEY_SENTINEL) {
return "docker-compose.redis-sentinel.yml"; return "docker-compose.valkey-sentinel.yml";
} }
if (IS_REDIS_SSL) { if (IS_VALKEY_SSL) {
return "docker-compose.redis-ssl.yml"; return "docker-compose.valkey-ssl.yml";
} }
return "docker-compose.redis.yml"; return "docker-compose.valkey.yml";
} }
private static String resolveRedisComposeVolumesFile() { private static String resolveValkeyComposeVolumesFile() {
if (IS_REDIS_CLUSTER) { if (IS_VALKEY_CLUSTER) {
return "docker-compose.redis-cluster.volumes.yml"; return "docker-compose.valkey-cluster.volumes.yml";
} }
if (IS_REDIS_SENTINEL) { if (IS_VALKEY_SENTINEL) {
return "docker-compose.redis-sentinel.volumes.yml"; return "docker-compose.valkey-sentinel.volumes.yml";
} }
if (IS_REDIS_SSL) { if (IS_VALKEY_SSL) {
return "docker-compose.redis-ssl.volumes.yml"; return "docker-compose.valkey-ssl.volumes.yml";
} }
return "docker-compose.redis.volumes.yml"; return "docker-compose.valkey.volumes.yml";
} }
public void stop() { public void stop() {

View File

@ -32,15 +32,15 @@ import java.util.stream.IntStream;
@Slf4j @Slf4j
public class ThingsBoardDbInstaller { public class ThingsBoardDbInstaller {
final static boolean IS_REDIS_CLUSTER = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisCluster")); final static boolean IS_VALKEY_CLUSTER = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisCluster"));
final static boolean IS_REDIS_SENTINEL = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisSentinel")); final static boolean IS_VALKEY_SENTINEL = Boolean.parseBoolean(System.getProperty("blackBoxTests.redisSentinel"));
final static boolean IS_HYBRID_MODE = Boolean.parseBoolean(System.getProperty("blackBoxTests.hybridMode")); final static boolean IS_HYBRID_MODE = Boolean.parseBoolean(System.getProperty("blackBoxTests.hybridMode"));
private final static String POSTGRES_DATA_VOLUME = "tb-postgres-test-data-volume"; private final static String POSTGRES_DATA_VOLUME = "tb-postgres-test-data-volume";
private final static String CASSANDRA_DATA_VOLUME = "tb-cassandra-test-data-volume"; private final static String CASSANDRA_DATA_VOLUME = "tb-cassandra-test-data-volume";
private final static String REDIS_DATA_VOLUME = "tb-redis-data-volume"; private final static String VALKEY_DATA_VOLUME = "tb-valkey-data-volume";
private final static String REDIS_CLUSTER_DATA_VOLUME = "tb-redis-cluster-data-volume"; private final static String VALKEY_CLUSTER_DATA_VOLUME = "tb-valkey-cluster-data-volume";
private final static String REDIS_SENTINEL_DATA_VOLUME = "tb-redis-sentinel-data-volume"; private final static String VALKEY_SENTINEL_DATA_VOLUME = "tb-valkey-sentinel-data-volume";
private final static String TB_LOG_VOLUME = "tb-log-test-volume"; private final static String TB_LOG_VOLUME = "tb-log-test-volume";
private final static String TB_COAP_TRANSPORT_LOG_VOLUME = "tb-coap-transport-log-test-volume"; private final static String TB_COAP_TRANSPORT_LOG_VOLUME = "tb-coap-transport-log-test-volume";
private final static String TB_LWM2M_TRANSPORT_LOG_VOLUME = "tb-lwm2m-transport-log-test-volume"; private final static String TB_LWM2M_TRANSPORT_LOG_VOLUME = "tb-lwm2m-transport-log-test-volume";
@ -56,9 +56,9 @@ public class ThingsBoardDbInstaller {
private final String postgresDataVolume; private final String postgresDataVolume;
private final String cassandraDataVolume; private final String cassandraDataVolume;
private final String redisDataVolume; private final String valkeyDataVolume;
private final String redisClusterDataVolume; private final String valkeyClusterDataVolume;
private final String redisSentinelDataVolume; private final String valkeySentinelDataVolume;
private final String tbLogVolume; private final String tbLogVolume;
private final String tbCoapTransportLogVolume; private final String tbCoapTransportLogVolume;
private final String tbLwm2mTransportLogVolume; private final String tbLwm2mTransportLogVolume;
@ -70,8 +70,8 @@ public class ThingsBoardDbInstaller {
private final Map<String, String> env; private final Map<String, String> env;
public ThingsBoardDbInstaller() { public ThingsBoardDbInstaller() {
log.info("System property of blackBoxTests.redisCluster is {}", IS_REDIS_CLUSTER); log.info("System property of blackBoxTests.redisCluster is {}", IS_VALKEY_CLUSTER);
log.info("System property of blackBoxTests.redisCluster is {}", IS_REDIS_SENTINEL); log.info("System property of blackBoxTests.redisCluster is {}", IS_VALKEY_SENTINEL);
log.info("System property of blackBoxTests.hybridMode is {}", IS_HYBRID_MODE); log.info("System property of blackBoxTests.hybridMode is {}", IS_HYBRID_MODE);
List<File> composeFiles = new ArrayList<>(Arrays.asList( List<File> composeFiles = new ArrayList<>(Arrays.asList(
new File("./../../docker/docker-compose.yml"), new File("./../../docker/docker-compose.yml"),
@ -80,8 +80,8 @@ public class ThingsBoardDbInstaller {
? new File("./../../docker/docker-compose.hybrid.yml") ? new File("./../../docker/docker-compose.hybrid.yml")
: new File("./../../docker/docker-compose.postgres.yml"), : new File("./../../docker/docker-compose.postgres.yml"),
new File("./../../docker/docker-compose.postgres.volumes.yml"), new File("./../../docker/docker-compose.postgres.volumes.yml"),
resolveRedisComposeFile(), resolveValkeyComposeFile(),
resolveRedisComposeVolumesFile() resolveValkeyComposeVolumesFile()
)); ));
if (IS_HYBRID_MODE) { if (IS_HYBRID_MODE) {
composeFiles.add(new File("./../../docker/docker-compose.cassandra.volumes.yml")); composeFiles.add(new File("./../../docker/docker-compose.cassandra.volumes.yml"));
@ -95,9 +95,9 @@ public class ThingsBoardDbInstaller {
postgresDataVolume = project + "_" + POSTGRES_DATA_VOLUME; postgresDataVolume = project + "_" + POSTGRES_DATA_VOLUME;
cassandraDataVolume = project + "_" + CASSANDRA_DATA_VOLUME; cassandraDataVolume = project + "_" + CASSANDRA_DATA_VOLUME;
redisDataVolume = project + "_" + REDIS_DATA_VOLUME; valkeyDataVolume = project + "_" + VALKEY_DATA_VOLUME;
redisClusterDataVolume = project + "_" + REDIS_CLUSTER_DATA_VOLUME; valkeyClusterDataVolume = project + "_" + VALKEY_CLUSTER_DATA_VOLUME;
redisSentinelDataVolume = project + "_" + REDIS_SENTINEL_DATA_VOLUME; valkeySentinelDataVolume = project + "_" + VALKEY_SENTINEL_DATA_VOLUME;
tbLogVolume = project + "_" + TB_LOG_VOLUME; tbLogVolume = project + "_" + TB_LOG_VOLUME;
tbCoapTransportLogVolume = project + "_" + TB_COAP_TRANSPORT_LOG_VOLUME; tbCoapTransportLogVolume = project + "_" + TB_COAP_TRANSPORT_LOG_VOLUME;
tbLwm2mTransportLogVolume = project + "_" + TB_LWM2M_TRANSPORT_LOG_VOLUME; tbLwm2mTransportLogVolume = project + "_" + TB_LWM2M_TRANSPORT_LOG_VOLUME;
@ -123,38 +123,38 @@ public class ThingsBoardDbInstaller {
env.put("TB_SNMP_TRANSPORT_LOG_VOLUME", tbSnmpTransportLogVolume); env.put("TB_SNMP_TRANSPORT_LOG_VOLUME", tbSnmpTransportLogVolume);
env.put("TB_VC_EXECUTOR_LOG_VOLUME", tbVcExecutorLogVolume); env.put("TB_VC_EXECUTOR_LOG_VOLUME", tbVcExecutorLogVolume);
env.put("TB_EDQS_LOG_VOLUME", tbEdqsLogVolume); env.put("TB_EDQS_LOG_VOLUME", tbEdqsLogVolume);
if (IS_REDIS_CLUSTER) { if (IS_VALKEY_CLUSTER) {
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
env.put("REDIS_CLUSTER_DATA_VOLUME_" + i, redisClusterDataVolume + '-' + i); env.put("VALKEY_CLUSTER_DATA_VOLUME_" + i, valkeyClusterDataVolume + '-' + i);
} }
} else if (IS_REDIS_SENTINEL) { } else if (IS_VALKEY_SENTINEL) {
env.put("REDIS_SENTINEL_DATA_VOLUME_MASTER", redisSentinelDataVolume + "-" + "master"); env.put("VALKEY_SENTINEL_DATA_VOLUME_PRIMARY", valkeySentinelDataVolume + "-" + "primary");
env.put("REDIS_SENTINEL_DATA_VOLUME_SLAVE", redisSentinelDataVolume + "-" + "slave"); env.put("VALKEY_SENTINEL_DATA_VOLUME_REPLICA", valkeySentinelDataVolume + "-" + "replica");
env.put("REDIS_SENTINEL_DATA_VOLUME_SENTINEL", redisSentinelDataVolume + "-" + "sentinel"); env.put("VALKEY_SENTINEL_DATA_VOLUME_SENTINEL", valkeySentinelDataVolume + "-" + "sentinel");
} else { } else {
env.put("REDIS_DATA_VOLUME", redisDataVolume); env.put("VALKEY_DATA_VOLUME", valkeyDataVolume);
} }
dockerCompose.withEnv(env); dockerCompose.withEnv(env);
} }
private static File resolveRedisComposeVolumesFile() { private static File resolveValkeyComposeVolumesFile() {
if (IS_REDIS_CLUSTER) { if (IS_VALKEY_CLUSTER) {
return new File("./../../docker/docker-compose.redis-cluster.volumes.yml"); return new File("./../../docker/docker-compose.valkey-cluster.volumes.yml");
} }
if (IS_REDIS_SENTINEL) { if (IS_VALKEY_SENTINEL) {
return new File("./../../docker/docker-compose.redis-sentinel.volumes.yml"); return new File("./../../docker/docker-compose.valkey-sentinel.volumes.yml");
} }
return new File("./../../docker/docker-compose.redis.volumes.yml"); return new File("./../../docker/docker-compose.valkey.volumes.yml");
} }
private static File resolveRedisComposeFile() { private static File resolveValkeyComposeFile() {
if (IS_REDIS_CLUSTER) { if (IS_VALKEY_CLUSTER) {
return new File("./../../docker/docker-compose.redis-cluster.yml"); return new File("./../../docker/docker-compose.valkey-cluster.yml");
} }
if (IS_REDIS_SENTINEL) { if (IS_VALKEY_SENTINEL) {
return new File("./../../docker/docker-compose.redis-sentinel.yml"); return new File("./../../docker/docker-compose.valkey-sentinel.yml");
} }
return new File("./../../docker/docker-compose.redis.yml"); return new File("./../../docker/docker-compose.valkey.yml");
} }
public Map<String, String> getEnv() { public Map<String, String> getEnv() {
@ -200,27 +200,27 @@ public class ThingsBoardDbInstaller {
if (IS_HYBRID_MODE) { if (IS_HYBRID_MODE) {
additionalServices.append(" cassandra"); additionalServices.append(" cassandra");
} }
if (IS_REDIS_CLUSTER) { if (IS_VALKEY_CLUSTER) {
for (int i = 0; i < 6; i++) { for (int i = 0; i < 6; i++) {
additionalServices.append(" redis-node-").append(i); additionalServices.append(" valkey-node-").append(i);
dockerCompose.withCommand("volume create " + redisClusterDataVolume + '-' + i); dockerCompose.withCommand("volume create " + valkeyClusterDataVolume + '-' + i);
dockerCompose.invokeDocker(); dockerCompose.invokeDocker();
} }
} else if (IS_REDIS_SENTINEL) { } else if (IS_VALKEY_SENTINEL) {
additionalServices.append(" redis-master"); additionalServices.append(" valkey-primary");
dockerCompose.withCommand("volume create " + redisSentinelDataVolume + "-" + "master"); dockerCompose.withCommand("volume create " + valkeySentinelDataVolume + "-" + "primary");
dockerCompose.invokeDocker(); dockerCompose.invokeDocker();
additionalServices.append(" redis-slave"); additionalServices.append(" valkey-replica");
dockerCompose.withCommand("volume create " + redisSentinelDataVolume + '-' + "slave"); dockerCompose.withCommand("volume create " + valkeySentinelDataVolume + '-' + "replica");
dockerCompose.invokeDocker(); dockerCompose.invokeDocker();
additionalServices.append(" redis-sentinel"); additionalServices.append(" valkey-sentinel");
dockerCompose.withCommand("volume create " + redisSentinelDataVolume + '-' + "sentinel"); dockerCompose.withCommand("volume create " + valkeySentinelDataVolume + '-' + "sentinel");
dockerCompose.invokeDocker(); dockerCompose.invokeDocker();
} else { } else {
additionalServices.append(" redis"); additionalServices.append(" valkey");
dockerCompose.withCommand("volume create " + redisDataVolume); dockerCompose.withCommand("volume create " + valkeyDataVolume);
dockerCompose.invokeDocker(); dockerCompose.invokeDocker();
} }
@ -261,7 +261,7 @@ public class ThingsBoardDbInstaller {
.add(tbSnmpTransportLogVolume) .add(tbSnmpTransportLogVolume)
.add(tbVcExecutorLogVolume) .add(tbVcExecutorLogVolume)
.add(tbEdqsLogVolume) .add(tbEdqsLogVolume)
.add(resolveRedisComposeVolumeLog()); .add(resolveValkeyComposeVolumeLog());
if (IS_HYBRID_MODE) { if (IS_HYBRID_MODE) {
rmVolumesCommand.add(cassandraDataVolume); rmVolumesCommand.add(cassandraDataVolume);
@ -270,16 +270,16 @@ public class ThingsBoardDbInstaller {
dockerCompose.withCommand(rmVolumesCommand.toString()); dockerCompose.withCommand(rmVolumesCommand.toString());
} }
private String resolveRedisComposeVolumeLog() { private String resolveValkeyComposeVolumeLog() {
if (IS_REDIS_CLUSTER) { if (IS_VALKEY_CLUSTER) {
return IntStream.range(0, 6).mapToObj(i -> " " + redisClusterDataVolume + "-" + i).collect(Collectors.joining()); return IntStream.range(0, 6).mapToObj(i -> " " + valkeyClusterDataVolume + "-" + i).collect(Collectors.joining());
} }
if (IS_REDIS_SENTINEL) { if (IS_VALKEY_SENTINEL) {
return redisSentinelDataVolume + "-" + "master " + " " + return valkeySentinelDataVolume + "-" + "primary " + " " +
redisSentinelDataVolume + "-" + "slave" + " " + valkeySentinelDataVolume + "-" + "replica" + " " +
redisSentinelDataVolume + " " + "sentinel"; valkeySentinelDataVolume + " " + "sentinel";
} }
return redisDataVolume; return valkeyDataVolume;
} }
private void copyLogs(String volumeName, String targetDir) { private void copyLogs(String volumeName, String targetDir) {

View File

@ -17,11 +17,11 @@
version: '3.0' version: '3.0'
services: services:
redis: valkey:
volumes: volumes:
- redis-data:/bitnami/redis/data - valkey-data:/bitnami/valkey/data
volumes: volumes:
redis-data: valkey-data:
external: external:
name: ${REDIS_DATA_VOLUME} name: ${VALKEY_DATA_VOLUME}

View File

@ -17,114 +17,114 @@
version: '3.0' version: '3.0'
services: services:
# Redis standalone # Valkey standalone
# The latest version of Redis compatible with ThingsBoard is 7.2 # The latest version of Valkey compatible with ThingsBoard is 8.0
redis: valkey:
restart: always restart: always
image: bitnami/valkey:8.0 image: bitnami/valkey:8.0
environment: environment:
# ALLOW_EMPTY_PASSWORD is recommended only for development. # ALLOW_EMPTY_PASSWORD is recommended only for development.
- 'ALLOW_EMPTY_PASSWORD=yes' - 'ALLOW_EMPTY_PASSWORD=yes'
- 'VALKEY_TLS_ENABLED=yes' - 'VALKEY_TLS_ENABLED=yes'
- 'VALKEY_TLS_CERT_FILE=/redis/certs/redis.crt' - 'VALKEY_TLS_CERT_FILE=/valkey/certs/valkey.crt'
- 'VALKEY_TLS_KEY_FILE=/redis/certs/redis.key' - 'VALKEY_TLS_KEY_FILE=/valkey/certs/valkey.key'
- 'VALKEY_TLS_CA_FILE=/redis/certs/redisCA.crt' - 'VALKEY_TLS_CA_FILE=/valkey/certs/valkeyCA.crt'
- 'VALKEY_TLS_AUTH_CLIENTS=no' - 'VALKEY_TLS_AUTH_CLIENTS=no'
ports: ports:
- '6379:6379' - '6379:6379'
volumes: volumes:
- ./tb-node/redis-data:/bitnami/redis/data - ./tb-node/valkey-data:/bitnami/valkey/data
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
# ThingsBoard setup to use redis-standalone # ThingsBoard setup to use valkey-standalone
tb-core1: tb-core1:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-core2: tb-core2:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-rule-engine1: tb-rule-engine1:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-rule-engine2: tb-rule-engine2:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-mqtt-transport1: tb-mqtt-transport1:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-mqtt-transport2: tb-mqtt-transport2:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-http-transport1: tb-http-transport1:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-http-transport2: tb-http-transport2:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-coap-transport: tb-coap-transport:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-lwm2m-transport: tb-lwm2m-transport:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-snmp-transport: tb-snmp-transport:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-vc-executor1: tb-vc-executor1:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey
tb-vc-executor2: tb-vc-executor2:
env_file: env_file:
- cache-redis.env - cache-valkey.env
volumes: volumes:
- ./redis-certs:/redis/certs - ./valkey-certs:/valkey/certs
depends_on: depends_on:
- redis - valkey

View File

@ -1,28 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIE1TCCAr2gAwIBAgIUFdFLz/q0EosJc39HhIac9+XpyRkwDQYJKoZIhvcNAQEL
BQAwWTELMAkGA1UEBhMCdWExDTALBgNVBAgMBGt5aXYxDTALBgNVBAcMBGt5aXYx
CzAJBgNVBAoMAnRiMQswCQYDVQQLDAJ0YjESMBAGA1UEAwwJbG9jYWxob3N0MB4X
DTIzMDkwNDE1NTA0MVoXDTI0MDkwMzE1NTA0MVowYjELMAkGA1UEBhMCQ1IxEzAR
BgNVBAgMCkNoYW5kcmlsbGExEzARBgNVBAcMCkNoYW5kcmlsbGExEjAQBgNVBAMM
CUhPU1RfTkFNRTEVMBMGA1UECgwMTmV3IFJlcHVibGljMIIBIjANBgkqhkiG9w0B
AQEFAAOCAQ8AMIIBCgKCAQEA+ICaK/aSklkUIih3cl4k4RYJL8rLS68d5JVSxpCQ
8MwuAakdU+ptD0b6X4+CcNtR96UlcO3cR15GLLT6s29Kw4Ta5SME+yhuFLUIrWxA
/gJ/pkJGkq1vXYZzdUFjtMlF+VbIw+r2hhSkbTR1hV08iRlvflafS8JB/tznqTFy
QIXu08heRtxVaC6SMHLeHmZdgdJrSOulwg/ctcP6tki+ZU9v+TH71M3mTIOLzuSz
7sqnFMPgW7ER0Utc4fndRfz17LA1NZdSrN0Ch5IO+EZ9gf/25w8makbx7lZoZASm
sAd0Uyq9ZPC0ok+oJjeDwanl/Bo7CGEgdxaFYNKpnizyUQIDAQABo4GLMIGIMAsG
A1UdDwQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYIKwYBBQUHAwIwGgYDVR0R
BBMwEYIJbG9jYWxob3N0hwR/AAABMB0GA1UdDgQWBBRAIkMMxT30wZYoNQuDM7uT
qwb+VzAfBgNVHSMEGDAWgBSfpEhvBqWx6usjDlGx7lEx8Fl21DANBgkqhkiG9w0B
AQsFAAOCAgEAMeaZ5K0w2kPSqcZbzV4WwGShrhnSYdsA4dlZhAUNNxsoXX590Ppe
lla+vhFSdk/IwjFxLzmiau5+JlCySeOJv2AaG56JvBBU1Wl8LOk01a7qRctiKRth
AGFGKZoJ50h5W1A0NV7KwcGIkQdebAFPdMmkOd6Do98ZhkzYLRuAK3U0K4wNQJuf
gPt9XtIugRNQOwxolXAj81FfhjZ5CnoaCQYJBFyIenwg4uGjg+D0F9WtAlRq8ww+
XpWpVw8QgPDk+SVoGXUsBs+wMCDlGu4ozN2lIvG1N5n1q0qn39SUYOSBkEsdM+AS
Yu6LMP4J1SPOwT5UJN2jK7fAYBdChF39nV/xiatfUSy8rWUFQSwGv6JD3X0MAYfT
DyOiYdX8o+AnetjfBHHwVXDobh5d1GiC2DwoUNW7KoEdj5mmhDZKiB2S47/5J7El
UA9CevmmDvf/tN9itPrutSwcb7uwLYRsf7Gx3D3P/2+nQHUKyNcyQCNtgR7RKHBS
EjeedMgtKvrqsdPnk6Ygwj8EMh4owDIDcieqnPZAxhqJOJT2ZORdzyelmpv5aDGc
0XnnRHRInSUgQStfPa9ghOBpSXlhxL1EJFFik+yFOjH4GivhoynCb7zjW+MjlPDV
LAsnmMukBR95ZkpxMnRUEoLTEvTaxmg4Vr/mqXeQUKdU8A812Wrk2hc=
-----END CERTIFICATE-----

View File

@ -1,28 +0,0 @@
-----BEGIN PRIVATE KEY-----
MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQD4gJor9pKSWRQi
KHdyXiThFgkvystLrx3klVLGkJDwzC4BqR1T6m0PRvpfj4Jw21H3pSVw7dxHXkYs
tPqzb0rDhNrlIwT7KG4UtQitbED+An+mQkaSrW9dhnN1QWO0yUX5VsjD6vaGFKRt
NHWFXTyJGW9+Vp9LwkH+3OepMXJAhe7TyF5G3FVoLpIwct4eZl2B0mtI66XCD9y1
w/q2SL5lT2/5MfvUzeZMg4vO5LPuyqcUw+BbsRHRS1zh+d1F/PXssDU1l1Ks3QKH
kg74Rn2B//bnDyZqRvHuVmhkBKawB3RTKr1k8LSiT6gmN4PBqeX8GjsIYSB3FoVg
0qmeLPJRAgMBAAECggEAE6sCCMa8NQ8N0+JGCew/mP0Ifxra2kOi5wuWgJbCkfxn
C8SZyKF+Pj5M5LFUDqCdLS+J9hUtYQyqGzG7weXmEfF67bXG2CYMCGGHrUorHq+N
8NfABC3r6YgRrU8emBlyC1j+DNuU5WnO1cHYJ1UIzIUR2Pr8Ip/eX1CWmUKLm2WW
YvUGzvTG0mM0l9/Q8pcTndAxDuL90GG6TrxtQoy7Ir6dYxTVKHgOwa6RX86VrCkm
jl6Wu7Bvo2fnPvPVx8p1mgWNgtBbnc/VAYjeF7Yi7CETWHTxGM4iGtZNL8/xxlW7
sm2SmWEu72EupLYgytA9w+EptjbwWfcTaWbWUXTFHQKBgQD5nmYLVvZUR1oc9g2a
Q7XpFQ/jVvwedeKGolMbWTFrEhl1+D8lKN/S3SoRCOALOUJFUCU+L1snN3MsJ5Es
Gb0FLSH1LBBfuHqP+aHn/uGLMW8e7P9thh4DQ1tIzKE5xhh+JDJJqd15YJlsDy1F
0aKWyulS4o9XK5q86rs5QbI4MwKBgQD+2uXEAiFwEXq7pw2e8STrnt0jp09KU6b1
z/ykyArBdcVkrEudZ+jIrR/6rlSKK+SKQxtx8MG9M/Nm09KFRCAWblxHBwQ87ZnU
8tMAmPHrikLKk1dbbU3BQ3cZkIWMryCo4wzuxeT4mc2goTGNZpNZDpjqjCXbnCgP
T29aPHG3awKBgGFv8UlP4su3JnfTnC+xaprXO+J0G+oP/iKrzmEIif/Pity/0HZC
5Eu9RSRtIHeBHFtOE5uYhK5kOLLtpv9d9KjGm1DGqIWUz1LQEOEsXwIkg8nAnVw1
VBXV/xYFupGAwCLNIkwa4Hb2vCywJ+3vDNZr0nQmN+nA/Z/syLRq7pR9AoGBALqp
l3pd2SHdG5jP/VD57IHLRMs1YwTcikAmizQh9IbH/MEE1QlALya0buTLxM3C4kxG
ZJaqsSwkHdWltd64DAyB3oKDaB48JNzs0ZDxdNeA1/TJwEUNpNK12EjYKojlSDWK
v1Evjspq1EofZkzb4XZsE6JO7feQw2KbWsKr3NprAoGBAKSSAjDpncxb+9Pr0Lwa
AS7ATgMhot6+lbtZZV6egTGUVvtgd1LyE2ZJkE+5XJRu49X1lSJdDpFT66rG5eNV
+rYnDqXL8c0Z/j1L96z1UMY6DLPj3n+07zgLiNIrOR4UKP/+TGB9MHHFMEpYnij0
m/f6dg0Ujw6CW31Hq2QdJ9P7
-----END PRIVATE KEY-----

View File

@ -1,32 +0,0 @@
-----BEGIN CERTIFICATE-----
MIIFkzCCA3ugAwIBAgIUK9fjeDv+ESrdFSHMqsod5djzTh4wDQYJKoZIhvcNAQEL
BQAwWTELMAkGA1UEBhMCdWExDTALBgNVBAgMBGt5aXYxDTALBgNVBAcMBGt5aXYx
CzAJBgNVBAoMAnRiMQswCQYDVQQLDAJ0YjESMBAGA1UEAwwJbG9jYWxob3N0MB4X
DTIzMDkwNDE1MDUxN1oXDTMzMDkwMTE1MDUxN1owWTELMAkGA1UEBhMCdWExDTAL
BgNVBAgMBGt5aXYxDTALBgNVBAcMBGt5aXYxCzAJBgNVBAoMAnRiMQswCQYDVQQL
DAJ0YjESMBAGA1UEAwwJbG9jYWxob3N0MIICIjANBgkqhkiG9w0BAQEFAAOCAg8A
MIICCgKCAgEAsaxpM/OLfx0jNVHAiD4dmJ4t5vZQNINtaI/GgnXNv9iM3aDvbYr/
Cp8mJgkOvI9BZqDEcLscBv+H4mxCqS2IFBqJbtkYHExBgg7V13NRtJwqsWVz0rBG
V1SFou2JSzPkQ6IDxJI+AUW6DfsbCs3o6VRPbriMfY06rNagerG1osaD9yn/EsH9
BTdALravcvU8mxOghzWH54EzwDUA0mKUetgvgfqkzjDlqzXFnOsIinnDi0Ia3idF
RaBVs7bKokl0Zp1mdtvsEpG4lcmhDtNIogcmeH2LW2zEneHuDX2BGsN9CCwEGj3k
cftuxEck2mQVDoDgX1IpIUGBhIaAixj+UXh8RNSwU96GBwKbFNy/CXNj5+34DcL0
kBh7p77rcrzm6xEGpP/3YYPoRVBRAX64x4QqzqF5oj6Sf2NGKH9RILmLWdqmq/up
6cMYyzAEOr3nIQ/7OfkdvxOt0oUzeB7QPYbTvM9bCqe3XA+JH1pnLhgySPxdTeVe
nUExge8WPJmdTlH1McminFDiJruFRa069hbky/b5z8BjIBN5S3lC4PdEE9YmDSL1
u26HnRVwtqC32fkDNI1PT/4p2VaB+DmIxkFXrVUnV0TiyCyxu4jIgXhUiJRHgBn9
zwB7lEZUhMriOBGJqHa0H0TtnH8z/5GYmipeJZllmQbhI+sMyYBS/+cCAwEAAaNT
MFEwHQYDVR0OBBYEFJ+kSG8GpbHq6yMOUbHuUTHwWXbUMB8GA1UdIwQYMBaAFJ+k
SG8GpbHq6yMOUbHuUTHwWXbUMA8GA1UdEwEB/wQFMAMBAf8wDQYJKoZIhvcNAQEL
BQADggIBABCt/bx7/YbvR/0PE4nIzxVovPItR+oYcInRrbwT+VWvL22Su7rf71lc
1vlil4xjdVxSEi6s5KZ69PLJKKXukt1MBCUStDK1HKPPB1SAhtD6nuvkh7YL+2im
A5gmtg3KkD2ZD2mWCHAa8K7NEMah1XiMVMo+ByFNPQExqOk2i3+5kjBrlfElsm0Q
ixM++93T62gTibOjuO8uPP0NUcIHI+RcEalc1hJjFof4gWLnIulaeuUydXw7RhzE
HzeOeZiZWrvW2mjfiANMn27TV5K0dZoh/4+YLqkKn1bdQsYVIWxWx8jZ0Nj0yzMb
Ekkodny3F+BHqkSUb3whRWDKN82valnCSJFAKZFZzueAJgCjANTNdr7S7UUIxZyi
QKll59T4O1yhawRu/cZ6TQWzV7RWdTerFfIjHMwsohDUxlkoACJebLahsBG9IHGN
Tn+P2djY6CXBctbTXhRiYqeb79/TPU0EETv7/ilNHS/tssWcKWkFdai3yMzLvxeH
YTVPMzeAWW/PnQOwYTkgeaj7SIK5bbm5n/gpWk31R5gRWhgJc9FZSa9+oZWbWeYh
3XfsuCuTH+jSs0g+jJUx/cpIVrO38r2hSuhDPugmHgM6yEnKMubhChCPCyXjO0z9
brEMQ1T9r2sKOYuyNDhN/W9/QsTb/RO4Ug2lYlzRTdehqvimHspW
-----END CERTIFICATE-----

View File

@ -0,0 +1,9 @@
-----BEGIN CERTIFICATE-----
MIIBLTCB1AIUSQ2Ce8LOpzqOJhL2aXCTVrd45twwCgYIKoZIzj0EAwIwHDEaMBgG
A1UEAwwRVmFsa2V5IEVDIFJvb3QgQ0EwHhcNMjUwNTI4MDYxNTI5WhcNMjYwNTI4
MDYxNTI5WjAXMRUwEwYDVQQDDAx2YWxrZXkubG9jYWwwWTATBgcqhkjOPQIBBggq
hkjOPQMBBwNCAATSpimU25+2yIKGNwSQgPN2QaEcfWnj4c8PcTjeXg/1C2+fpMyl
jgknA64GUM2VeoVbG0mTkywlRU57+2yVLKYrMAoGCCqGSM49BAMCA0gAMEUCIDi0
ri1mBU64a8C0L/QZet0C/+HsbhItq40AmtZyEKWlAiEA8FJG51ZvncgYx8PCLGS7
WmBCqfnG58W4ga4M6YhEnYA=
-----END CERTIFICATE-----

View File

@ -0,0 +1,8 @@
-----BEGIN EC PARAMETERS-----
BggqhkjOPQMBBw==
-----END EC PARAMETERS-----
-----BEGIN EC PRIVATE KEY-----
MHcCAQEEIHsaG9ozysmDm7xv+d+i/vl7xJUHcgL93/9rvQfd3PWDoAoGCCqGSM49
AwEHoUQDQgAE0qYplNuftsiChjcEkIDzdkGhHH1p4+HPD3E43l4P9Qtvn6TMpY4J
JwOuBlDNlXqFWxtJk5MsJUVOe/tslSymKw==
-----END EC PRIVATE KEY-----

View File

@ -0,0 +1,11 @@
-----BEGIN CERTIFICATE-----
MIIBjDCCATOgAwIBAgIUd7nfNuCY22WidK3CdazyMQUzVrAwCgYIKoZIzj0EAwIw
HDEaMBgGA1UEAwwRVmFsa2V5IEVDIFJvb3QgQ0EwHhcNMjUwNTI4MDYxNTE4WhcN
MjcwNTI4MDYxNTE4WjAcMRowGAYDVQQDDBFWYWxrZXkgRUMgUm9vdCBDQTBZMBMG
ByqGSM49AgEGCCqGSM49AwEHA0IABA4DTobDPtQtjBxYR+szO6p/pen9JWYPuXww
AyYMDEvD5ue3itruuDz0td0BMvn5YO+t1d03VKFVGP1ZpB4XO7ujUzBRMB0GA1Ud
DgQWBBSwBnnqUCfMUoaq7adEANr614SLFDAfBgNVHSMEGDAWgBSwBnnqUCfMUoaq
7adEANr614SLFDAPBgNVHRMBAf8EBTADAQH/MAoGCCqGSM49BAMCA0cAMEQCIFCp
9xuuj8Z6iSozSA/3cIugBnQqUSMw9BrS+2Qr6v69AiBz2R+DGXZAKTkOzqgxBXjv
fcdX4LrBpLCn1Pw/IDD+Ug==
-----END CERTIFICATE-----