# ============================================================================= # SOSO 서버 - 리버스 프록시 설정 (Caddy Web Server) # ============================================================================= # # 🌐 역할 및 목적: # 이 파일은 SOSO 프로젝트의 모든 외부 HTTP/HTTPS 트래픽을 처리하는 # 리버스 프록시 서버 설정입니다. Caddy 웹 서버를 사용하여 다음과 같은 # 핵심 기능들을 자동화하고 관리합니다. # # 🔧 주요 기능: # 1. 자동 HTTPS/SSL 인증서 관리 (Let's Encrypt) # - 도메인 인증서 자동 발급 및 갱신 # - 만료 전 자동 갱신으로 중단 없는 서비스 # - HTTPS 강제 적용으로 보안 강화 # # 2. HTTP → HTTPS 자동 리다이렉트 # - 모든 HTTP 요청을 HTTPS로 자동 전환 # - 영구 리다이렉트(301)로 SEO 최적화 # # 3. 경로 기반 라우팅 및 로드 밸런싱 # - URL 패턴에 따른 백엔드 서비스 분기 # - 마이크로서비스 아키텍처 지원 # - 무중단 서비스 업데이트 지원 # # 4. 보안 헤더 자동 추가 # - XSS 공격 방지 헤더 # - 클릭재킹 방지 헤더 # - MIME 타입 스니핑 방지 # - 서버 정보 숨김으로 보안 강화 # # 5. 성능 최적화 # - Gzip 압축으로 대역폭 절약 # - 정적 파일 캐싱으로 응답 속도 향상 # - Keep-Alive 연결 최적화 # # 6. 서비스 모니터링 및 헬스체크 # - API 서버 자동 헬스체크 # - 장애 서비스 자동 격리 # - 복구 시 자동 트래픽 재개 # # 🗺️ 라우팅 구조: # ┌─────────────────────────────────────────────────────────────────┐ # │ soso.dreampaste.com │ # ├─────────────────────────────────────────────────────────────────┤ # │ / → Jenkins 관리자 페이지 (임시) │ # │ /jenkins/* → Jenkins CI/CD 관리자 인터페이스 │ # │ /api/* → SOSO API 서버 (Spring Boot) │ # │ /swagger-ui/* → API 문서 (Swagger UI) │ # │ /actuator/* → Spring Boot Actuator (모니터링) │ # │ /docs/* → 기타 문서 │ # │ /v3/api-docs* → OpenAPI 3.0 스펙 │ # │ *.css, *.js, 이미지 → 정적 파일 (캐싱 적용) │ # └─────────────────────────────────────────────────────────────────┘ # # 🛡️ 보안 설정: # - Server 헤더 제거로 웹 서버 정보 숨김 # - X-Content-Type-Options: nosniff (MIME 스니핑 방지) # - X-Frame-Options: SAMEORIGIN (클릭재킹 방지) # - HTTPS 강제 적용으로 모든 통신 암호화 # - 자동 보안 헤더 추가로 웹 보안 강화 # # 🔄 서비스 의존성: # - Jenkins 컨테이너 (jenkins:8080) # - API 서버 컨테이너 (api:8080) # - MySQL 데이터베이스 (간접 의존성) # - Redis 캐시 서버 (간접 의존성) # # 📈 성능 및 모니터링: # - Gzip 압축으로 평균 60-80% 대역폭 절약 # - 정적 파일 24시간 브라우저 캐싱 # - API 서버 30초마다 헬스체크 # - 헬스체크 타임아웃 10초로 빠른 장애 감지 # ============================================================================= soso.dreampaste.com { # ================================================================= # 전역 압축 설정 # ================================================================= # 모든 응답에 대해 Gzip 압축을 적용하여 네트워크 대역폭을 절약합니다. # HTML, CSS, JavaScript, JSON 등의 텍스트 기반 콘텐츠를 압축하여 # 평균 60-80%의 크기 감소 효과를 얻습니다. encode gzip # ================================================================= # 기본 보안 헤더 설정 # ================================================================= # 웹 애플리케이션의 보안을 강화하기 위한 HTTP 헤더들을 설정합니다. header { # 서버 정보 숨김: 공격자가 서버 소프트웨어 정보를 알 수 없도록 함 -Server # MIME 타입 스니핑 방지: 브라우저가 Content-Type을 임의로 추측하지 못하도록 함 # XSS 공격 벡터 중 하나인 Content-Type 혼동 공격을 방지 X-Content-Type-Options "nosniff" # 클릭재킹 방지: 다른 사이트에서 iframe으로 포함되는 것을 제한 # SAMEORIGIN: 같은 도메인에서만 iframe 사용 허용 X-Frame-Options "SAMEORIGIN" } # ================================================================= # Jenkins CI/CD 관리자 패널 라우팅 # ================================================================= # Jenkins 웹 UI에 대한 접근을 처리합니다. # 개발팀이 빌드 파이프라인을 관리하고 모니터링할 수 있습니다. # /jenkins → /jenkins/ 영구 리다이렉트 (trailing slash 정규화) redir /jenkins /jenkins/ permanent # Jenkins 컨테이너로 프록시 (jenkins:8080) reverse_proxy /jenkins/* jenkins:8080 { # HTTPS 프로토콜 정보를 백엔드에 전달 # Jenkins가 올바른 리다이렉트 URL을 생성할 수 있도록 함 header_up X-Forwarded-Proto {scheme} } # ================================================================= # SOSO API 서버 라우팅 # ================================================================= # Spring Boot 기반의 메인 API 서버에 대한 요청을 처리합니다. # 모든 애플리케이션 로직과 데이터 처리가 이루어지는 핵심 서비스입니다. # 인증 관련 API reverse_proxy /auth/* api:8080 { header_up X-Forwarded-Proto {scheme} health_uri /actuator/health health_interval 30s health_timeout 10s } # 회원가입 API reverse_proxy /signup/* api:8080 { header_up X-Forwarded-Proto {scheme} } # 커뮤니티 API reverse_proxy /community/* api:8080 { header_up X-Forwarded-Proto {scheme} } # ================================================================= # API 문서 (Swagger UI) 라우팅 # ================================================================= # 개발자와 클라이언트가 API 스펙을 확인하고 테스트할 수 있는 # Swagger UI 인터페이스에 대한 접근을 처리합니다. # /swagger → /swagger-ui/index.html 영구 리다이렉트 redir /swagger /swagger-ui/index.html permanent redir /swagger/ /swagger-ui/index.html permanent # Swagger UI 정적 파일들 프록시 reverse_proxy /swagger-ui/* api:8080 # OpenAPI 3.0 스펙 JSON/YAML 파일 프록시 reverse_proxy /v3/api-docs* api:8080 # ================================================================= # 헬스체크 및 문서 엔드포인트 # ================================================================= # Spring Boot Actuator 모니터링 엔드포인트와 기타 문서 페이지를 # API 서버로 프록시합니다. # Spring Boot Actuator: 애플리케이션 메트릭, 헬스체크, 환경 정보 등 reverse_proxy /actuator/* api:8080 # 기타 문서 페이지 (개발자 가이드, API 가이드 등) reverse_proxy /docs/* api:8080 # ================================================================= # 정적 파일 캐싱 설정 # ================================================================= # CSS, JavaScript, 이미지 등의 정적 리소스에 대해 브라우저 캐싱을 # 적용하여 페이지 로딩 속도를 향상시킵니다. @static { # 캐싱 대상 파일 확장자 목록 # 웹 폰트, 스타일시트, 스크립트, 이미지 파일 등 path *.css *.js *.png *.jpg *.jpeg *.gif *.ico *.svg *.woff *.woff2 *.ttf *.eot } header @static { # 24시간(86400초) 동안 브라우저에서 캐시 유지 # 공개 캐시로 설정하여 프록시 서버에서도 캐시 가능 Cache-Control "public, max-age=86400" } # ================================================================= # 기본 라우팅 (루트 경로) # ================================================================= # 루트 경로(/)에 대한 기본 처리입니다. # 현재는 Jenkins 관리 페이지로 임시 리다이렉트하지만, # 향후 API가 완성되면 Swagger UI로 변경할 예정입니다. redir / /jenkins/ temporary # ================================================================= # 에러 처리 # ================================================================= # 백엔드 서비스가 응답하지 않거나 오류가 발생했을 때 # 사용자에게 보여줄 에러 페이지를 설정합니다. handle_errors { respond "서비스가 일시적으로 사용할 수 없습니다" {http.error.status_code} } } # ============================================================================= # HTTP → HTTPS 자동 리다이렉트 설정 # ============================================================================= # 보안상의 이유로 모든 HTTP 요청을 HTTPS로 영구 리다이렉트합니다. # 이는 다음과 같은 보안 이점을 제공합니다: # # 1. 데이터 암호화: 모든 통신이 TLS/SSL로 암호화됨 # 2. 중간자 공격 방지: 네트워크 스니핑 및 데이터 변조 방지 # 3. SEO 최적화: 검색 엔진이 HTTPS를 선호하므로 랭킹 향상 # 4. 브라우저 보안 기능: 최신 브라우저의 보안 기능 활용 가능 # # 301 영구 리다이렉트를 사용하여 검색 엔진과 브라우저가 앞으로 # 모든 요청을 HTTPS로 보내도록 유도합니다. # ============================================================================= http://soso.dreampaste.com { # 모든 HTTP 요청을 동일한 경로의 HTTPS URL로 영구 리다이렉트 # {uri} 변수를 사용하여 원본 요청 경로와 쿼리 스트링을 유지 redir https://soso.dreampaste.com{uri} permanent }