Node-redis: NOAUTH ๋น„๋ฐ€๋ฒˆํ˜ธ๊ฐ€ ์„ค์ •๋˜์–ด ์žˆ์–ด๋„ ์ธ์ฆ ํ•„์š” ์˜ค๋ฅ˜

์— ๋งŒ๋“  2018๋…„ 06์›” 29์ผ  ยท  18์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: NodeRedis/node-redis

  • ๋ฒ„์ „ : ๋…ธ๋“œ Redis 2.8.0 / Redis 4.0.9
  • ํ”Œ๋žซํผ : Heroku-16 ์Šคํƒ์˜ NodeJS 8.11.3
  • ์„ค๋ช… : redis์— ์—ฐ๊ฒฐํ•˜๊ณ  ์•”ํ˜ธ๊ฐ€ ์žˆ๋Š” ๋‹ค์Œ ์˜ต์…˜ ๊ฐœ์ฒด๋ฅผ ์ „๋‹ฌํ•˜๊ณ  ์žˆ์ง€๋งŒ node_redis๋Š” ํ•ญ์ƒ NOAUTH ์˜ค๋ฅ˜๋ฅผ ๋ฐœ์ƒ์‹œํ‚ต๋‹ˆ๋‹ค.
options = {
   'auth_pass': nconf.get('redis_pass')[nodeEnv],
   'no_ready_check': true,
};

redis-cli ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ redis์— ์—ฐ๊ฒฐํ•˜๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€๋งŒ ์–ด๋–ค ์ด์œ ๋กœ ์ธํ•ด ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

29 Jun 2018 11:06:14.626136 <190>1 2018-06-29T18:06:14.346750+00:00 app web.1 - - ReplyError: NOAUTH Authentication required
    at new Command (/app/node_modules/redis/lib/command.js:12:22)
    at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
    at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
    at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
    at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
    at Object.onceWrapper (events.js:313:30)
    at emitNone (events.js:111:20)
    at Socket.emit (events.js:208:7)
    at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1173:10)Exception

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

๋‚˜๋Š” ๋˜ํ•œ ์—ฌ๊ธฐ์—์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ReplyError: NOAUTH Authentication required.

๋ฒ„์ „ : ๋…ธ๋“œ Redis 3.0.0 / Redis 5.0.8

๋ชจ๋“  18 ๋Œ“๊ธ€

options ๊ฐœ์ฒด๋งŒ์œผ๋กœ๋Š” ๊ตฌ๋ถ„ํ•˜๊ธฐ ์–ด๋ ต์ง€๋งŒ ์ด๊ฒƒ์€ ๊ฝค ํ‘œ์ค€์ ์ด๊ณ  ์ข‹์€ ๊ฒƒ์œผ๋กœ ์•Œ๋ ค์ ธ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ž˜๋ชป๋œ redis ์„œ๋ฒ„์— ์—ฐ๊ฒฐํ•˜๊ณ  ์žˆ๊ฑฐ๋‚˜ nconf.get('redis_pass')[nodeEnv] ๊ฐ€ ์ž˜๋ชป๋œ ๋น„๋ฐ€๋ฒˆํ˜ธ(๋˜๋Š” ์ •์˜๋˜์ง€ ์•Š์€)๋ฅผ ์ œ๊ณตํ•˜๊ณ  ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋” ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์•ˆ๋…•ํ•˜์„ธ์š”, ์ €๋„ ๊ฐ™์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ์•”ํ˜ธ๋ฅผ ์ผ๋ฐ˜ ํ…์ŠคํŠธ๋กœ ์ „๋‹ฌํ–ˆ๋Š”๋ฐ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์‚ฌ์‹ค ๋‹ค์Œ ์ฝ”๋“œ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด ๊ธฐ๋ณธ redis.conf ํŒŒ์ผ์—์„œ requirepass ๋ผ์ธ์˜ ์ฃผ์„ ์ฒ˜๋ฆฌ๋งŒ ์ œ๊ฑฐํ•ฉ๋‹ˆ๋‹ค.

# use a very strong password otherwise it will be very easy to break.
#
requirepass foobared

# Command renaming.

ํ…Œ์ŠคํŠธ๋ฅผ ์œ„ํ•ด ๋กœ์ปฌ ์ปดํ“จํ„ฐ์—์„œ ์ด ๊ตฌ์„ฑ์„ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

events.js:160
      throw er; // Unhandled 'error' event
      ^
ReplyError: Ready check failed: NOAUTH Authentication required.
    at parseError (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis/node_modules/redis-parser/lib/parser.js:193:12)
    at parseType (/home/mauricio/Documents/lisapp/pos_lisa/node_modules/redis/node_modules/redis-parser/lib/parser.js:303:14)

๋‹ค์Œ์€ ๋‚ด nodejs ์„œ๋ฒ„์— ์ ์šฉํ•œ ์ฝ”๋“œ์ž…๋‹ˆ๋‹ค.

const redisPassword = "foobared" ; 
const ClientRedisApi = redis.createClient({
          host : '127.0.0.1',  
          no_ready_check: true,
          auth_pass: redisPassword,                                                                                                                                                           
});                               

ClientRedisApi.on('connect', () => {   
          global.console.log("connected");
})                              

ClientRedisApi.on('error', err => {       
          global.console.log(err.message)
})                             

ClientRedisApi.set("foo", 'bar');         

ClientRedisApi.get("foo", function (err, reply) {
        global.console.log(reply.toString())
})

์žฌ๋ฏธ์žˆ๋Š” ์ ์€ ์„œ๋ฒ„๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ "foo" ํ‚ค๊ฐ€ "bar" ๊ฐ’์œผ๋กœ redis ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ์ €์žฅ๋˜์ง€๋งŒ ์•ฑ์ด ์ถฉ๋Œํ•˜๊ณ  ์ƒํ˜ธ ์ž‘์šฉํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ฌด ๊ฒƒ๋„ ํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์—ฌ๊ธฐ ์žˆ๋Š” ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ. Linux ์ž„์˜ ์•”ํ˜ธ ์ƒ์„ฑ๊ธฐ์—์„œ ์ƒ์„ฑ๋œ ๊ธด ์•”ํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ์•”ํ˜ธ๋ฅผ ํ›จ์”ฌ ๋” ์งง์€ ๊ฒƒ์œผ๋กœ ๋ณ€๊ฒฝํ–ˆ์„ ๋•Œ ๋ชจ๋“  ๊ฒƒ์ด ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด Node.JS ํŒจํ‚ค์ง€ ์ž์ฒด์— ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. redis-cli ์— ๋“ค์–ด๊ฐ€์„œ auth ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ฉด ๊ธด ์•”ํ˜ธ ๊ฐ€ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚ด๊ฐ€ ์‚ฌ์šฉํ•œ ๋ฉ”์†Œ๋“œ ๋ณ€ํ˜•(์˜ˆ: ์ „์ฒด URL ๋˜๋Š” ์˜ต์…˜ ๋ธ”๋ก์˜ "auth_pass"/"password" ๋˜๋Š” redisClient.auth( ) ๋ฐฉ๋ฒ• - ๊ธด ์•”ํ˜ธ๋กœ ๋ชจ๋‘ ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค).

์•ˆ๋…•ํ•˜์„ธ์š” @roschler๋‹˜ , ์ฝ”๋“œ๋ฅผ ์ œ๊ณตํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ์‚ฌ์‹ค์€ ๊ท€ํ•˜์˜ ์ œ์•ˆ์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ '123'๊ณผ ๊ฐ™์€ ๋น„๋ฐ€๋ฒˆํ˜ธ๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š์•„๋„ ์—ฌ์ „ํžˆ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ฌธ์„œ์— ์žˆ๋Š” ๋ชจ๋“  ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ•˜๊ณ  ๋‹ค๋ฅธ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‹น์‹ ์„ ๊ท€์ฐฎ๊ฒŒ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์ง€๋งŒ ์‚ฌ์‹ค์€ ๋‚˜์—๊ฒŒ ๋‹ค๋ฅธ ์„ ํƒ์˜ ์—ฌ์ง€๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฏธ๋ฆฌ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

@maooricio ์ €๋Š” ์ด๊ฒƒ์ด ์„œ๋ฒ„ ๋˜๋Š” ์ž˜๋ชป๋œ ์„œ๋ฒ„์˜ ์ž˜๋ชป๋œ ๊ตฌ์„ฑ์ด๋ผ๊ณ  99.999% ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. 2018๋…„ 10์›”์˜ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ๋ฌด์ž‘์œ„๋กœ ์ƒ์„ฑ๋œ ํ‚ค๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  redis-cli ์—์„œ MONITOR๋กœ ์—์ฝ”๋ฅผ ์‹œ๋„ํ•ฉ๋‹ˆ๋‹ค.

@roschler ๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(์ธ์šฉ?)

๋‚˜๋Š” ์—ฌ์ „ํžˆ์ด ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. redis db์— ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์„ ์‹œ๋„ํ–ˆ์ง€๋งŒ ์‚ฌ์šฉ์ž์— ๋Œ€ํ•œ ์•”ํ˜ธ ์ธ์ฆ์— ์‹คํŒจํ–ˆ์Šต๋‹ˆ๋‹ค.

@nicolasmatheus ๋‹น์‹ ์˜ ์˜ค๋ฅ˜๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๊ฐ™์€ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์„ค์ • ๋งค๊ฐœ๋ณ€์ˆ˜๊ฐ€ ์ •ํ™•ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” 3 ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ชจ๋‘ ์‹œ๋„ํ–ˆ์ง€๋งŒ ๋ชจ๋‘ ๋™์ผํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ์Šต๋‹ˆ๋‹ค.

      // First method
      const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST);
      client.auth(process.env.REDIS_PASSWORD);

      // Second method
      const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST, {
        password: process.env.REDIS_PASSWORD
      });

      // Third method
      const client = redis.createClient(uri)

NODE_DEBUG=redis ์„ค์ • ํ›„

[0] Sending auth to redis:6379 id 0
[0] Send redis:6379 id 0: *2
[0] $4
[0] auth
[0] $14
[0] mypassword
[0]
[0] Stream connected redis:6379 id 0
[0] Redis: CONNECTED // CUSTOM MESSAGE
[0] Checking server ready state...
[0] Send redis:6379 id 0: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 0
[0] Redis server ready.
[0] on_ready called redis:6379 id 0
[0] Redis: READY // CUSTOM MESSAGE
[0] Stream connected redis:6379 id 1
[0] Checking server ready state...
[0] Send redis:6379 id 1: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 1
[0]
[0] /app/node_modules/redis/lib/command.js:12
[0]         this.error = new Error();
[0]                      ^
[0] ReplyError: NOAUTH Authentication required.
[0]     at new Command (/app/node_modules/redis/lib/command.js:12:22)
[0]     at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
[0]     at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
[0]     at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
[0]     at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
[0]     at Object.onceWrapper (events.js:299:28)
[0]     at Socket.emit (events.js:215:7)
[0]     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1115:10)
[0] npm ERR! code ELIFECYCLE

๋„์ปค ์ž‘์„ฑ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค

  redis:
    container_name: redis
    image: redis:5.0.3-alpine
    restart: always
    env_file: .env
    command: ["redis-server", "--appendonly", "yes", "--requirepass", "${REDIS_PASSWORD}"]
    hostname: ${REDIS_HOST}
    volumes:
      - ~/.mydata/redis:/data
    ports:
      - ${REDIS_PORT}:6379
    networks:
      - my-network

cli redis-cli -h 127.0.0.1 -p 6379 -a 'mypassword' ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ redis์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@thellimist ํŠนํžˆ ๋‘ ๋ฒˆ์งธ ๋ฐฉ๋ฒ•์œผ๋กœ redis-cli ๋ฐ MONITOR ์—์„œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚˜๊ณ  ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค.

@stockholmux

export default class Cache {
   static client: any

   static init(): Promise<any> {
      if (Cache.client) {
        logger.error("Client already exists")
        return new Promise((resolve, reject) => { reject() });
      }

      const client = redis.createClient(process.env.REDIS_PORT, process.env.REDIS_HOST, {
        password: process.env.REDIS_PASSWORD
      });
      Cache.client = asyncRedis.decorate(client);
      Cache.client.monitor(function (err, res) {
        logger.info("Entering monitoring mode.");
      });
      Cache.client.set('foo', 'bar');

      Cache.client.on("ready", (e: any) => {
        logger.info(`ready ${e}`);
      });

      Cache.client.on("reconnecting", (e: any) => {
        logger.info(`reconnecting ${e}`);
      });

      Cache.client.on("end", (e: any) => {
        logger.info(`end ${e}`);
      });

      Cache.client.on("warning", (e: any) => {
        logger.info(`warning ${e}`);
      });

      Cache.client.on("monitor", (e: any, res: any) => {
        logger.error(`monitor err: ${e}`);
        logger.info(`monitor res: ${res}`);
      });

      Cache.client.on("connect", () => {
        logger.info("connected");
      });
      Cache.client.on("error", (e: any) => {
        logger.error(`Error: :${e}`);
      });

      return new Promise((resolve, reject) => { resolve() }
   }

await Cache.init() ์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์‘๋‹ต์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

[0] Sending auth to redis:6379 id 0
[0] Send redis:6379 id 0: *2
[0] $4
[0] auth
[0] $14
[0] mypassword
[0]
[0] Queueing monitor for next server connection.
[0] Queueing set for next server connection.
[0] Stream connected redis:6379 id 0
[0] 2019-12-17 06:49:48 error [server.ts]: connected
[0] Checking server ready state...
[0] Send redis:6379 id 0: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 0
[0] Redis server ready.
[0] on_ready called redis:6379 id 0
[0] Sending offline command: monitor
[0] Send redis:6379 id 0: *1
[0] $7
[0] monitor
[0]
[0] Sending offline command: set
[0] Send redis:6379 id 0: *3
[0] $3
[0] set
[0] $3
[0] foo
[0] $3
[0] bar
[0]
[0] 2019-12-17 06:49:48 info [server.ts]: ready undefined
[0] Net read redis:6379 id 0
[0] 2019-12-17 06:49:48 info [server.ts]: Entering monitoring mode.
[0] 2019-12-17 06:49:48 error [server.ts]: monitor err: 1576565388.385183
[0] 2019-12-17 06:49:48 info [server.ts]: monitor res: set,foo,bar
[0] Stream connected redis:6379 id 1
[0] Checking server ready state...
[0] Send redis:6379 id 1: *1
[0] $4
[0] info
[0]
[0] Net read redis:6379 id 1
[0]
[0] /app/node_modules/redis/lib/command.js:12
[0]         this.error = new Error();
[0]                      ^
[0] ReplyError: NOAUTH Authentication required.
[0]     at new Command (/app/node_modules/redis/lib/command.js:12:22)
[0]     at RedisClient.info (/app/node_modules/redis/lib/individualCommands.js:169:39)
[0]     at RedisClient.ready_check (/app/node_modules/redis/index.js:534:10)
[0]     at RedisClient.on_connect (/app/node_modules/redis/index.js:428:14)
[0]     at Socket.<anonymous> (/app/node_modules/redis/index.js:268:14)
[0]     at Object.onceWrapper (events.js:299:28)
[0]     at Socket.emit (events.js:215:7)
[0]     at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1115:10)

๋˜ํ•œ key/val "foo: bar"๊ฐ€ redis์— ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ์—๋Š” ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์—ฐ๊ฒฐํ•œ ๋‹ค์Œ ์–ด๋–ค ์ด์œ ๋กœ ๋‹ค์‹œ ์—ฐ๊ฒฐ์„ ์‹œ๋„ํ•˜์ง€๋งŒ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Express server.listen์—์„œ await Cache.init() ๋ฅผ ํ•œ ๋ฒˆ๋งŒ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

@thellimist ๋‚˜๋Š” ๋‹น์‹ ์ด ์ž˜๋ชป ์ดํ•ดํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ง„๋‹จํ•˜๋ ค๋ฉด MONITOR _from_ redis-cli ์„ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์œ„์™€ ๊ฐ™์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ๋‚ด์—์„œ ์‹คํ–‰ํ•˜๋ฉด ์ธ์ฆ์„ ์บก์ฒ˜ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ชจ๋‹ˆํ„ฐ ์ด์ „์— ๋ฐœ์ƒํ•˜๊ธฐ ๋•Œ๋ฌธ์—). ๋‚˜๋Š” ๋˜ํ•œ ์™„์ „ํžˆ ํ”Œ๋Ÿฌ์‹œ ๋œ DB์—์„œ ์‹คํ–‰ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์–ด์จŒ๋“ , ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด(์Šค๋‹ˆํŽซ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•จ) ์ฝ”๋“œ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ ์ ˆํ•œ ์•”ํ˜ธ ์—†์ด redis.createClient ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(๋‹ค๋ฅธ ๋ชจ๋“ˆ์ผ ์ˆ˜๋„ ์žˆ์Œ). ์žฌ์—ฐ๊ฒฐ์— ๋Œ€ํ•œ ๋””๋ฒ„๊ทธ ๋กœ๊ทธ๊ฐ€ ํ‘œ์‹œ๋˜์ง€ ์•Š๊ณ  id 1 ์— ๋‹ค๋ฅธ ๋„คํŠธ์›Œํฌ ์ŠคํŠธ๋ฆผ์—์„œ ์ž‘์—… ์ค‘์ด๋ผ๊ณ  ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

@stockholmux

๋ฌธ์ œ๋Š” ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ๊ฐ„๋‹จํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” typeorm ํŒจํ‚ค์ง€๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์—ˆ๊ณ  js/ts ํŒŒ์ผ์— ์—†๋Š” ๋‹ค๋ฅธ ๊ตฌ์„ฑ ํŒŒ์ผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. Node Redis ๋กœ๊ทธ๊ฐ€ ํ˜ธ์ถœ๋œ ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ์ง€ ์•Š์•„ ์ฐพ๊ธฐ๊ฐ€ ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”.

Docker๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ redis.conf์˜ ํŒŒ์ผ ๋„คํŠธ์›Œํฌ ์„ค์ •์„ ํŽธ์ง‘ํ•ฉ๋‹ˆ๋‹ค.

bind 0.0.0.0

๊ทธ๊ฒƒ์€ ๋‚˜๋ฅผ ์œ„ํ•ด ๊ทธ๊ฒƒ์„ ๊ณ ์ณค๋‹ค.

@mariothedev ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งค์šฐ ์กฐ์‹ฌํ•˜์‹ญ์‹œ์˜ค. ์ ์ ˆํ•œ ๋ฐฉํ™”๋ฒฝ์ด ์—†์œผ๋ฉด ํ•ด๋‹น bind ์„ค์ •์„ ์‚ฌ์šฉํ•˜์—ฌ redis๊ฐ€ ํ™œ์ง ์—ด๋ฆฝ๋‹ˆ๋‹ค.

@stockholmux - ์•Œ๋ ค์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค :)

๋‚˜๋Š” ๋˜ํ•œ ์—ฌ๊ธฐ์—์ด ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€: ReplyError: NOAUTH Authentication required.

๋ฒ„์ „ : ๋…ธ๋“œ Redis 3.0.0 / Redis 5.0.8

๊ฐ™์€ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ต์„ ์ฐพ๊ธฐ ์œ„ํ•ด ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์ฐพ์•˜์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ํ•ด๊ฒฐ์ฑ…์ด ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋Š” ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์ด ํ•˜๋‚˜ ๋” ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๊ณ  Redis ๊ธฐ๋ฐ˜ ๋Œ€๊ธฐ์—ด์ธ Bull ์„ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Œ์„ ๊ธฐ์–ตํ•˜๋Š” ๋ฐ ์ฐฝํ”ผํ•  ์ •๋„๋กœ ์˜ค๋žœ ์‹œ๊ฐ„์ด ๊ฑธ๋ ธ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์—ฐ๊ฒฐ ์ •๋ณด๋ฅผ ์ „๋‹ฌํ–ˆ์ง€๋งŒ Bull์— ๋Œ€ํ•ด ์žŠ์–ด๋ฒ„๋ ธ๊ณ  ์ฝ˜์†”์—์„œ ์ •ํ™•ํžˆ ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ Redis๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ™•์ธํ•ด์•ผ ํ•  ๋˜ ๋‹ค๋ฅธ ์‚ฌํ•ญ์€ ์•ฑ์˜ ๋‹ค๋ฅธ ํ•ญ๋ชฉ์ด Redis๋ฅผ ์‚ฌ์šฉ ์ค‘์ด๊ณ  ์ด๋Ÿฌํ•œ ์˜ค๋ฅ˜๋ฅผ ๋‹ค์‹œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ์—ฌ๋ถ€์ž…๋‹ˆ๋‹ค.

edit ์ด ์˜ค๋ฅ˜์˜ ์›์ธ์ด Bull์ธ ๊ฒฝ์šฐ auth_pass ๊ฐ€ ์•„๋‹Œ redis ์—ฐ๊ฒฐ ๊ฐœ์ฒด์—์„œ password ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰