Docker部署NestJS+Redis出现NOAUTH认证要求错误的解决方法
解决NestJS容器化连接带密码的Redis出现NOAUTH错误的问题
问题场景
容器化部署NestJS应用与Redis服务后,使用BullModule连接Redis时抛出以下认证错误:
return new ReplyError(string) ^ ReplyError: NOAUTH Authentication required.
相关配置信息如下:
docker-compose.yml
services: my_app: build: context: . dockerfile: src/app/Dockerfile target: development command: npm run start:dev my_app env_file: - src/.env volumes: - .:/usr/src/app - /usr/src/app/node_modules networks: - default depends_on: - database - redis ports: - '80:3000' redis: image: redis restart: always command: /bin/sh -c "redis-server --requirepass $$REDIS_PASSWORD" env_file: - .env ports: - 6379:6379 environment: - ALLOW_EMPTY_PASSWORD=yes volumes: - ./redis/data:/data
.env文件
REDIS_PASSWORD=password REDIS_URI=redis://:${REDIS_PASSWORD}@redis:6379?authSource=0 # ---> REDIS_URI=redis://public:${REDIS_PASSWORD}@redis:6379?authSource=0
AppModule配置
BullModule.forRoot( { redis: { host: 'redis', port: 6379 } } ),
错误原因
Redis容器通过--requirepass $$REDIS_PASSWORD设置了访问密码,但NestJS的BullModule连接配置中未提供认证密码,导致Redis拒绝未授权的连接请求。
解决方法
方法1:在BullModule配置中添加密码字段
修改AppModule的BullModule配置,直接从环境变量读取Redis密码并配置:
BullModule.forRoot({ redis: { host: 'redis', port: 6379, password: process.env.REDIS_PASSWORD // 新增密码认证配置 } }),
注意:需确保NestJS应用能正确读取到REDIS_PASSWORD环境变量,检查my_app服务的env_file指向的文件中包含该变量。
方法2:使用REDIS_URI直接连接
利用.env中已配置的REDIS_URI(已包含完整认证信息),简化BullModule配置:
BullModule.forRoot({ redis: process.env.REDIS_URI }),
此方式无需单独配置host、port、password,URI已包含所有连接参数。
额外优化(可选)
Redis容器的ALLOW_EMPTY_PASSWORD=yes配置与--requirepass逻辑冲突(已设置密码,无需允许空密码),可删除该冗余配置:
redis: # ...保留其他配置 # 移除以下环境变量配置 # environment: # - ALLOW_EMPTY_PASSWORD=yes
内容的提问来源于stack exchange,提问作者DolDurma
相关产品推荐
相关产品推荐

