]> git.immae.eu Git - github/Chocobozzz/PeerTube.git/commitdiff
feat(server): add redis sentinel support (#5593)
authorkontrollanten <6680299+kontrollanten@users.noreply.github.com>
Wed, 10 May 2023 07:52:50 +0000 (09:52 +0200)
committerGitHub <noreply@github.com>
Wed, 10 May 2023 07:52:50 +0000 (09:52 +0200)
* feat(server): add redis sentinel support

closes #5141

* Styling

---------

Co-authored-by: Chocobozzz <me@florianbigard.com>
config/default.yaml
config/production.yaml.example
server/initializers/checker-before-init.ts
server/initializers/config.ts
server/lib/redis.ts

index 14bb8d060be5f0f6d4eec89f36d78bb727675323..5d0eab4f53f198ab39c98fef0078d2b76670fbcb 100644 (file)
@@ -65,8 +65,15 @@ database:
 redis:
   hostname: 'localhost'
   port: 6379
-  auth: null
+  auth: null # Used by both standalone and sentinel
   db: 0
+  sentinel:
+    enabled: false
+    enable_tls: false
+    master_name: ''
+    sentinels:
+      - hostname: ''
+        port: 26379
 
 # SMTP server to send emails
 smtp:
index db9c18cb833c16f63984248efb76c7b6dffc8864..5514f1af65bab62179047d136496d2db99aff022 100644 (file)
@@ -63,8 +63,15 @@ database:
 redis:
   hostname: 'localhost'
   port: 6379
-  auth: null
+  auth: null # Used by both standalone and sentinel
   db: 0
+  sentinel:
+    enabled: false
+    enable_tls: false
+    master_name: ''
+    sentinels:
+      - hostname: ''
+        port: 26379
 
 # SMTP server to send emails
 smtp:
index 2f5a274e44428c36118f8de6038934fde563b185..0a315ea70c7327d0dbf144c1a7272af4426c0db2 100644 (file)
@@ -84,7 +84,8 @@ function checkMissedConfig () {
   const requiredAlternatives = [
     [ // set
       [ 'redis.hostname', 'redis.port' ], // alternative
-      [ 'redis.socket' ]
+      [ 'redis.socket' ],
+      [ 'redis.sentinel.master_name', 'redis.sentinel.sentinels[0].hostname', 'redis.sentinel.sentinels[0].port' ]
     ]
   ]
   const miss: string[] = []
index 9c270568953490480b99488fcaade2cd146df4b7..51ac5d0ce04a7cf190acd23d42ff8b747902610d 100644 (file)
@@ -39,7 +39,13 @@ const CONFIG = {
     PORT: config.has('redis.port') ? config.get<number>('redis.port') : null,
     SOCKET: config.has('redis.socket') ? config.get<string>('redis.socket') : null,
     AUTH: config.has('redis.auth') ? config.get<string>('redis.auth') : null,
-    DB: config.has('redis.db') ? config.get<number>('redis.db') : null
+    DB: config.has('redis.db') ? config.get<number>('redis.db') : null,
+    SENTINEL: {
+      ENABLED: config.has('redis.sentinel.enabled') ? config.get<boolean>('redis.sentinel.enabled') : false,
+      ENABLE_TLS: config.has('redis.sentinel.enable_tls') ? config.get<boolean>('redis.sentinel.enable_tls') : false,
+      SENTINELS: config.has('redis.sentinel.sentinels') ? config.get<{ hostname: string, port: number }[]>('redis.sentinel.sentinels') : [],
+      MASTER_NAME: config.has('redis.sentinel.master_name') ? config.get<string>('redis.sentinel.master_name') : null
+    }
   },
   SMTP: {
     TRANSPORT: config.has('smtp.transport') ? config.get<string>('smtp.transport') : 'smtp',
index 3706d22282b7b27c7a9cbc1da12da2c05723dd56..8430b2227cfad5a3f7d52ffb88bdbe9a889acfe5 100644 (file)
@@ -32,7 +32,8 @@ class Redis {
     if (this.initialized === true) return
     this.initialized = true
 
-    logger.info('Connecting to redis...')
+    const redisMode = CONFIG.REDIS.SENTINEL.ENABLED ? 'sentinel' : 'standalone'
+    logger.info('Connecting to redis ' + redisMode + '...')
 
     this.client = new IoRedis(Redis.getRedisClientOptions('', { enableAutoPipelining: true }))
     this.client.on('error', err => logger.error('Redis failed to connect', { err }))
@@ -56,10 +57,25 @@ class Redis {
     this.prefix = 'redis-' + WEBSERVER.HOST + '-'
   }
 
-  static getRedisClientOptions (connectionName?: string, options: RedisOptions = {}): RedisOptions {
+  static getRedisClientOptions (name?: string, options: RedisOptions = {}): RedisOptions {
+    const connectionName = [ 'PeerTube', name ].join('')
+    const connectTimeout = 20000 // Could be slow since node use sync call to compile PeerTube
+
+    if (CONFIG.REDIS.SENTINEL.ENABLED) {
+      return {
+        connectionName,
+        connectTimeout,
+        enableTLSForSentinelMode: CONFIG.REDIS.SENTINEL.ENABLE_TLS,
+        sentinelPassword: CONFIG.REDIS.AUTH,
+        sentinels: CONFIG.REDIS.SENTINEL.SENTINELS,
+        name: CONFIG.REDIS.SENTINEL.MASTER_NAME,
+        ...options
+      }
+    }
+
     return {
-      connectionName: [ 'PeerTube', connectionName ].join(''),
-      connectTimeout: 20000, // Could be slow since node use sync call to compile PeerTube
+      connectionName,
+      connectTimeout,
       password: CONFIG.REDIS.AUTH,
       db: CONFIG.REDIS.DB,
       host: CONFIG.REDIS.HOSTNAME,