배포 아키텍처: 무중단 프로덕션 시스템

이 글에서는 자동 재시작과 무중단으로 웹사이트를 배포하고 운영하는 방법을 설명합니다.

문제: 수동 배포는 위험합니다

기존 배포 방식은 다음을 필요로 합니다:

  • 수동 서버 재시작: 다운타임 발생

  • 서비스 모니터링: 누군가가 충돌을 감시해야 함

  • 코드 업데이트: SSH 접속 및 수동 단계 필요

  • 롤백: 문제 발생 시 수동 처리

이 방식은 확장성이 없으며 업데이트 중 다운타임이 발생합니다.

해결책: Systemd를 통한 자동화 배포

우리는 애플리케이션을 관리하기 위해 systemd를 사용합니다(인프라 개요 참조):

  • 자동 재시작: 충돌 또는 코드 변경 시 자동 재시작

  • 무중단: 우아한 워커 재시작

  • 로깅: 중앙 집중식 로그 관리

  • 프로세스 관리: 워커 생명주기 처리

서버 인프라

프로덕션 서버

프로덕션 서버는 공개 웹사이트를 호스팅합니다:

  • 목적: 제품 카탈로그와 이커머스를 제공하는 공개 웹사이트

  • 모듈: "web"만

  • 환경: 프로덕션 (Gunicorn + systemd)

  • 접근: 공개 (로그인 불필요)

애플리케이션 서버

Gunicorn

Gunicorn은 프로덕션 웹 서버입니다:

  • 다중 워커: 여러 워커 프로세스

Systemd 통합

Systemd가 Gunicorn을 관리합니다:

  • 자동 시작: 서버 부팅 시

  • 자동 재시작: 충돌 또는 코드 변경 시

  • 로깅: Systemd 저널 통합

  • 프로세스 관리: 워커 생명주기

구성

환경 구성

구성은 환경별로 다릅니다:

  • 구성 파일: 환경별 설정

  • JSON 형식: 키-값 쌍

  • 환경 변수: 비밀값과 API 키

  • 모듈 활성화: 로드되는 기능 제어

정적 에셋

정적 에셋CloudFront CDN과 함께 S3에서 제공됩니다:

  • S3 버킷: 정적 파일을 위한 객체 저장소

  • CloudFront: 전역 에셋 전송을 위한 CDN

  • 캐싱: 정적 콘텐츠에 대한 긴 TTL

  • 버전 관리: 버전 번호를 통한 캐시 무효화

배포 프로세스

코드 배포

코드는 Git을 통해 배포되며 systemd가 애플리케이션 서비스를 관리합니다:

  1. 커밋 및 푸시: 변경사항을 Git 저장소에 푸시
  2. 서버에서 풀: 코드를 프로덕션 서버로 풀
  3. Systemd 재시작: 충돌 시 서비스 자동 재시작

구성 배포

구성은 코드와 별도로 관리됩니다:

  1. 구성 파일: Git의 JSON 구성 파일
  2. 환경 변수: 환경에서 로드되는 비밀값
  3. 모듈 활성화: 로드되는 기능 제어

모니터링

헬스 체크

헬스 엔드포인트가 서버 상태를 모니터링합니다:

  • 헬스 엔드포인트: 기본 헬스 체크

  • 데이터베이스 체크: 데이터베이스 연결성

  • 캐시 체크: 캐시 연결성

로깅

로그는 여러 위치에 저장됩니다:

  • Gunicorn 오류 로그: 애플리케이션 오류

  • Gunicorn 접근 로그: HTTP 요청

  • 서비스 로그: Systemd 저널

요약

배포 아키텍처는 다음을 제공합니다:

  • Gunicorn: 프로덕션 WSGI 서버

  • Systemd: 자동 재시작 및 프로세스 관리

  • Git 배포: 코드 및 구성 관리

  • S3 + CloudFront: 정적 에셋 전송

  • 헬스 모니터링: 헬스 체크 엔드포인트

  • 로깅: 오류 및 접근 로그