-
Notifications
You must be signed in to change notification settings - Fork 1
feat(TS-59): 홈서버 구축 및 CI/CD 자동화 환경 구성 #91
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
- github secrets 설정을 쉽게 도와줄 script 파일 생성 - setup-ssh-key.sh로 github actions에 필요한 ssh key 생성 - set-github-secrets.sh로 github secrets 설정을 한번에 진행
- 최신 OpenSSH에서 보안상 이유로 rsa 키 유형을 제한하기 때문에 키 유형을 변경
- 기존에 모든 도커 리소스를 삭제하여 배포시 매번 새로 이미지를 다운로드하던 문제점 개선
- 이전에 놓쳤던 부분까지 모두 변경
- resources/config의 설정값을 develop 브랜치에서 가져오기 위해 GitHub Actions 워크플로우 수정 - private 서브모듈 접근을 위한 PAT 토큰 설정 추가
- 서브모듈 체크아웃 실패 해결을 위해 경로를 src/main/resources/config로 수정 - resources/config → src/main/resources/config
- git fetch 명령어 추가하여 원격 브랜치 정보 먼저 가져오도록 수정 - shallow clone으로 인한 브랜치 정보 부재 문제 해결
- git fetch origin develop:develop 명령어로 변경 - 로컬 develop 브랜치를 명시적으로 생성하며 fetch하도록 수정
- MariaDB 컨테이너 준비 상태 확인을 위한 헬스체크 추가
- Docker Buildx와 캐시 기능 추가로 이미지 빌드 속도 향상 - 로컬 빌드 대신 GitHub Container Registry 사용 - 필수 파일만 전송하도록 파일 전송 최소화 - 오래된 이미지와 볼륨의 정리 프로세스 개선 배포 프로세스를 GitHub Actions으로 이전하고 파일 전송을 최적화하여 전체 배포 시간을 크게 단축
- 백엔드 서비스를 GHCR의 미리 빌드된 이미지 사용하도록 변경 - 개발 환경 전용 볼륨 마운트 제거 운영 서버의 리소스 사용량을 줄이기 위한 설정 변경
- GitHub Actions에 패키지 쓰기 권한(packages: write) 추가 - 레포지토리 읽기 권한(contents: read) 명시적 설정 이미지를 GitHub Container Registry에 푸시할 수 있도록 필요한 최소한의 권한을 명시적으로 설정
- docker-compose.yml을 infra와 backend로 분리하여 인프라 서비스의 안정성을 높이고 불필요한 재시작을 방지 - MariaDB, Nginx → docker-compose.infra.yml (안정적 운영) - Backend → docker-compose.backend.yml (간단한 배포) - GitHub Actions workflow를 backend 전용 배포로 수정하여 배포 과정 단순화
- GitHub Container Registry 접근을 위해 github.token을 GH_PAT로 변경하여 권한 오류 해결
- 서버에서 이미지 pull 시 인증 오류 해결을 위해 docker login 단계 추가
- 라즈베리파이(ARM) 환경 지원을 위해 이미지 빌드 시 platforms 옵션 추가
- 서로 다른 docker compose 파일에서 같은 네트워크를 참조할 수 있도록 project name 옵션 설정
- 인프라와 백엔드 설정을 굳이 분리할 필요 없이 하나의 파일로 통합하여 네트워크 설정 문제 해결
- MariaDB 헬스체크 기반 의존성을 백엔드에 추가 - 백엔드 서비스 시작 조건 기반 의존성을 nginx에 추가 - 서비스 시작 순서 보장: MariaDB -> 백엔드 -> nginx
- 성능 향상을 위해 멀티플랫폼 빌드 설정(platforms) 제거 - 빌드 시간 단축
…-backend into docker-server
… into TS-59/feat/docker-server-setup
- getUsernameFromJWT() 메서드에서 validateToken() 호출부 제거 - 유효하지 않은 토큰의 경우 로깅 시 사용자명 "unknown" 으로 변경
무엇을: docker-compose up 명령어에 --build 플래그 추가 왜: PR 브랜치에서 develop 브랜치로 병합 시 코드 변경사항을 컨테이너에 즉시 반영하기 위해
…utorial-sejong/cr-backend into TS-59/feat/docker-server-setup
- nginx, mariadb를 arm64v8 버전으로 변경 - backend 컨테이너에 ARM64 플랫폼 명시 - 라즈베리파이3b ARM 아키텍처 호환성 확보
- ghcr.io에서 이미지를 직접 가져오는 방식이라 --build 옵션 제거 (로컬 Dockerfile 빌드가 아닌 레지스트리 pull 방식이므로 불필요) - 이미지 정보를 BACKEND_IMAGE 환경변수로 통합 - 중복된 GITHUB_REPOSITORY 환경변수 제거
매 배포마다 일주일 이상 된 미사용 이미지 정리하도록 변경
…utorial-sejong/cr-backend into TS-59/feat/docker-server-setup
| healthcheck: | ||
| test: ["CMD", "mariadb", "-h", "localhost", "-u${DB_USER}", "-p${DB_PASSWORD}", "-e", "SELECT 1"] | ||
| start_period: 30s | ||
| interval: 10s | ||
| timeout: 5s | ||
| retries: 5 |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
healthcheck라는 부분을 이번에 처음 알았습니다!
감사합니다.
| logger.warn(LogMessage.builder() | ||
| .action(LogAction.VALIDATE_TOKEN) | ||
| .subject("s" + username) | ||
| .subject("unknown") |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
확인했습니다!
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
실제 사용되는 sql 파일을 사용하면 좋을 것 같습니다!
📋 이슈 번호
TS-59
+) 커밋 내역 보다 files changed로 봐주시면 될 것 같습니다!
파일 중에 단순히 줄바꿈, 정렬만 바꾼 것은 백엔드 파일을 수정해서 도커 이미지 빌드를 처음부터 다시 시켜볼 목적으로 한 것입니다.
📌 개요
라즈베리파이를 활용한 홈서버를 구축하고 GitHub Actions를 통한 CI/CD 파이프라인을 구성했습니다. Docker 컨테이너를 통해 애플리케이션을 효율적으로 관리하고, 자동화된 배포 시스템을 구축하여 개발 생산성을 향상시켰습니다.
📄 주요 구현 내용
1. Docker 컨테이너 구성
MariaDB와 Spring Boot 연동 시 발생할 수 있는 타이밍 이슈를 해결했습니다. 단순
depends_on설정은 컨테이너 생성만을 감지하기 때문에, MariaDB가 완전히 초기화되기 전에 Spring Boot가 연결을 시도하는 문제가 있었습니다. 이를 해결하기 위해 MariaDB에 헬스체크를 도입하여 데이터베이스가 실제로 쿼리를 처리할 준비가 된 후에만 Spring Boot가 시작되도록 구성했습니다.NGINX는 리버스 프록시로 활용하여 외부 요청을 Spring Boot 애플리케이션으로 라우팅하도록 설정했습니다. Multi-stage 빌드를 통해 최종 이미지 크기를 최적화했으며, 각 컨테이너는 Docker network를 통해 안전하게 통신하도록 구성했습니다.
2. CI/CD 파이프라인 구축
GitHub Actions를 활용하여 코드 변경사항이 발생할 때마다 자동으로 빌드하고 배포하는 파이프라인을 구축했습니다. GitHub Container Registry를 활용하여 Docker 이미지를 관리하고, Gradle 캐시와 Docker Buildx를 통해 빌드 성능을 최적화했습니다.
라즈베리파이가 linux/arm64 기반인데 Github Actions에서 사용되는 ghcr(GitHub Container Registry)은 x86/amd64이라
x86/amd64 이미지를 ARM으로 크로스 컴파일하는 과정이 필요해 배포에 6-7분 정도 소요됩니다.(x86/amd64 기준으로 하면 1분대인데ㅠㅠ..)
현재 빌드 시간 단축을 위한 추가적인 최적화 방안을 검토 중입니다.
배포 과정에서는 SCP를 통해 필요한 설정 파일만을 전송하고(ghcr에서 백엔드 빌드가 끝났기 때문에 라즈베리파이에는 도커 관련 파일만 전송해주었습니다.), SSH를 통해 원격으로 백엔드 컨테이너를 재시작하도록 구성했습니다. 매 배포마다 일주일 이상 된 미사용 Docker 이미지를 자동으로 정리하여 디스크 공간을 효율적으로 관리합니다.
3. 보안 및 설정 자동화
SSH 키 생성과 GitHub Secrets 설정을 자동화하는 스크립트를 구현했습니다. ED25519 알고리즘을 사용하여 보안성을 강화했으며, 환경별로 설정을 분리하여 관리할 수 있도록 했습니다.
민감한 정보는 모두 환경 변수로 관리되며, GitHub Environments를 통해 환경별로 설정을 격리했습니다. 이를 통해 개발 환경과 운영 환경의 설정을 안전하게 분리하여 관리할 수 있습니다.