본문으로 건너뛰기
Enclave

리버스 프록시와 HTTPS로 공개하기

인증서를 갖춘 nginx 한 대로 공개 도메인을 메인 앱에 리버스 프록시하면 공개 완료. 자주 틀리는 세 가지: WebSocket에는 Upgrade 헤더 필수, CORS와 공개 주소 env 두 개 수정, X-Admin-Secret 헤더는 명시적으로 통과시키기.

  1. 1.메인 앱 도메인 리버스 프록시

    443 포트에 SSL 인증서를 설정한 뒤 location /을 메인 앱(Docker 모드는 http://127.0.0.1:80, 베어메탈은 http://127.0.0.1:5180)으로 프록시합니다. 핵심 세 줄: proxy_http_version 1.1, proxy_set_header Upgrade $http_upgrade, proxy_set_header Connection "upgrade" — 하나라도 빠지면 /socket.io의 WebSocket 업그레이드가 400으로 실패합니다. 프런트엔드 컨테이너/템플릿이 이미 /api를 백엔드로 전달하므로 이 바깥 계층에서 API 라우팅을 따로 나눌 필요는 없습니다.

  2. 2.env 두 개 수정 후 api 재시작

    새 도메인을 api/.env의 CORS_ALLOWED_ORIGINS에 추가하고(쉼표 구분), PUBLIC_API_BASE_URL을 메인 앱의 공개 루트 주소(예: https://app.your-domain.com, /api 없이)로 변경합니다. 변경 후 api를 재시작해야 적용됩니다.

  3. 3.운영 엔드포인트 보호

    /admin/*은 메인 앱과 같은 백엔드를 사용합니다. 공개 인터넷에서 운영 엔드포인트를 호출하려면 ADMIN_SECRET 무차별 대입을 막기 위해 IP 허용 목록이나 Basic 인증을 추가하세요. 또한 프록시가 커스텀 헤더를 명시적으로 통과시키는지 확인하세요: proxy_set_header X-Admin-Secret $http_x_admin_secret; (일부 프록시는 비표준 헤더를 기본적으로 걸러냅니다).

문제 해결: 프런트엔드에서 Failed to fetch

브라우저 devtools의 Network 탭에서 요청을 확인하세요: /api 요청이 text/html로 돌아왔다면 nginx가 /api를 백엔드로 전달하지 않아 SPA 폴백에 걸린 것이고, CORS 거부라면 CORS_ALLOWED_ORIGINS에 현재 접속 중인 도메인이 빠져 있는 것입니다.

문제 해결: WebSocket 400

/socket.io/ location에는 Upgrade / Connection 헤더를 명시하고 proxy_http_version 1.1을 지정해야 합니다 — 하나라도 빠지면 400이 됩니다. 프록시가 여러 층이면 모든 층에 필요합니다.

관련 질문

  • Enclave를 셀프 호스팅할 수 있나요? 어렵나요?
    가능하며, 난이도는 일반적인 web 서비스를 운영하는 것과 비슷합니다. docker compose를 사용해 봤다면 세 단계로 자신의 인스턴스를 가질 수 있습니다: 저장소 클론, .env 복사, docker compose up. API·프런트엔드·데이터베이스·벡터 인덱스가 모두 내 서버에서 실행됩니다.

관련 콘텐츠

셀프 호스팅 문서로 돌아가기
공유XTelegramLINEWeibo
리버스 프록시와 HTTPS로 공개하기 · Enclave