# =============================================================================
# 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
}
