> ## Documentation Index
> Fetch the complete documentation index at: https://docs.cloudtype.io/llms.txt
> Use this file to discover all available pages before exploring further.

# 배포하기

<video autoPlay muted loop playsInline className="w-full aspect-video" src="https://storage.googleapis.com/files.cloudtype.io/ale-docs/developers/images/ko/demo00.mp4" />

> 대시보드의 <Icon icon="circle-plus" iconType="solid" size={15} color="2396F1" /> 또는 `⌘ + K` 로 생성되는 배포창을 통해 배포과정이 시작됩니다.

<Tip>
  cloudtype 에서 제공하는 템플릿은 기본 모듈 및 라이브러리가 상이합니다. <Icon icon="windows" size={15} color="9fa3a5" /> Windows, <Icon icon="chrome" size={15} color="9fa3a5" /> Chrome 라이브러리처럼 기본으로 제공되지 않는 라이브러리를 사용하려는 경우, [Dockerfile](/ko/developers/dockerfile)을 작성해서 배포해야 합니다.
</Tip>

***

## 배포방식 선택

<AccordionGroup>
  <Accordion title="내 GitHub 저장소 배포하기">
    #### 배포할 저장소 선택

    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy01.png" />
    </Frame>

    > 배포창에서 **GitHub 저장소 배포하기**를 클릭한 후, OAuth 방식으로 연동된 GitHub 계정의 저장소를 선택하세요.

    #### 언어/프레임웍 선택

    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy02.png" />
    </Frame>

    > 배포할 저장소에 맞는 프리셋을 선택하세요.

    <Tip>
      React, vue 등과 같은 정적사이트의 경우 **Web Application**을 선택해주세요.
    </Tip>
  </Accordion>

  <Accordion title="Git URL로 배포하기">
    #### 배포키 등록

    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/git_private01.png" />
    </Frame>

    > 배포창에서 **Git URL로 배포하기**를 선택한 후, 배포하려는 저장소의 **SSH방식의 Git URL**을 입력하면 자동으로 생성된 **배포키(Deploy Key)** 를 조회할 수 있습니다.

    <Info>
      cloudtype은 **GitHub** 뿐만 아니라 **GitLab, Bitbucket** 등에 반영된 비공개 저장소의 코드도 배포할 수 있도록 SSH 방식의 인증을 지원합니다. 플랫폼 별 배포키 등록은 아래를 참고해주세요
    </Info>

    <AccordionGroup>
      <Accordion title="GitHub ">
        <Frame>
          <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/git_private02.png" />
        </Frame>

        > 배포하려는 저장소의 **Settings > Deploy keys** 화면 우측 상단의 `Add deploy key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
      </Accordion>

      <Accordion title="GitLab">
        <Frame>
          <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/git_private03.png" />
        </Frame>

        > 배포하려는 저장소의 **Settings > Repository** 화면에서 **Deploy keys** 항목의 `Expand`, `Add new key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
      </Accordion>

      <Accordion title="Bitbucket">
        <Frame>
          <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/git_private04.png" />
        </Frame>

        > 배포하려는 저장소의 **Repository settings > Access keys** 화면에서 `Add key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
      </Accordion>
    </AccordionGroup>

    #### 언어/프레임웍 선택

    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/git_private05.png" />
    </Frame>

    > 배포할 저장소에 맞는 프리셋을 선택하세요.

    <Tip>
      React, vue 등과 같은 정적사이트의 경우 **Web Application**을 선택해주세요.
    </Tip>
  </Accordion>

  <Accordion title="템플릿을 선택해서 배포하기">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy03.png" />
    </Frame>

    > 개발한 서비스에 적합한 템플릿을 선택한 후 연동된 GitHub 저장소 선택 또는 Git URL을 입력하세요.

    <Tip>
      React, vue 등과 같은 정적사이트의 경우 **Web Application**을 선택해주세요.
    </Tip>
  </Accordion>
</AccordionGroup>

## 배포 설정과 배포

> 배포할 저장소와 프리셋 또는 템플릿을 선택한 후, 배포에 관한 아래의 항목을 설정하고 배포하세요.

<AccordionGroup>
  <Accordion title="브랜치와 서브 디렉토리">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy04.png" />
    </Frame>

    > 저장소 선택 후 `설정` 버튼을 클릭하면 **브랜치와 서브 디렉토리**를 설정할 수 있는 필드가 표시됩니다. 하나의 저장소에 여러 개의 서비스를 별도의 폴더로 관리하는 경우처럼, **루트디렉토리가 아닌 하위 폴더에 배포할 서비스가 존재**하는 경우 **서브 디렉토리** 필드에 그 경로를 입력하세요.

    <Info>
      서브 디렉토리를 설정을 하지 않은 경우, 루트 디렉토리에서 배포가 실행됩니다.
    </Info>

    <Tip>
      더 자세한 내용은 [저장소 서브 디렉토리 설정 페이지](/ko/developers/subdir)를 참고하세요.
    </Tip>
  </Accordion>

  <Accordion title="버전">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy05.png" />
    </Frame>

    > 프리셋의 버전을 배포할 저장소에 맞게 선택하세요.

    <Warning>
      프로젝트 설정 파일(build.gradle, requirements.txt, package.json 등)에 명시된 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 또는 런타임 오류가 발생할 수 있습니다.
    </Warning>
  </Accordion>

  <Accordion title="환경 변수">
    <video autoPlay muted loop playsInline className="w-full aspect-video" src="https://storage.googleapis.com/files.cloudtype.io/ale-docs/developers/images/secret2_kr.mp4" />

    > 환경 변수는 다음 방식들을 조합하여 추가할 수 있습니다:

    * ENV 파일 Drag & Drop
    * (+) 아이콘으로 새로운 변수를 직접 입력
    * 열쇠 아이콘을 사용해 저장된 시크릿 중에서 선택

    <Info>
      환경변수 설정 및 시크릿 관리에 관한 자세한 내용은 [환경변수 관리 페이지](/ko/developers/env) 를 참고하세요.
    </Info>
  </Accordion>

  <Accordion title="포트 번호">
    > 포트번호는 소스 코드 혹은 환경변수의 설정과 일치해야 하며 정확하지 않은 포트번호를 입력하거나 공란으로 한 경우, 서비스가 정상적으로 작동하지 않을 수 있습니다.

    <Warning>
      포트번호는 기본값이 적용되지 않습니다. 포트설정에 관한 더 자세한 내용은 [포트 설정 페이지](/ko/developers/port) 를 참고하세요.
    </Warning>
  </Accordion>

  <Accordion title="Install, Build, Start Command">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy06.png" />
    </Frame>

    > 서비스의 라이프사이클 명령어를 설정하세요. 각 필드에는 기본 명령어가 표시되어 있으며, 프로젝트 설정에 맞게 변경할 수 있습니다

    * **Install Command**: 의존성 패키지 설치 명령어 (예: `npm install`, `pip install -r requirements.txt`)
    * **Build Command**: 애플리케이션 빌드 명령어 (예: `npm run build`, `gradle build`)
    * **Start Command**: 서비스 실행 명령어 (예: `npm start`, `python app.py`)

    <Info>
      필드값을 입력하지 않으면 placeholder에 표시된 기본값이 적용됩니다.
    </Info>
  </Accordion>

  <Accordion title="더 많은 옵션">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy07.png" />
    </Frame>

    > 추가로 설정값을 입력할 수 있는 필드가 표시됩니다.

    <Info>
      표시되는 필드는 템플릿 / 프리셋 별로 다르며, 주요 언어별 설정사항은 아래의 카드를 참고하세요.
    </Info>

    <CardGroup cols={4}>
      <Card title="springboot" icon="leaf" href="/ko/developers/springboot" horizontal />

      <Card title="node.js" icon="node" href="/ko/developers/node" horizontal />

      <Card title="Database" icon="database" href="/ko/developers/database" horizontal />

      <Card title="docker" icon="docker" href="/ko/developers/dockerfile" horizontal />
    </CardGroup>
  </Accordion>

  <Accordion title="성능(리소스) 설정과 배포">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy08.png" />
    </Frame>

    * **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택

    * **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용

    * **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정

    * **디스크** : 데이터베이스를 배포할 경우 표시되는 필드로, 데이터베이스가 차지할 디스크의 용량 설정

    * [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보

    * **배포** : `배포하기` 클릭

    <Warning>
      프리티어 플랜에서 구독 플랜(Hobby, Pro)으로 전환한 경우, 배포된 서비스에 구독 리소스가 자동으로 적용되지 않습니다. [프리티어 라벨이 붙은 서비스의 설정탭에서 구독 리소스를 적용한 후 다시 배포하면,](/ko/developers/resource#%EA%B5%AC%EB%8F%85-%EB%A6%AC%EC%86%8C%EC%8A%A4-%EC%A0%81%EC%9A%A9%ED%95%98%EA%B8%B0) 구독 리소스가 적용되어 서비스를 중단 없이 사용할 수 있습니다.
    </Warning>
  </Accordion>
</AccordionGroup>

<Info>
  표시되는 필드는 템플릿 / 프리셋 별로 다르며, 주요 언어별 설정사항은 아래의 카드를 참고하세요.
</Info>

<CardGroup cols={4}>
  <Card title="springboot" icon="leaf" href="/ko/developers/springboot" horizontal />

  <Card title="node.js" icon="node" href="/ko/developers/node" horizontal />

  <Card title="Database" icon="database" href="/ko/developers/database" horizontal />

  <Card title="docker" icon="docker" href="/ko/developers/dockerfile" horizontal />
</CardGroup>

## 로그와 터미널

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy09.png" />
</Frame>

> 서비스 카드 또는 상세페이지의 **<Icon icon="terminal" size={15} color="9fa3a5" /> 아이콘**을 클릭하면, 배포/실행로그 조회 또는 터미널에 접속할 수 있습니다.

## 워크로드

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy10.png" />
</Frame>

> 서비스 상세페이지의 워크로드 탭에서, 서비스가 차지하는 리소스의 양을 확인할 수 있습니다.

## 재배포(업데이트)

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy11.png" />
</Frame>

> **코드 수정, 리소스 변경 등** 업데이트할 내역이 있는 경우, 서비스 설정화면 하단부의 `배포하기` 버튼을 누르면 업데이트를 반영한 새로운 배포가 진행됩니다.

<Tip>
  배포 자동화를 위한 GitHub Actions 적용은 [GitHub Actions 페이지](/ko/developers/githubactions)를 참고하세요.
</Tip>

## 롤백(복원)

<Frame>
  <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/rollback01.png" />
</Frame>

> **서비스 상세페이지의 배포내역탭**에서 이전 버전의 서비스 상태로 복원할 수 있습니다.

<Tip>
  복원할 버전을 혼동하지 않기 위해, 커밋 메세지를 확인하세요.
</Tip>

## 트러블슈팅

<AccordionGroup>
  <Accordion title="서브 디렉토리 미적용 (Error: Project files not found)">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/subdir01.png" />
    </Frame>

    > 배포 시 루트 디렉토리를 기준으로 빌드가 진행됩니다. 저장소의 루트 디렉토리가 아닌 서브 디렉토리에 실행할 소스가 있는 경우 별도로 서브 디렉토리를 지정해주어야 합니다.
  </Accordion>

  <Accordion title="버전 불일치">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy05.png" />
    </Frame>

    > 배포할 프로젝트를 개발할 때 적용한 JDK, Python, Node.js 등의 버전과 cloudtype의 배포 설정에 적용한 버전이 서로 다를 경우 서비스가 정상적으로 빌드 혹은 실행되지 않습니다.
    > 프로젝트의 언어/플랫폼 버전에 따라 [배포 설정의 버전을 알맞게 설정한 후 재배포하세요.](/ko/developers/deploy#5)
  </Accordion>

  <Accordion title="포트 번호 문제">
    > 특정 포트에서 서비스되는 프로젝트의 경우, 배포 설정에서 포트 번호가 누락되거나 잘못 입력되면 정상적으로 실행되지 않을 수 있습니다.
    > **특정 포트에 바인딩 되지 않는 프로젝트의 경우, 배포 설정에서 포트 번호 항목을 공란으로 두어야 합니다.**
  </Accordion>

  <Accordion title="selenium, puppeteer 등의 Chrome 라이브러리 사용">
    > cloudtype 에서 제공하는 템플릿은 기본 모듈 및 라이브러리가 상이합니다. <Icon icon="windows" size={15} color="9fa3a5" /> Windows, <Icon icon="chrome" size={15} color="9fa3a5" /> Chrome 라이브러리처럼 기본으로 제공되지 않는 라이브러리를 사용하려는 경우, [Dockerfile](/ko/developers/dockerfile)을 작성해서 배포해야 합니다.
  </Accordion>

  <Accordion title="CORS 문제">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/reverseproxy02.png" />
    </Frame>

    > CORS는 각 프레임워크 별로 그 해결방법이 상이하며, 각 프레임워크에서 지원하는 라이브러리 혹은 모듈을 활용하여 발생하는 이슈를 해결할 수 있습니다.
    > Next.js 등과 같이 자체적으로 리버스 프록시를 지원하는 프레임워크를 사용하면 내장된 Rewrites 기능으로 해결할 수 있으며, Reat, Vue와 같은 프론트엔드를 배포할 때에는 [Rewrites 설정을 통해 리버스 프록시를 적용](/ko/developers/reverseproxy)할 수 있습니다.
  </Accordion>

  <Accordion title="오류에 대한 실행로그가 보이지 않는 경우">
    > 서비스 패널의 **플레이 버튼으로 재시작** 후 실행로그를 확인해보세요. 어떤 로그도 표시되지 않는다면 서비스 상세 페이지의 **이벤트탭**에서 발생한 이벤트를 확인하여 문제를 해결해야합니다.
  </Accordion>

  <Accordion title="유료 구독했지만 매일 서비스가 중단되는 경우">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/resource02.png" />
    </Frame>

    > 프리티어 플랜에서 구독 플랜(Hobby, Pro)으로 전환한 경우, 배포된 서비스에 구독 리소스가 자동으로 적용되지 않습니다. 프리티어 라벨이 붙은 서비스의 설정화면에서 구독 리소스를 적용한 후 다시 배포하면, 구독리소스가 적용되어 서비스가 중단되지 않습니다.
  </Accordion>

  <Accordion title="리소스 부족(out of memory)">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy12.png" />
    </Frame>

    > JVM 기반의 어플리케이션을 배포하는 경우 JVM에 할당한 메모리가 사용 가능한 리소스의 범위를 초과할 때 OOM이 발생할 수 있으며, Node.js 역시 heap 메모리의 부족으로 같은 현상이 발생할 수 있습니다.
    > 언어 혹은 프레임워크에서 적절하게 메모리를 부여하거나 리소스를 추가로 할당하여 배포해야 합니다.
  </Accordion>

  <Accordion title="타임존">
    <Frame>
      <img className="block rounded-md" src="https://files.cloudtype.io/ale-docs/developers/images/ko/deploy13.png" />
    </Frame>

    > 일반적인 프레임워크에서는 `TZ`라는 환경변수를 통해 타임존을 설정할 수 있으며, [여기](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) 제시된 일람에 따라 국가 및 도시를 설정할 수 있습니다.
    > 이외의 방법은 사용하고 있는 프레임워크의 공식문서를 참고하시기 바랍니다.
  </Accordion>
</AccordionGroup>

## 참고

* [GitHub Actions](/ko/developers/githubactions)
* [Dockerfile](/ko/developers/dockerfile)
