당신의 안식의 서버 Spring Boot 프로젝트를 자동 빌드하고, 미니PC에 자동 배포하는데 성공했다..!
많은 오류와 삽질이 있었기에 어떻게 해결했는지 기록하려고 한다.
일단 나는 Spring Boot 프로젝트를 GitHub Actions의 CI/CD 파이프라인을 통해 Docker 이미지로 빌드한 후, Docker Hub에 업로드하고, 미니 PC에서 해당 이미지를 pull하여 실행하는 방식으로 배포 로직을 구성했다.
👀 문제 상황
- GitHub Actions로 CI/CD 설정 완료
- Mini PC에 PostgreSQL 설치
- Spring Boot 앱은 Docker 컨테이너로 실행되도록 구성
이 상태에서 앱을 배포했더니, 다음과 같은 DB 연결 실패 오류가 발생했다.
CannotGetJdbcConnectionException: Failed to obtain JDBC Connection Caused by: java.net.SocketTimeoutException: Connect timed out
🤔 오류의 원인은 뭘까..
당연히 PostgreSQL 문제라고 생각했다! 그래서 다양한 방법을 시도했다.
PostgreSQL 방화벽 뚫기, 외부 접속 허용 설정 등등..
그리고 사실 IP 문제라고 생각하지 않았다. 그 이유는 Docker에서 내 미니PC의 IP로 접속해 PostgreSQL을 연결하는 원리라고 생각했기 때문에 내 미니 PC의 공인 IP로 설정했기 때문이다.
🙋♀️ 문제 해결
문제의 원인은 나의 짧은 네트워크 지식이었다.ㅎㅎ
사실 미니 PC는 내 와이파이 공유기를 통해 인터넷에 연결되어있다. 그래서 공유기 아래에 있는 기기들은 공유기에서 할당해주는 내부 IP를 사용한다는 점을 몰랐다...
Docker 컨테이너도 결국은 미니 PC 안에서 실행되는 프로세스이기 때문에, 컨테이너가 접근할 대상은 공인 IP가 아니다. 동일 네트워크 상의 내부 IP 인 것이다! 하지만 나는 그것도 모르고 외부에서 접속할 때 쓰는 공인 IP를 사용하고 있었다.😅
hostname -I
그래서 이 명령어로 내 내부 IP를 확인하고 다시 설정해주었더니 DB 연결에 성공한 것을 확인할 수 있었다.
📌 참고
참고로 나는 모든 API의 url에 앞에 /v2/를 붙여주도록 개발 환경에서 설정했다. properties.application에
server.servlet.context-path=/v2
이렇게 작성했지만, 미니 PC에 자동 배포 후에는 이를 사용할 수 없다. 왜냐면 properties.application의 정보는 모두 깃허브의 secret key로 등록했기 때문!
따라서 CI/CD 파이프라인에 작성해줘야한다.
구체적인 CI/CD 최종 배포 코드와 설계는 다음 포스팅에 기록할 것이라 참고만 하면 될 것같습니다!
'🙋♀️ Infra' 카테고리의 다른 글
| [미니 프로젝트] (3) - 미니 PC로 홈서버 구축하기 (0) | 2025.03.13 |
|---|---|
| [미니 프로젝트] (2) - 미니 PC로 홈서버 구축하기 (2) | 2025.03.04 |
| [미니 프로젝트] (1) - 미니 PC로 홈서버 구축하기 (0) | 2025.03.01 |