---
title: Docker Compose로 MCP 터널 배포하기
url: https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/deploy-compose
description: Docker Compose를 사용하여 VM에 MCP 터널 스택을 설치합니다.
---

<Note>
  MCP tunnels(MCP 터널)는 연구 프리뷰 단계입니다. 사용해 보려면 [액세스를 요청](https://claude.com/form/mcp-tunnels)하세요.
</Note>

이 가이드는 [터널 스택](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/concepts#components)을 단일 호스트에 강화된 컨테이너로 배포합니다. 가용성을 위해 동일한 구성을 여러 호스트에 복제할 수 있습니다.

## 시작하기 전에

다음이 필요합니다:

* **터널.** 프로그래매틱 액세스를 사용하는 경우, 터널 ID를 제공하지 않으면 [setup 컴포넌트](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/concepts#components)가 터널을 생성해 줍니다. 대신 기존 터널에 연결하려면 [Console에서 터널을 생성](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/console#create-a-tunnel)하고 터널 ID(`tnl_...`)를 기록해 두세요. 수동 프로비저닝은 항상 Console에서 생성한 터널에서 시작합니다.

* **호스트가 Tunnels API에 인증할 수 있는 방법.**

  * **프로그래매틱 액세스(권장).** setup 컴포넌트가 Workload Identity Federation을 통해 인증할 수 있도록 터널을 생성할 때 **Set up programmatic access**를 켜세요. setup 컴포넌트가 터널을 생성하도록 하는 경우에는 대신 Claude Console의 [Workload identity](https://platform.claude.com/settings/workload-identity-federation) 페이지(`platform.claude.com/settings/workload-identity-federation`)에서 직접 페더레이션 규칙을 생성하세요. 페더레이션 규칙 ID(`fdrl_...`)와 조직 ID를 기록해 두세요.
  * **수동.** 프로그래매틱 액세스를 건너뜁니다. [Console에서 터널 토큰을 가져오고](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/console#get-the-connection-details), CA와 서버 인증서를 직접 생성한 다음, [Console에 CA를 등록](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/console#add-a-ca-certificate)합니다.

* **Docker와 Docker Compose가 설치된 호스트.** 수동 흐름에는 `openssl`(1.1.1 이상)도 필요합니다.

* 호스트에서 `api.anthropic.com`(443 TCP) 및 [터널 엣지](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/concepts#components)(7844 TCP 및 UDP)로의 **아웃바운드 네트워크 연결.** 전체 [네트워크 요구 사항](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/overview#network-requirements)을 참조하세요.

* `routes` 아래에 구성할 주소에서 호스트가 접근할 수 있고 실행 중인 **하나 이상의 MCP 서버.** 아직 없다면 [샘플 서버를 사용](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/deploy-compose#optional-use-a-sample-mcp-server)하세요.

## 선택 사항: 샘플 MCP 서버 사용하기

테스트에 사용할 수 있는 MCP 서버가 없다면 다음의 최소 서버를 사용하세요:

```bash
mkdir -p mcp-tunnel
cat > mcp-tunnel/hello_server.py <<'EOF'
from mcp.server.fastmcp import FastMCP

mcp = FastMCP("hello-server", host="0.0.0.0", port=9000)


@mcp.tool()
def hello(name: str = "world") -> str:
    """Say hello to someone."""
    return f"Hello, {name}!"


if __name__ == "__main__":
    mcp.run(transport="streamable-http")
EOF
```

다음 설치 단계에서는 `mcp-tunnel/`로 `cd`하며, 해당 서비스와 라우트를 어디에 추가해야 하는지 안내합니다.

## 설치

이 가이드는 Docker Compose를 사용하는 하나의 참조 접근 방식을 제공합니다. 조직의 보안 요구 사항을 충족하도록 이를 조정하는 것은 사용자의 책임입니다.

<Tabs>
  <Tab title="프로그래매틱 액세스 사용">
    이 경로는 호스트에 OIDC ID 공급자(예: 클라우드 VM 메타데이터 서버 또는 SPIFFE)가 있어야 합니다. 없다면 대신 **프로그래매틱 액세스 미사용** 탭을 사용하세요.

    setup 컴포넌트는 Workload Identity Federation을 사용하여 터널 토큰을 가져오고, CA와 서버 인증서를 생성하며, Anthropic에 CA를 등록합니다.

    <Steps>
      <Step title="배포 디렉터리 준비">
        ```bash
        mkdir -p mcp-tunnel/{config,data}
        cd mcp-tunnel
        sudo chown 65532:65532 data
        ```

        컨테이너는 루트가 아닌 UID `65532`로 실행되며 `data/`에 대한 쓰기 권한이 필요합니다.
      </Step>

      <Step title="docker-compose.yaml 작성">
        compose 파일은 이미지를 SHA-256 다이제스트로 고정하고, 모든 컨테이너를 읽기 전용 파일 시스템과 함께 루트가 아닌 사용자로 실행하며, 모든 Linux capability를 제거하고, 권한 상승을 비활성화합니다.

        ```bash
        cat > docker-compose.yaml <<'EOF'
        services:
          setup:
            image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:efb27b299d627e4134815663cb8896641eeaee025d734c0f695582b4df38f013
            entrypoint: ["/setup"]
            command:
              - init
              - --api-url=https://api.anthropic.com
              - --output=dir:/data
              - --token-version=1
            environment:
              - TUNNEL_ID
              - ANTHROPIC_FEDERATION_RULE_ID
              - ANTHROPIC_ORGANIZATION_ID
              - ANTHROPIC_WORKSPACE_ID
              - ANTHROPIC_IDENTITY_TOKEN
            volumes:
              - ./data:/data
            user: "65532:65532"
            read_only: true
            security_opt:
              - no-new-privileges:true
            cap_drop:
              - ALL
            profiles: ["setup"]

          cloudflared:
            image: cloudflare/cloudflared@sha256:6b599ca3e974349ead3286d178da61d291961182ec3fe9c505e1dd02c8ac31b0
            command: tunnel --no-autoupdate run --url http://localhost:8080
            environment:
              - TUNNEL_TOKEN
            # 프록시의 netns를 공유하여 localhost:8080으로 접근할 수 있게 합니다.
            network_mode: "service:mcp-proxy"
            restart: unless-stopped
            user: "65532:65532"
            read_only: true
            security_opt:
              - no-new-privileges:true
            cap_drop:
              - ALL
            stop_grace_period: 30s
            logging:
              options:
                max-size: "10m"
                max-file: "3"

          mcp-proxy:
            image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:efb27b299d627e4134815663cb8896641eeaee025d734c0f695582b4df38f013
            volumes:
              - ./config/mcp-proxy.yaml:/etc/mcp-gateway/config.yaml:ro
              - ./data:/data:ro
            restart: unless-stopped
            user: "65532:65532"
            read_only: true
            security_opt:
              - no-new-privileges:true
            cap_drop:
              - ALL
            stop_grace_period: 30s
            logging:
              options:
                max-size: "10m"
                max-file: "3"
        EOF
        ```

        [샘플 MCP 서버](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/deploy-compose#optional-use-a-sample-mcp-server)를 사용하는 경우 서비스로 추가하세요:

        ```bash
        cat >> docker-compose.yaml <<'EOF'

          hello-mcp:
            image: python:3.13-slim
            working_dir: /app
            volumes:
              - ./hello_server.py:/app/hello_server.py:ro
            command: sh -c "pip install --quiet mcp && python hello_server.py"
            restart: unless-stopped
        EOF
        ```
      </Step>

      <Step title="터널 프로비저닝">
        식별자를 설정합니다. setup 컴포넌트가 터널을 생성하도록 하려면 `TUNNEL_ID`를 설정하지 않은 채로 두고, [Console](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/console#create-a-tunnel)의 기존 터널에 연결하려면 설정하세요:

        ```bash
        # export TUNNEL_ID=tnl_...   # 기존 터널에 연결하려면 설정하세요
        export ANTHROPIC_FEDERATION_RULE_ID=fdrl_...
        export ANTHROPIC_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000
        ```

        페더레이션 규칙이 조직의 기본 워크스페이스가 아닌 다른 워크스페이스로 범위가 지정되어 있다면 `ANTHROPIC_WORKSPACE_ID=wrkspc_...`도 설정하세요. 그렇지 않으면 setup 컴포넌트는 기본 워크스페이스를 사용합니다. 자동 생성된 터널은 해당 워크스페이스에 생성됩니다.

        `ANTHROPIC_IDENTITY_TOKEN`을 이 호스트의 ID 공급자가 발급한 OIDC JWT로 설정하세요. [공급자별 WIF 가이드](https://platform.claude.com/docs/ko/manage-claude/workload-identity-federation#identity-providers)를 따라 발급자를 등록하고, 규칙의 subject를 설정하고, 토큰을 발급하세요. 규칙의 audience는 토큰 발급 시 요청하는 audience와 일치해야 합니다.

        setup 컴포넌트를 실행합니다:

        ```bash
        docker compose run --rm setup
        ```

        `setup init`은 `data/`에 대해 멱등적입니다. 다시 실행하면 이미 저장된 터널 ID와 CA를 재사용하며 두 번째 터널을 절대 생성하지 않습니다. 새 CA는 `data/`가 비어 있거나 `TUNNEL_ID`가 변경된 경우에만 생성 및 등록됩니다. 이 경우 활성 인증서 두 개라는 상한이 적용되므로, 두 슬롯이 모두 채워져 있다면 먼저 Console에서 하나를 폐기하세요.

        오류가 발생하면 [Setup 컴포넌트 인증 실패](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/troubleshooting#setup-component-authentication-failures)를 참조하세요.

        터널 도메인을 조회하고 이후 단계를 위해 export하세요:

        ```bash
        export TUNNEL_DOMAIN=$(sudo cat data/tunnel-domain)
        echo "$TUNNEL_DOMAIN"
        ```

        <Note>
          Workload Identity Federation 토큰은 수명이 짧으며(기본 1시간) 자동으로 만료됩니다. setup이 완료된 후 폐기할 것은 없습니다.
        </Note>
      </Step>

      <Step title="프록시 구성 작성">
        `tunnel_domain`은 **필수**입니다. [프록시](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/concepts#components)는 `routes`에서 서브도메인을 조회하기 전에 들어오는 호스트 이름에서 도메인 접미사를 제거하는 데 이를 사용합니다. `routes`는 리스트가 아니라 서브도메인에서 업스트림 URL로의 평면 맵입니다.

        ```bash
        cat > config/mcp-proxy.yaml <<EOF
        listen_addr: ":8080"
        log_level: info
        shutdown_timeout: 30s
        tunnel_domain: ${TUNNEL_DOMAIN}
        tls:
          cert_file: /data/tls.crt
          key_file: /data/tls.key
        routes:
          echo: http://hello-mcp:9000
        EOF
        ```

        `echo:` 라우트는 [샘플 MCP 서버](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/deploy-compose#optional-use-a-sample-mcp-server)를 대상으로 합니다. 이를 자체 라우트로 교체하거나 추가하세요. 사용 가능한 모든 필드는 [프록시 구성](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/reference#proxy-configuration) 레퍼런스를 참조하세요.
      </Step>

      <Step title="배포 시작">
        ```bash
        export TUNNEL_TOKEN=$(sudo cat data/tunnel-token)
        docker compose up -d
        ```
      </Step>
    </Steps>
  </Tab>

  <Tab title="프로그래매틱 액세스 미사용">
    **Set up programmatic access**를 켜지 않았거나 로컬 개발 및 테스트용이라면 이 흐름을 사용하세요. `setup` 서비스는 없습니다.

    <Steps>
      <Step title="Console에서 터널 토큰과 도메인 가져오기">
        터널 상세 페이지에서 **Domain**(`abcd1234.tunnel.anthropic.com` 형식)을 복사한 다음, **Token** 옆의 눈 아이콘을 클릭하여 터널 토큰을 가져오고 복사 아이콘으로 복사하세요.

        가이드의 나머지 부분을 위해 둘 다 셸 변수로 설정하세요:

        ```bash
        export TUNNEL_DOMAIN=YOUR_TUNNEL_DOMAIN_HERE
        export TUNNEL_TOKEN='eyJ...'
        ```
      </Step>

      <Step title="스캐폴딩 및 인증서 생성">
        ```bash
        mkdir -p mcp-tunnel/{data,config}
        cd mcp-tunnel
        ```

        프록시는 `:8080`에서 일반 WebSocket으로 수신하며, [내부 TLS](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/concepts#components) 핸드셰이크는 이 인증서들을 사용하여 해당 WebSocket 스트림 **내부에서** 이루어집니다. Anthropic은 Console에 등록한 CA에 대해 내부 핸드셰이크를 검증합니다. 서버 인증서의 Subject Alternative Name(SAN)은 [인증서 요구 사항](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/reference#certificate-requirements)에 따라 `*.<tunnel-domain>`을 포함해야 합니다.

        ```bash
        # 자체 서명 CA. 배포판의 openssl.cnf 기본값과 관계없이 인증서
        # 요구 사항을 충족하도록 확장을 명시적으로 지정합니다.
        openssl req -x509 -newkey rsa:2048 -nodes \
          -keyout data/ca.key -out data/ca.crt \
          -days 3650 -subj "/CN=mcp-tunnel-ca" \
          -addext "basicConstraints=critical,CA:TRUE" \
          -addext "keyUsage=critical,keyCertSign,cRLSign" \
          -addext "subjectKeyIdentifier=hash"

        # 서버 인증서용 확장 파일. -extfile을 사용하면(OpenSSL 3.0+ 전용인
        # -copy_extensions 대신) OpenSSL 1.1.x에서도
        # 계속 동작합니다.
        cat > data/tls.ext <<EOF
        subjectAltName = DNS:${TUNNEL_DOMAIN},DNS:*.${TUNNEL_DOMAIN}
        authorityKeyIdentifier = keyid,issuer
        extendedKeyUsage = serverAuth
        EOF

        # CA가 서명한 서버 인증서
        openssl req -newkey rsa:2048 -nodes \
          -keyout data/tls.key -out /tmp/server.csr \
          -subj "/CN=${TUNNEL_DOMAIN}"
        openssl x509 -req -in /tmp/server.csr \
          -CA data/ca.crt -CAkey data/ca.key -CAcreateserial \
          -out data/tls.crt -days 90 \
          -extfile data/tls.ext

        # 루트가 아닌 프록시 컨테이너(UID 65532)가 바인드 마운트에서 키를
        # 읽을 수 있도록 허용합니다. 전체 읽기 비트가 없으면 컨테이너가
        # 호스트 소유 파일을 열 수 없습니다.
        chmod 644 data/tls.key
        ```
      </Step>

      <Step title="Console에 CA 인증서 등록">
        터널 상세 페이지에서 **Certificates** 섹션으로 스크롤하여 **Add certificate**를 클릭하세요. **Choose file**로 `data/ca.crt`를 직접 업로드하거나(모달은 `.pem`, `.crt`, `.cer`을 허용합니다) 내용을 붙여넣으세요:

        ```bash
        cat data/ca.crt
        ```

        인증서가 등록되면 터널 이름 옆의 **Needs certificate** 배지가 사라집니다. [CA 인증서 추가](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/console#add-a-ca-certificate)를 참조하세요.
      </Step>

      <Step title="프록시 구성 작성">
        `tunnel_domain`은 **필수**입니다. 프록시는 `routes`에서 서브도메인을 조회하기 전에 들어오는 호스트 이름에서 도메인 접미사를 제거하는 데 이를 사용합니다. `routes`는 리스트가 아니라 서브도메인에서 업스트림 URL로의 평면 맵입니다.

        ```bash
        cat > config/mcp-proxy.yaml <<EOF
        listen_addr: ":8080"
        log_level: info
        tunnel_domain: ${TUNNEL_DOMAIN}
        tls:
          cert_file: /data/tls.crt
          key_file: /data/tls.key
        routes:
          echo: http://hello-mcp:9000
        EOF
        ```

        `echo:` 라우트는 [샘플 MCP 서버](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/deploy-compose#optional-use-a-sample-mcp-server)를 대상으로 합니다. 이를 자체 라우트로 교체하거나 추가하세요. 사용 가능한 모든 필드는 [프록시 구성](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/reference#proxy-configuration) 레퍼런스를 참조하세요.
      </Step>

      <Step title="docker-compose.yaml 작성">
        `network_mode: "service:mcp-proxy"` 설정은 [cloudflared](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/concepts#components)를 프록시의 네트워크 네임스페이스에 배치하여 cloudflared 컨테이너 내부의 `localhost:8080`이 프록시에 도달하도록 합니다. `--url http://localhost:8080` 플래그는 cloudflared에 포워딩 대상을 지정합니다. 이 플래그가 없으면 cloudflared는 들어오는 요청에 대한 라우트가 없어 503을 반환합니다.

        ```bash
        cat > docker-compose.yaml <<'EOF'
        services:
          cloudflared:
            image: cloudflare/cloudflared@sha256:6b599ca3e974349ead3286d178da61d291961182ec3fe9c505e1dd02c8ac31b0
            # --url은 필수입니다: 수동 흐름에서는 ingress 규칙이 푸시되지 않으므로,
            # 이 옵션이 없으면 cloudflared가 모든 요청에 503을 반환합니다.
            command: tunnel --no-autoupdate run --url http://localhost:8080
            environment:
              - TUNNEL_TOKEN
            # localhost:8080이 프록시에 도달하도록 프록시의 netns를 공유합니다.
            network_mode: "service:mcp-proxy"
            restart: unless-stopped
            user: "65532:65532"
            read_only: true
            security_opt:
              - no-new-privileges:true
            cap_drop:
              - ALL
            stop_grace_period: 30s
            logging:
              options:
                max-size: "10m"
                max-file: "3"

          mcp-proxy:
            image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:efb27b299d627e4134815663cb8896641eeaee025d734c0f695582b4df38f013
            volumes:
              - ./config/mcp-proxy.yaml:/etc/mcp-gateway/config.yaml:ro
              - ./data:/data:ro
            restart: unless-stopped
            user: "65532:65532"
            read_only: true
            security_opt:
              - no-new-privileges:true
            cap_drop:
              - ALL
            stop_grace_period: 30s
            logging:
              options:
                max-size: "10m"
                max-file: "3"
        EOF
        ```

        [샘플 MCP 서버](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/deploy-compose#optional-use-a-sample-mcp-server)를 사용하는 경우 서비스로 추가하세요:

        ```bash
        cat >> docker-compose.yaml <<'EOF'

          hello-mcp:
            image: python:3.13-slim
            working_dir: /app
            volumes:
              - ./hello_server.py:/app/hello_server.py:ro
            command: sh -c "pip install --quiet mcp && python hello_server.py"
            restart: unless-stopped
        EOF
        ```
      </Step>

      <Step title="배포 시작">
        ```bash
        docker compose up -d
        ```
      </Step>
    </Steps>
  </Tab>
</Tabs>

compose 파일은 기본값 없이 호스트 환경에서 `TUNNEL_TOKEN`을 읽으므로, 새 셸을 열 때마다 그리고 재부팅 후에 export를 반복해야 합니다.

다중 VM 배포의 경우 `mcp-tunnel/` 디렉터리를 각 호스트에 복사하고, `TUNNEL_TOKEN`을 설정한 다음, `docker compose up -d`를 실행하세요. 프로그래매틱 흐름에서 `TUNNEL_TOKEN`은 `$(sudo cat data/tunnel-token)`이고, 수동 흐름에서는 Console에서 복사한 값입니다. 동일한 터널 토큰과 인증서가 모든 복제본에서 작동합니다.

## 배포 검증

Anthropic 측에서 [업스트림 MCP 서버](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/concepts#components)를 호출하여 엔드투엔드로 검증하세요. [터널링된 MCP 서버 사용하기](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/overview#use-the-tunneled-mcp-servers)를 참조하세요. [샘플 MCP 서버](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/deploy-compose#optional-use-a-sample-mcp-server)를 사용하는 경우 라우팅된 URL은 `https://echo.<your-tunnel-domain>/mcp`입니다. 검증에 실패하면 [문제 해결](https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/troubleshooting)을 참조하세요.

## 업그레이드

이 섹션의 명령은 `mcp-tunnel/` 배포 디렉터리 내부에서 실행하세요.

### 터널 토큰 교체

프로그래매틱 액세스를 사용하는 경우, `setup` 서비스 명령에서 `--token-version`을 증가시키고, Workload Identity Federation 식별자를 설정하고, 새 OIDC JWT를 발급한 다음, setup 컴포넌트를 다시 실행하세요:

```bash
# docker-compose.yaml 편집: setup 서비스의 --token-version 인수에 있는
# 정수를 증가시키세요(예: --token-version=1 에서
# --token-version=2 로). 값이 변경되지 않으면 setup 바이너리는
# 교체를 거부합니다.

# export TUNNEL_ID=tnl_...   # 설치 중에 설정한 경우에만 설정하세요
export ANTHROPIC_FEDERATION_RULE_ID=fdrl_...
export ANTHROPIC_ORGANIZATION_ID=00000000-0000-0000-0000-000000000000
# export ANTHROPIC_WORKSPACE_ID=wrkspc_...   # 규칙이 워크스페이스 범위인 경우
# 사용 환경에 맞는 WIF 공급자 가이드에 따라 ANTHROPIC_IDENTITY_TOKEN 을 다시 발급하세요
# (설치 이후 만료되었을 것입니다).
export ANTHROPIC_IDENTITY_TOKEN=...

docker compose run --rm setup

export TUNNEL_TOKEN=$(sudo cat data/tunnel-token)
docker compose up -d cloudflared
```

`--token-version` 인수는 명령줄에서 전달하는 대신 `docker-compose.yaml`에서 편집하므로, 새 값이 이후 setup 컴포넌트 실행에도 유지됩니다. setup 컴포넌트는 Workload Identity Federation으로 인증하므로 폐기할 API 토큰이 없습니다.

프로그래매틱 액세스를 사용하지 않는 경우, Console의 터널 상세 페이지에서 **Rotate token**을 클릭한 다음, 각 호스트에서 `TUNNEL_TOKEN` 환경 변수를 업데이트하고 cloudflared를 재시작하세요(`docker compose up -d cloudflared`).

<Warning>
  **Rotate token**을 클릭하면 현재 토큰이 즉시 무효화됩니다. 그 시점부터 모든 호스트에서 `TUNNEL_TOKEN`을 업데이트하고 cloudflared를 재시작할 때까지, cloudflared가 재시작되는(크래시, 호스트 재부팅) 호스트는 다시 연결할 수 없습니다. 교체 후 각 호스트를 신속하게 업데이트하세요.
</Warning>

### 인증서 갱신

만료를 모니터링하고 서버 인증서가 만료되기 전에 갱신하는 것은 사용자의 책임입니다.

프로그래매틱 액세스를 사용하는 경우:

```bash
docker compose run --rm setup renew-cert --output=dir:/data
```

CLI 인수는 `setup` 서비스의 `command`(`init` 인수)를 대체하지만 `entrypoint`는 유지하므로, 이는 `/setup renew-cert --output=dir:/data`를 실행합니다.

<Tip>
  `--renew-before=720h`를 전달하면 유효 기간이 30일 넘게 남아 있을 때 명령이 아무 작업도 하지 않습니다. 이렇게 하면 고정된 일정으로 안전하게 실행할 수 있습니다.
</Tip>

프로그래매틱 액세스를 사용하지 않는 경우, 기존 CA로 새 서버 인증서에 서명하고(Console에 등록된 CA는 변경되지 않습니다) `data/tls.crt`를 교체하세요. 새 셸에서 실행하는 경우 먼저 `TUNNEL_DOMAIN`을 설정하세요.

```bash
export TUNNEL_DOMAIN=YOUR_TUNNEL_DOMAIN_HERE
openssl req -new -key data/tls.key -out /tmp/server.csr \
  -subj "/CN=${TUNNEL_DOMAIN}"
openssl x509 -req -in /tmp/server.csr \
  -CA data/ca.crt -CAkey data/ca.key -CAcreateserial \
  -out data/tls.crt -days 90 \
  -extfile data/tls.ext
```

어느 흐름에서든 프록시는 `tls.cert_file`을 폴링하여 자동으로 다시 로드하므로 재시작이 필요하지 않습니다.

## 다음 단계

<CardGroup cols={2}>
  <Card title="터널링된 MCP 서버 사용하기" icon="link" href="https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/overview#use-the-tunneled-mcp-servers">
    업스트림 MCP 서버를 Managed Agent 또는 Messages API에 연결합니다.
  </Card>

  <Card title="보안" icon="lock" href="https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/security">
    강화 지침, 자격 증명 교체, 침해 대응.
  </Card>

  <Card title="문제 해결" icon="wrench" href="https://platform.claude.com/docs/ko/agents-and-tools/mcp-tunnels/troubleshooting">
    연결, TLS, 라우팅 문제를 진단합니다.
  </Card>
</CardGroup>
