배포 환경 변수 주입은 어떻게 풀어낼까?
·
Infra
1. 개요배포 환경에서는 DB 계정, JWT 시크릿 같은 민감한 데이터와 CORS 허용 도메인 같은 환경별 값이 필요하다.값을 코드에 하드코딩하면 유출 리스크가 커지고, 환경(dev/stage/prod)별로 빌드 아티팩트를 다시 만들어야 한다.값을 서버에 수동으로 입력하면 휴먼 에러가 늘고, 멀티 서버 환경에서는 서버마다 값이 달라지는 사고가 난다.또, 컨테이너가 재기동되면 값이 사라지거나(임시 export), 운영자가 기억에 의존하는 문제가 생긴다.배포 자동화가 있는 경우에도 어디에서 어떤 파일/변수로 주입되는지가 불명확하면 장애 시 원인 파악이 어렵다.즉, 배포 환경변수 주입은 운영에서 재현 불가/복구 지연/보안 유출로 이어지는 중요한 문제다. 이제 어떤 방식들로 해결할 수 있는지 알아보자. 2. 해..
무중단 배포 & 로드밸런싱 전략 적용
·
Infra
왜 무중단 배포를 구현했나 기존에는 배포 시 서버를 재시작하는 중단 배포 방식으로 배포를 진행했다.이 방식은 구현이 간단하지만 배포 시 서비스 중단 발생, 이로 인한 사용자 경험 저하와 같은 문제가 발생한다.특히 현재 개발하고 있는 실시간 채팅 서비스의 경우 연결이 끊기는 것이 치명적이었다.내가 사용자라고 생각해봤을 때 배포할때마다 서비스가 중단된다면 다른 서비스를 찾아볼 것 같다 생각했다. 그래서 '다운타임 없이 배포하는 무중단 배포'를 우선적으로 구현해보기로 했다. 로드밸런싱을 적용한 이유메시지 브로커 기반 아키텍처에서는 다수의 서버 인스턴스가 메시지를 처리할 때, 각 인스턴스가 메시지를 경쟁적으로 소비할지(경쟁 소비 모델), 또는 메시지를 분산 처리할지(팬아웃 모델)에 대한 설계가 중요하다. 하지..
SonarQube + Jenkins + GitHub CI/CD 연동기
·
Infra
1. 소나큐브(SonarQube)란?소나큐브는 정적 코드 분석 플랫폼이다. 쉽게 말해 코드를 직접 실행하지 않고도 잠재적인 버그, 보안 취약점, 중복 코드를 찾아내어 기술 부채를 관리해준다. 요즘 인텔리제이같은 IDE에서도 잘 관리해주는 기능아니야? 라고 생각할 수 있지만 소나큐브는 사용자의 요구에 맞게 규칙을 커스터마이징하고 이를 팀원들과 공유해 협업 시 일관된 코드 품질을 유지하고, 품질이 기준 미달일 경우 배포를 막는데 강력한 역할을 한다. 정적 분석 결과를 볼 수 있는 분석 보고서를 생성(SonarScanner)하고 CI/CD와 통합되면 코드 변경사항을 자동으로 분석하고 기준에 따라 릴리즈를 진행/취소(Quality Gate)를 통해 클린코드를 지향한다. 바이브 코딩의 비율이 증가하여 기술부채가 ..
Jenkins와 Docker Compose를 이용한 Spring Boot CI/CD 구축기(feat. 홈서버)
·
Infra
1. 개요AWS EC2의 프리티어는 메모리가 1GB 정도로 빌드하기엔 어려운 환경이었다. 마침 집에 사용하고 있던 홈서버용 미니pc가 있었기에 무거운 업무는 미니pc에서, docker 이미지만 AWS에 띄워 안정적으로 서비스하는 배포 전략을 계획했다. 인프라 구성: AWS EC2 (Amazon Linux 2023), 홈서버 미니pc(linux ubuntu 24.04.3 LTS)JDK 환경: Java 21.0.9CI/CD 도구: Jenkins (Docker 환경)배포 방식: Docker Compose를 활용한 멀티 컨테이너 배포 (Spring Boot, MySQL, Jenkins 등)네트워크 전략: Cloudflare Tunnel을 활용해 포트 포워딩 없이 보안성이 강화된 외부 접속 허용 파이프라인 시나..
N8N 홈서버 구축 회고(2) - 도커 설정 및 트러블 슈팅
·
Infra
홈서버 터미널에서 전체적인 파일 구조를 파악하거나 대량의 코드를 수정하기엔 생산성이 떨어져 vscode를 설치하기로 결정.code-server를 도커로 띄우고, Cloudflare Tunnel을 통해 포트 개방 없이 안전하게 연결할 것이다. 우선 도커를 설치 및 실행한다. 터미널에 아래와 같이 입력한다.# 1. 시스템 업데이트 및 Docker 설치sudo yum update -ysudo yum install -y docker# 2. Docker 서비스 시작 및 자동 실행 설정sudo systemctl start dockersudo systemctl enable docker# 3. 사용자 권한 부여sudo usermod -aG docker $USER# 4. Docker Compose 설치 (플러그인 방식)..
도커 컨테이너 다루기
·
Infra/Docker
도커 컨테이너의 생애주기도커 컨테이너는 실행 중, 정지, 파기 3가지 상태를 갖는다. 실행 중 상태docker container run 명령으로 Dockerfile에 포함된 인스트럭션에 정의된 애플리케이션(컨테이너)을 최초 실행한 시점의 상태는 실행 중이다.실행이 끝나면 정지 상태가 된다. 정지 상태컨테이너를 정지시키면 디스크에 종료 시점의 상태가 저장돼 남는다.그러므로 정지시킨 컨테이너를 다시 실행할 수 있다. 파기 상태정지 상태의 컨테이너는 파기하지 않는 이상 디스크에 그대로 남아있다.컨테이너를 자주 생성하고 정지해야 한다면 디스크를 차지하는 용량이 늘어나므로 불필요한 컨테이너를 파기하는 것이 좋다.다만 한 번 파기한 컨테이너는 다시 실행할 수 없다. docker container run - 컨테이너..
도커 이미지 다루기
·
Infra/Docker
도커 명령은 크게 이미지에 대한 명령과 컨테이너에 대한 명령 두가지로 나뉜다. 도커 이미지 다루기도커 이미지는 빌드할 때마다 다시 생성되는데, 내용의 해시값을 이미지 ID로 삼기 때문에 내용이 바뀌면 이미지 ID도 새 값이 부여된다. 도움말옵션에 대한 도움말docker help이미지 하위 옵션에 대한 도움말docker image --help docker image build - 이미지 빌드docker image build는 Dockerfile에 기술된 구성을 따라 도커 이미지를 생성하는 명령이다.docker image build -t 이미지명[:태그명] Dockerfile의_경로-t 옵션은 이미지명과 태그명을 붙이는 것으로 필수적으로 사용된다. 예를 들어 Dockerfile이 현재 작업 디렉터리에 있다면..
컨테이너로 애플리케이션 실행하기
·
Infra/Docker
컨테이너로 애플리케이션 실행하기image 받아오기docker image pull 이미지명[:태그명] // ex) docker image pull gihyodocker/echo:latest컨테이너 실행컨테이너 실행을 하려면 docker에 이미지가 존재해야한다.예시는 -p [호스트포트:컨테이너포트]를 통해 포트포워딩을 수행한다.docker container run [옵션] 이미지명 [:태그명] // ex) docker container run -t -p 9000:8080 gihyodocker/echo:latest -d 옵션을 붙여 백그라운드로 컨테이너를 실행할 수도 있다.네트워크 주소 접근curl http://localhost:9000/컨테이너 정지docker stop 컨테이너명컨테이너 삭제컨테이너를 삭제하..