아니.. redis 비밀번호를 spring boot yml파일 속 비밀번호를 넣어도, 내가 따로 기록해둔 곳에 적힌 비밀번호를 넣어도 비밀번호가 옳지 않다고 뜬다..
내가 설정해둔 docker-compose.yml, application.yml, Dockerfile은 다음과 같았다.
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
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
.. 나머지 생략
# 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번은 간단히 이런 방법이 있다~ 정도로만 기록해둔다.
개인 프로젝트거나 아직 서버를 정식으로 배포하지 않았을 때 사용하면 좋을 것 같다.
docker stop redis
docker rm redis
redis:
image: "redis:alpine"
container_name: redis
command: redis-server --requirepass "새로운비밀번호"
ports:
- "6379:6379"
networks:
- app-network
docker-compose up -d redis
docker exec -it redis redis-cli
AUTH 새로운비밀번호
ping
새로운 비밀번호를 맞게 적용한 경우,
pong
pong을 확인할 수 있을 것이다.
[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
이렇게 백업 파일이 호스트에 저장된 것을 확인할 수 있다.
docker stop redis
docker rm redis
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
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했다..
[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"