Redis 비밀번호를 잃어버렸을 때

tree·2024년 12월 17일
0

프로젝트

목록 보기
3/3

문제상황: redis 비밀번호 틀림

아니.. redis 비밀번호를 spring boot yml파일 속 비밀번호를 넣어도, 내가 따로 기록해둔 곳에 적힌 비밀번호를 넣어도 비밀번호가 옳지 않다고 뜬다..

내가 설정해둔 docker-compose.yml, application.yml, Dockerfile은 다음과 같았다.

1. docker-compose.yml

services:
  app:
    build: .
    container_name: java_app
    depends_on:
      - redis
    ports:
      - "8080:8080"
    networks:
      - app-network
    environment:
      - SPRING_DATASOURCE_URL= {datasource}
      - SPRING_DATASOURCE_USERNAME={db username}
      - SPRING_DATASOURCE_PASSWORD={db 비밀번호}
      - SPRING_REDIS_HOST=redis
      - SPRING_REDIS_PORT=6379
    volumes:
      - /var/log/hamilab:/var/log/{project}

  redis:
    image: "redis:alpine"
    container_name: redis
    ports:
      - "6379:6379"
    networks:
      - app-network


networks:
  app-network:
    driver: bridge

2. application.yml

spring:
  application:
    name: {project}

  datasource:
    url: jdbc:mariadb://{db url}?useUnicode=true&characterEncoding=utf-8
    driver-class-name: org.mariadb.jdbc.Driver
    username: {db username}
    password: {db 비밀번호}
    hikari:
      data-source-properties:
        characterEncoding: UTF-8
        useUnicode: true


  jpa:
    generate-ddl: true
    hibernate:
      ddl-auto: update
    show-sql: true
    properties:
      hibernate:
        dialect: org.hibernate.dialect.MariaDBDialect
        format_sql: true
  data:
    redis:
      host: {ec2 public IP}
      port: 6379
      password: {redis 비밀번호}

  cache:
    type: redis


.. 나머지 생략

3. Dockerfile

# Java 애플리케이션을 위한 Dockerfile
FROM openjdk:17-jdk-slim

# 작업 디렉토리 설정
WORKDIR /app

# 애플리케이션 JAR 파일 복사
COPY build/libs/{project}-0.0.1-SNAPSHOT.jar /app/{project}.jar

# 애플리케이션 실행
CMD ["java", "-jar", "/app/{project}.jar"]

application.yml에만 redis 비밀번호가 설정되어있었고, docker-compose.yml에는 비밀번호가 설정되어있지 않았다. 그리고 내가 아마 docker 컨테이너에서 redis를 업로드 한 뒤에 컨테이너 내부에서 비밀번호를 설정했던 것 같다... 어렴풋이 vm 열어서 주석 삭제하고 비밀번호를 활성화한 기억이 나는데.. 기록해둔게 없다!!! 흑흑..

나만 봐도 정말 비밀번호 초기화는 사용자에게 꼭 필요한 기능인 것 같다 ^^,,

아무튼 별도로 비밀번호를 적용해서 yml파일에 기록된 비밀번호와 같지 않다고 되는 것 같다... (아무리 그래도 다른 비밀번호로 적용하진 않았을 것 같은데.. 꽤나 억울하다..)

-> 참고로 application.yml, docker-compose.yml 등 현재 .env파일과 같은 별도로 저장해둔 것을 쓰지 않고 날것으로 쓰고 있는데 보안상 .env 파일이나 바로 저장해둔 것이나 어차피 ssh로 접근 가능하면 모두 다 볼 수 있는거 아닌가? 하는 생각에 .env파일은 생성하지 않았다. 그리고 ssh도 오직 나의 ip만 허용해놨다.

해결 방안

이렇게 비밀번호를 잃어버렸을 경우 크게 2가지가 있다.
1. redis 컨테이너 삭제 후 재 생성
2. Redis 백업 후 복원 (RDB 백업 파일 사용)

사실 내 서버에서 redis가 크게 중요한 부분을 차지하지 않아서 삭제후 재생성이 가장 간편하다. 그러나 항상 올라가있는 서버에 관련해서 함부로 삭제하지 않는 습관을 가지기 위해 2번으로 적용할 것이다.

1번은 간단히 이런 방법이 있다~ 정도로만 기록해둔다.
개인 프로젝트거나 아직 서버를 정식으로 배포하지 않았을 때 사용하면 좋을 것 같다.

1. redis 컨테이너 삭제 후 재 생성

redis 컨테이너 삭제

docker stop redis
docker rm redis

docker-compose.yml 수정: 비밀번호 설정

redis:
  image: "redis:alpine"
  container_name: redis
  command: redis-server --requirepass "새로운비밀번호"
  ports:
    - "6379:6379"
  networks:
    - app-network

redis 컨테이너 재생성

docker-compose up -d redis

비밀번호 재 확인

docker exec -it redis redis-cli
AUTH 새로운비밀번호
ping

새로운 비밀번호를 맞게 적용한 경우,

pong

pong을 확인할 수 있을 것이다.

2. Redis 백업 후 복원 (RDB 백업 파일 사용)

redis 데이터 파일 위치 확인

[ec2-user@ip-172-31-14-106 ~]$ docker exec -it redis sh
ls -al /data
/data # ls -al /data
total 4
drwxr-xr-x    2 redis    redis           22 Dec 17 07:47 .
drwxr-xr-x    1 root     root            18 Jul 29 08:39 ..
-rw-------    1 redis    redis          625 Dec 17 07:47 dump.rdb

백업 파일을 호스트에 저장

docker cp redis:/data/dump.rdb ./backup-dump.rdb


이렇게 백업 파일이 호스트에 저장된 것을 확인할 수 있다.

기존 redis 컨테이너 삭제

docker stop redis
docker rm redis

docker-compose.yml 수정

services:
  app:
    build: .
    container_name: java_app
    depends_on:
      - redis
    ports:
      - "8080:8080"
    networks:
      - app-network
    environment:
      - SPRING_DATASOURCE_URL={datasource}
      - SPRING_DATASOURCE_USERNAME={db username}
      - SPRING_DATASOURCE_PASSWORD={db 비밀번호}
      - SPRING_REDIS_HOST=redis
      - SPRING_REDIS_PORT=6379
      - SPRING_REDIS_PASSWORD=새로운비밀번호  # Redis 비밀번호 설정
    volumes:
      - /var/log/hamilab:/var/log/{project}

  redis:
    image: "redis:alpine"
    container_name: redis
    command: redis-server --requirepass "새로운비밀번호"   # Redis 비밀번호 설정
    ports:
      - "6379:6379"
    volumes:
      - ./backup-dump.rdb:/data/dump.rdb   # 백업된 RDB 파일 마운트
    networks:
      - app-network

networks:
  app-network:
    driver: bridge

수정된 yml을 통한 redis 컨테이너 실행

docker-compose up -d
[ec2-user@ip-172-31-14-106 {}]$ docker-compose up -d
[+] Running 1/2
 ✔ Container redis     Started                                                                                                                                                                               0.7s
 ⠸ Container java_app  Starting                                                                                                                                                                              0.9s
Error response from daemon: driver failed programming external connectivity on endpoint java_app (번호): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use

나는 현재 docker-compose.yml에 8080 포트 지정도 해놨기 때문에 에러가 난다.

무중단 배포를 중단하지 않는 선에서 하고싶기에 다음과 같이 했다.

docker-compose up -d redis

-> 그러나 이것은 나의 바람이었을 뿐,, 같은 네트워크 내에 두 컨테이너를 두기 위해서 다시 삭제하고 compose했다..

백업한 redis.rds로 기존 key 확인 가능

[ec2-user@ip-172-31-14-106 {}]$ docker-compose down
[+] Running 3/0
 ✔ Container java_app               Removed                                                                                                                                                                  0.0s
 ✔ Container redis                  Removed                                                                                                                                                                  0.0s
 ✔ Network {}_be_app-network  Removed                                                                                                                                                                  0.0s
[ec2-user@ip-172-31-14-106 {}]$ docker-compose up -d redis
[+] Running 2/2
 ✔ Network {}_be_app-network  Created                                                                                                                                                                  0.0s
 ✔ Container redis                  Started                                                                                                                                                                  0.4s
[ec2-user@ip-172-31-14-106 {}]$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS         PORTS                                       NAMES
35ed5cdcf6de   redis:alpine   "docker-entrypoint.s…"   10 seconds ago   Up 9 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp   redis
[ec2-user@ip-172-31-14-106 {}]$ docker cp /home/ec2-user/backup-dump.rdb redis:/data/dump.rdb
Successfully copied 2.56kB to redis:/data/dump.rdb
[ec2-user@ip-172-31-14-106 {}]$ docker restart redis
redis
[ec2-user@ip-172-31-14-106 {}]$ docker exec -it redis redis-cli
127.0.0.1:6379> ping
(error) NOAUTH Authentication required.
127.0.0.1:6379> AUTH "새로운 비밀번호"
OK
127.0.0.1:6379> ping
PONG
127.0.0.1:6379> keys *
1) "companies::company"
2) "invalid token: --@naver.com"
3) "a1"

0개의 댓글