# Angular
Source: https://cloudtype.mintlify.app/ko/developers/angular
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/react.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `Angular` 를 검색하고 `Angular` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Angular
```yaml theme={null}
name: angular
app: web
options:
docbase: /dist
nodeversion: 16
spa: true
context:
git:
url: https://github.com/cloudtype-examples/angular.git
branch: main
preset: angular
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
### 공식문서
* [Angular Docs](https://angular.io/docs)
# API 키 관리
Source: https://cloudtype.mintlify.app/ko/developers/apikey
외부에서 클라우드타입의 API를 활용하고자 할 때 사용되는 인증 정보입니다. API Key로 [Github Actions 등 외부의 CI/CD 도구를 활용하여 배포작업을 진행](/ko/developers/githubactions)할 수 있습니다.
***
### API Key 생성
> 스페이스 설정화면의 인증 페이지에서 API 키를 생성할 수 있습니다.
생성된 API 토큰은 다시 조회할 수 없습니다.
# 터미널 접속
Source: https://cloudtype.mintlify.app/ko/developers/cli/attach
## 터미널 접속하기
접속할 컨테이너 ID 를 조회합니다.
```sh theme={null}
$ ctype ins
Current stage is "@demo/myproject:main"
APP ID STATUS STARTED AT EXPOSE
node node:node:0 running 2022-01-11 14:40:06 3000
node node:gitsync:0 running 2022-01-11 14:40:06 -
```
실행중인 애플리케이션의 터미널에 접속하는 방법입니다. 아래 명령은 현재 프로젝트의 `myapp` 애플리케이션에 접속합니다.
```plain theme={null}
$ ctype term node node:node:0
root@node:/app# ls -al
```
배포환경 옵션을 사용하면 다른 프로젝트나 배포환경의 애플리케이션의 터미널에 접속할 수 있습니다.
```sh theme={null}
$ ctype term node node:node:0 -t @demo/myproject:dev
```
***
## 터미널 옵션
1. `--target` 혹은 `-t`
target 옵션으로 현재 배포환경이 아닌 배포환경을 직접 지정할 수 있습니다.
```sh theme={null}
$ ctype term node node:node:0 -t @demo/projectname:stage
```
# 배포
Source: https://cloudtype.mintlify.app/ko/developers/cli/deploy
## 설정 파일을 통한 배포
### 1. 배포파일 작성하기
아래 내용을 `.cloudtype/app.yaml` 파일로 생성하세요.
```yaml theme={null}
name: myapp
app: node@16
options:
git:
branch: main
url: https://github.com/cloudtype-examples/node-express.git
env:
- name: NODE_ENV
value: production
install: npm ci --production
ports: 3000
start: npm start
```
### 2. 배포하기
아래와 같이 인수가 없는 경우 `.cloudtype/app.yaml` 파일을 사용하여 배포됩니다.
```sh theme={null}
$ ctype apply
1 apps deployed to @demo/myproject
└ app "node" deployed to stage main
```
배포할 설정 파일을 지정하려는 경우 파일명을 직접 지정할 수 있습니다.
```sh theme={null}
$ ctype apply -f myapp.yaml
```
### 3. 배포 확인
```sh theme={null}
$ ctype ls
Current stage is "@demo/myproject:main"
NAME APP CREATED UPDATED
node node@16 2022-01-11 03:57:37 2022-01-12 20:35:56
```
***
## 프리셋
제공하는 플랫폼별 프리셋으로 설정 파일을 생성할 수 있습니다.
### 1. 프리셋 조회
```sh theme={null}
$ ctype presets
58 presets found.
NAME DISPLAY NAME EXAMPLE
react React https://github.com/cloudtype-examples/react.git
vue-2 Vue 2 https://github.com/cloudtype-examples/vue2.git
vue-3 Vue 3 https://github.com/cloudtype-examples/vue3.git
angular Angular https://github.com/cloudtype-examples/angular.git
html HTML https://github.com/cloudtype-examples/html.git
gatsby Gatsby https://github.com/cloudtype-examples/gatsby.git
svelte Svelte https://github.com/cloudtype-examples/svelte.git
astro Astro https://github.com/cloudtype-examples/astro.git
lit-element-vite Lit (vite) https://github.com/cloudtype-examples/lit.git
preact-vite Preact (vite) https://github.com/cloudtype-examples/preact.git
react-vite React (vite) https://github.com/cloudtype-examples/react-vite.git
svelte-vite Svelte (vite) https://github.com/cloudtype-examples/svelte-vite.git
vanilla-vite VanillaJS (vite) https://github.com/cloudtype-examples/vanilla.git
webpack-5 Webpack 5 https://github.com/cloudtype-examples/webpack5.git
node Node.js https://github.com/cloudtype-examples/node-express.git
next.js-11 Next.js 11 https://github.com/cloudtype-examples/nextjs.git
next.js-12 Next.js 12 https://github.com/cloudtype-examples/nextjs12.git
next.js Next.js 13 https://github.com/cloudtype-examples/nextjs13.git
nuxt.js Nuxt.js https://github.com/cloudtype-examples/nuxtjs.git
nest.js NestJS https://github.com/cloudtype-examples/nestjs.git
remix Remix https://github.com/cloudtype-examples/remix.git
express-graphql GraphQL(express) https://github.com/cloudtype-examples/express-graphql
next-prisma Prisma(Next 13) https://github.com/cloudtype-examples/next-prisma.git
fastify Fastify https://github.com/cloudtype-examples/fastify.git
python-django Python Django https://github.com/cloudtype-examples/python-django.git
python-flask Python Flask https://github.com/cloudtype-examples/flask.git
python-fastapi Python FastAPI https://github.com/cloudtype-examples/fastapi.git
python-streamlit Python Streamlit https://github.com/cloudtype-examples/streamlit.git
java-springboot Spring Boot https://github.com/cloudtype-examples/java-springboot.git
kotlin Kotlin https://github.com/cloudtype-examples/kotlin.git
dotnet .NET https://github.com/cloudtype-examples/dotnet.git
golang Go https://github.com/cloudtype-examples/golang.git
gin gin https://github.com/cloudtype-examples/gin.git
fiber Fiber https://github.com/cloudtype-examples/go-fiber.git
deno Deno https://github.com/cloudtype-examples/deno.git
php PHP https://github.com/cloudtype-examples/php.git
ruby-rails Ruby on Rails https://github.com/cloudtype-examples/ruby-on-rails.git
ruby-sinatra Ruby Sinatra https://github.com/cloudtype-examples/ruby-sinatra.git
buildpacks Buildpacks https://github.com/cloudtype/example-node-express.git
container Container
dockerfile Dockerfile https://github.com/cloudtype-examples/dockerfile.git
mariadb MariaDB
mongo MongoDB
postgresql PostgreSQL
redis Redis
code-server Code Server
elasticsearch Elasticsearch
kafka Apache Kafka
nginx nginx
select Select Admin https://github.com/cloudtype/example-select.git
discordbot-js Discord Bot(JS) https://github.com/cloudtype-examples/discordbot-js.git
discordbot-py Discord Bot(Python) https://github.com/cloudtype-examples/discordbot-py.git
slackbot-js Slack Bot(JS) https://github.com/cloudtype-examples/slackbot-js.git
slackbot-py Slack Bot(Python) https://github.com/cloudtype-examples/slackbot-py.git
ghost ghost
jekyll Jekyll https://github.com/cloudtype/example-jekyll.git
wordpress Wordpress
docusaurus Docusaurus https://github.com/cloudtype-examples/example-docusaurus.git
```
### 2. 설정 파일 생성하기
원하는 프리셋 이름으로 설정 파일을 생성하세요. 파일을 지정하지 않은 경우 `.cloudtype/app.yaml` 파일로 생성됩니다.
```sh theme={null}
$ ctype create node/express
Configuration file created. .cloudtype/app.yaml
```
**배포하기**
```sh theme={null}
$ ctype apply
1 apps deployed to @demo/myproject
└ app "node" deployed to stage main
```
`-f`(`--file`) 옵션을 사용해서 원하는 파일명을 지정할 수 있습니다. 아래 예시는 `config/myapp.yaml` 파일로 생성합니다.
```sh theme={null}
$ ctype create node/express -f config/myapp.yaml
Configuration file created. config/myapp.yaml
```
**배포하기**
```sh theme={null}
$ ctype apply -f config/myapp.yaml
1 apps deployed to @demo/myproject
└ app "node" deployed to stage main
```
# 설치
Source: https://cloudtype.mintlify.app/ko/developers/cli/install
ale에서 어플리케이션을 관리하는 페이지입니다.
## CLI 설치하기
### 사전준비
CLI 를 사용하려면 `Node.js` 설치가 필요합니다.
Node.js 공식웹사이트 혹은 nvm 을 통해서 Node.js v12 이상을 설치하세요.
```sh theme={null}
$ npm i -g @cloudtype/cli
```
### 로그인
#### username / password
```sh theme={null}
$ ctype login
# 혹은
$ ctype login -u username -p password
```
#### API key token
API Key 발급은 [API Key 발급받기](/ko/developers/apikey) 페이지를 참고하세요.
```sh theme={null}
$ ctype login -t API_KEY_TOKEN
```
### 프로젝트 생성
프로젝트가 없다면 새로운 프로젝트를 생성하세요.
```sh theme={null}
$ ctype project create myproject
```
### 프로젝트 조회
```sh theme={null}
$ ctype projects
Current scope is "@demo"
NAME CREATED
myproject 2022-01-11 03:57:30
```
### 현재 프로젝트 및 배포환경 조회
```sh theme={null}
$ ctype use
Current stage is @demo/myproject:main on gke-seoul-1
```
### 프로젝트 전환
```sh theme={null}
$ ctype use myproject # 배포환경을 지정하지 않으면 기본 배포환경(main)으로 전환됩니다.
# 혹은
$ ctype use myproject:main
```
### 배포환경 전환
```sh theme={null}
$ ctype use :development
```
### 팀 스코프 지정
```sh theme={null}
$ ctype use @teamname/myproject:main
```
# 로그뷰
Source: https://cloudtype.mintlify.app/ko/developers/cli/log
## 로그 조회하기
로그 조회할 컨테이너 ID 를 조회합니다.
```sh theme={null}
$ ctype ins
Current stage is "@demo/myproject:main"
APP ID STATUS STARTED AT EXPOSE
node node:node:0 running 2022-01-11 14:40:06 3000
node node:gitsync:0 running 2022-01-11 14:40:06 -
```
실행중인 애플리케이션의 실시간 로그를 조회하는 방법입니다. 아래 명령은 현재 프로젝트의 `myapp` 애플리케이션 로그를 조회합니다.
```sh theme={null}
$ ctype logs node node:node:0
node@16 is starting...
no pre-install command
...
```
배포환경 옵션을 사용하면 다른 프로젝트나 배포환경의 애플리케이션의 로그를 조회할 수 있습니다.
```sh theme={null}
$ ctype logs node node:node:0 -t @demo/myproject:dev
```
***
## 로그 옵션
1. `--tailLines` 혹은 `-l`
tailLines 옵션을 사용하면 마지막 로그로부터 이전의 라인부터 조회할 수 있습니다.
```sh theme={null}
$ ctype logs node node:node:0 -l 10
```
2. `--timestamps` 혹은 `-m`
timestamp 옵션을 사용하면 로그 시간을 함께 볼 수 있습니다.
```sh theme={null}
$ ctype logs node node:node:0 -m
```
3. `--target` 혹은 `-t`
target 옵션으로 현재 배포환경이 아닌 배포환경을 직접 지정할 수 있습니다.
```sh theme={null}
$ ctype logs node node:node:0 -t @demo/projectname:stage
```
# 서비스 간 통신
Source: https://cloudtype.mintlify.app/ko/developers/connect
> cloudtype은 데이터베이스, 메세징 큐 등의 서비스를 다른 서비스와 연동하기 위해 필요한 호스트명과 포트를 제공합니다. 용도에 따라 동일 배포환경 내에서 참조하는 것과 외부에서 참조하는 것으로 나뉩니다.
## 접속 정보 조회
> 서비스 상세 페이지의 리소스탭에서 두 가지 유형의 엔드포인트를 확인할 수 있습니다:
* 인그레스: 외부 서비스와의 연결을 위한 \[hostname:port]
* 내부 연결: 같은 배포환경의 서비스 간 통신을 위한 \[hostname:port]
같은 배포환경의 서비스간 통신에는 서비스 이름이 호스트네임으로 사용됩니다.
## 내부 서비스 간 통신
> 같은 화면에 있는 서비스 사이에는 내부 연결 주소인 **서비스 이름과 포트번호로 통신**할 수 있습니다.
같은 화면에 있는 서비스는 같은 배포환경에 속합니다. 배포환경 별로 격리된 네트워크가 구성되기 때문에 방화벽 규칙 적용이 필요없고, 통신 지연 현상이 최소화됩니다.
cloudtype의 작업단위인 스페이스, 프로젝트, **배포환경**, 서비스에 관한 내용은 [배포환경 페이지](/ko/developers/environment)를 참고하세요.
## 다른 배포환경 또는 외부 서비스
> 서비스 상세페이지 **리소스탭의 인그레스 정보(호스트네임 : 포트번호)로** 다른 배포환경 또는 외부의 서비스와 통신할 수 있습니다. 이 경우, 연결하려는 데이터베이스가 속한 배포환경의 설정탭에서 **TCP 외부접속을 허용해야 합니다.**
TCP 접속 허용 설정은 배포환경 단위로 가능하며, 설정한 배포환경에 속한 서비스 전체에 적용됩니다. 서비스 단위의 개별 설정은 불가합니다.
인그레스 주소를 사용해 로컬 컴퓨터의 관리툴로 데이터베이스에 TCP 접속할 수 있습니다.
> 접속정보를 입력한 후, 이어지는 화면에서 배포시 설정한 Root Password를 입력하세요.
[Root Password는 배포환경 설정탭의 시크릿 항목](/ko/developers/database#3-2-root-password)에서 조회할 수 있습니다. [MySQL Workbench Download](https://dev.mysql.com/downloads/workbench/)
관리 툴로 데이터베이스에 TCP 접속 시 배포환경 설정탭에서 TCP 외부접속을 허용하도록 설정해야 합니다.
> Connection 탭에서 접속정보와 배포할 때 설정한 Username(기본값 **root**), Root Password를 입력하세요.
[Root Password는 배포환경 설정탭의 시크릿 항목](/ko/developers/database#3-2-root-password)에서 조회할 수 있습니다. [pgAdmin Download](https://www.pgadmin.org/download/)
관리 툴로 데이터베이스에 TCP 접속 시 배포환경 설정탭에서 TCP 외부접속을 허용하도록 설정해야 합니다.
> `New Connection` 클릭 후, **Advanced Connection Options** 하단부의 General 탭에서 **포트번호까지 포함한 호스트네임**을 Host 필드에 입력하세요.
> Authentication 탭에서 배포할 때 설정한 Username(기본값 **admin**), Root Password를 입력하세요.
[Root Password는 배포환경 설정탭의 시크릿 항목](/ko/developers/database#3-2-root-password)에서 조회할 수 있습니다. [MongoDB Compass Download](https://www.mongodb.com/try/download/compass)
관리 툴로 데이터베이스에 TCP 접속 시 배포환경 설정탭에서 TCP 외부접속을 허용하도록 설정해야 합니다.
> `Add Redis Database` 클릭 후, 접속정보를 입력해주세요.
[Root Password는 배포환경 설정탭의 시크릿 항목](/ko/developers/database#3-2-root-password)에서 조회할 수 있습니다. [Redis Insignt Download](https://redis.io/insight/)
관리 툴로 데이터베이스에 TCP 접속 시 배포환경 설정탭에서 TCP 외부접속을 허용하도록 설정해야 합니다.
## 아웃바운드 IP
> 클라우드타입에서 배포한 서비스와 외부의 DB를 연동하여 사용하려는 경우, 설정탭의 배포환경 정보 메뉴에서 클라우드타입의 아웃바운드 IP를 조회하여 활용할 수 있습니다.
공용으로 사용되는 IP로 새로 컨테이너가 재생성되거나 프로젝트를 새로 생성해도 아웃바운드 IP는 항상 같으며 대시보드에 표시된 IP 중 하나가 사용됩니다. 외부서비스에 화이트리스트 IP로 등록할 경우, 대시보드에 표시되는 IP를 모두 등록해주세요.
# Container Image
Source: https://cloudtype.mintlify.app/ko/developers/container
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 검색한 **Container 템플릿**으로 container image를 배포할 수 있습니다.
[이미지 레지스트리 연결하기 페이지](/ko/developers/registry)를 참고해 저장소 연결 후 프라이빗 저장소의 커스텀 이미지를 배포할 수 있습니다.
## 설정과 배포
> Container 템플릿 선택 후 이어지는 배포 설정창에서 필요한 설정값들을 입력한 후 배포하세요.
> 이미지 주소와 태그를 `:`와 함께 입력하세요.
> 이미지 배포를 위한 설정값을 입력해주세요.
* **uid** : 컨테이너에서 프로세스를 실행하는 사용자의 고유한 식별자(기본값 1000)
* **gid** : 컨테이너에서 프로세스가 속한 그룹의 고유한 식별자(기본값 1000)
* **Update strategy**
* **Rolling Update** : 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate** : 모든 서비스 종료후 새로운 버전의 서비스 생성 및 구동, 다운타임 발생
* **Shell** : 컨테이너가 실행된 후 실행할 쉘(sh, bash, zsh 등)
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 수 있는 vCPU 리소스의 최대값으로, '최소' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 수 있는 메모리 리소스의 최대값
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
# 데이터베이스
Source: https://cloudtype.mintlify.app/ko/developers/database
> cloudtype에서 데이터베이스를 배포하고, 배포된 DB와 **다른 서비스와의 통신** 및 DB 관리 도구로 **TCP연결**하는 방법을 다룹니다.
배포한 데이터베이스를 중지하거나 재배포할 경우 데이터가 보존되지만, **데이터베이스 서비스 삭제 시 데이터도 영구적으로 제거됩니다.**
***
## 데이터베이스 배포하기
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서, 배포할 **database**를 선택한 후 표시되는 설정 필드값을 입력하세요.
> 버전, Root Password 등의 설정값을 정할 수 있습니다.
서비스 별로 표시되는 **기본 설정값** 항목이 다릅니다. 사용하려는 목적에 맞게 알맞은 값을 입력해주세요.
> 데이터베이스 이름, Timezone 설정 등, 추가적인 설정값을 입력할 수 있습니다.
서비스 별로 표시되는 **더 많은 옵션**의 항목이 다릅니다. 사용하려는 목적에 맞게 알맞은 값을 입력해주세요.
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* **디스크** : 데이터베이스가 차지할 수 있는 디스크의 용량 설정
* **배포** : `배포하기` 클릭
Root Password 미설정 시, 자동생성된 Password를 [배포환경 설정탭의 시크릿 항목](/ko/developers/database#root-password-%EC%A1%B0%ED%9A%8C)에서 조회할 수 있습니다.
## 다른 서비스와의 통신
### 같은 배포환경 내 서비스
> 같은 화면에 있는 서비스 사이에는 내부 연결 주소인 **서비스 이름과 포트번호로 통신**할 수 있습니다.
같은 화면에 있는 서비스는 같은 배포환경에 속합니다. 배포환경 별로 격리된 네트워크가 구성되기 때문에 방화벽 규칙 적용이 필요없고, 통신 지연 현상이 최소화됩니다.
cloudtype의 작업단위인 스페이스, 프로젝트, **배포환경**, 서비스에 관한 내용은 [배포환경 페이지](/ko/developers/environment)를 참고하세요.
### 다른 배포환경 또는 외부 서비스
> 서비스 상세페이지 **연결 탭의 상단에 있는 주소(호스트네임 : 포트번호)로** 다른 배포환경 또는 외부의 서비스와 통신할 수 있습니다. 이 경우 TCP 외부 접속을 허용하도록 설정해야합니다.
> 연결하려는 데이터베이스가 속한 배포환경의 설정탭에서 TCP 외부접속을 허용할 수 있습니다.
TCP 접속 허용 설정은 배포환경 단위로 가능하며, 설정한 배포환경에 속한 서비스 전체에 적용됩니다. 서비스 단위의 개별 설정은 불가합니다.
### DB 관리 툴
> [접속 주소](/ko/developers/database#2-2)를 사용해 로컬 컴퓨터의 관리툴로 데이터베이스에 TCP 접속할 수 있습니다.
> 접속정보를 입력한 후, 이어지는 화면에서 배포시 설정한 Root Password를 입력하세요.
[MySQL Workbench Download](https://dev.mysql.com/downloads/workbench/)
> Connection 탭에서 접속정보와 배포할 때 설정한 Username(기본값 **root**), Root Password를 입력하세요.
[pgAdmin Download](https://www.pgadmin.org/download/)
> `New Connection` 버튼 클릭 후, **Advanced Connection Options** 하단부의 General 탭에서 **포트번호까지 포함한 호스트네임**을 Host 필드에 입력하세요.
> Authentication 탭에서 배포할 때 설정한 Username(기본값 **admin**), Root Password를 입력하세요.
[MongoDB Compass Download](https://www.mongodb.com/try/download/compass)
> `Add Redis Database` 버튼 클릭 후, 접속정보를 입력해주세요.
[Redis Insignt Download](https://redis.io/insight/)
DB관리 툴과 데이터베이스를 연결하려면 **TCP 외부접속을 허용하도록 설정해야합니다.**
## 데이터베이스 관리
### 리소스 변경
> 서비스 상세페이지 설정화면의 배포 설정 항목에서 디스크, CPU 등의 리소스를 변경하고 `배포하기` 버튼으로 재배포하면 변경된 리소스가 적용됩니다.
재배포 시 기존의 데이터는 유지됩니다.
### Root Password 조회
> 배포환경 설정탭의 **시크릿**항목에서 배포과정에서 설정한 Root Password 값을 조회할 수 있습니다.
### 데이터베이스 삭제
> 서비스 상세페이지 설정탭 하단부의 `서비스 삭제하기` 버튼으로 데이터베이스를 삭제할 수 있습니다.
데이터베이스 삭제 시 해당 서비스를 통해 디스크에 저장된 데이터가 영구적으로 제거됩니다.
# Deno
Source: https://cloudtype.mintlify.app/ko/developers/deno
## 준비 및 확인사항
### 지원 Deno 버전
* **1.10, 1.12, 1.14, 1.16, 1.18, 1.19, 1.20, 1.22, 1.24, 1.26, 1.28**
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Deno 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/deno.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `deno` 를 검색하고 `Deno` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Deno
```yaml theme={null}
name: deno
app: deno@1.19
options:
ports: 8000
install: deno cache deps.ts
start: deno run --allow-net deno.ts
context:
git:
url: https://github.com/cloudtype-examples/deno.git
branch: main
preset: deno
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
### 공식문서
* [Deno Docs](https://doc.deno.land/)
# 배포하기
Source: https://cloudtype.mintlify.app/ko/developers/deploy
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창을 통해 배포과정이 시작됩니다.
cloudtype 에서 제공하는 템플릿은 기본 모듈 및 라이브러리가 상이합니다. Windows, Chrome 라이브러리처럼 기본으로 제공되지 않는 라이브러리를 사용하려는 경우, [Dockerfile](/ko/developers/dockerfile)을 작성해서 배포해야 합니다.
***
## 배포방식 선택
#### 배포할 저장소 선택
> 배포창에서 **GitHub 저장소 배포하기**를 클릭한 후, OAuth 방식으로 연동된 GitHub 계정의 저장소를 선택하세요.
#### 언어/프레임웍 선택
> 배포할 저장소에 맞는 프리셋을 선택하세요.
React, vue 등과 같은 정적사이트의 경우 **Web Application**을 선택해주세요.
#### 배포키 등록
> 배포창에서 **Git URL로 배포하기**를 선택한 후, 배포하려는 저장소의 **SSH방식의 Git URL**을 입력하면 자동으로 생성된 **배포키(Deploy Key)** 를 조회할 수 있습니다.
cloudtype은 **GitHub** 뿐만 아니라 **GitLab, Bitbucket** 등에 반영된 비공개 저장소의 코드도 배포할 수 있도록 SSH 방식의 인증을 지원합니다. 플랫폼 별 배포키 등록은 아래를 참고해주세요
> 배포하려는 저장소의 **Settings > Deploy keys** 화면 우측 상단의 `Add deploy key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
> 배포하려는 저장소의 **Settings > Repository** 화면에서 **Deploy keys** 항목의 `Expand`, `Add new key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
> 배포하려는 저장소의 **Repository settings > Access keys** 화면에서 `Add key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
#### 언어/프레임웍 선택
> 배포할 저장소에 맞는 프리셋을 선택하세요.
React, vue 등과 같은 정적사이트의 경우 **Web Application**을 선택해주세요.
> 개발한 서비스에 적합한 템플릿을 선택한 후 연동된 GitHub 저장소 선택 또는 Git URL을 입력하세요.
React, vue 등과 같은 정적사이트의 경우 **Web Application**을 선택해주세요.
## 배포 설정과 배포
> 배포할 저장소와 프리셋 또는 템플릿을 선택한 후, 배포에 관한 아래의 항목을 설정하고 배포하세요.
> 저장소 선택 후 `설정` 버튼을 클릭하면 **브랜치와 서브 디렉토리**를 설정할 수 있는 필드가 표시됩니다. 하나의 저장소에 여러 개의 서비스를 별도의 폴더로 관리하는 경우처럼, **루트디렉토리가 아닌 하위 폴더에 배포할 서비스가 존재**하는 경우 **서브 디렉토리** 필드에 그 경로를 입력하세요.
서브 디렉토리를 설정을 하지 않은 경우, 루트 디렉토리에서 배포가 실행됩니다.
더 자세한 내용은 [저장소 서브 디렉토리 설정 페이지](/ko/developers/subdir)를 참고하세요.
> 프리셋의 버전을 배포할 저장소에 맞게 선택하세요.
프로젝트 설정 파일(build.gradle, requirements.txt, package.json 등)에 명시된 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 또는 런타임 오류가 발생할 수 있습니다.
> 환경 변수는 다음 방식들을 조합하여 추가할 수 있습니다:
* ENV 파일 Drag & Drop
* (+) 아이콘으로 새로운 변수를 직접 입력
* 열쇠 아이콘을 사용해 저장된 시크릿 중에서 선택
환경변수 설정 및 시크릿 관리에 관한 자세한 내용은 [환경변수 관리 페이지](/ko/developers/env) 를 참고하세요.
> 포트번호는 소스 코드 혹은 환경변수의 설정과 일치해야 하며 정확하지 않은 포트번호를 입력하거나 공란으로 한 경우, 서비스가 정상적으로 작동하지 않을 수 있습니다.
포트번호는 기본값이 적용되지 않습니다. 포트설정에 관한 더 자세한 내용은 [포트 설정 페이지](/ko/developers/port) 를 참고하세요.
> 서비스의 라이프사이클 명령어를 설정하세요. 각 필드에는 기본 명령어가 표시되어 있으며, 프로젝트 설정에 맞게 변경할 수 있습니다
* **Install Command**: 의존성 패키지 설치 명령어 (예: `npm install`, `pip install -r requirements.txt`)
* **Build Command**: 애플리케이션 빌드 명령어 (예: `npm run build`, `gradle build`)
* **Start Command**: 서비스 실행 명령어 (예: `npm start`, `python app.py`)
필드값을 입력하지 않으면 placeholder에 표시된 기본값이 적용됩니다.
> 추가로 설정값을 입력할 수 있는 필드가 표시됩니다.
표시되는 필드는 템플릿 / 프리셋 별로 다르며, 주요 언어별 설정사항은 아래의 카드를 참고하세요.
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* **디스크** : 데이터베이스를 배포할 경우 표시되는 필드로, 데이터베이스가 차지할 디스크의 용량 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
프리티어 플랜에서 구독 플랜(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) 구독 리소스가 적용되어 서비스를 중단 없이 사용할 수 있습니다.
표시되는 필드는 템플릿 / 프리셋 별로 다르며, 주요 언어별 설정사항은 아래의 카드를 참고하세요.
## 로그와 터미널
> 서비스 카드 또는 상세페이지의 ** 아이콘**을 클릭하면, 배포/실행로그 조회 또는 터미널에 접속할 수 있습니다.
## 워크로드
> 서비스 상세페이지의 워크로드 탭에서, 서비스가 차지하는 리소스의 양을 확인할 수 있습니다.
## 재배포(업데이트)
> **코드 수정, 리소스 변경 등** 업데이트할 내역이 있는 경우, 서비스 설정화면 하단부의 `배포하기` 버튼을 누르면 업데이트를 반영한 새로운 배포가 진행됩니다.
배포 자동화를 위한 GitHub Actions 적용은 [GitHub Actions 페이지](/ko/developers/githubactions)를 참고하세요.
## 롤백(복원)
> **서비스 상세페이지의 배포내역탭**에서 이전 버전의 서비스 상태로 복원할 수 있습니다.
복원할 버전을 혼동하지 않기 위해, 커밋 메세지를 확인하세요.
## 트러블슈팅
> 배포 시 루트 디렉토리를 기준으로 빌드가 진행됩니다. 저장소의 루트 디렉토리가 아닌 서브 디렉토리에 실행할 소스가 있는 경우 별도로 서브 디렉토리를 지정해주어야 합니다.
> 배포할 프로젝트를 개발할 때 적용한 JDK, Python, Node.js 등의 버전과 cloudtype의 배포 설정에 적용한 버전이 서로 다를 경우 서비스가 정상적으로 빌드 혹은 실행되지 않습니다.
> 프로젝트의 언어/플랫폼 버전에 따라 [배포 설정의 버전을 알맞게 설정한 후 재배포하세요.](/ko/developers/deploy#5)
> 특정 포트에서 서비스되는 프로젝트의 경우, 배포 설정에서 포트 번호가 누락되거나 잘못 입력되면 정상적으로 실행되지 않을 수 있습니다.
> **특정 포트에 바인딩 되지 않는 프로젝트의 경우, 배포 설정에서 포트 번호 항목을 공란으로 두어야 합니다.**
> cloudtype 에서 제공하는 템플릿은 기본 모듈 및 라이브러리가 상이합니다. Windows, Chrome 라이브러리처럼 기본으로 제공되지 않는 라이브러리를 사용하려는 경우, [Dockerfile](/ko/developers/dockerfile)을 작성해서 배포해야 합니다.
> CORS는 각 프레임워크 별로 그 해결방법이 상이하며, 각 프레임워크에서 지원하는 라이브러리 혹은 모듈을 활용하여 발생하는 이슈를 해결할 수 있습니다.
> Next.js 등과 같이 자체적으로 리버스 프록시를 지원하는 프레임워크를 사용하면 내장된 Rewrites 기능으로 해결할 수 있으며, Reat, Vue와 같은 프론트엔드를 배포할 때에는 [Rewrites 설정을 통해 리버스 프록시를 적용](/ko/developers/reverseproxy)할 수 있습니다.
> 서비스 패널의 **플레이 버튼으로 재시작** 후 실행로그를 확인해보세요. 어떤 로그도 표시되지 않는다면 서비스 상세 페이지의 **이벤트탭**에서 발생한 이벤트를 확인하여 문제를 해결해야합니다.
> 프리티어 플랜에서 구독 플랜(Hobby, Pro)으로 전환한 경우, 배포된 서비스에 구독 리소스가 자동으로 적용되지 않습니다. 프리티어 라벨이 붙은 서비스의 설정화면에서 구독 리소스를 적용한 후 다시 배포하면, 구독리소스가 적용되어 서비스가 중단되지 않습니다.
> JVM 기반의 어플리케이션을 배포하는 경우 JVM에 할당한 메모리가 사용 가능한 리소스의 범위를 초과할 때 OOM이 발생할 수 있으며, Node.js 역시 heap 메모리의 부족으로 같은 현상이 발생할 수 있습니다.
> 언어 혹은 프레임워크에서 적절하게 메모리를 부여하거나 리소스를 추가로 할당하여 배포해야 합니다.
> 일반적인 프레임워크에서는 `TZ`라는 환경변수를 통해 타임존을 설정할 수 있으며, [여기](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) 제시된 일람에 따라 국가 및 도시를 설정할 수 있습니다.
> 이외의 방법은 사용하고 있는 프레임워크의 공식문서를 참고하시기 바랍니다.
## 참고
* [GitHub Actions](/ko/developers/githubactions)
* [Dockerfile](/ko/developers/dockerfile)
# Django
Source: https://cloudtype.mintlify.app/ko/developers/django
> Python으로 작성된 Django 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
| Django 버전 | 지원하는 Python 버전 |
| ---------- | -------------------------- |
| Django 3.1 | 3.6, 3.7, 3.8, 3.9 |
| Django 3.2 | 3.6, 3.7, 3.8, 3.9, 3.10 |
| Django 4.0 | 3.8, 3.9, 3.10 |
| Django 4.1 | 3.8, 3.9, 3.10, 3.11 |
| Django 4.2 | 3.8, 3.9, 3.10, 3.11, 3.12 |
| Django 5.0 | 3.10, 3.11, 3.12 |
| Django 5.1 | 3.10, 3.11, 3.12 |
프로젝트 설정 파일(requirements.txt 등)에 명시된 Python 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Django** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
Django의 경우 `settings.py` 에서 `ALLOWED_HOSTS`, `CSRF_TRUSTED_ORIGINS` 를 알맞게 설정해야 정상적으로 페이지가 로드됩니다.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* **포트번호**: `8000`(기본값)
* **Start Command**: `python3 manage.py runserver 0:8000`(기본값)
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
* **Install command**: Python 패키지 설치 명령
* **Pre start Command**: Start Command 실행 전 사전에 수행되어야 할 명령
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
환경변수와 Pre Start Command를 다음과 같이 세팅하면 Super User를 생성할 수 있습니다.
```
[환경변수]
DJANGO_SUPERUSER_USERNAME - Django 슈퍼유저 username
DJANGO_SUPERUSER_PASSWORD - Django 슈퍼유저 password
DJANGO_SUPERUSER_EMAIL - Django 슈퍼유저 email
[시작 명령 - Pre Start Command]
python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py createsuperuser --noinput
```
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[Django Docs](https://docs.djangoproject.com/)
# Dockerfile
Source: https://cloudtype.mintlify.app/ko/developers/dockerfile
> Dockerfile 템플릿을 활용해 Dockerfile을 간편하게 배포할 수 있습니다.
cloudtype 의 템플릿 / 프리셋은 효율적인 리소스 관리를 위한 최소한의 라이브러리만 사용합니다.
**Windows,** **Chrome** 라이브러리처럼 기본으로 제공되지 않는 라이브러리를 사용하려는 경우,
[예제 코드](/ko/developers/dockerfile#%EC%96%B8%EC%96%B4%EB%B3%84-%EC%B0%B8%EA%B3%A0-%EC%98%88%EC%A0%9C-%EC%BD%94%EB%93%9C)를 참고해 Dockerfile을 작성해서 배포하세요.
***
## 저장소와 템플릿 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Dockerfile** 템플릿을 선택하고, 연동된 GitHub 계정의 저장소를 선택하세요.
내 GitHub 저장소 또는 Git URL로 배포하는 경우, 언어/프레임웍으로 Dockerfile을 선택하세요.
## 배포 설정과 배포
### 기본 설정
* **Environment variables(ENV)** : 컨테이너를 실행할 때 참조되는 환경변수
* **Build arguments(ARG)** : 이미지를 빌드할 때 참조되는 인자
* **Port** : 컨테이너가 실행되는 대상포트로, `docker run` 명령어의 `-p, --publish` 옵션에 적용되는 인자
* **Health Check** : 컨테이너 상태 검증 엔드포인트
* **Start commands** : 컨테이너 시작 명령어
### 더 많은 옵션
* **Dockerfile text** : Dockerfile의 전체 내용 입력
* **Build Labels(LABEL)** : Dockerfile로 컨테이너 이미지 빌드 시 버전, 라이센스 등 추가 정보 주입
* **uid** : 컨테이너에서 프로세스를 실행하는 사용자의 고유한 식별자(기본값 1000)
* **gid** : 컨테이너에서 프로세스가 속한 그룹의 고유한 식별자(기본값 1000)
* **Update strategy**
* **Rolling Update** : 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate** : 모든 서비스 종료후 새로운 버전의 서비스 생성 및 구동, 다운타임 발생
* **Shell** : 컨테이너가 실행된 후 실행할 쉘(sh, bash, zsh 등)
### 성능(리소스) 설정과 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
## 로그와 터미널
> 서비스 카드 또는 상세페이지의 ** 아이콘**을 클릭하면, 배포/실행로그 조회 또는 터미널에 접속할 수 있습니다.
## 워크로드
> 서비스 상세페이지의 워크로드 탭에서, 서비스가 차지하는 리소스의 양을 확인할 수 있습니다.
## 재배포(업데이트)
> **코드 수정, 리소스 변경 등** 업데이트할 내역이 있는 경우, 서비스 상세페이지 설정탭 하단부의 `배포하기`를 클릭하면 업데이트를 반영한 새로운 배포가 진행됩니다.
배포 자동화를 위한 GitHub Actions 적용은 [GitHub Actions 페이지](/ko/developers/githubactions)를 참고하세요.
## 롤백(복원)
> **서비스 상세페이지의 배포내역탭**에서 이전 버전의 서비스 상태로 복원할 수 있습니다.
복원할 버전을 혼동하지 않기 위해, 커밋 메세지를 확인하세요.
## 언어별 참고 예제 코드
[Github 저장소로 이동](https://github.com/cloudtype-examples/docker-node-be)
```dockerfile theme={null}
# 의존성 설치
FROM node:16-buster
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
ENV NODE_ENV production
COPY . .
# node 이미지에 이미 "node"라는 사용자가 uid/gid 1000번으로 생성되어 있음
USER node
EXPOSE 3000
CMD ["npm", "start"]
```
[Github 저장소로 이동](https://github.com/cloudtype-examples/docker-node-fe)
```dockerfile theme={null}
# 프로젝트 빌드
FROM node:16-buster AS builder
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
RUN npm run build
# Production 런타임 - nginx
FROM nginxinc/nginx-unprivileged:1.23 AS runner
WORKDIR /usr/share/nginx/html
COPY --from=builder /app/build .
EXPOSE 3000
CMD ["nginx", "-g", "daemon off;"]
```
[Github 저장소로 이동](https://github.com/cloudtype-examples/docker-python)
```dockerfile theme={null}
FROM python:3.9-slim-buster
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED 1
ARG UID=1000
ARG GID=1000
RUN groupadd -g "${GID}" python \
&& useradd --create-home --no-log-init -u "${UID}" -g "${GID}" python
WORKDIR /home/python
COPY --chown=python:python requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
# USER 변경은 반드시 pip 패키지 설치 스크립트 이후에 작성되어야 함
USER python:python
ENV PATH="/home/${USER}/.local/bin:${PATH}"
COPY --chown=python:python . .
ARG FLASK_ENV
ENV FLASK_ENV=${FLASK_ENV}
EXPOSE 5000
# WSGI, 포트 번호, 모듈명 등은 각 소스 코드에 알맞게 수정하여 배포 진행
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
```
[Github 저장소로 이동](https://github.com/cloudtype-examples/springboot-crud-example)
```dockerfile theme={null}
# JDK 이미지를 통한 executable jar 빌드
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
# COPY build.gradle.kts settings.gradle.kts ./ Kotlin인 경우 .kts 확장자 적용
RUN ./gradlew dependencies --no-daemon
COPY . .
RUN chmod +x ./gradlew
RUN ./gradlew bootJar --no-daemon
# jar 실행을 위한 JRE 이미지 적용
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/build/libs/*.jar ./main.jar
USER worker:worker
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "main.jar"]
```
[Github 저장소로 이동](https://github.com/cloudtype-examples/spring-multi-module)
```dockerfile theme={null}
# JDK 이미지를 통한 executable jar 빌드
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY build.gradle settings.gradle ./
# COPY build.gradle.kts settings.gradle.kts ./ Kotlin인 경우 .kts 확장자 적용
RUN ./gradlew dependencies --no-daemon
COPY . .
RUN chmod +x ./gradlew
RUN ./gradlew bootJar :api:bootJar --no-daemon
# RUN ./gradlew bootJar ::bootJar --no-daemon
# jar 실행을 위한 JRE 이미지 적용
FROM eclipse-temurin:17-jre-alpine
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/api/build/libs/*.jar ./main.jar
# COPY --from=build --chown=worker:worker /app//build/libs/*.jar ./main.jar
USER worker:worker
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "main.jar"]
```
[Github 저장소로 이동](https://github.com/cloudtype-examples/springboot-crud-gradle)
```dockerfile theme={null}
# Build
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY gradlew .
COPY gradle gradle
COPY build.gradle.kts settings.gradle.kts ./
RUN ./gradlew dependencies --no-daemon
COPY . .
RUN chmod +x ./gradlew
RUN ./gradlew build --no-daemon -x test
# Runtime
FROM eclipse-temurin:17-jre-alpine AS runtime
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/build/libs/*.jar ./main.jar
USER worker:worker
ENV PROFILE=${PROFILE}
EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "main.jar"]
```
[Github 저장소로 이동](https://github.com/cloudtype-examples/springboot-crud-maven)
```dockerfile theme={null}
# Build
FROM eclipse-temurin:17-alpine AS build
RUN apk add --no-cache bash
WORKDIR /app
COPY mvnw .
COPY .mvn .mvn
COPY pom.xml .
RUN ./mvnw dependency:go-offline -B
COPY . .
RUN chmod +x ./mvnw
RUN ./mvnw package -DskipTests
# Runtime
FROM eclipse-temurin:17-jre-alpine as runtime
WORKDIR /app
RUN addgroup -g 1000 worker && \
adduser -u 1000 -G worker -s /bin/sh -D worker
COPY --from=build --chown=worker:worker /app/target/*.jar ./main.jar
USER worker:worker
ENV PROFILE=${PROFILE}
EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "main.jar"]
```
# Docusaurus
Source: https://cloudtype.mintlify.app/ko/developers/docusaurus
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* Docusaurus 버전별 필요 Node 사양
* Docusaurus 2: 16.14 이상
* Docusaurus 1: 10.9 이상
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
### Gatsby 버전
* Docusaurus 2와 Docusaurus 1은 필요로 하는 Node 버전 및 기타 설정이 다를 수 있습니다. 공식문서를 참고하여 배포에 필요한 설정을 확인해주세요.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/docusaurus.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `docusaurus` 를 검색하고 `Docusaurus` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Docusaurus
```yaml theme={null}
name: docusaurus
app: web
options:
docbase: /build
nodeversion: 16
spa: true
context:
git:
url: https://github.com/cloudtype-examples/docusaurus.git
branch: main
preset: docusaurus
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
* [Node로 서버를 구동했는데 permission denied 0.0.0.0:80 에러가 발생하면서 서비스에 접근이 되지 않습니다.](/ko/troubleshooting/node)
### 공식문서
* [Docusaurus Docs](https://docusaurus.io/docs/installation)
* [Docusaurus Docs](https://v1.docusaurus.io/)
# 도메인 연결
Source: https://cloudtype.mintlify.app/ko/developers/domain
> cloudtype은 커스텀 도메인 연결을 위해 CNAME과 APEX 도메인 레코드를 지원합니다. 도메인 설정 방법은 사용 중인 도메인 제공업체에 따라 다르며, 본 가이드에서는 [AWS Route 53](https://aws.amazon.com/ko/route53/)과 [Cloudflare](https://www.cloudflare.com)를 통해 관리되는 도메인 설정 방법을 다룹니다.
이외의 DNS 제공서비스의 경우, DNS 사업자마다 레코드 등록 방법 및 세부 설정이 상이하므로 보유하고 있는 도메인의 제공업체 가이드에서 **DNS 설정 > CNAME 설정 방법** 을 참고하세요.
cloudtype에서 배포된 서비스는 SSL 인증서가 자동으로 발급 및 적용됩니다. 프리뷰 URL뿐만 아니라 사용자가 연결한 커스텀 도메인에도 적용되며, 수동으로 SSL 설정을 할 필요가 없습니다.
***
## 도메인 연결 정보 조회
> 도메인을 연결하려는 **서비스 상세페이지의 연결탭**에서 `도메인 연결`을 클릭하세요. 연결하려는 도메인의 이름(예: `example.com` 또는 `www.example.com` 등)을 입력하면 DNS 설정에 필요한 CNAME, TXT 레코드 값을 조회할 수 있습니다.
## AWS Route 53
> 연결하려는 도메인의 Route 53 대시보드 Hosted Zones 항목에서 `Create record`를 클릭한 후, 레코드 값을 입력하세요.
* **Record Name** : cloudtype에서 설정한 도메인(예: `www.example.com`)의 프리픽스(예: `www`)
* **Record Type** : CNAME
* **Value** : cloudtype 에서 조회한 CNAME 레코드 값
> cloudtype 에 돌아와서 `인증하기`를 클릭하고 **도메인 인증이 성공**되면 `연결하기`를 클릭하는 것으로 도메인이 연결됩니다.
**연결된 도메인에 SSL 인증서가 자동으로 발급됩니다.** DNS 레코드 전파와 SSL 인증서 검증이 완료될 때까지 도메인 접속이 일시적으로 제한되거나 SSL 보안 경고가 표시될 수 있습니다.
"현재 DNS 설정값이 다릅니다. CNAME을 찾을 수 없습니다" 의 메시지는 입력된 레코드의 등록에 약간의 시간이 걸리기 때문에 나올 수 있는 오류 메시지 입니다. 잠시 후 인증하기를 다시 시도해 보세요.
## Cloudflare
### 서브도메인 연결하기
> cloudtype 에서 [CNAME 레코드 값을 조회](/ko/developers/domain#1)한 후, Cloudflare에서 구매한 도메인의 **DNS Records**메뉴에서 레코드를 추가하세요.
* **Type** : CNAME
* **Name** : cloudtype에서 설정한 도메인(예: `www.example.com`)의 프리픽스(예: `www`)
* **Target** : cloudtype 에서 조회한 CNAME 레코드 값
* **Proxy status** : DNS only(비활성화)
Proxy status가 **프록싱 됨** 상태인 경우, cloudtype이 자동화한 SSL인증서 발급 등의 도메인 규칙이 적용되지 않아 도메인이 연결되지 않습니다. **반드시 DNS only(비활성화) 상태로 정해주세요.**
> cloudtype에 돌아와서 `인증하기`를 클릭하고 **도메인 인증이 성공**되면 `연결하기`를 클릭하는 것으로 도메인이 연결됩니다.
**연결된 도메인에 SSL 인증서가 자동으로 발급됩니다.** DNS 레코드 전파와 SSL 인증서 검증이 완료될 때까지 도메인 접속이 일시적으로 제한되거나 SSL 보안 경고가 표시될 수 있습니다.
"현재 DNS 설정값이 다릅니다. CNAME을 찾을 수 없습니다" 의 메시지는 입력된 레코드의 등록에 약간의 시간이 걸리기 때문에 나올 수 있는 오류 메시지 입니다. 잠시 후 인증하기를 다시 시도해 보세요.
### 루트도메인 연결하기
> cloudtype의 도메인 연결 화면에서 **루트도메인**을 입력하고 CNAME, TXT 레코드 값을 확인하세요.
루트도메인을 연결하기 위해 2개의 레코드를 모두 등록해야합니다. 아래의 항목을 참고하세요.
> cloudtype에서 조회한 CNAME 레코드 값을 활용해, Cloudflare에서 구매한 도메인의 **DNS Records**메뉴에서 CNAME 레코드를 추가하세요.
* **Type** : CNAME
* **Name** : @
* **Target** : cloudtype 에서 조회한 CNAME 레코드값
* **Proxy status** : DNS only(비활성화)
**Name** 항목에 입력하는 **@** 기호는 루트도메인을 의미하는 Cloudflare의 규칙입니다. 공란으로 비우면 연결되지 않습니다.
Proxy status가 **프록싱 됨** 상태인 경우, cloudtype이 자동화한 SSL인증서 발급 등의 도메인 규칙이 적용되지 않아 도메인이 연결되지 않습니다. **반드시 DNS only(비활성화) 상태로 정해주세요.**
> cloudtype에서 조회한 TXT 레코드 값을 활용해, Cloudflare에서 구매한 도메인의 **DNS Records**메뉴에서 TXT 레코드를 추가하세요.
* **Type** : TXT
* **Name** : @
* **Content** : cloudtype 에서 조회한 TXT 레코드 값
**Name** 항목에 입력하는 **@** 기호는 루트도메인을 의미하는 Cloudflare의 규칙입니다. 공란으로 비우면 연결되지 않습니다.
> cloudtype에 돌아와서 `인증하기`를 클릭하고 **도메인 인증이 성공**되면 `연결하기`를 클릭하는 것으로 도메인이 연결됩니다.
**연결된 도메인에 SSL 인증서가 자동으로 발급됩니다.** DNS 레코드 전파와 SSL 인증서 검증이 완료될 때까지 도메인 접속이 일시적으로 제한되거나 SSL 보안 경고가 표시될 수 있습니다.
"현재 DNS 설정값이 다릅니다. CNAME을 찾을 수 없습니다" 의 메시지는 입력된 레코드의 등록에 약간의 시간이 걸리기 때문에 나올 수 있는 오류 메시지 입니다. 잠시 후 인증하기를 다시 시도해 보세요.
# .NET
Source: https://cloudtype.mintlify.app/ko/developers/dotnet
## 준비 및 확인사항
### 지원 .NET 버전
* **3, 5, 6**
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 .NET 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/dotnet.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `dotnet` 를 검색하고 `.NET` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### .NET
```yaml theme={null}
name: dotnet
app: dotnet
options:
env:
- name: ASPNETCORE_ENVIRONMENT
value: Development
- name: PORT
value: "5000"
ports: 5000
context:
git:
url: https://github.com/cloudtype-examples/dotnet.git
branch: main
preset: dotnet
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
### 공식문서
* [.NET Docs](https://learn.microsoft.com/ko-kr/dotnet/)
# 환경변수
Source: https://cloudtype.mintlify.app/ko/developers/env
> 배포 환경별로 시크릿을 저장하고 관리할 수 있습니다. 배포 설정 시 저장된 시크릿을 불러와 환경변수로 쉽게 적용할 수 있습니다.
## 시크릿 저장
> 배포환경 설정화면의 시크릿 항목에서 ENV파일을 Drag & Drop하거나, 아이콘을 클릭해 여러 개의 환경변수를 직접 입력할 수 있습니다.
ENV파일에서 환경변수 이름과 값이 등호(=) 로 구분된 내용이 입력되며, 확장자 이름과 상관없이 적용 가능합니다.
## 배포 과정에서 적용
> 배포창의 Environment variables 항목에서 ENV파일을 **Drag & Drop**하거나, 아이콘을 클릭해 여러 개의 환경변수를 직접 입력할 수 있으며, 를 클릭하면 미리 저장한 시크릿을 불러올 수 있습니다.
시크릿은 배포환경 단위로 저장됩니다. 시크릿이 조회되지 않는 경우, [서비스가 위치한 배포환경을 확인해보세요.](/ko/developers/environment#4-1)
## 배포 후 관리
> 서비스 설정화면의 배포 설정 항목에서 환경변수를 수정 또는 추가할 수 있으며, `배포하기`를 클릭하면 수정된 환경 변수를 적용한 배포과정이 진행됩니다.
## Yaml 설정에서 사용
> 대시보드가 아닌 CLI 혹은 CI 도구에서 서비스를 배포하는 데에 활용되는 yaml 예시입니다.
> 아래 코드와 같이 `secret(시크릿)` 속성을 사용합니다.
```yaml theme={null}
name: flask
app: python@3.9
options:
env:
- name: FLASK_ENV
secret: flask-env
- name: DB_PASSWORD
secret: mariadb-root-password
ports: 5000
start: gunicorn -b 0.0.0.0:5000 app:app
context:
git:
url: https://github.com/cloudtype-examples/flask.git
branch: main
preset: python-flask
```
> 만약 미리 저장한 환경변수 값이 아니라 배포시점에 직접 환경변수 값을 입력하는 경우, `value` 속성에 값을 작성해주어야 합니다.
```yaml theme={null}
name: flask
app: python@3.9
options:
env:
- name: FLASK_ENV
value: production
ports: 5000
start: gunicorn -b 0.0.0.0:5000 app:app
context:
git:
url: https://github.com/cloudtype-examples/flask.git
branch: main
preset: python-flask
```
# 배포환경
Source: https://cloudtype.mintlify.app/ko/developers/environment
> 배포환경 단위로 격리된 네트워크가 구성되며, 배포환경에서 아래의 설정 및 관리가 가능합니다.
> 같은 화면에 있는 서비스는 같은 배포환경에 속하며, 내부 연결 주소인 **서비스 이름과 포트번호로 통신**할 수 있습니다. 배포환경 별로 격리된 네트워크가 구성되기 때문에 방화벽 규칙 적용이 필요없고, 통신 지연 현상이 최소화됩니다.
자세한 내용은 [서비스 간 통신 페이지](/ko/developers/connect)를 참고하세요.
> 업무 단위로 사용되는 한 개 또는 여러 개의 배포환경(Dev, QA, Staging, Prod 등)을 하나의 프로젝트에서 관리할 수 있습니다.
선택한 배포환경에서 실행 중인 모든 서비스의 배포 설정이 포함된 YAML 파일을 다운로드하고, 새로운 배포환경에 드래그 앤 드롭 방식으로 적용할 수 있습니다.
관련한 가이드는 [배포환경 복제 페이지](/ko/developers/replication)를 참고하세요.
> 설정탭의 시크릿관리 항목에서 자주 사용하는 환경변수를 시크릿으로 저장해, **선택된 배포환경의 서비스에 적용**할 수 있습니다.
> 다른 배포환경, 프로젝트 또는 타 서비스 등 배포환경 외부에서 원격으로 접속할 수 있도록 TCP 외부 접속을 허용할 수 있습니다. 해당 설정을 켜게 되면, 모든 IP에 대해 접속이 허용되므로 보안에 유의해야합니다.
cloudtype의 스페이스, 프로젝트, 배포환경, 서비스 등 전체적인 구조에 관한 사항은 아래를 참고하세요.
> 스페이스는 [팀원을 초대](/ko/developers/space#%ED%8C%80%EC%9B%90-%EA%B4%80%EB%A6%AC)해 프로젝트를 공유할 수 있는 최상위의 작업 단위입니다. 구독한 리소스 범위에서 팀원이 자유롭게 프로젝트를 생성하고 관리할 수 있습니다.
> **프로젝트는 배포환경의 묶음으로 사용되는 표시명**입니다. 사용자의 관리 편의성을 위한 명칭이며, 업무 단위로 사용되는 한 개 또는 여러 개의 배포환경(Dev, QA, Staging, Prod 등)을 하나의 프로젝트에서 관리할 수 있습니다.
> 배포환경 단위로 격리된 네트워크가 구성되며, [같은 배포환경의 서비스 간에는 서비스명을 호스트네임으로 참조해 통신할 수 있습니다.](/ko/developers/connect#%EB%82%B4%EB%B6%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0) 자주 사용하는 환경변수 값은 배포환경 단위에서 [시크릿으로 저장해 관리 및 적용할 수 있습니다.](/ko/developers/env)
> 서비스 별로 [터미널을 통한 접근](/ko/developers/log)이 가능하고, [커스텀 도메인을 연결](/ko/developers/domain)할 수 있습니다. 서비스 배포에 관한 내용은 [배포하기 페이지](/ko/developers/deploy)를 참고하세요.
***
## 배포환경 생성
> [프로젝트 생성](/ko/developers/project#1) 시 `main` 을 이름으로 하는 배포환경이 동시에 생성됩니다.
프로젝트에 속하지 않은 배포환경을 단독으로 생성할 수 없습니다.
## 배포환경 정보
> 상단부는 선택된 배포환경이 속한 프로젝트 이름, 리소스 정보와 배포환경 셀렉터로 구성되어 있습니다. 하단부의 **정보 탭**에서 배포환경 내 서비스의 정보를 조회하고 관리할 수 있습니다.
> 구동 중인 서비스를 카드 형식으로 조회하고 관리할 수 있으며, 서비스 카드의 버튼을 통해 웹접속, 로그조회, 및 터미널 접속 등을 수행할 수 있습니다.
* **시작( ) / 중지( )** : 서비스 시작 및 중지
* **로그뷰/터미널( )** : 실행로그, 빌드로그 조회 또는 터미널 접속
* **저장소( )** : 소스 코드 저장소 접속
* **접속하기** : 할당된 도메인을 통한 서비스 접속 (웹 서비스)
* **주소복사** : TCP 접속을 위한 Host 및 Port 주소 복사 (데이터베이스)
* **사용자 프로필** : 해당 서비스를 배포한 사용자를 조회
* **프리티어** : [프리티어 리소스](/ko/developers/resource)로 배포된 서비스임을 표시
* **** : 새로운 서비스를 배포할 수 있는 배포창 오픈
* **서비스 상태** : 배포중, 빌드중, 실행중, 중지됨 등의 서비스 현재상태 표시
> 배포환경에 배포된 서비스 프리뷰 도메인, 커스텀 도메인과, 데이터베이스의 접속 주소를 조회할 수 있습니다.
시간이 지나면 이벤트가 더 이상 조회되지 않을 수 있습니다.
> 배포된 서비스에 의해 클러스터에서 발생한 이벤트를 조회할 수 있습니다.
시간이 지나면 이벤트가 더 이상 조회되지 않을 수 있습니다.
> 배포된 서비스에 의해 클러스터에서 발생한 이벤트를 조회할 수 있습니다.
시간이 지나면 이벤트가 더 이상 조회되지 않을 수 있습니다.
## 배포환경 추가
### 빈 배포환경으로 생성
> 우측 상단의 배포환경 셀렉터에서 **새 배포환경 생성**을 클릭한 후, **빈 배포환경으로 생성하기**를 선택하세요. 이름과 배포될 클러스터를 정한 후 `생성하기`를 클릭하면 새로운 배포환경이 생성됩니다.
### 배포환경을 복제하여 생성
> 서비스가 배포되어 있는 배포환경을 원본 배포환경으로 선택하면, 선택된 환경의 모든 서비스가 복제된 새로운 배포환경이 생성됩니다.
원본 배포환경을 복제하는 기능으로 개발 서버, 운영 서버, QA 서버환경을 간편하게 구축할 수 있습니다. 자동생성된 서비스는 중지 상태이며 **모두 시작** 기능으로 간편하게 실행할 수 있습니다.
배포환경 복제해 새로운 배포환경을 생성할 때, 기존 배포환경에 저장된 시크릿은 복제되지 않습니다. [시크릿 관리 페이지](/ko/developers/environment#%EC%8B%9C%ED%81%AC%EB%A6%BF-%EA%B4%80%EB%A6%AC)를 참고해 시크릿을 새로 저장해주세요.
## 배포환경 관리
### 배포환경 전환
> 우측 상단의 배포환경 셀렉터를 클릭하면 다른 배포환경으로 전환할 수 있습니다.
메인 배포환경을 제외한 배포환경은 고유의 컬러가 부여됩니다. 배포환경의 컬러로 배포 또는 수정할 서비스가 속할 배포환경을 확인하세요.
### YAML파일 다운로드 및 적용
> 배포된 모든 서비스의 배포 설정이 담긴 YAML 파일을 다운로드하고 새로운 배포환경에서 Drag & Drop 방식으로 적용할 수 있습니다.
YAML 형식의 배포 스크립트 파일을 활용하면 간편하게 프로젝트 전체를 복제 할 수 있습니다. 관련한 가이드는 [배포환경 복제 페이지](/ko/developers/replication)를 참고하세요.
### 기본 배포환경 설정
> 설정탭 배포환경 정보 메뉴에서 `기본 배포환경으로 지정` 버튼을 눌러 특정 배포환경을 기본 배포환경으로 설정할 수 있습니다. 프로젝트 패널 접속시 기본 배포환경으로 접속되기 때문에 **업데이트가 잦은 배포환경을 기본 배포환경으로 설정해 주세요.**
### 아웃바운드 IP 조회
> 설정탭 배포환경 정보 메뉴에서 클라우드타입의 아웃바운드 IP를 조회할 수 있습니다.
공용으로 사용되는 IP로 새로 컨테이너가 재생성되거나 프로젝트를 새로 생성해도 아웃바운드 IP는 항상 같으며 대시보드에 표시된 IP 중 하나가 사용됩니다. 외부서비스에 화이트리스트 IP로 등록할 경우, 대시보드에 표시되는 IP를 모두 등록해주세요.
### 배포환경 삭제
> 설정탭 최하단의 배포환경 삭제 항목에서 `배포환경 삭제하기`를 클릭하고 확인하면 배포환경이 삭제됩니다.
프로젝트 내에 배포환경이 한 개만 존재하는 경우 `프로젝트 삭제하기` 버튼으로 표시되며, 프로젝트와 함께 배포환경도 삭제됩니다.
## 시크릿 관리
> 설정탭의 시크릿관리 화면에서, 우측의 **** 아이콘을 클릭해 시크릿을 저장하면, **선택된 배포환경의 서비스에 환경변수로 활용**할 수 있습니다.
서비스 배포시 환경변수 적용에 관한 가이드는 [환경변수 관리 페이지](/ko/developers/env#2)를 참고하세요.
시크릿은 배포환경 단위로 저장 및 공유할 수 있습니다.
## 방화벽 설정
> 다른 배포환경, 프로젝트 또는 타 서비스 등 배포환경 외부에서 원격으로 접속할 수 있도록 TCP 외부 접속을 허용할 수 있습니다.
> 설정 메뉴 방화벽 관리 항목에서 해당 설정을 켜게 되면, 모든 IP에 대해 접속이 허용되므로 보안에 유의해야합니다.
프로젝트 외부 서비스 또는 로컬 컴퓨터와의 통신에 관한 가이드는 [서비스 간 통신 페이지](/ko/developers/connect)를 참고하세요.
# FastAPI
Source: https://cloudtype.mintlify.app/ko/developers/fastapi
> Python으로 작성된 FastAPI 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
* FastAPI는 **최소 3.7 버전의 Python**를 필요로 합니다.
프로젝트 설정 파일(requirements.txt 등)에 명시된 Python 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **FastAPI** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* **포트번호**: `8000`(기본값)
* **Start Command**: `uvicorn main:app --host=0.0.0.0 --port=8000`(기본값)
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
Start Command에 명령어 입력 시, uvicorn 실행의 인자는 다음을 참고하여 소스에 맞게 수정하여 입력합니다.
```
uvicorn main:app --host=0.0.0.0 --port=8000
# [예시]
# main.py에서 myapi=FastAPI()로 객체 할당
uvicorn main:myapi --host=0.0.0.0 --port=8000
```
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
* **Install command**: Python 패키지 설치 명령
* **Pre start Command**: Start Command 실행 전 사전에 수행되어야 할 명령
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[FastAPI Docs](https://fastapi.tiangolo.com/)
# 주요 기능
Source: https://cloudtype.mintlify.app/ko/developers/features
***
### 기본 기능
간편한 GitHub연동 및 **GitHub Actions를 통한 배포 자동화**
서비스 배포 시 HTTPS(TLS)인증서가 발급된 **프리뷰 URL** 자동생성
Node, React, DB, Dockerfile 등과 OpenClaw를 포함한 다양한 기본 APP / 템플릿 지원
### 관리 기능
배포로그와 실행로그 조회 및 터미널 접속
Rewrites 기능으로 Nginx 없이 리버스 프록시 적용
팀원을 초대해 권한을 부여하고, 협업하며 프로젝트 관리
배포설정 시 선택한 동시실행 수만큼 서비스 수평확장
Health Check를 통한 무중단 배포 지원
CNAME 방식으로 간편하게 커스텀 도메인 연결
공통으로 사용되는 환경변수를 암호화하여 관리
두 번의 클릭으로 이전 버전의 서비스로 복원
컨테이너 템플릿으로 간편하게 컨테이너 이미지 배포
SSH 방식의 인증으로 연결된 비공개 저장소의 코드 배포
# Flask
Source: https://cloudtype.mintlify.app/ko/developers/flask
> Python으로 작성된 Flask 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
* Flask는 **최소 3.7 버전의 Python**를 필요로 합니다.
프로젝트 설정 파일(requirements.txt 등)에 명시된 Python 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Flask** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* **포트번호**: `5000`(기본값)
* **Start Command**: `gunicorn -b 0.0.0.0:5000 app:app`(기본값)
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
Start Command에 명령어 입력 시, gunicorn 실행의 인자는 다음을 참고하여 소스에 맞게 수정하여 입력합니다.
```
gunicorn -b 0.0.0.0:5000 [Flask를 import 하여 어플리케이션을 실행하는 파일명]:app
# [예시]
# ale.py 에서 Flask를 import 하여 어플리케이션을 실행
gunicorn -b 0.0.0.0:5000 ale:app
```
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
* **Install command**: Python 패키지 설치 명령
* **Pre start Command**: Start Command 실행 전 사전에 수행되어야 할 명령
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[Flask Docs](https://flask.palletsprojects.com/en/2.3.x/)
# Gatsby
Source: https://cloudtype.mintlify.app/ko/developers/gatsby
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* Gatsby 버전별 필요 Node 사양
* Gatsby 5: 18 이상
* Gatsby 4: 14.15 이상
* Gatsby 3: 12.13 이상
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
### Gatsby 버전
* Vue 2와 Vue 3는 필요로 하는 Node 버전 및 기타 설정이 다를 수 있습니다. 공식문서를 참고하여 배포에 필요한 설정을 확인해주세요.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/gatsby.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `gatsby` 를 검색하고 `Gatsby` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Gatsby
```yaml theme={null}
name: gatsby
app: web
options:
docbase: /public
nodeversion: "16"
spa: true
context:
git:
url: https://github.com/cloudtype-examples/gatsby.git
branch: main
preset: gatsby
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
### 공식문서
* [Gatsby 5 Docs](https://www.gatsbyjs.com/docs/)
* [Gatsby 4 Docs](https://v4.gatsbyjs.com/docs/)
* [Gatsby 3 Docs](https://v3.gatsbyjs.com/docs/)
# GitHub Actions
Source: https://cloudtype.mintlify.app/ko/developers/githubactions
> 서비스 배포 시 [자동으로 생성되는 워크플로우 yml 파일](/ko/developers/githubactions#2-1-workflow)을 적용해 간편하게 배포자동화할 수 있습니다.
>
***
## 시크릿 설정
> 클라우드타입과 GitHub의 통신을 위한 시크릿 설정이 필요합니다.
> GitHub 계정 Settings의 Developer settings 화면에서 Personal access tokens 메뉴의 `Generate new token(classic)`을 클릭하세요.
> 이어지는 화면에서 **`repo`, `workflow`, `admin:public_key`** 권한을 부여하고 토큰을 생성하세요.
Expiration 설정 기간 만료시 workflow가 작동하지 않게됩니다.
> 생성된 토큰값을 보관하세요.
> 스페이스 설정화면의 **인증** 메뉴에서 `새로운 API 키 생성`을 클릭해 키를 생성하고 보관하세요.
> GitHub 저장소의 **Settings**화면 **Secrets and variables의 Actions**항목에서 `New repository secret`을 클릭하세요.
> **Name값에 주의**하며 2개의 Repository secret을 생성하세요.
| Name | Secret |
| ---------------- | ------------------------------------- |
| CLOUDTYPE\_TOKEN | cloudtype API key |
| GHP\_TOKEN | GitHub Personal Access Token |
## GitHub Actions 적용
### Workflow 파일 내용 조회
> Github Actions를 적용하려는 서비스 상세페이지의 **CLI**탭에서 Github Actions 항목의 코드를 복사하세요.
### Workflow 파일 생성
> 프로젝트의 루트 디렉토리에 **.github/workflows** 디렉토리를 생성하고 cloudtype에서 복사한 코드를 내용으로 하는 yaml 파일을 만들어주세요.
**.github/workflows**폴더는 약속된 경로이기 때문에 변경할 수 없지만 파일명은 자유롭게 설정할 수 있습니다.
## 액션 별 입력값
> GitHub Actions는 cloudtype 에서 저장소를 Pull 할 수 있도록 GitHub 저장소 Deploy Key 를 설정하는 **connect** 액션과 배포 설정을 cloudtype 에 전송하고 배포를 요청하는 **deploy** 액션으로 작동합니다
| 입력값(Inputs) | | 필수 / 기본값 |
| -------------------- | -------------------------------------- | ------------------------------------- |
| **token** | cloudtype API Key | 필수 |
| **ghtoken** | GitHub Personal Token | 필수 |
| **endpoint** | cloudtype API Endpoint | 필수 (https\://app.\[도메인]/api) |
| **scope** | 연결하려는 스페이스 이름 | 기본값 : API Key 사용자의 스페이스명 |
| **repo** | GitHub 저장소(형식 user/repo) | 기본값 : 현재 액션이 실행중인 저장소 |
| **readOnly** | 'true'로 설정 시 읽기전용 배포키 생성 | 기본값 : false |
| 입력값(Inputs) | | 필수 / 기본값 |
| ------------- | ------------------------ | ------------------------------------- |
| **token** | cloudtype API Key | 필수 |
| **endpoint** | cloudtype API Endpoint | 필수 (https\://app.\[도메인]/api) |
| **project** | 배포할 프로젝트 이름 | 필수 (스페이스/프로젝트) |
| **stage** | 배포할 배포환경 이름 | 기본값 : 프로젝트 내 기본 배포환경 |
| **allStages** | 'true'로 설정 시 모든 배포환경에 배포 | 기본값 : false |
| **repo** | GitHub 저장소(형식 user/repo) | 현재 액션이 실행중인 저장소 |
| **file** | 배포 설정파일의 저장소 위치 | 기본값 : .cloudtype/app.yaml |
| **json** | 배포 설정 JSON 텍스트 | - |
| **yaml** | 배포 설정 yaml 텍스트 | - |
**file, json, yaml** 입력값 중 1가지의 설정은 반드시 필요합니다.
## 활용
> 자동으로 생성된 workflow 파일을 서비스 설정에 맞게 수정해서 활용할 수 있습니다.
> **path**에 배포할 디렉토리를 설정할 수 있습니다.
```bash theme={null}
context:
git:
...
path: /pathname
```
> yaml 파일에 리소스에 관한 내용이 없는 경우, [대시보드에서 설정한 리소스 쿼터](/ko/developers/resource#2)를 반영합니다. yaml 파일로 리소스를 관리하려는 경우 **resources**에 `spot`, `cpu`, `memory`, `disk`, `replicas`를 설정해 적용할 수 있습니다.
```bash theme={null}
...
yaml: |
name: springboot-crud-example
app: java@17
resources:
spot: false
cpu: 1
memory: 1.5
replicas: 2
...
```
> [대시보드에서 환경 변수를 설정해서 배포](/ko/developers/env)한 경우, CLI탭의 workflow 파일 내용에 자동으로 반영됩니다. yaml 파일에 수동으로 적용하려는 경우 **options.env** 에 name과 value를 배열 형태로 설정해 적용할 수 있습니다.
```bash theme={null}
...
yaml: |
name: springboot-crud-example
app: java@17
options:
ports: 8080
env:
- name: JAVA_OPTS
value: -Xms256m -Xmx512m
- name: SPRING_PROFILES_ACTIVE
value: dev
...
```
프로젝트에 시크릿을 등록해둔 경우, value 값을 시크릿 이름으로 참조할 수 있습니다.
> **options.ports** 에서 콤마(,)로 포트를 구분하여 총 3개의 포트까지 설정 가능합니다.
```bash theme={null}
...
yaml: |
name: springboot-crud-example
app: java@17
options:
ports: 8080, 8081, 8082
...
```
# Go
Source: https://cloudtype.mintlify.app/ko/developers/golang
> Go 언어로 작성된 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
| Spring Boot 버전 | 지원하는 JDK 버전 |
| --------------- | ----------- |
| Spring Boot 3.x | JDK 17 이상 |
| Spring Boot 2.x | JDK 8 이상 |
프로젝트 설정 파일(pom.xml, build.gradle 등)에 명시된 JDK 버전과 배포 설정 시 선택한 JDK 버전이 일치하지 않으면 빌드 오류가 발생할 수 있습니다.
기본적으로 JAR 형태의 빌드 산출물 및 스크립트를 지원하며, WAR의 경우 Executable WAR에 한하여 지원합니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 Java 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하거나 [Git URL 탭에서 Git 저장소 URL을 입력하세요.](/ko/developers/private-repo)
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* [포트번호](/ko/developers/port)
* **Start Command**
* [Health Check](/ko/developers/zero-downtime-deployment)
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
* **Pre-built jar file path**: 사전에 빌드되어 저장소에 반영되어 있는 jar 파일 경로
* **Build Command**: gradle/maven 빌드 명령어
* **Include files in build**: 빌드 시 추가할 파일 혹은 디렉토리
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료 후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [온디맨드 리소스와 스팟 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 수 있는 vCPU 리소스의 최대값으로, '최소' 선택 시 0.1 vCPU로 설정됩니다.
* **메모리** : 서비스가 사용할 수 있는 메모리 리소스의 최대값
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
## 고급 설정 기능
### 저장소 내 Jar 파일 배포
* Spring Boot Jar 파일을 저장소에 반영하고 배포하는 경우, 배포 설정창의 **Pre-built jar file path** 필드에 각 빌드도구에 맞는 jar파일의 경로를 입력하고 배포를 진행합니다.
* **Gradle**: `build/libs/[프로젝트명].jar`
* **Maven**: `target/[프로젝트명].jar`
### 빌드 시 특정 리소스 경로 포함
* cloudtype 에서 Spring Boot 프로젝트를 배포하는 경우, 정적 리소스 위치로 `WebProperties.Resources`에 정의된 `/static` 등을 제외한 `src` 디렉토리의 파일은 빌드 시 포함되지 않습니다.
프로젝트에서 특정 경로의 리소를 참조하는 경우 배포 설정창의 **Include files in build** 필드에 해당 디렉토리 경로를 작성하고 배포하면 됩니다.
구분자 쉼표(`,`)를 사용하여 복수의 디렉토리를 포함시킬 수 있습니다.
### 멀티모듈 어플리케이션 배포
* 여러 개의 모듈로 이루어진 Spring Boot 어플리케이션을 배포하는 경우 몇 가지의 작업이 필요합니다.
간단한 예시를 통해 배포 방법을 안내드립니다.
```plain theme={null}
project-root/
├── build.gradle.kts
├── settings.gradle.kts
├── api/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── kotlin/
│ └── resources/
├── core/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── kotlin/
│ └── resources/
└── gradle/
└── wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
```
* `api`, `core` 모듈로 구성하고 `api`를 main class로 지정
* Spring Boot 템플릿 선택 후 다음의 설정 적용
* **Start command**: `java -jar api/build/libs/api-0.0.1-SNAPSHOT.jar`
* `java -jar`의 인수로 `/build/libs/-0.0.1-SNAPSHOT.jar`
* **Include files in build**: `core,api`
* 모듈의 디렉토리명을 쉼표로 구분하여 입력
***
[Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/html/index.html)
# GraphQL
Source: https://cloudtype.mintlify.app/ko/developers/graphql
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/express-graphql.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `graphql` 를 검색하고 `GraphQL` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 프로젝트를 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
### 4. GraphiQL 사용하기
* GraphQL 편집기인 **GraphiQL** 을 활성화하기 위해서는 Express 서버 구성시 다음의 내용을 작성해야 합니다.
```javascript theme={null}
app.use('/graphql', graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true,
}));
```
* 서비스가 배포된 후, 할당된 도메인에 `/graphql` 경로를 붙여 브라우저에서 접속하면 다음과 같이 GraphiQL이 실행되며, 쿼리를 직접 실행해보는 등의 작업을 수행할 수 있습니다.
Express에서 설정한 주소 규칙에 따라 경로는 달라질 수 있습니다.
***
## CLI 를 통한 생성
### 1. 사전준비
* 아래 가이드에 따라 CLI 를 설치하세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### GraphQL
```yaml theme={null}
name: express-graphql
app: node@16
options:
env:
- name: NODE_ENV
value: production
ports: 4000
context:
git:
url: https://github.com/cloudtype-examples/express-graphql.git
branch: main
preset: express-graphql
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
* [Node로 서버를 구동했는데 permission denied 0.0.0.0:80 에러가 발생하면서 서비스에 접근이 되지 않습니다.](/ko/troubleshooting/node)
### 공식문서
* [Node.js Docs](https://nodejs.org/en/docs/)
* [GraphQL Docs](https://graphql.org/learn/)
* [Express Docs](https://expressjs.com/en/guide/routing.html)
# Static HTML
Source: https://cloudtype.mintlify.app/ko/developers/html
빌드 과정 없이 정적 HTML 파일을 그대로 배포합니다.
저장소 루트(또는 아래 `docbase` 로 지정한 경로)에 **`index.html` 파일이 반드시 있어야 합니다.** 배포 전에 파일 유무를 확인하세요.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/html.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `html` 을 검색하고 `HTML` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우 세부 설정이 기본 설정과 다를 수 있습니다. 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Static HTML
```yaml theme={null}
name: html
app: web
options:
docbase: /
spa: false
context:
git:
url: https://github.com/cloudtype-examples/html.git
branch: main
preset: html
```
주요 설정 항목은 아래와 같습니다.
| 항목 | 설명 |
| ------------ | ----------------------------------------------------------------------------- |
| `docbase` | 정적 파일이 위치한 기준 경로. 저장소 루트면 `/`, 하위 폴더면 `/dist` 처럼 지정합니다 |
| `spa` | SPA 여부. `true` 면 존재하지 않는 경로 요청도 `index.html` 로 응답합니다. 정적 HTML 문서 묶음이면 `false` |
| `git.url` | 배포할 저장소 주소 |
| `git.branch` | 배포할 브랜치 |
| `preset` | `html` 프리셋 사용 |
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [HTML 파일이 GitHub 저장소에 있는데 도메인으로 접속하면 정상적으로 페이지가 로드되지 않아요.](/ko/troubleshooting/common)
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
# Jekyll
Source: https://cloudtype.mintlify.app/ko/developers/jekyll
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/jekyll.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `jekyll` 를 검색하고 `Jekyll` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Jekyll
```yaml theme={null}
name: jekyll
app: jekyll
options: {}
context:
git:
url: https://github.com/cloudtype-examples/jekyll.git
branch: main
preset: jekyll
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
### 공식문서
* [Jekyll Docs](https://jekyllrb-ko.github.io/)
# Laravel
Source: https://cloudtype.mintlify.app/ko/developers/laravel
## 준비 및 확인사항
### 지원 PHP 버전
* **7.3, 7.4, 8.0, 8.1, 8.2 (배포 시 자동 탐지)**
### Procfile 작성
* Laravel 서비스를 배포하기 위해서는 소스의 루트 위치에 `Procfile` 을 생성하고 다음의 내용을 작성한 후 원격 저장소에 반영해놓아야 합니다.
```plain theme={null}
web: vendor/bin/heroku-php-apache2 public/
```
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/laravel.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `laravel` 를 검색하고 `Laravel` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
* `APP_KEY`: Laravel 내부적으로 사용되는 APP\_KEY 값을 입력해주어야 합니다. Laravel 프로젝트가 위치한 경로에서 `php artisan key:generate` 명령을 수행하면 `.env` 파일에 APP\_KEY에 대한 값이 할당되며, 이 값을 배포 설정의 **APP\_KEY** 필드에 입력해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Laravel
```yaml theme={null}
name: laravel
app: php
options:
ports: 9000
env:
- name: APP_KEY
value: [APP_KEY 값]
- name: LOG_CHANNEL
value: errorlog
context:
git:
url: https://github.com/cloudtype-examples/laravel.git
branch: main
preset: laravel
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
### 공식문서
* [Laravel Docs](https://laravel.com/docs/10.x)
# 로그와 터미널
Source: https://cloudtype.mintlify.app/ko/developers/log
> 배포된 서비스를 대시보드의 터미널을 통해 접속할 수 있으며, 실행 로그 및 빌드 내역도 손쉽게 확인할 수 있습니다.
> 배포 과정이나 서비스 실행 중 오류가 발생한 경우, 배포 및 실행 로그를 확인하고 조치하세요.
서비스 카드 내의 터미널 아이콘, 서비스 상세화면 우측의 터미널 아이콘으로 해당 서비스의 로그를 확인하거나 터미널에 접속할 수 있습니다.
cloudtype은 VM이 아닌 컨테이너 방식으로 서비스를 구동하기 때문에 저장소 내 명세 파일을 통해 패키지 및 라이브러리를 설치해야 하며, 터미널을 통해 설치를 시도할 경우 정상적으로 동작하지 않을 수 있습니다.
데이터베이스 배포 및 사용 시, DB 콘솔/CLI로 터미널의 용도가 제한됩니다.
***
## 배포 로그
## 실행 로그
## 터미널
# MariaDB
Source: https://cloudtype.mintlify.app/ko/developers/mariadb
MariaDB 배포 가이드입니다.
ale에서 MariaDB를 배포하고, 관리 툴을 사용하여 TCP 방식으로 접속하는 가이드입니다.
본 문서에서는 DB 툴로 MySQL Workbench를 사용했으며, [여기](https://dev.mysql.com/downloads/workbench/)에서 다운로드 받을 수 있습니다.
ale에서 제공하는 데이터베이스는 동적 확장이나 자동 백업 등 매니지드 데이터베이스 기능을 지원하지 않습니다. 데이터 손실 및 기타 우발적인 데이터 관련 사고에 유의하세요.
## MariaDB
### MariaDB 배포하기
시작하기 페이지의 데이터베이스 카테고리 또는 ⌘ + K 를 사용하여 mariadb를 검색하고 MariaDB 템플릿을 클릭합니다.
**설정변경** 을 클릭하고 **Root Password** 설정 후 **배포하기** 를 클릭하여 배포를 진행합니다.
**Root Password** 를 별도로 설정하지 않으면 프로젝트 내부에 랜덤값의 암호가 `[서비스명]-root-password` 시크릿으로 설정됩니다.
생성된 시크릿을 활용하는 방법은 **[환경변수 설정](/ko/developers/env)** 가이드를 참고해주세요.
***
### 프로젝트 내부에서 서비스 간 통신하기
ale에서 배포된 데이터베이스는 생성된 주소와 포트를 통해 프로젝트 외부에서 TCP로 통신할 수 있는 방법 뿐만 아니라 배포환경 내부에서 서비스명을 호스트명으로 참조하는 기능을 지원하고 있습니다. 프로젝트 내부의 동일 배포환경에 데이터베이스 및 기타 서비스가 배포 되어있는 경우 보안 및 성능 측면에서 서비스명을 호스트명으로 하여 접속하는 방법을 권장합니다.
프로젝트 내부에서 호스트명으로 활용하고자 하는 값을 서비스 이름으로 입력하여 MariaDB를 배포합니다.
배포 후 상세페이지에 진입하여 도메인 탭을 클릭합니다.
도메인 항목에서 두 개의 호스트:포트 조합을 확인할 수 있으며, 각 역할은 다음과 같습니다.
* **`svc.xxx.cloudtype.app:[포트번호]`**
* 배포환경 외부 통신 전용이며, 별도의 TCP 접속 허용 설정 필요
* 포트는 데이터베이스 신규 배포 시마다 변경되며 고정 불가
* **`[서비스명]:[포트번호]`**
* 배포환경 내부에서 서비스 간 통신을 하는 데에 활용되며, 상기 이미지의 `mariadb-prod` 에 해당함
* 포트는 `3306` 으로 고정됨
***
### TCP 외부 접속 허용하기
프로젝트 패널 우측 상단부의 ⚙️ 아이콘을 클릭하고, 설정 하단의 방화벽 항목에서 **TCP 외부 접속 허용하기**을 활성화 한 후 **적용하기** 버튼을 클릭합니다.
설정이 정상적으로 적용되면 **`svc.xxx.cloudtype.app:[포트번호]`** 형식의 주소로 외부에서 접근이 가능해집니다.
TCP 외부 접속을 허용해야 하는 경우는 다음과 같습니다.
* ale의 다른 프로젝트에서 배포했거나 동일 프로젝트의 다른 배포환경에서 배포한 서비스에서 접근하는 경우
* 로컬 환경에서 개발 중인 서비스를 테스트 하기 위해 접근이 필요한 경우
* 로컬 환경의 DB 툴을 활용해 접근하는 경우
TCP 접속 허용 설정은 배포환경 내에 배포된 서비스 전체에 적용되며, 서비스 개별 설정은 불가합니다.
***
### MySQL Workbench와 연결하기
MySQL Workbench를 실행한 후 도메인 탭에서 확인한 호스트명, 포트 번호 및 계정 정보를 아래와 같이 입력하면 ale에서 배포한 MariaDB와 연결이 완료됩니다.
접속이 되지 않는 경우 TCP 외부 접속 설정을 확인해주세요.
MySQL Workbench 이외에도 DataGrip, Dbeaver, phpMyAdmin 등 다양한 DB 툴을 사용하여 접속할 수 있습니다.
# MongoDB
Source: https://cloudtype.mintlify.app/ko/developers/mongo
ale에서 MongoDB를 배포하고, 관리 툴을 사용하여 TCP 방식으로 접속하는 가이드입니다.
본 문서에서는 DB 툴로 MongoDB Compass를 사용했으며, [여기](https://www.mongodb.com/try/download/compass)에서 다운로드 받을 수 있습니다.
ale에서 제공하는 데이터베이스는 동적 확장이나 자동 백업 등 매니지드 데이터베이스 기능을 지원하지 않습니다. 데이터 손실 및 기타 우발적인 데이터 관련 사고에 유의하세요.
## MongoDB
### MongoDB 배포하기
시작하기 페이지의 데이터베이스 카테고리 또는 ⌘ + K 를 사용하여 mongo를 검색하고 MongoDB 템플릿을 클릭합니다.
**설정변경** 을 클릭하고 **Root Password** 설정 후 **배포하기** 를 클릭하여 배포를 진행합니다.
**Root Password** 를 별도로 설정하지 않으면 프로젝트 내부에 랜덤값의 암호가 `[서비스명]-root-password` 시크릿으로 설정됩니다.
생성된 시크릿을 활용하는 방법은 **[환경변수 설정](/ko/developers/env)** 가이드를 참고해주세요.
***
### 프로젝트 내부에서 서비스 간 통신하기
ale에서 배포된 데이터베이스는 생성된 주소와 포트를 통해 프로젝트 외부에서 TCP로 통신할 수 있는 방법 뿐만 아니라 배포환경 내부에서 서비스명을 호스트명으로 참조하는 기능을 지원하고 있습니다. 프로젝트 내부의 동일 배포환경에 데이터베이스 및 기타 서비스가 배포 되어있는 경우 보안 및 성능 측면에서 서비스명을 호스트명으로 하여 접속하는 방법을 권장합니다.
프로젝트 내부에서 호스트명으로 활용하고자 하는 값을 서비스 이름으로 입력하여 MongoDB를 배포합니다.
배포 후 상세페이지에 진입하여 도메인 탭을 클릭합니다.
도메인 항목에서 두 개의 호스트:포트 조합을 확인할 수 있으며, 각 역할은 다음과 같습니다.
* **`svc.xxx.cloudtype.app:[포트번호]`**
* 배포환경 외부 통신 전용이며, 별도의 TCP 접속 허용 설정 필요
* 포트는 데이터베이스 신규 배포 시마다 변경되며 고정 불가
* **`[서비스명]:[포트번호]`**
* 배포환경 내부에서 서비스 간 통신을 하는 데에 활용되며, 상기 이미지의 `mongo-prod` 에 해당함
* 포트는 `27017` 으로 고정됨
***
### TCP 외부 접속 허용하기
프로젝트 패널 우측 상단부의 ⚙️ 아이콘을 클릭하고, 설정 하단의 방화벽 항목에서 **TCP 외부 접속 허용하기**을 활성화 한 후 **적용하기** 버튼을 클릭합니다.
설정이 정상적으로 적용되면 **`svc.xxx.cloudtype.app:[포트번호]`** 형식의 주소로 외부에서 접근이 가능해집니다.
TCP 외부 접속을 허용해야 하는 경우는 다음과 같습니다.
* ale의 다른 프로젝트에서 배포했거나 동일 프로젝트의 다른 배포환경에서 배포한 서비스에서 접근하는 경우
* 로컬 환경에서 개발 중인 서비스를 테스트 하기 위해 접근이 필요한 경우
* 로컬 환경의 DB 툴을 활용해 접근하는 경우
TCP 접속 허용 설정은 배포환경 내에 배포된 서비스 전체에 적용되며, 서비스 개별 설정은 불가합니다.
***
### MongoDB Compass와 연결하기
MongoDB Compass를 실행한 후 **New Connection** 버튼을 클릭하고 **General** 탭의 Host에 외부 접속용 `호스트명:포트`를 입력합니다.
**Authentication** 으로 이동하여 MongoDB 배포시 설정했던 **Username**과 **Password**를 입력하고 **Connect** 버튼을 누릅니다.
접속이 되지 않는 경우 TCP 외부 접속 설정을 확인해주세요.
# Nest.js
Source: https://cloudtype.mintlify.app/ko/developers/nestjs
> Nest.js 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
* **8, 10, 12, 14, 16, 18, 20**
* Nest.js는 **최소 12 버전의 Node.js** 를 필요로 하며, 13 버전은 사용할 수 없습니다.
프로젝트 설정 파일(package.json, .nvmrc 등)에 명시된 Node.js 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Nest.js** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* **포트번호**: `3000`(기본값)
* **Install Command**: npm/yarn 패키지 설치 명령어
* **Build Command**: npm/yarn 빌드 명령어
* **Start Command**: node 실행 명령어
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
* **.npmrc**: npm 패키지 레지스트리 경로, 프록시 등 설정
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[Nest.js Docs](https://docs.nestjs.com/)
# Next.js
Source: https://cloudtype.mintlify.app/ko/developers/nextjs
> Next.js 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
\-- **8, 10, 12, 14, 16, 18, 20**
프로젝트 설정 파일(package.json, .nvmrc 등)에 명시된 Node.js 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
Next.js 어플리케이션을 배포하는 경우 빌드 시점에 외부의 값을 주입하는 것과 런타임 시점에 값을 참조하는 경우를 구분하여 빌드인자 혹은 환경변수를 세팅해야 합니다.
* **빌드인자(Build Arguments):** 빌드 시 인자의 값을 주입
* **환경변수(Environment Variables):** 런타임 시점에 값을 참조
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Next.js** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* **포트번호**
* **Install Command**: npm/yarn 패키지 설치 명령어
* **Build Command**: npm/yarn 빌드 명령어
* **Start Command**: node 실행 명령어
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Output Directory**: 빌드 산출물 디렉터리
* **Include files in build**: 프로젝트 빌드 시 필요한 파일 혹은 디렉터리 경로
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
* **.npmrc**: npm 패키지 레지스트리 경로, 프록시 등 설정
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[Next.js Docs](https://nextjs.org/docs/getting-started)
# Vanilla app
Source: https://cloudtype.mintlify.app/ko/developers/node
> Node.js 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
* **8, 10, 12, 14, 16, 18, 20**
프로젝트 설정 파일(package.json, .nvmrc 등)에 명시된 Node.js 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Node.js** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* **포트번호**: `3000`(기본값)
* **Install Command**: npm/yarn 패키지 설치 명령어
* **Build Command**: npm/yarn 빌드 명령어
* **Start Command**: node 실행 명령어
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
* **.npmrc**: npm 패키지 레지스트리 경로, 프록시 등 설정
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[Node.js Docs](https://nodejs.org/en/docs)
# Nuxt.js
Source: https://cloudtype.mintlify.app/ko/developers/nuxtjs
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* Nuxt.js 버전별 필요 Node 사양
* Nuxt 2: 14 이상
* Nuxt 3: 16.11 이상
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
### 빌드인자 및 환경변수 설정
Next.js 어플리케이션을 배포하는 경우 빌드 시점에 외부의 값을 주입하는 것과 런타임 시점에 값을 참조하는 경우를 구분하여 빌드인자 혹은 환경변수를 세팅해야 합니다.
* **빌드인자(Build Arguments):** 빌드 시 인자의 값이 주입
* **환경변수(Environment Variables):** 런타임 시점에 값을 참조
### Nuxt.js 버전 확인
* Nuxt 2와 Nuxt 3는 필요로 하는 Node / Vue 버전 및 기타 설정이 다를 수 있습니다. 공식문서를 참고하여 배포에 필요한 설정을 확인해주세요.
### IP Binding
* **Nuxt 2**의 경우 기본 Host가 `localhost`로 설정되어 있습니다. 해당 설정으로 배포를 하게되면 외부에서 해당 서비스에 접근할 수 없으므로 `nuxt.config.js`에 다음과 같은 설정 추가가 필요합니다.
```javascript theme={null}
export default {
server: {
host: '0.0.0.0' // default: localhost
}
}
```
* **Nuxt 3**의 경우 기본 Host가 `0.0.0.0`으로 설정되어 있기 때문에 배포를 위한 설정 추가/변경이 필요하지 않습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/nuxtjs.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `Nuxt` 를 검색하고 `Nuxt.js` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Nuxt.js
```yaml theme={null}
name: nuxtjs
app: node@16
options:
env:
- name: NODE_ENV
value: production
ports: 3000
build: yarn build
context:
git:
url: https://github.com/cloudtype-examples/nuxtjs.git
branch: main
preset: nuxt.js
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
* [Node로 서버를 구동했는데 permission denied 0.0.0.0:80 에러가 발생하면서 서비스에 접근이 되지 않습니다.](/ko/troubleshooting/node)
### 공식문서
* [Nuxt 3 Docs](https://nuxt.com/docs/getting-started/introduction)
* [Nuxt 2 Docs](https://nuxtjs.org/docs/get-started/installation)
# OpenClaw
Source: https://cloudtype.mintlify.app/ko/developers/openclaw
## 템플릿 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서, openclaw 템플릿을 검색하고 선택하세요.
## 배포하기
> 리소스를 설정하고 `배포하기` 버튼을 클릭하세요.
더 많은 옵션을 클릭하면, 환경 변수 주입, 게이트웨이 토큰 설정, API expose 등을 설정할 수 있습니다.
## 접속과 온보딩
> '접속하기' 버튼을 클릭하고 게이트웨이 토큰 값을 입력하면, 오픈클로 온보딩 과정을 진행할 수 있습니다.
게이트웨이 토큰은 아래의 이미지처럼 프로젝트 설정탭의 시크릿 항목에서 조회할 수 있습니다. **배포과정에서 설정하지 않은 경우 난수로 자동 설정됩니다.**
## 환경 변수 추가 등 설정변경
> 서비스 상세페이지의 설정탭에서 vCPU, 메모리 등의 리소스를 변경하거나, 더 많은 옵션을 클릭해서 환경 변수를 주입할 수 있습니다.
설정 변경 후, 하단의 배포하기 버튼으로 재배포해야 변경된 설정이 적용됩니다.
AI 모델에 따라 민감한 정보는 환경 변수로 주입해달라고 요청하는 경우가 많습니다. 이러할 경우 위의 방식으로 환경 변수를 추가할 수 있습니다.
# PHP
Source: https://cloudtype.mintlify.app/ko/developers/php
> PHP 언어로 작성된 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
| Spring Boot 버전 | 지원하는 JDK 버전 |
| --------------- | ----------- |
| Spring Boot 3.x | JDK 17 이상 |
| Spring Boot 2.x | JDK 8 이상 |
프로젝트 설정 파일(pom.xml, build.gradle 등)에 명시된 JDK 버전과 배포 설정 시 선택한 JDK 버전이 일치하지 않으면 빌드 오류가 발생할 수 있습니다.
기본적으로 JAR 형태의 빌드 산출물 및 스크립트를 지원하며, WAR의 경우 Executable WAR에 한하여 지원합니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 Java 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하거나 [Git URL 탭에서 Git 저장소 URL을 입력하세요.](/ko/developers/private-repo)
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* [포트번호](/ko/developers/port)
* **Start Command**
* [Health Check](/ko/developers/zero-downtime-deployment)
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
* **Pre-built jar file path**: 사전에 빌드되어 저장소에 반영되어 있는 jar 파일 경로
* **Build Command**: gradle/maven 빌드 명령어
* **Include files in build**: 빌드 시 추가할 파일 혹은 디렉토리
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료 후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [온디맨드 리소스와 스팟 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 수 있는 vCPU 리소스의 최대값으로, '최소' 선택 시 0.1 vCPU로 설정됩니다.
* **메모리** : 서비스가 사용할 수 있는 메모리 리소스의 최대값
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
## 고급 설정 기능
### 저장소 내 Jar 파일 배포
* Spring Boot Jar 파일을 저장소에 반영하고 배포하는 경우, 배포 설정창의 **Pre-built jar file path** 필드에 각 빌드도구에 맞는 jar파일의 경로를 입력하고 배포를 진행합니다.
* **Gradle**: `build/libs/[프로젝트명].jar`
* **Maven**: `target/[프로젝트명].jar`
### 빌드 시 특정 리소스 경로 포함
* cloudtype 에서 Spring Boot 프로젝트를 배포하는 경우, 정적 리소스 위치로 `WebProperties.Resources`에 정의된 `/static` 등을 제외한 `src` 디렉토리의 파일은 빌드 시 포함되지 않습니다.
프로젝트에서 특정 경로의 리소를 참조하는 경우 배포 설정창의 **Include files in build** 필드에 해당 디렉토리 경로를 작성하고 배포하면 됩니다.
구분자 쉼표(`,`)를 사용하여 복수의 디렉토리를 포함시킬 수 있습니다.
### 멀티모듈 어플리케이션 배포
* 여러 개의 모듈로 이루어진 Spring Boot 어플리케이션을 배포하는 경우 몇 가지의 작업이 필요합니다.
간단한 예시를 통해 배포 방법을 안내드립니다.
```plain theme={null}
project-root/
├── build.gradle.kts
├── settings.gradle.kts
├── api/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── kotlin/
│ └── resources/
├── core/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── kotlin/
│ └── resources/
└── gradle/
└── wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
```
* `api`, `core` 모듈로 구성하고 `api`를 main class로 지정
* Spring Boot 템플릿 선택 후 다음의 설정 적용
* **Start command**: `java -jar api/build/libs/api-0.0.1-SNAPSHOT.jar`
* `java -jar`의 인수로 `/build/libs/-0.0.1-SNAPSHOT.jar`
* **Include files in build**: `core,api`
* 모듈의 디렉토리명을 쉼표로 구분하여 입력
***
[Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/html/index.html)
# 포트 설정
Source: https://cloudtype.mintlify.app/ko/developers/port
> 서비스 배포 시 구성 및 용도에 따라 특정 포트를 설정할 수 있으며,
> 포트 번호를 설정하지 않아도 되는 경우에는 공란으로 두고 배포할 수 있습니다.
포트를 올바르게 설정하지 않으면 배포된 서비스에 접근이 불가하므로 주의해야 합니다.
***
## 포트 설정
> 배포 설정 창의 **Port** 필드에 설정하고자 하는 포트 번호를 입력하세요.
> 이 때, 포트번호는 소스 코드 혹은 환경변수의 설정과 일치해야 하며,
> 프레임워크에 설정된 기본값을 사용하는 경우 이를 확인하여 설정을 적용해야 합니다.
포트 번호를 지정하지 않으면 포트가 노출되지 않은 상태로 서비스가 배포됩니다. 이 경우 서비스에 대한 외부 접근이 불가능하며, 헬스 체크나 모니터링 기능이 정상적으로 동작하지 않을 수 있습니다. 네트워크 통신이 필요한 서비스라면 반드시 적절한 포트를 지정해주세요.
디스코드 봇과 같은 서비스는 별도의 포트번호를 설정하지 않는 경우가 대부분입니다.
이러한 경우 배포설정 시 Port 항목을 공란으로 두어야 하며,
임의의 포트번호가 입력되어 설정이 적용되면 `시작중` 상태에서 더 이상 진행되지 않다가 오류상태로 바뀝니다.
## 포트 수정
> 포트 번호에 변화가 있거나, 포트 번호를 잘못 입력한 경우, 서비스 상세페이지의 설정화면에서 **Port** 필드에 설정하고자 하는 포트번호를 입력하고 `배포하기`를 클릭하면, 새로 입력한 포트가 적용된 서비스가 배포됩니다.
포트번호가 잘못 설정된 경우 해당 서비스는 정상적으로 실행되지 않고
할당된 도메인 접속 시 503 에러가 발생합니다.
# PostgreSQL
Source: https://cloudtype.mintlify.app/ko/developers/postgres
ale에서 PostgreSQL을 배포하고, 관리 툴을 사용하여 TCP 방식으로 접속하는 가이드입니다.
본 문서에서는 DB 툴로 pgAdmin를 사용했으며, [여기](https://www.pgadmin.org/download/)에서 다운로드 받을 수 있습니다.
ale에서 제공하는 데이터베이스는 동적 확장이나 자동 백업 등 매니지드 데이터베이스 기능을 지원하지 않습니다. 데이터 손실 및 기타 우발적인 데이터 관련 사고에 유의하세요.
## PostgreSQL
### PostgreSQL 배포하기
시작하기 페이지의 데이터베이스 카테고리 또는 ⌘ + K 를 사용하여 postgres를 검색하고 PostgreSQL 템플릿을 클릭합니다.
**설정변경** 을 클릭하고 **Root Password** 설정 후 **배포하기** 를 클릭하여 배포를 진행합니다.
**Root Password** 를 별도로 설정하지 않으면 프로젝트 내부에 랜덤값의 암호가 `[서비스명]-root-password` 시크릿으로 설정됩니다.
생성된 시크릿을 활용하는 방법은 **[환경변수 설정](/ko/developers/env)** 가이드를 참고해주세요.
***
### 프로젝트 내부에서 서비스 간 통신하기
ale에서 배포된 데이터베이스는 생성된 주소와 포트를 통해 프로젝트 외부에서 TCP로 통신할 수 있는 방법 뿐만 아니라 배포환경 내부에서 서비스명을 호스트명으로 참조하는 기능을 지원하고 있습니다. 프로젝트 내부의 동일 배포환경에 데이터베이스 및 기타 서비스가 배포 되어있는 경우 보안 및 성능 측면에서 서비스명을 호스트명으로 하여 접속하는 방법을 권장합니다.
프로젝트 내부에서 호스트명으로 활용하고자 하는 값을 서비스 이름으로 입력하여 PostgreSQL를 배포합니다.
배포 후 상세페이지에 진입하여 도메인 탭을 클릭합니다.
도메인 항목에서 두 개의 호스트:포트 조합을 확인할 수 있으며, 각 역할은 다음과 같습니다.
* **`svc.xxx.cloudtype.app:[포트번호]`**
* 배포환경 외부 통신 전용이며, 별도의 TCP 접속 허용 설정 필요
* 포트는 데이터베이스 신규 배포 시마다 변경되며 고정 불가
* **`[서비스명]:[포트번호]`**
* 배포환경 내부에서 서비스 간 통신을 하는 데에 활용되며, 상기 이미지의 `postgresql-prod` 에 해당함
* 포트는 `5432` 으로 고정됨
***
### TCP 외부 접속 허용하기
프로젝트 패널 우측 상단부의 ⚙️ 아이콘을 클릭하고, 설정 하단의 방화벽 항목에서 **TCP 외부 접속 허용하기**을 활성화 한 후 **적용하기** 버튼을 클릭합니다.
설정이 정상적으로 적용되면 **`svc.xxx.cloudtype.app:[포트번호]`** 형식의 주소로 외부에서 접근이 가능해집니다.
TCP 외부 접속을 허용해야 하는 경우는 다음과 같습니다.
* ale의 다른 프로젝트에서 배포했거나 동일 프로젝트의 다른 배포환경에서 배포한 서비스에서 접근하는 경우
* 로컬 환경에서 개발 중인 서비스를 테스트 하기 위해 접근이 필요한 경우
* 로컬 환경의 DB 툴을 활용해 접근하는 경우
TCP 접속 허용 설정은 배포환경 내에 배포된 서비스 전체에 적용되며, 서비스 개별 설정은 불가합니다.
***
### pgAdmin과 연결하기
pgAdmin을 실행한 후 도메인 탭에서 확인한 호스트명, 포트 번호 및 계정 정보를 아래와 같이 입력하면 ale에서 배포한 PostgreSQL과 연결이 완료됩니다.
접속이 되지 않는 경우 TCP 외부 접속 설정을 확인해주세요.
pgAdmin 이외에도 DataGrip, Dbeaver 등 다양한 DB 툴을 사용하여 접속할 수 있습니다.
# Prisma
Source: https://cloudtype.mintlify.app/ko/developers/prisma
* 본 예시에서는 TypeScript 기반의 ORM인 Prisma와 Next.js(v13)를 연동하여 클라우드타입에서 배포하는 과정을 다루고 있습니다.
기타 프레임워크 연동 및 각종 설정 등은 Prisma 공식 문서를 참고해주세요.
* [🔗 Prisma Docs](https://www.prisma.io/docs)
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* Prisma는 \*\*최소 14.17.0 버전의 Node\*\*를 필요로 합니다.
* Next.js는 \*\*최소 14.6.0 버전의 Node\*\*를 필요로 합니다.
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
### 빌드인자 및 환경변수 설정
Next.js 어플리케이션을 배포하는 경우 빌드 시점에 외부의 값을 주입하는 것과 런타임 시점에 값을 참조하는 경우를 구분하여 빌드인자 혹은 환경변수를 세팅해야 합니다.
* **빌드인자(Build Arguments):** 빌드 시 인자의 값이 주입
* **환경변수(Environment Variables):** 런타임 시점에 값을 참조
### package.json 세팅
```json theme={null}
{
"name": "next-prisma",
"version": "1.0.0",
"description": "",
"keywords": [],
"license": "MIT",
"author": "",
"main": "index.js",
"scripts": {
"dev": "next",
"build": "prisma generate && prisma migrate deploy && prisma db seed && next build",
"start": "concurrently \"next start\" \"npx prisma studio\"",
"studio": "npx prisma studio"
},
"dependencies": {
"@prisma/client": "^4.11.0",
"next": "^13.0.0",
"react": "^18.0.0",
"react-dom": "^18.0.0",
"react-markdown": "^8.0.0"
},
"devDependencies": {
"concurrently": "^7.6.0",
"prisma": "^4.11.0"
},
"prisma": {
"seed": "node prisma/seed.js"
}
}
```
* Prisma를 어플리케이션과 연동하여 클라우드타입에 배포하기 위해서는 `package.json` 의 npm script가 알맞게 작성되어 있어야 합니다.
Prisma의 경우 데이터베이스 스키마 마이그레이션이 어플리케이션 빌드 과정 중에 수행되기 때문에 올바르지 않은 Build 스크립트 작성 시 정상적으로 구동되지 않을 수 있으며, 배포 시 `package.json`에서 정의한 내용에 따라 Build Command 필드에 알맞은 값을 입력해주어야 어플리케이션이 정상적으로 동작합니다.
* Prisma는 [Prisma Studio](https://www.prisma.io/docs/concepts/components/prisma-studio) 라는 툴을 통해 데이터베이스의 데이터를 조회 및 조작할 수 있는 기능을 제공하고 있습니다.
이 기능을 사용하시려면 어플리케이션이 배포되는 포트 뿐만 아니라 Prisma Studio가 서비스되는 `5555` 포트를 배포 시에 반드시 추가해주어야 합니다.
Next.js 어플리케이션과 Prisma Studio를 동시에 서비스 하기 위해 예제에서는 npm 패키지인 [concurrently](https://github.com/open-cli-tools/concurrently) 가 사용되었습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/next-prisma.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `prisma` 를 검색하고 `Prisma(Next 13)` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 프로젝트를 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Prisma + Next.js
```yaml theme={null}
name: next-prisma
app: node@16
options:
env:
- name: NODE_ENV
value: production
ports: 3000
build: yarn build
context:
git:
url: https://github.com/cloudtype-examples/next-prisma.git
branch: main
preset: next-prisma
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
* [Node로 서버를 구동했는데 permission denied 0.0.0.0:80 에러가 발생하면서 서비스에 접근이 되지 않습니다.](/ko/troubleshooting/node)
### 공식문서
* [Prisma Docs](https://www.prisma.io/docs)
* [Next.js Docs](https://nextjs.org/docs/getting-started)
# 비공개 Git 저장소 배포
Source: https://cloudtype.mintlify.app/ko/developers/private-repo
> cloudtype은 GitHub 뿐만 아니라 GitLab, Bitbucket 등에 반영된 비공개 저장소의 코드도 배포할 수 있도록 SSH 방식의 인증을 지원합니다.
***
## 배포키 조회
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Git 저장소 배포하기**를 선택한 후, Git URL 탭에서 배포할 저장소의 **Git URL(SSH)** 을 입력하면 **배포키(Deploy Key)** 를 조회할 수 있습니다.
## 배포키 등록
### GitHub
> 배포하려는 저장소의 **Settings > Deploy keys** 화면 우측 상단의 `Add deploy key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
### GitLab
> 배포하려는 저장소의 **Settings > Repository** 화면에서 **Deploy keys** 항목의 `Expand`, `Add new key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
### Bitbucket
> 배포하려는 저장소의 **Repository settings > Access keys** 화면에서 `Add key`를 클릭한 후 cloudtype에서 조회한 배포키 값을 입력해 키를 추가합니다.
## 배포하기
### 언어/프레임웍 선택
> 배포할 저장소에 맞는 프리셋을 선택하세요.
React, vue 등과 같은 정적사이트의 경우 **Web Application**을 선택해주세요.
### 배포 설정과 배포
> 배포 설정 및 배포 과정은 [배포하기 페이지](/ko/developers/deploy#2)를 참고하세요.
# 프로젝트
Source: https://cloudtype.mintlify.app/ko/developers/project
> **프로젝트는 배포환경의 묶음으로 사용되는 표시명**입니다. 사용자의 관리 편의성을 위한 명칭이며, 업무 단위로 사용되는 한 개 또는 여러 개의 배포환경(Dev, QA, Staging, Prod 등)을 하나의 프로젝트에서 관리할 수 있습니다. 초기화면에서 프로젝트 이름을 제외한 모든 정보는 선택된 배포환경의 정보를 표시합니다.
본 가이드에서는 프로젝트 생성 및 삭제만 다룹니다. 설정탭에서는 선택된 배포환경에 관한 설정을 할 수 있으며, 자세한 내용은 [배포환경 관리 페이지](/ko/developers/environment)를 참고하세요.
프로젝트 생성시 `main` 을 이름으로 하는 배포환경이 동시에 생성되고, 상단 이미지는 프로젝트 내부의 `main` 배포환경에서 배포된 서비스를 보여주는 화면입니다. cloudtype의 스페이스, 프로젝트, 배포환경, 서비스 등 작업 단위에 관한 사항은 아래를 참고하세요.
> 스페이스는 [팀원을 초대](/ko/developers/space#%ED%8C%80%EC%9B%90-%EA%B4%80%EB%A6%AC)해 프로젝트를 공유할 수 있는 최상위의 작업 단위입니다. 구독한 리소스 범위에서 팀원이 자유롭게 프로젝트를 생성하고 관리할 수 있습니다.
> **프로젝트는 배포환경의 묶음으로 사용되는 표시명**입니다. 사용자의 관리 편의성을 위한 명칭이며, 업무 단위로 사용되는 한 개 또는 여러 개의 배포환경(Dev, QA, Staging, Prod 등)을 하나의 프로젝트에서 관리할 수 있습니다.
> 배포환경 단위로 격리된 네트워크가 구성되며, [같은 배포환경의 서비스 간에는 서비스명을 호스트네임으로 참조해 통신할 수 있습니다.](/ko/developers/connect#%EB%82%B4%EB%B6%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0) 자주 사용하는 환경변수 값은 배포환경 단위에서 [시크릿으로 저장해 관리 및 적용할 수 있습니다.](/ko/developers/env)
> 서비스 별로 [터미널을 통한 접근](/ko/developers/log)이 가능하고, [커스텀 도메인을 연결](/ko/developers/domain)할 수 있습니다. 서비스 배포에 관한 내용은 [배포하기 페이지](/ko/developers/deploy)를 참고하세요.
***
## 프로젝트 생성
> 사이드바의 프로젝트 항목에서 버튼을 누르고, 각 필드에 알맞는 프로젝트 정보를 입력하면 프로젝트가 생성됩니다.
* **스페이스** : 프로젝트가 속할 스페이스
* **프로젝트 이름** : 2 글자 이상, 20 글자 이하의 영문 소문자 및 숫자의 조합
* **표시 이름** : 사용자가 프로젝트를 식별하는 용도로 사용하는 이름이며, 영문, 숫자 뿐만 아니라 한글을 포함한 기타 언어의 문자 및 특수문자의 설정이 가능합니다.
프로젝트 생성시 `main`을 이름으로 하는 배포환경이 동시에 생성되고, 프로젝트 이름을 제외한 모든 정보는 `main` 배포환경의 정보를 표시합니다.
## 프로젝트 삭제
> 프로젝트 화면의 설정탭 하단부의 `프로젝트 삭제하기` 버튼으로 프로젝트 또는 배포환경을 삭제할 수 있습니다. 구동 중인 애플리케이션 및 관련 데이터가 모두 영구히 삭제되며, **중요한 데이터가 적재되어 있는 경우 사전에 백업을 진행하여야 합니다.**
하나의 프로젝트에 여러 개의 배포환경이 있는 경우, 해당 메뉴는 **배포환경 삭제**로 표시됩니다. 프로젝트에 한개의 배포환경만 남았을 때, 프로젝트 삭제가 가능합니다.
# Vanilla app
Source: https://cloudtype.mintlify.app/ko/developers/python
> Python으로 작성된 일반 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
| Django 버전 | 지원하는 Python 버전 |
| ---------- | -------------------------- |
| Django 3.1 | 3.6, 3.7, 3.8, 3.9 |
| Django 3.2 | 3.6, 3.7, 3.8, 3.9, 3.10 |
| Django 4.0 | 3.8, 3.9, 3.10 |
| Django 4.1 | 3.8, 3.9, 3.10, 3.11 |
| Django 4.2 | 3.8, 3.9, 3.10, 3.11, 3.12 |
| Django 5.0 | 3.10, 3.11, 3.12 |
| Django 5.1 | 3.10, 3.11, 3.12 |
프로젝트 설정 파일(requirements.txt 등)에 명시된 Python 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Python** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
Django의 경우 `settings.py` 에서 `ALLOWED_HOSTS`, `CSRF_TRUSTED_ORIGINS` 를 알맞게 설정해야 정상적으로 페이지가 로드됩니다.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* **포트번호**: `8000`(기본값)
* **Start Command**: `python3 manage.py runserver 0:8000`(기본값)
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
* **Install command**: Python 패키지 설치 명령
* **Pre start Command**: Start Command 실행 전 사전에 수행되어야 할 명령
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
환경변수와 Pre Start Command를 다음과 같이 세팅하면 Super User를 생성할 수 있습니다.
```
[환경변수]
DJANGO_SUPERUSER_USERNAME - Django 슈퍼유저 username
DJANGO_SUPERUSER_PASSWORD - Django 슈퍼유저 password
DJANGO_SUPERUSER_EMAIL - Django 슈퍼유저 email
[시작 명령 - Pre Start Command]
python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py createsuperuser --noinput
```
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[Django Docs](https://docs.djangoproject.com/)
# 빠른 시작
Source: https://cloudtype.mintlify.app/ko/developers/quickstart
**Node.js 배포하기**
***
## 사전준비
* [GitHub 계정](https://github.com/)
## 템플릿 선택
> 대시보드의 클릭 또는 `⌘ + K` 로 생성된 배포창에서 **Node.js** 템플릿을 선택하세요.
## 저장소 선택
> 이어지는 화면에서 `저장소 만들기` 버튼을 클릭하세요, 연동된 GitHub 계정에 Node.js 템플릿의 소스코드가 생성됩니다.
## 설정과 배포
> 기본 설정값을 변경하지 않고 하단부의 `배포하기`를 클릭하세요.
GitHub 계정의 저장소를 선택한 경우, 설정값 입력이 필요합니다. 배포 설정에 관한 자세한 내용은 [배포하기 페이지](/ko/developers/deploy#2)를 참고하세요.
## 배포된 서비스에 접속
> 배포가 완료된 후 우측의 `접속하기`를 클릭하면, https 인증서가 발급된 프리뷰 도메인으로 서비스에 접속할 수 있습니다.
# Ruby on Rails
Source: https://cloudtype.mintlify.app/ko/developers/rails
## 준비 및 확인사항
### 지원 Ruby 버전
* **2.5, 2.6, 2.7, 3.0, 3.1, 3.2**
* Rails 버전별 필요 Ruby 사양
* Rails 5.2.x: 2.5
* Rails 6.0.x: 2.6
* Rails 6.1.x: 3.0
* Rails 7.0.x: 3.1
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Ruby 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/ruby-on-rails.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `rails` 를 검색하고 `Ruby on Rails` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Ruby on Rails
```yaml theme={null}
name: ruby-on-rails
app: ruby@2.7
options:
env:
- name: RAILS_ENV
value: development
install: bundle install
ports: 3000
start: rails s -b 0.0.0.0 -p 3000
context:
git:
url: https://github.com/cloudtype-examples/ruby-on-rails.git
branch: main
preset: ruby-rails
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
### 공식문서
* [Ruby on Rails Docs](https://guides.rubyonrails.org/)
# React
Source: https://cloudtype.mintlify.app/ko/developers/react
> React 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
* **8, 10, 12, 14, 16, 18, 20**
프로젝트 설정 파일(package.json, .nvmrc 등)에 명시된 Node.js 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **React** 템플릿을 선택하세요.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **Build Variables**: React 프로젝트 빌드 시 포함되어야 하는 변수
* **Docbase**: 빌드 산출물 대상 디렉터리
* [Rewrites: 프록시를 위한 경로 및 URL](/ko/developers/reverseproxy)
* **Node.js 버전**
* **Build Command**: React 프로젝트 빌드 명령어
* **Single Page Application**: 싱글 페이지 앱 여부
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
* **Install command**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **.npmrc**: npm 패키지 레지스트리 경로, 프록시 등 설정
* **Index page**: index 페이지 파일명
cloudtype은 별도의 Nginx 서버 세팅없이, 배포설정 시 Rewrites 필드값 입력을 통해, 리버스 프록시가 작동하도록 하는 기능을 지원합니다. 자세한 내용은 [Reverse Proxy 페이지](/ko/developers/reverseproxy)를 참고하세요.
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[React Docs](https://ko.reactjs.org/docs/getting-started.html)
# Redis
Source: https://cloudtype.mintlify.app/ko/developers/redis
ale에서 Redis를 배포하고, 관리 툴을 사용하여 TCP 방식으로 접속하는 가이드입니다.
본 문서에서는 DB 툴로 Redis Insight를 사용했으며, [여기](https://redis.com/redis-enterprise/redis-insight)에서 다운로드 받을 수 있습니다.
ale에서 제공하는 데이터베이스는 동적 확장이나 자동 백업 등 매니지드 데이터베이스 기능을 지원하지 않습니다. 데이터 손실 및 기타 우발적인 데이터 관련 사고에 유의하세요.
## Redis
### Redis 배포하기
시작하기 페이지의 데이터베이스 카테고리 또는 ⌘ + K 를 사용하여 redis 검색하고 Redis 템플릿을 클릭합니다.
**설정변경** 을 클릭하고 필요에 따라 설정을 적용한 뒤 **배포하기** 버튼을 누릅니다.
***
### 프로젝트 내부에서 서비스 간 통신하기
ale에서 배포된 데이터베이스는 생성된 주소와 포트를 통해 프로젝트 외부에서 TCP로 통신할 수 있는 방법 뿐만 아니라 배포환경 내부에서 서비스명을 호스트명으로 참조하는 기능을 지원하고 있습니다. 프로젝트 내부의 동일 배포환경에 데이터베이스 및 기타 서비스가 배포 되어있는 경우 보안 및 성능 측면에서 서비스명을 호스트명으로 하여 접속하는 방법을 권장합니다.
프로젝트 내부에서 호스트명으로 활용하고자 하는 값을 서비스 이름으로 입력하여 Redis를 배포합니다.
배포 후 상세페이지에 진입하여 도메인 탭을 클릭합니다.
도메인 항목에서 두 개의 호스트:포트 조합을 확인할 수 있으며, 각 역할은 다음과 같습니다.
* **`svc.xxx.cloudtype.app:[포트번호]`**
* 배포환경 외부 통신 전용이며, 별도의 TCP 접속 허용 설정 필요
* 포트는 데이터베이스 신규 배포 시마다 변경되며 고정 불가
* **`[서비스명]:[포트번호]`**
* 배포환경 내부에서 서비스 간 통신을 하는 데에 활용되며, 상기 이미지의 `redis-prod` 에 해당함
* 포트는 `6379` 으로 고정됨
***
### TCP 외부 접속 허용하기
프로젝트 패널 우측 상단부의 ⚙️ 아이콘을 클릭하고, 설정 하단의 방화벽 항목에서 **TCP 외부 접속 허용하기**을 활성화 한 후 **적용하기** 버튼을 클릭합니다.
설정이 정상적으로 적용되면 **`svc.xxx.cloudtype.app:[포트번호]`** 형식의 주소로 외부에서 접근이 가능해집니다.
TCP 외부 접속을 허용해야 하는 경우는 다음과 같습니다.
* ale의 다른 프로젝트에서 배포했거나 동일 프로젝트의 다른 배포환경에서 배포한 서비스에서 접근하는 경우
* 로컬 환경에서 개발 중인 서비스를 테스트 하기 위해 접근이 필요한 경우
* 로컬 환경의 DB 툴을 활용해 접근하는 경우
TCP 접속 허용 설정은 배포환경 내에 배포된 서비스 전체에 적용되며, 서비스 개별 설정은 불가합니다.
***
### Redis Insight와 연결하기
Redis Insight를 실행한 후 **ADD REDIS DATABASE** 버튼을 누르고 도메인 탭에서 확인한 호스트명, 포트 번호 및 데이터베이스 별칭(임의 값으로 설정 가능)를 아래와 같이 입력하면 ale에서 배포한 Redis와 연결이 완료됩니다.
접속이 되지 않는 경우 TCP 외부 접속 설정을 확인해주세요.
# 이미지 레지스트리 연결
Source: https://cloudtype.mintlify.app/ko/developers/registry
> 프라이빗 이미지 저장소를 연결하면 Container 템플릿으로 커스텀 이미지를 배포할 수 있습니다. 본 가이드에서는 **GitHub Container Registry, GCP Artifact Registry, Docker Hub**의 연결을 다룹니다.
***
## 저장소 연결
### Personal Access Token 생성
> GitHub 계정의 **Settings**에 진입 후 [Developer settings > Personal access tokens (classic) 페이지](https://github.com/settings/tokens)에서 `Generate new token > Generate new token(classic)`을 클릭해 토큰을 생성하세요.
### 권한 부여 및 토큰 발급
> 아래의 권한을 부여하고 `Generate token`을 클릭하세요.
* **repo**
* **write:packages**
* **admin:public\_key**
> 토큰 생성이 완료되면 토큰 값이 표시됩니다. 토큰은 생성 시 최초 한 번만 값을 확인할 수 있습니다.
### cloudtype에 연결
> 스페이스 설정화면의 애드온 메뉴에서 `컨테이너 저장소 연결하기`를 클릭하면 표시되는 **컨테이너 저장소 설정** 창에서 아래의 값들을 입력한 후 `연결하기`를 클릭하면 **GitHub Container Registry**가 연결됩니다.
* **저장소 제공자** : GitHub Container Registry
* **GitHub 아이디** : GitHub ID
* **퍼스널 엑세스 토큰(PAT)** : GitHub에서 생성한 Personal Access Token
### GCP Artifact Registry 생성
> Google Cloud 콘솔에서 **Artifact Registry** 서비스에 접속한 후 `저장소 만들기`를 클릭하세요.
> 저장소의 이름을 적절히 정하고 아래의 값들을 입력한 후 `만들기`를 클릭하면 저장소가 생성됩니다.
* **형식** : Docker
* **모드** : 표준
* **위치 유형** : 리전
* **리전** : 사용자의 상황에 맞는 리전 선택
* **암호화** : Google 관리 암호화 키
### 저장소 접속 주소 조회
> 생성된 저장소를 클릭하면 `[리전]-docker.pkg.dev/[GCP 프로젝트 ID]/[저장소이름]` 형식의 접속 주소를 조회할 수 있습니다.
저장소 접속 주소는 cloudtype에서 저장소를 연결할 때 사용됩니다.
### 서비스 계정 생성 및 권한 부여
> Google Cloud 콘솔의 **IAM 및 관리자 > 서비스 계정** 페이지에서 `서비스 계정 만들기`를 클릭하세요.
> 식별할 수 있는 **서비스 계정 이름**을 작성한 후 `만들고 계속하기`를 클릭합니다.
> 역할 선택 창에서 **Artifact Registry 관리자** 항목을 선택하고, `완료`를 클릭하면 서비스 계정이 생성됩니다.
### JSON KEY 만들기
> 생성된 서비스 계정 우측의 아이콘을 클릭한 후 **키 관리**를 선택하세요.
> 생성한 서비스 계정 키 관리 페이지의 **키 추가 > 새 키 만들기**를 클릭하면 표시되는 **비공개 키 만들기** 창에서, 키 유형으로 **JSON**을 선택하고 `만들기`를 클릭하면 JSON 키가 파일 형태로 다운로드 됩니다.
### cloudtype에 연결
> 스페이스 설정화면의 애드온 메뉴에서 `컨테이너 저장소 연결하기`를 클릭하면 표시되는 **컨테이너 저장소 설정** 창에서 아래의 값들을 입력한 후 `연결하기`를 클릭하면 **Google Cloud Artifact Registry**가 연결됩니다.
* **저장소 제공자** : Google Cloud Artifact Registry
* **접속 주소** : 저장소 생성 후 조회한 접속주소
* **키파일(JSON)** : JSON 키 파일 내용
### Docker Hub Access Token 생성
> Docker Hub 계정을 만든 후 우측 상단의 계정명이 있는 버튼을 클릭합니다.
> 이어 **Account Settings > Security** 메뉴로 접속한 후에 `New Access Token`을 클릭하세요.
### 권한 부여 및 토큰 발급
> Access Token Description 필드에 토큰의 용도나 역할을 구분할 수 있는 문구를 작성하고 Access permissions는 **Read & Write** 값을 선택하세요.
> 생성된 토큰은 최초 1회에 한해 조회할 수 있습니다.
### cloudtype에 연결
> 스페이스 설정화면의 애드온 메뉴에서 `컨테이너 저장소 연결하기`를 클릭하면 표시되는 **컨테이너 저장소 설정** 창에서 아래의 값들을 입력한 후 `연결하기`를 클릭하면 **Docker Hub**가 연결됩니다.
* **저장소 제공자** : Docker Hub
* **유저명** : Docker Hub ID
* **비밀 번호(토큰)** : Docker Hub Access token
## 이미지 배포
> 이미지 배포는 [컨테이너 이미지 배포하기 페이지](/ko/developers/registry)를 참고하세요.
# 동시실행(레플리카)
Source: https://cloudtype.mintlify.app/ko/developers/replica
## 적용하기
> 배포과정에서 **동시실행(레플리카)** 수를 설정하는 방식으로 ReplicaSet를 적용할 수 있습니다.
설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성을 확보할 수 있습니다.
## 조회하기
> **서비스 상세화면 리소스탭**의 워크로드 항목에서 동시실행(레플리카)이 적용된 서비스의 상태를 확인할 수 있습니다. 좌측부터 실시간 `서비스 상태` `CPU 사용량` `메모리 사용량` 등을 나타냅니다.
우측의 아이콘으로 구동중인 서비스 각각의 실행로그 조회 및 터미널 접속과 디스크립션을 확인할 수 있습니다.
## 변경하기
> **서비스 설정화면** 성능 설정 항목에서 동시실행(레플리카) 수를 변경하고 `배포하기`를 클릭하면, 변경 사항을 반영하여 재배포됩니다.
# 배포환경 복제
Source: https://cloudtype.mintlify.app/ko/developers/replication
> 배포환경 셀렉터의 **YAML 다운로드** 기능을 활용해, 간편하게 배포환경 전체를 복제할 수 있습니다.
배포환경은 한 개 또는 여러 개의 서비스로 구성할 수 있는 작업단위입니다. 스페이스에서 서비스까지 cloudtype 의 작업단위에 관한 내용은 아래를 참고하세요.
> 스페이스는 [팀원을 초대](/ko/developers/space#%ED%8C%80%EC%9B%90-%EA%B4%80%EB%A6%AC)해 프로젝트를 공유할 수 있는 최상위의 작업 단위입니다. 구독한 리소스 범위에서 팀원이 자유롭게 프로젝트를 생성하고 관리할 수 있습니다.
> **프로젝트는 배포환경의 묶음으로 사용되는 표시명**입니다. 사용자의 관리 편의성을 위한 명칭이며, 업무 단위로 사용되는 한 개 또는 여러 개의 배포환경(Dev, QA, Staging, Prod 등)을 하나의 프로젝트에서 관리할 수 있습니다.
> 배포환경 단위로 격리된 네트워크가 구성되며, [같은 배포환경의 서비스 간에는 서비스명을 호스트네임으로 참조해 통신할 수 있습니다.](/ko/developers/connect#%EB%82%B4%EB%B6%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0) 자주 사용하는 환경변수 값은 배포환경 단위에서 [시크릿으로 저장해 관리 및 적용할 수 있습니다.](/ko/developers/env)
> 서비스 별로 [터미널을 통한 접근](/ko/developers/log)이 가능하고, [커스텀 도메인을 연결](/ko/developers/domain)할 수 있습니다. 서비스 배포에 관한 내용은 [배포하기 페이지](/ko/developers/deploy)를 참고하세요.
***
## YAML 파일 다운로드
> 화면 우측의 배포환경 셀렉터를 클릭하면, 복제할 배포환경에 속한 서비스 전체의 배포설정이 담긴 YAML 파일을 다운로드 받을 수 있습니다.
YAML 파일에 리소스, 환경 변수, 시크릿 이름 등의 설정 값이 포함되지만 시크릿 값은 포함되지 않습니다. 복제하려는 배포환경의 서비스가 저장된 시크릿을 사용하는 경우, 아래를 참고해 새로운 배포환경에 시크릿을 저장하세요.
## 시크릿 다운로드
> 설정탭의 시크릿 항목에서 **파일로 다운로드**를 클릭해 저장된 시크릿을 다운로드 받을 수 있습니다.
## 시크릿 저장
> 다운로드한 시크릿 파일을 새로운 배포환경에 Drag & Drop 방식으로 적용하고 저장하세요.
## YAML 파일 적용
> 새로운 배포환경에서 YAML 파일을 Drag & Drop 방식으로 적용하면, 원본 배포환경과 동일한 설정의 모든 서비스가 중지된 상태로 생성됩니다.
> 서비스 각각의 아이콘을 클릭하거나, 우측의 배포환경 셀렉터에서, `모두 시작`을 클릭하면 모든 서비스가 새로운 배포환경에서 배포됩니다.
새로운 배포환경에 데이터베이스 등 외부 서비스와 TCP 접속이 필요한 서비스가 있는 경우, [TCP 외부 접속을 허용으로 설정하세요.](/ko/developers/environment#%EB%B0%A9%ED%99%94%EB%B2%BD-%EC%84%A4%EC%A0%95)
# 구독 / 리소스 유형
Source: https://cloudtype.mintlify.app/ko/developers/resource
구독 플랜 사양 및 리소스 유형에 대한 내용은 아래와 같습니다.
**카드 등록 시 Free Tier 플랜이 적용되며, 1GB의 프리티어 리소스가 부여됩니다.**
| | |
| --------------------------------------------------- | ----------------- |
| 4개의 서비스 생성 가능 | 배포된 서비스는 매일 1회 정지 |
| 1GB의 임시 디스크 부여(1개의 DB) | 제한된 네트워크 성능 |
| 프리뷰 도메인 자동발급 | 커스텀 도메인 연결 불가 |
| [GitHub Actions 지원](/ko/developers/githubactions) | 동시실행(레플리카) 적용 불가 |
| [팀원 추가 및 관리(최대 4인)](/ko/developers/space#2) | 1개의 프로젝트만 생성 가능 |
| [무중단 배포지원](/ko/developers/zero-downtime-deployment) | |
**메모리 리소스 구독 시 Hobby 플랜이 적용되며, 프리티어 리소스도 사용 가능합니다.**
| | |
| --------------------------------------------------- | ------------------------------------------ |
| **Free Tier의 모든 기능** | 2GB의 디스크 부여(2개의 DB) |
| [GitHub Actions 지원](/ko/developers/githubactions) | 다중 배포환경 및 추가 프로젝트 생성 가능 |
| [팀원 추가 및 관리(최대 4인)](/ko/developers/space#2) | [커스텀 도메인 연결 가능](/ko/developers/domain) |
| [무중단 배포지원](/ko/developers/zero-downtime-deployment) | [동시실행(레플리카) 적용 가능](/ko/developers/replica) |
| 100Mbps의 네트워크 성능 | [프라이빗 이미지 저장소 연결](/ko/developers/registry) |
확장된 네트워크 성능으로, 5인 이상의 팀을 구성하여 사용할 수 있습니다.
| | |
| ------------------------------------------------ | ------------ |
| **Hobby 플랜의 모든 기능** | 1G RAM 기본 제공 |
| 5인 이상의 팀 구성 가능 | 최대 20인까지 |
| HTTP 연결 유지 최대 30분(웹소켓/SSE) | |
| 1Gbps의 네트워크 성능 | |
| 구분 | 특성 |
| ---------------------------------------- | ---------------------------------- |
| **프리티어** | 매일 1회 서비스 중지 및 불특정한 시점에 다운타임 발생 가능 |
| | 테스트 용도로 적합 |
| **구독** | 고가용성 유지 및 서비스 무중단 가동 |
| | 운영 용도에 적합 |
리소스 구독 시 사용할 수 있는 구독 리소스가 추가됩니다. 기존에 프리티어 리소스로 배포된 서비스의 리소스가 구독 리소스로 자동 전환되지 않습니다. [구독 리소스를 적용해서 재배포](/ko/developers/resource) 해야 중단없이 사용할 수 있습니다.
cloudtype은 선언형 구독 방식의 클라우드 서비스를 제공합니다. 후불형 과금방식의 클라우드 서비스와 달리, **선언한 구독 리소스 안에서 예측 가능한 비용으로 서비스를 운영**할 수 있으머 플랜 별 네트워크 성능은 아래와 같습니다.
* 대역폭 : 10Mbps
* 응답 제한시간 : 60초
* 최대 커넥션 : 60개
* 초당요청수 : 60개
* 분당요청수 : 600개
* 대역폭 : 100Mbps
* 응답 제한시간 : 5분
* 최대 커넥션 : 300개
* 초당요청수 : 180개
* 분당요청수 : 3600개
* 대역폭 : 1Gbps
* 응답 제한시간 : 30분
* 최대 커넥션 : 300개
* 초당요청수 : 360개
* 분당요청수 : 7200개
***
### 구독 리소스 적용하기
> Free Tier플랜에서 구독 플랜(Hobby, Pro)으로 전환한 경우, **배포된 서비스에 구독 리소스가 자동으로 적용되지 않습니다.** 프리티어 라벨이 붙은 서비스의 설정화면에서 구독 리소스를 적용한 후 다시 배포하면, 구독 리소스가 적용되어 중단없이 서비스를 운영할 수 있습니다.
# 리버스 프록시
Source: https://cloudtype.mintlify.app/ko/developers/reverseproxy
> cloudtype 은 별도의 Nginx 서버 세팅없이, 위와 같은 리버스 프록시가 작동하도록 하는 기능을 지원하며, React 등 Web Application을 프리셋으로 사용하는 서비스에 간편하게 적용할 수 있습니다.
***
## 준비 사항
> 리버스 프록시 기능을 적용하려는 React등의 프론트엔드 서비스의 코드 중 외부의 **API URL을 호출하는 부분을 자기 자신을 호출하도록 작성**해야 합니다. 이 부분은 배포과정에서 `Rewrite` 필드값 입력을 통해 리버스 프록시로 처리됩니다.
## 리버스 프록시 적용(Rewrites)
> React 등 Web application을 프리셋으로 사용하는 프론트엔드 서비스의 배포 설정화면에 **Rewrites** 필드를 아래와 같은 규칙으로 입력해 리버스 프록시를 적용할 수 있습니다.
* **좌측 필드** : 코드에 작성된 호출 경로
* **우측 필드** : 실제로 호출해야 할 경로
드롭다운 메뉴에서 동일화면(배포환경)에 있는 서비스를 선택하고 경로를 추가하거나, URL을 직접 입력할 수 있습니다.
# 이전 버전 복원
Source: https://cloudtype.mintlify.app/ko/developers/rollback
> cloudtype 은 컨테이너 이미지를 기반으로 서비스를 구동하기 때문에 이슈 발생 시 이전의 버전으로 신속하게 복원할 수 있습니다.
> 복원하고자 하는 서비스의 상세페이지 **배포내역탭**에서, 복원을 희망하는 배포내역의 우측 아이콘을 클릭하면 복원할 수 있습니다.
> 복원이 완료되면 적용된 버전의 상태가 **적용됨** 으로 변경됩니다.
복원할 버전을 혼동하지 않기 위해, 커밋 메세지를 확인하세요.
# 서비스
Source: https://cloudtype.mintlify.app/ko/developers/service
## 서비스 상세 정보
> 프로젝트 화면에서 배포된 서비스 카드를 클릭하면, 해당 서비스 상세 페이지로 진입할 수 있습니다. 서비스 정보탭에서는 아래의 정보를 조회할 수 있습니다.
> 배포 내역과 빌드로그를 조회할 수 있고, 배포내역 우측의 를 클릭하면 관련 GitHub 페이지로 이동하거나 [재배포 또는 롤백](/ko/developers/rollback)할 수 있습니다.
> 서비스가 차지하는 리소스 사용량과 디스크립션을 조회할 수 있는 화면입니다. 좌측부터 실시간 `서비스 상태` `CPU 사용량` `메모리 사용량` 등을 나타내며, [동시실행(레플리카)을 적용](/ko/developers/replica)한 경우 구동중인 서비스 각각의 상태를 모두 조회할 수 있습니다.
> 배포된 서비스의 프리뷰 도메인 또는 커스텀 도메인과 [같은 배포환경에 있는 서비스 간 통신](/ko/developers/connect#2)을 위한 호스트네임과 포트번호를 조회할 수 있습니다.
우측의 `도메인 연결` 버튼으로 커스텀 도메인을 연결할 수 있습니다. 자세한 내용은 [커스텀 도메인 연결 페이지](/ko/developers/domain) 페이지를 참고해주세요.
> 데이터베이스의 경우 연결된 디스크에 대한 정보를 표시힙니다.
> 서비스와 관련하여 발생한 이벤트를 조회할 수 있습니다.
시간이 지나면 이벤트가 더 이상 조회되지 않을 수 있습니다.
> 서비스를 CLI로 배포하기 위한 yaml파일 내용과, GitHub Actions를 적용할 수 있는 workflow 파일 내용을 조회할 수 있습니다.
GitHub Actions 적용법은 [GitHub Actions 페이지](/ko/developers/githubactions)를 참고하세요.
## 서비스 설정
> 서비스 상세페이지의 설정탭에서 아래의 정보를 조회하거나 관리할 수 있습니다.
> 서비스가 속한 프로젝트, 배포환경 및 서비스 이름을 조회할 수 있으며, 서비스 표시명을 변경할 수 있습니다.
> 배포 시 설정한 설정값들을 조회 및 변경할 수 있습니다.
배포 설정값을 변경한 경우, 하단부의 `배포하기`를 클릭하면 변경된 설정이 반영됩니다.
## 서비스 재배포(업데이트)
> **코드 수정, 리소스 변경 등** 업데이트할 내역이 있는 경우, 서비스 설정화면 하단부의 `배포하기`를 누르면 업데이트를 반영한 새로운 배포가 진행됩니다.
배포 자동화를 위한 GitHub Actions 적용은 [GitHub Actions 페이지](/ko/developers/githubactions)를 참고하세요.
## 서비스 삭제
> 서비스 설정탭 하단부의 `서비스 삭제하기`를 클릭하면 서비스가 삭제됩니다.
# Socket.IO
Source: https://cloudtype.mintlify.app/ko/developers/socketio
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* Socket.IO는 \*\*최소 10 버전의 Node\*\*를 필요로 합니다.
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/socketio.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `socketio` 를 검색하고 `Socket.io` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
* 아래 가이드에 따라 CLI 를 설치하세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Socket.IO
```yaml theme={null}
name: socketio
app: node@16
options:
env:
- name: NODE_ENV
value: production
ports: 3000
context:
git:
url: https://github.com/cloudtype-examples/socketio.git
branch: main
preset: socketio
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
* [Node로 서버를 구동했는데 permission denied 0.0.0.0:80 에러가 발생하면서 서비스에 접근이 되지 않습니다.](/ko/troubleshooting/node)
### 공식문서
* [Node.js Docs](https://nodejs.org/en/docs/)
* [Socket.IO Docs](https://socket.io/docs/v4/)
* [Express Docs](https://expressjs.com/en/guide/routing.html)
# 스페이스 / 팀원
Source: https://cloudtype.mintlify.app/ko/developers/space
> 스페이스는 [팀원을 초대](/ko/developers/space#%ED%8C%80%EC%9B%90-%EA%B4%80%EB%A6%AC)해 프로젝트를 공유할 수 있는 최상위의 작업 단위입니다. 구독한 리소스 범위에서 팀원이 자유롭게 프로젝트를 생성하고 관리할 수 있습니다.
스페이스에서 서비스까지 cloudtype 의 작업단위에 관한 내용은 아래를 참고하세요.
> 스페이스는 [팀원을 초대](/ko/developers/space#%ED%8C%80%EC%9B%90-%EA%B4%80%EB%A6%AC)해 프로젝트를 공유할 수 있는 최상위의 작업 단위입니다. 구독한 리소스 범위에서 팀원이 자유롭게 프로젝트를 생성하고 관리할 수 있습니다.
> **프로젝트는 배포환경의 묶음으로 사용되는 표시명**입니다. 사용자의 관리 편의성을 위한 명칭이며, 업무 단위로 사용되는 한 개 또는 여러 개의 배포환경(Dev, QA, Staging, Prod 등)을 하나의 프로젝트에서 관리할 수 있습니다.
> 배포환경 단위로 격리된 네트워크가 구성되며, [같은 배포환경의 서비스 간에는 서비스명을 호스트네임으로 참조해 통신할 수 있습니다.](/ko/developers/connect#%EB%82%B4%EB%B6%80-%EC%84%9C%EB%B9%84%EC%8A%A4-%EA%B0%84-%ED%86%B5%EC%8B%A0) 자주 사용하는 환경변수 값은 배포환경 단위에서 [시크릿으로 저장해 관리 및 적용할 수 있습니다.](/ko/developers/env)
> 서비스 별로 [터미널을 통한 접근](/ko/developers/log)이 가능하고, [커스텀 도메인을 연결](/ko/developers/domain)할 수 있습니다. 서비스 배포에 관한 내용은 [배포하기 페이지](/ko/developers/deploy)를 참고하세요.
***
## 스페이스 관리
### 스페이스 추가
> 가입 시 생성된 **기본 스페이스 이외의 스페이스를 사용하려는 경우**, 좌측 상단의 스페이스 이름을 클릭하고 **스페이스 개설하기**를 선택하세요.
### 스페이스 전환
> 좌측 상단의 스페이스 이름을 클릭하면 다른 스페이스로 전환할 수 있습니다.
### 스페이스 이름 변경
> 좌측 상단의 아이콘을 클릭해 스페이스 정보 페이지로 진입한 후, 스페이스 이름을 클릭하면 스페이스 이름을 변경할 수 있습니다.
스페이스 이름은 프로젝트의 모음을 대표하는 고유한 값으로, CLI 나 API 등의 도구 사용시 프로젝트를 식별하기 위해 `@스페이스명/프로젝트명` 형식으로 사용됩니다.
### 스페이스 삭제
> 스페이스 정보 페이지의 `스페이스 삭제하기`로 스페이스를 삭제할 수 있습니다.
기본 스페이스는 삭제할 수 없으며, 추가로 생성한 스페이스에 대해서만 삭제가 가능합니다.
스페이스 삭제시 스페이스 내의 프로젝트 및 서비스 등은 모두 영구적으로 삭제되므로 주의해야 합니다.
## 팀원 관리
### 팀원 초대
> 스페이스 설정화면의 팀 페이지에서 `초대하기` 버튼으로 팀원을 초대할 수 있습니다.
초대된 사용자가 cloudtype에 이미 등록된 사용자인 경우, 초대와 동시에 팀원으로 등록되며, 그렇지 않은 경우 입력한 이메일로 가입 초대메일을 발송합니다.
### 권한 변경과 삭제
> 구성원 우측 끝 아이콘을 클릭한 후 해당 구성원의 권한을 변경하거나 팀에서 삭제할 수 있습니다.
## 리소스 상태
> 대시보드 좌측 하단에서 선택된 스페이스의 리소스 타입 별 리소스 `사용량 / 구독량` 정보를 확인할 수 있습니다.
# Spring Boot(Java/Kotlin)
Source: https://cloudtype.mintlify.app/ko/developers/springboot
> Java / Kotlin 언어로 작성된 Spring Boot 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
| Spring Boot 버전 | 지원하는 JDK 버전 |
| --------------- | ----------- |
| Spring Boot 3.x | JDK 17 이상 |
| Spring Boot 2.x | JDK 8 이상 |
프로젝트 설정 파일(pom.xml, build.gradle 등)에 명시된 JDK 버전과 배포 설정 시 선택한 JDK 버전이 일치하지 않으면 빌드 오류가 발생할 수 있습니다.
기본적으로 JAR 형태의 빌드 산출물 및 스크립트를 지원하며, WAR의 경우 Executable WAR에 한하여 지원합니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 Springboot 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **버전**
* [환경 변수](/ko/developers/env)
* [포트번호](/ko/developers/port)
* **Start Command**
* [Health Check](/ko/developers/zero-downtime-deployment)
* **Build Variables**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **Embedded node.js**: 프로젝트 내 빌드가 필요한 Node.js 버전
* **Pre-built jar file path**: 사전에 빌드되어 저장소에 반영되어 있는 jar 파일 경로
* **Build Command**: gradle/maven 빌드 명령어
* **Include files in build**: 빌드 시 추가할 파일 혹은 디렉토리
* **Update strategy**
* **Rolling Update**: 새로운 버전의 서비스 배포 시점에 기존 파드 종료, 노드 가용자원 확보 필요
* **Recreate**: 모든 서비스 종료 후 새로운 버전의 서비스를 생성 및 구동하여 다운타임 발생
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
## 고급 설정 기능
### 저장소 내 Jar 파일 배포
* Spring Boot Jar 파일을 저장소에 반영하고 배포하는 경우, 배포 설정창의 **Pre-built jar file path** 필드에 각 빌드도구에 맞는 jar파일의 경로를 입력하고 배포를 진행합니다.
* **Gradle**: `build/libs/[프로젝트명].jar`
* **Maven**: `target/[프로젝트명].jar`
### 빌드 시 특정 리소스 경로 포함
* cloudtype 에서 Spring Boot 프로젝트를 배포하는 경우, 정적 리소스 위치로 `WebProperties.Resources`에 정의된 `/static` 등을 제외한 `src` 디렉토리의 파일은 빌드 시 포함되지 않습니다.
프로젝트에서 특정 경로의 리소를 참조하는 경우 배포 설정창의 **Include files in build** 필드에 해당 디렉토리 경로를 작성하고 배포하면 됩니다.
구분자 쉼표(`,`)를 사용하여 복수의 디렉토리를 포함시킬 수 있습니다.
### 멀티모듈 어플리케이션 배포
* 여러 개의 모듈로 이루어진 Spring Boot 어플리케이션을 배포하는 경우 몇 가지의 작업이 필요합니다.
간단한 예시를 통해 배포 방법을 안내드립니다.
```plain theme={null}
project-root/
├── build.gradle.kts
├── settings.gradle.kts
├── api/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── kotlin/
│ └── resources/
├── core/
│ ├── build.gradle.kts
│ └── src/
│ └── main/
│ ├── kotlin/
│ └── resources/
└── gradle/
└── wrapper/
├── gradle-wrapper.jar
└── gradle-wrapper.properties
```
* `api`, `core` 모듈로 구성하고 `api`를 main class로 지정
* Spring Boot 템플릿 선택 후 다음의 설정 적용
* **Start command**: `java -jar api/build/libs/api-0.0.1-SNAPSHOT.jar`
* `java -jar`의 인수로 `/build/libs/-0.0.1-SNAPSHOT.jar`
* **Include files in build**: `core,api`
* 모듈의 디렉토리명을 쉼표로 구분하여 입력
***
[Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/html/index.html)
# 서브 디렉토리 배포
Source: https://cloudtype.mintlify.app/ko/developers/subdir
> cloudtype 은 GitHub 등의 외부 git 저장소의 **루트 디렉토리를 기준으로 서비스를 빌드 / 배포 합니다.**
> 만약 하나의 저장소에 여러 서비스가 별개의 디렉토리로 구분되어 저장되어 있다면, 서브 디렉토리 설정을 적용해야 합니다.
> 다음의 경우에 해당된다면 서브 디렉토리 설정을 적용해 배포하세요.
* **하나의 저장소에 두 개 이상의 서비스를 개별 디렉토리로 나누어 관리하는 경우**
* **저장소의 루트 폴더가 아닌 특정 하위 디렉토리에서 코드를 관리하는 경우**
위와 같이 하나의 저장소에 두 개 이상의 서비스가 존재하는 경우, 각각을 별도의 서비스로 배포해야 합니다.
## 서브디렉토리 설정
> 배포 설정 화면에서 우측의 설정 버튼을 클릭한 표시되는 서브 디렉토리 필드에 디렉토리 경로를 입력하세요.
이후의 배포과정은 [배포하기 페이지](/ko/developers/deploy)를 참고하세요.
# Svelte
Source: https://cloudtype.mintlify.app/ko/developers/svelte
## 준비 및 확인사항
### 지원 Node 버전
* **8, 10, 12, 14, 16, 18**
* ⚠️ 로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
## 대시보드를 통한 생성
### 1. 템플릿 선택하기
* **[Github 저장소에서 템플릿 보기](https://github.com/cloudtype-examples/react.git)**
* 시작하기 페이지의 **언어/플랫폼** 카테고리에 접속 또는 `⌘ + K` 를 사용하여 `Svelte` 를 검색하고 `Svelte` 템플릿을 클릭하세요.
### 2. 새 저장소(repository) 생성하기 또는 나의 저장소 선택하기
클라우드타입은 기본적으로 사용자 Github 계정의 저장소에 반영된 소스를 배포합니다.
* 1️⃣ **배포하려는 저장소가 없다면**
⇒ 클라우드타입이 제공하는 예제 저장소를 사용자의 Github 계정에 생성합니다.
* 2️⃣ **배포하려는 저장소가 있다면**
⇒ 클라우드타입에서 배포할 사용자 본인의 저장소를 선택합니다.
#### 1️⃣ 배포하려는 저장소가 없는 경우
* 아래의 그림처럼 **비공개 저장소 설정하기** 여부만 선택한 후 `저장소 만들기` 를 클릭하면 사용자의 Github 계정에 해당 템플릿 저장소가 자동으로 생성됩니다.
#### 2️⃣ 배포하려는 저장소가 있는 경우
* Github 계정에 존재하는 저장소를 사용하려는 경우 아래의 화면처럼 여러 저장소 중 배포를 원하는 항목을 선택하세요. 이미 위에서 저장소를 만든 경우 이 부분은 건너뛰어주세요.
* 저장소를 직접 선택한 경우, 빌드 및 시작을 위한 명령어 등 세부 설정이 기본 설정과 다를 수 있습니다. 아래의 그림처럼 빌드 설정의 **설정변경** 버튼을 클릭하고 수정이 필요한 설정사항을 수정해주세요.
### 3. 배포하기
* 위 과정을 마친 후 마지막으로 배포할 리전을 선택하고 `배포하기` 버튼을 클릭하면 배포가 자동으로 진행됩니다.
***
## CLI 를 통한 생성
### 1. 사전준비
아래 가이드에 따라 CLI 를 설치하고 로그인을 진행해주세요.
[CLI 설치하기](/ko/developers/cli/install)
### 2. 설정파일 생성
`.cloudtype/app.yaml` 파일을 생성하세요.
#### Svelte
```yaml theme={null}
name: svelte
app: web
options:
docbase: /public
nodeversion: "16"
spa: true
context:
git:
url: https://github.com/cloudtype-examples/svelte.git
branch: main
preset: svelte
```
### 3. 배포하기
```sh theme={null}
$ ctype apply
```
## 참고
### FAQ
* [서비스 접속 시 50X 페이지만 뜹니다.](/ko/troubleshooting/common)
* [로컬에서는 이상없이 설치되던 패키지가 클라우드타입에서 빌드할 때 정상적으로 설치되지 않습니다.](/ko/troubleshooting/node)
* [하나의 Git 원격 저장소에서 두 개 이상의 앱을 배포하고 싶어요.](/ko/troubleshooting/git)
* [클라우드타입에서 볼 수 있는 로그뷰 말고 별도의 파일로 로그를 따로 저장하고 싶습니다.](/ko/troubleshooting/common)
### 공식문서
* [Svelte Docs](https://svelte.dev/docs)
# Vue
Source: https://cloudtype.mintlify.app/ko/developers/vue
> Vue 애플리케이션 배포 가이드입니다.
***
## 준비 및 확인사항
* **8, 10, 12, 14, 16, 18, 20**
프로젝트 설정 파일(package.json, .nvmrc 등)에 명시된 Node.js 버전과 배포 설정 시 선택한 버전이 일치하지 않으면 빌드 및 런타임 오류가 발생할 수 있습니다.
## 템플릿과 저장소 선택
> 대시보드의 또는 `⌘ + K` 로 생성되는 배포창에서 **Vue** 템플릿을 선택하고, 이어지는 드롭다운 메뉴에서 연동된 GitHub 계정의 저장소를 선택하세요.
## 배포 설정값 입력
> 다음 각 항목에서 서비스가 동작하기 위한 설정을 알맞게 적용하세요.
* **Build Variables**: Vue 프로젝트 빌드 시 포함되어야 하는 변수
* **Docbase**: 빌드 산출물 대상 디렉터리
* [Rewrites: 프록시를 위한 경로 및 URL](/ko/developers/reverseproxy)
* **Node.js 버전**
* **Build Command**: Vue 프로젝트 빌드 명령어
* **Single Page Application**: 싱글 페이지 앱 여부
* [Health Check](/ko/developers/zero-downtime-deployment): 컨테이너 상태 검증 엔드포인트
* **Install command**: 컨테이너 이미지 빌드 시 포함되어야 하는 변수
* **.npmrc**: npm 패키지 레지스트리 경로, 프록시 등 설정
* **Index page**: index 페이지 파일명
cloudtype은 별도의 Nginx 서버 세팅없이, 배포설정 시 Rewrites 필드값 입력을 통해, 리버스 프록시가 작동하도록 하는 기능을 지원합니다. 자세한 내용은 [Reverse Proxy 페이지](/ko/developers/reverseproxy)를 참고하세요.
## 성능(리소스) 설정 및 배포
* **리소스 유형** : [구독 리소스와 프리티어 리소스](/ko/developers/resource) 중 선택
* **CPU** : 서비스가 사용할 vCPU 리소스의 최대값을 설정하며, '최소 vCPU' 선택 시 0.1 vCPU 사용
* **메모리** : 서비스가 사용할 메모리 리소스의 최대값을 설정
* [동시실행(레플리카)](/ko/developers/replica) : 설정한 수만큼 서비스가 수평확장되어 부하 분산 및 안정성 확보
* **배포** : `배포하기` 클릭
배포가 완료되면 프리뷰 도메인을 통해 브라우저로 웹 페이지를 조회하거나 API 툴을 사용해 요청을 보낼 수 있습니다.
***
[Vue Docs](https://ko.reactjs.org/docs/getting-started.html)
# 무중단 배포
Source: https://cloudtype.mintlify.app/ko/developers/zero-downtime-deployment
> cloudtype은 Port의 상태와 Healthz HTTP 반환 값 등을 통한 무중단 배포를 지원하며, 각종 웹 서비스 및 API 등이 그 대상입니다.
Port를 공개하지 않고 수행되는 서비스의 경우 무중단 배포가 지원되지 않습니다.
## Healthz 설정
> 서비스의 상태를 확인하는 Health Check를 통해 무중단 배포를 지원합니다.
> 배포설정 창에서 `Healthz`에 입력한 경로에 대해서 HTTP 응답 값이 2XX와 같이 반환되는지 여부에 따라 배포가 진행되며,
> 값을 입력하지 않고 비워둘 경우 루트 경로에 대한 상태를 확인합니다.
index 페이지가 있는 웹 서비스와 달리 API로 작동되는 서비스에서 `Healthz` 옵션을 활용하기 위해서는
요청에 따른 서비스의 상태를 응답하는 엔드포인트를 소스 레벨에서 구성해야합니다.
Spring Boot의 경우 Actuator와 같은 모듈로 Health Check 엔드포인트를 구성할 수 있으며, 기타 언어 및 프레임워크에서 직접 구현할 수도 있습니다.
# CI/CD 문제 해결
Source: https://cloudtype.mintlify.app/ko/troubleshooting/cicd
CI/CD 관련 문제 해결 가이드
## GitHub Actions
> 클라우드타입은 GitHub Actions와 배포 명세 파일을 활용하여 간단하게 CI/CD 프로젝트를 구축할 수 있습니다. [GitHub Actions 페이지](/ko/developers/githubactions)를 참고해 자세한 사용 방법을 확인해주세요.
***
## 참고
### 공식문서
* [GitHub Actions Docs](https://docs.github.com/ko/actions)
# 일반 문제
Source: https://cloudtype.mintlify.app/ko/troubleshooting/common
클라우드타입 사용 중 자주 발생하는 일반적인 문제와 해결 방법
## 일반
> 배포 시 루트 디렉토리를 기준으로 빌드가 진행됩니다. 저장소의 루트 디렉토리가 아닌 서브 디렉토리에 실행할 소스가 있는 경우 별도로 서브 디렉토리를 지정해주어야 합니다.
> 배포할 프로젝트를 개발할 때 적용한 JDK, Python, Node.js 등의 버전과 cloudtype의 배포 설정에 적용한 버전이 서로 다를 경우 서비스가 정상적으로 빌드 혹은 실행되지 않습니다.
> 프로젝트의 언어/플랫폼 버전에 따라 [배포 설정의 버전을 알맞게 설정한 후 재배포하세요.](/ko/developers/deploy#5)
> 특정 포트에서 서비스되는 프로젝트의 경우, 배포 설정에서 포트 번호가 누락되거나 잘못 입력되면 정상적으로 실행되지 않을 수 있습니다.
> **특정 포트에 바인딩 되지 않는 프로젝트의 경우, 배포 설정에서 포트 번호 항목을 공란으로 두어야 합니다.**
> cloudtype 에서 제공하는 템플릿은 기본 모듈 및 라이브러리가 상이합니다. Windows, Chrome 라이브러리처럼 기본으로 제공되지 않는 라이브러리를 사용하려는 경우, [Dockerfile](/ko/developers/dockerfile)을 작성해서 배포해야 합니다.
> CORS는 각 프레임워크 별로 그 해결방법이 상이하며, 각 프레임워크에서 지원하는 라이브러리 혹은 모듈을 활용하여 발생하는 이슈를 해결할 수 있습니다.
> Next.js 등과 같이 자체적으로 리버스 프록시를 지원하는 프레임워크를 사용하면 내장된 Rewrites 기능으로 해결할 수 있으며, Reat, Vue와 같은 프론트엔드를 배포할 때에는 [Rewrites 설정을 통해 리버스 프록시를 적용](/ko/developers/reverseproxy)할 수 있습니다.
> 서비스 패널의 **플레이 버튼으로 재시작** 후 실행로그를 확인해보세요. 어떤 로그도 표시되지 않는다면 서비스 상세 페이지의 **이벤트탭**에서 발생한 이벤트를 확인하여 문제를 해결해야합니다.
> 프리티어 플랜에서 구독 플랜(Hobby, Pro)으로 전환한 경우, 배포된 서비스에 구독 리소스가 자동으로 적용되지 않습니다. 프리티어 라벨이 붙은 서비스의 설정화면에서 구독 리소스를 적용한 후 다시 배포하면, 구독리소스가 적용되어 서비스가 중단되지 않습니다.
> JVM 기반의 어플리케이션을 배포하는 경우 JVM에 할당한 메모리가 사용 가능한 리소스의 범위를 초과할 때 OOM이 발생할 수 있으며, Node.js 역시 heap 메모리의 부족으로 같은 현상이 발생할 수 있습니다.
> 언어 혹은 프레임워크에서 적절하게 메모리를 부여하거나 리소스를 추가로 할당하여 배포해야 합니다.
> 일반적인 프레임워크에서는 `TZ`라는 환경변수를 통해 타임존을 설정할 수 있으며, [여기](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones) 제시된 일람에 따라 국가 및 도시를 설정할 수 있습니다.
> 이외의 방법은 사용하고 있는 프레임워크의 공식문서를 참고하시기 바랍니다.
> HTML 템플릿은 기본적으로 github 저장소 내 최상위(루트) 디렉토리의 `index.html` 파일을 렌더링하여 홈 화면으로 설정합니다. 저장소 내의 html 파일명을 확인해주세요.
> 클라우드플레어 연결 후 ERR\_TOO\_MANY\_REDIRECTS 발생할 때 SSL/TLS 암호화 모드가 가변으로 되어 있는 경우, 전체 혹은 전체(엄격)으로 변경이 필요합니다.
> 도메인 연결 과정에서는 프록시 상태 체크를 해제해야 합니다. 인증서 발급까지 완료된 경우 프록시를 다시 체크하여 활성화 해주세요.
> 현재 클라우드타입은 디스크 마운트를 지원하지 않아 어플리케이션에서 파일로 출력하더라도 영구히 저장되지 않습니다. 추후 디스크 마운트 기능을 지원 예정이며, 로그 수집은 [Papertrail](https://www.papertrail.com/)과 같은 서비스를 사용하는 것을 권장합니다.
> 컨테이너 기반 서비스 특성상 VM과는 달리 클라우드타입의 터미널은 디버깅 및 확인 용도로만 사용하는 것을 권장합니다. 또한 터미널에서 조작한 모든 설정은 재시작시 초기화됩니다. 설치가 필요한 라이브러리 등이 있다면 [Dockerfile 을 통해 배포](/ko/developers/dockerfile)해주세요.
서비스 배포 후 50X 발생 시, 실행 로그 결과에 따라 다음과 같은 케이스로 나눠 살펴볼 수 있습니다.
**1️⃣ 어플리케이션이 정상적으로 구동되지 않고 예외가 발생하거나 서버가 종료된 경우**
> 어플리케이션 구동에 필요한 패키지가 정상적으로 설치되지 않았거나 데이터베이스 연결이 실패했을 수 있습니다. 실행 로그의 에러 메세지를 기반으로 소스 내용 및 [환경 변수 등을 확인](/ko/developers/env)해주세요.
**2️⃣ 서버는 정상적으로 구동됐는데 권한과 관련된 에러가 발생하는 경우**
> 언어 및 프레임워크 중 특정 도메인 규칙에 대하여 CORS 허용 규칙을 적용해주어야 접속가능한 것이 있습니다. [리버스 프록시 페이지](/ko/developers/reverseproxy)를 참고해주세요.
**3️⃣ 빌드가 정상적으로 완료 되었는데 상태가 ‘시작중’에서 바뀌지 않고 생성된 URL에 접속해도 503 페이지만 뜨는 경우**
> 루트 디렉토리가 아닌 서브디렉토리에 코드가 존재하는 경우 이러한 상황이 발생할 수 있습니다. 사용자의 저장소를 디렉토리를 확인하고, 해당되는 경우 [서브디렉토리 설정](/ko/developers/subdir)을 추가해주세요.
**4️⃣ 서버는 정상적으로 구동됐는데 접속시 에러창이 뜨고 실행 로그에 아무런 반응이 없는 경우**
> 소스 코드에 설정된 포트가 배포시에 작성하신 포트와 불일치할 경우일 확률이 높습니다. [입력한 포트를 확인해주세요](/ko/developers/port).
# 데이터베이스
Source: https://cloudtype.mintlify.app/ko/troubleshooting/database
데이터베이스 관련 문제 해결 가이드
## 공통
> 동일한 프로젝트 내의 어플리케이션이 아니거나 DB 툴에서의 접속이 필요한 경우 프로젝트 설정에서 외부 TCP 접속을 허용해주어야 합니다. 설정 방법은 [데이터베이스 페이지](/ko/developers/database)를 참고해주세요.
> `svc.xxxxx.cloudtype.app` 는 연동하고자 하는 서비스가 배포된 프로젝트 외부에서 접속할 때 사용하는 URL 입니다. 동일한 프로젝트 내의 서비스는 데이터베이스 배포 시 설정한 서비스명을 호스트명으로 간주하여 이용 가능합니다. [서비스 간 통신 페이지](/ko/developers/connect)를 참고해주세요.
> 현재 데이터베이스를 연동하여 사용할 수 있는 DB 툴을 다음과 같이 템플릿으로 제공하고 있습니다.
* [phpMyAdmin](https://app.cloudtype.io/create/list?preset=phpmyadmin)
* [pgAdmin](https://app.cloudtype.io/create/list?preset=pgadmin)
* [Mongo Express](https://app.cloudtype.io/create/list?preset=mongo-express)
# Dockerfile
Source: https://cloudtype.mintlify.app/ko/troubleshooting/dockerfile
Dockerfile 관련 문제 해결 가이드
## 준비 및 확인사항
* 단일 Docker 이미지의 크기는 2GB(유료 구독 시 5GB)까지 지원합니다. 큰 용량의 이미지를 활용해야 하는 경우, 컨테이너보다는 VM이나 온프레미스 방식의 인프라 사용이 적합할 수 있습니다.
Windows Server나 ARM 아키텍처 기반의 Docker 이미지 런타임은 지원하지 않습니다.
## 공통
### Dockerfile 작성 시 root 권한으로 스크립트 작성
> 클라우드타입에서 Dockerfile을 이용하여 배포를 진행하시는 경우 UID 및 GID를 설정하는 스크립트를 작성해야 합니다. 배포되는 서비스는 보안 및 서비스 안정성을 위해 non-root 권한으로 실행하도록 권장하고 있어, Dockerfile로 배포 시 정상적으로 작동하지 않는 경우 아래의 예시를 참고하여 스크립트 수정 후 재배포해주세요.
* **Java Spring Boot(Gradle)**
```dockerfile theme={null}
# jar 파일 빌드
FROM eclipse-temurin:11 as builder
COPY gradlew .
COPY gradle gradle
COPY build.gradle .
COPY settings.gradle .
COPY src src
RUN chmod +x ./gradlew
RUN ./gradlew bootjar
# jar 실행
FROM eclipse-temurin:11 as runtime
RUN addgroup --system --gid 1000 worker
RUN adduser --system --uid 1000 --ingroup worker --disabled-password worker
USER worker:worker
COPY --from=builder build/libs/*.jar app.jar
EXPOSE 8080
ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "/app.jar"]
```
* **Java Spring Boot(Maven)**
```dockerfile theme={null}
# jar 파일 빌드
FROM eclipse-temurin:11 as builder
WORKDIR /opt/app
COPY .mvn/ .mvn
COPY mvnw pom.xml ./
RUN ./mvnw dependency:go-offline
COPY ./src ./src
# -Dmaven.test.skip=true 이 mvn install 단계에 설정되지 않으면
# 환경변수가 주입되지 않은 상태에서 어플리케이션이 실행되어 에러 발생
RUN ./mvnw clean install -Dmaven.test.skip=true
# jar 실행
FROM eclipse-temurin:11 as runtime
RUN addgroup --system --gid 1000 worker
RUN adduser --system --uid 1000 --ingroup worker --disabled-password worker
USER worker:worker
WORKDIR /opt/app
EXPOSE 8080
COPY --from=builder /opt/app/target/*.jar /opt/app/*.jar
ENTRYPOINT ["java", "-Dspring.profiles.active=${PROFILE}", "-jar", "/opt/app/*.jar"]
```
* **Python Flask**
```dockerfile theme={null}
FROM python:3.9-slim-buster
ENV PYTHONDONTWRITEBYTECODE=1
ENV PYTHONUNBUFFERED 1
ARG UID=1000
ARG GID=1000
RUN groupadd -g "${GID}" python \
&& useradd --create-home --no-log-init -u "${UID}" -g "${GID}" python
WORKDIR /home/python
COPY --chown=python:python requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
# USER 변경은 반드시 pip 패키지 설치 스크립트 이후에 작성되어야 함
USER python:python
ENV PATH="/home/${USER}/.local/bin:${PATH}"
COPY --chown=python:python . .
ARG FLASK_ENV
ARG DB_USERNAME
ARG DB_PASSWORD
ARG DB_URL
ENV FLASK_ENV=${FLASK_ENV}
ENV DB_USERNAME=${DB_USERNAME}
ENV DB_PASSWORD=${DB_PASSWORD}
ENV DB_URL=${DB_URL}
EXPOSE 5000
CMD ["gunicorn", "-b", "0.0.0.0:5000", "app:app"]
```
* **Node.js**
```dockerfile theme={null}
# 의존성 설치
FROM node:16-buster
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
ENV NODE_ENV production
COPY . .
# node 이미지에 이미 "node"라는 사용자가 uid/gid 1000번으로 생성되어 있음
USER node
EXPOSE 3000
CMD ["npm", "start"]
```
* **React**
```dockerfile theme={null}
# 프로젝트 빌드
FROM node:16-buster AS builder
WORKDIR /app
COPY package*.json .
RUN npm ci
COPY . .
RUN npm run build
# Production 런타임
FROM nginxinc/nginx-unprivileged:1.23 AS runner
WORKDIR /usr/share/nginx/html
COPY --from=builder /app/build .
EXPOSE 3000
CMD ["nginx", "-g", "daemon off;"]
```
### Dockerfile 내부에서 ARG 와 ENV 로 선언된 값 활용
> Dockerfile을 활용하여 배포하는 경우 다음과 같이 변수를 넘기는 두 가지의 방법이 있습니다.
* **빌드 인자(Build Arguments): 빌드 시점에 주입**
```bash theme={null}
docker build -t app:latest . --build-arg ARG1="VAL1" --build-arg ARG2="VAL2"
```
* **환경 변수(Environment Variables): 런타임 시점에 주입**
```bash theme={null}
docker run -d -p 8080:8080 --name app -e ENV1="VAL1" -e ENV2="VAL2" app:latest
```
***
## 참고
### 공식문서
* [Docker Docs](https://docs.docker.com/)
# Git 문제 해결
Source: https://cloudtype.mintlify.app/ko/troubleshooting/git
Git 관련 문제 해결 가이드
## 공통
> 저장소의 소스가 정상적으로 fetch 되었다면 프로젝트가 위치한 디렉토리를 확인해보아야 합니다.
> 만약 루트 디렉토리가 아닌 다른 디렉토리에 프로젝트가 위치해 있다면 해당 프로젝트가 위치한 경로를 서브 디렉토리로 설정하는 작업이 필요합니다. 방법은 [여기](/ko/developers/subdir)를 참고해주세요.
> 서브 디렉토리를 설정하여 하나의 Git 저장소 내 디렉토리로 구분되어 있는 프로젝트들을 각각 배포할 수 있습니다.
> 자세한 설정 및 배포 방법은 [여기](/ko/developers/subdir)를 참고해주세요.
# Java
Source: https://cloudtype.mintlify.app/ko/troubleshooting/java
Java 및 Spring Boot 관련 문제 해결 가이드
## 준비 및 확인사항
* **8, 11, 17, 18, 19**
로컬/테스트 환경과 클라우드타입에서 설정한 Java 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
> Environment Variables(환경변수)에 `SPRING_PROFILES_ACTIVE` 와 실행을 희망하는 profile 값을 입력하여 배포를 진행해주세요.
> profile에 따라 어플리케이션이 동작할 수 있도록 `application-.properties` 파일 혹은 `application.yml` 파일의 내용을 사전에 확인하세요.
> Environment Variables(환경변수)에 TZ 와 설정을 희망하는 시간대 값을 입력하여 배포를 진행해주세요. 환경변수로 설정된 값은 JVM 구동 시 주입되어 Spring 어플리케이션에 적용됩니다.
* 예시
* TZ: Asia/Seoul
* TZ: America/New\_York
* [Linux 타임존 리스트](https://en.wikipedia.org/wiki/List_of_tz_database_time_zones)
> 클라우드타입은 Jar로 패키징된 Spring 어플리케이션에 대해서 배포를 지원하며, War 패키지는 지원하지 않습니다.
서비스 배포 후 50X 발생 시, 실행 로그 결과에 따라 다음과 같은 케이스로 나눠 살펴볼 수 있습니다.
**1️⃣ 어플리케이션이 정상적으로 구동되지 않고 예외가 발생하거나 서버가 종료된 경우**
> 어플리케이션 구동에 필요한 패키지가 정상적으로 설치되지 않았거나 데이터베이스 연결이 실패했을 수 있습니다. 실행 로그의 에러 메세지를 기반으로 소스 내용 및 [환경 변수 등을 확인](/ko/developers/env)해주세요.
**2️⃣ 서버는 정상적으로 구동됐는데 권한과 관련된 에러가 발생하는 경우**
> 언어 및 프레임워크 중 특정 도메인 규칙에 대하여 CORS 허용 규칙을 적용해주어야 접속가능한 것이 있습니다. [리버스 프록시 페이지](/ko/developers/reverseproxy)를 참고해주세요.
**3️⃣ 빌드가 정상적으로 완료 되었는데 상태가 ‘시작중’에서 바뀌지 않고 생성된 URL에 접속해도 503 페이지만 뜨는 경우**
> 루트 디렉토리가 아닌 서브디렉토리에 코드가 존재하는 경우 이러한 상황이 발생할 수 있습니다. 사용자의 저장소를 디렉토리를 확인하고, 해당되는 경우 [서브디렉토리 설정](/ko/developers/subdir)을 추가해주세요.
**4️⃣ 서버는 정상적으로 구동됐는데 접속시 에러창이 뜨고 실행 로그에 아무런 반응이 없는 경우**
> 소스 코드에 설정된 포트가 배포시에 작성하신 포트와 불일치할 경우일 확률이 높습니다. [입력한 포트를 확인해주세요](/ko/developers/port).
***
## 참고
### 공식문서
* [Spring Boot Docs](https://docs.spring.io/spring-boot/docs/current/reference/html/index.html)
# Node.js
Source: https://cloudtype.mintlify.app/ko/troubleshooting/node
Node.js 관련 문제 해결 가이드
## 준비 및 확인사항
* **8, 10, 12, 14, 16, 18, 20**
로컬/테스트 환경과 클라우드타입에서 설정한 Node 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
> 클라우드타입은 배포할 GitHub 저장소의 `yarn.lock`, `package-lock.json`, `package.json` 의 순서대로 파일을 탐색하여 패키지를 설치합니다.
> 만약 이 3개의 파일이 모두 누락되어 있다면 설치할 패키지를 특정할 수 없기 때문에 정상적으로 배포가 진행되지 않습니다. GitHub 저장소의 필요 파일 누락 여부를 확인해주세요.
* `yarn.lock`, `package-lock.json`, `package.json` 파일이 GitHub 저장소에 정상적으로 반영되어 있다면 node 버전과 Install Command를 확인해주세요.
* node의 경우 v14와 v16 간 호환이 불가능한 패키지가 적지 않기 때문에 로컬에서 개발을 진행할 때 사용하던 node 버전을 확인하여 적용 부탁드립니다.
* Install Command 의 경우 기본적으로 `npm ci` 명령어가 적용되며, 프로젝트의 환경에 맞게 변경이 가능합니다.
> 클라우드타입에서 서비스가 배포되는 환경인 리눅스 운영체제에서는 root 권한이 없는 상태에서 1024번 이하의 포트를 사용할 수 없습니다.
> 클라우드타입의 어플리케이션은 보안 및 취약점 노출 방지를 위해 root가 아닌 사용자로 서비스를 구동하고 있기 때문에 다른 포트를 설정하여 서비스 재배포 부탁드립니다.
서비스 배포 후 50X 발생 시, 실행 로그 결과에 따라 다음과 같은 케이스로 나눠 살펴볼 수 있습니다.
**1️⃣ 어플리케이션이 정상적으로 구동되지 않고 예외가 발생하거나 서버가 종료된 경우**
> 어플리케이션 구동에 필요한 패키지가 정상적으로 설치되지 않았거나 데이터베이스 연결이 실패했을 수 있습니다. 실행 로그의 에러 메세지를 기반으로 소스 내용 및 [환경 변수 등을 확인](/ko/developers/env)해주세요.
**2️⃣ 서버는 정상적으로 구동됐는데 권한과 관련된 에러가 발생하는 경우**
> 언어 및 프레임워크 중 특정 도메인 규칙에 대하여 CORS 허용 규칙을 적용해주어야 접속가능한 것이 있습니다. [리버스 프록시 페이지](/ko/developers/reverseproxy)를 참고해주세요.
**3️⃣ 빌드가 정상적으로 완료 되었는데 상태가 ‘시작중’에서 바뀌지 않고 생성된 URL에 접속해도 503 페이지만 뜨는 경우**
> 루트 디렉토리가 아닌 서브디렉토리에 코드가 존재하는 경우 이러한 상황이 발생할 수 있습니다. 사용자의 저장소를 디렉토리를 확인하고, 해당되는 경우 [서브디렉토리 설정](/ko/developers/subdir)을 추가해주세요.
**4️⃣ 서버는 정상적으로 구동됐는데 접속시 에러창이 뜨고 실행 로그에 아무런 반응이 없는 경우**
> 소스 코드에 설정된 포트가 배포시에 작성하신 포트와 불일치할 경우일 확률이 높습니다. [입력한 포트를 확인해주세요](/ko/developers/port).
***
## 참고
### 공식문서
* [Node.js Docs](https://nodejs.org/en/docs)
# Python
Source: https://cloudtype.mintlify.app/ko/troubleshooting/python
Python 관련 문제 해결 가이드
## 준비 및 확인사항
* **3.7, 3.8, 3.9, 3.10, 3.11, 3.12**
로컬/테스트 환경과 클라우드타입에서 설정한 Python 버전이 상이한 경우 정상적으로 빌드되지 않을 수 있습니다.
프로젝트가 저장된 GitHub 저장소에 `requirements.txt` 파일 자체가 누락되거나 파일 내부에 필요한 패키지 정보가 누락된 경우입니다. 프로젝트에서 사용하시는 패키지에 대한 명세가 `requirements.txt` 내에 잘 작성되었는지 확인이 필요합니다.
Python 버전이 프로젝트에 맞지 않게 설정되었을 가능성이 있습니다. 특히 3.11, 3.12 버전은 이전의 패키지와 의존성 이슈가 발생할 가능성이 크므로 미리 로컬에서 테스트 한 후 알맞은 버전으로 설정해야합니다.
서비스 배포 후 50X 발생 시, 실행 로그 결과에 따라 다음과 같은 케이스로 나눠 살펴볼 수 있습니다.
**1️⃣ 어플리케이션이 정상적으로 구동되지 않고 예외가 발생하거나 서버가 종료된 경우**
어플리케이션 구동에 필요한 패키지가 정상적으로 설치되지 않았거나 데이터베이스 연결이 실패했을 수 있습니다. 실행 로그의 에러 메세지를 기반으로 소스 내용 및 [환경 변수 등을 확인](/ko/developers/env)해주세요.
**2️⃣ 서버는 정상적으로 구동됐는데 권한과 관련된 에러가 발생하는 경우**
언어 및 프레임워크 중 특정 도메인 규칙에 대하여 CORS 허용 규칙을 적용해주어야 접속가능한 것이 있습니다. [리버스 프록시 페이지](/ko/developers/reverseproxy)를 참고해주세요.
**3️⃣ 빌드가 정상적으로 완료 되었는데 상태가 ‘시작중’에서 바뀌지 않고 생성된 URL에 접속해도 503 페이지만 뜨는 경우**
루트 디렉토리가 아닌 서브디렉토리에 코드가 존재하는 경우 이러한 상황이 발생할 수 있습니다. 사용자의 저장소를 디렉토리를 확인하고, 해당되는 경우 [서브디렉토리 설정](/ko/developers/subdir)을 추가해주세요.
**4️⃣ 서버는 정상적으로 구동됐는데 접속시 에러창이 뜨고 실행 로그에 아무런 반응이 없는 경우**
소스 코드에 설정된 포트가 배포시에 작성하신 포트와 불일치할 경우일 확률이 높습니다. [입력한 포트를 확인해주세요](/ko/developers/port).
## Django
### 쉘에 접근하지 않고 Django의 Super User 생성
> 환경변수와 시작 명령어를 다음과 같이 세팅하면 Super User를 생성할 수 있습니다.
```shell theme={null}
[환경변수]
DJANGO_SUPERUSER_USERNAME - Django 슈퍼유저 username
DJANGO_SUPERUSER_PASSWORD - Django 슈퍼유저 password
DJANGO_SUPERUSER_EMAIL - Django 슈퍼유저 email
[시작 명령 - Pre Start Command]
python3 manage.py makemigrations && python3 manage.py migrate && python3 manage.py createsuperuser --noinput
```
User 모델에 별도의 필수 필드를 설정한 경우 `DJANGO_SUPERUSER_필드명(대문자)` 로 하여 환경변수에 추가해야 합니다.
### Django Admin 페이지에서 로그인 시 500 에러
> 도메인에 대한 origin 설정이 `settings.py` 에서 누락되어 발생하는 에러로, 다음의 코드를 `settings.py` 에 추가하면 해결됩니다.
```python theme={null}
ALLOWED_HOSTS = ["localhost", "127.0.0.1", ".cloudtype.app"]
CSRF_TRUSTED_ORIGINS = ['https://*.cloudtype.app']
```
### Django 프로젝트를 배포했는데 manage.py 파일이 존재하지 않는다고 표시
> Python 명령어 입력시 `python`이 아닌 `python3` 으로 실행해야 하며, GitHub 저장소에서 `manage.py` 가 위치한 곳을 정확히 지정해주어야 합니다.
* GitHub 저장소의 루트 디렉토리에 `manage.py` 가 위치한 경우 별도의 설정 필요 없음
* GitHub 저장소의 서브 디렉토리에 `manage.py` 가 위치한 경우 최초 템플릿 생성시, 경로 지정 필요
* 예) 서브 디렉토리 - `django-mariadb-samplapp`
* 최초 생성시 서브 디렉토리 필드에 알맞은 디렉토리명 입력
## Flask
### gunicorn: gunicorn command not found 에러 발생
> Flask의 웹 서버 역할을 하는 gunicorn 패키지가 컨테이너 이미지 빌드 시에 설치되지 않은 경우입니다. 배포 대상 GitHub 저장소 내의 `requirements.txt` 파일 내부에 gunicorn 패키지가 올바르게 명시되어 있는지 확인해주세요.
### Flask 서버가 실행 오류
> Start Command 필드에는 기본적으로 `gunicorn -b 0.0.0.0:5000 app:app` 명령어가 세팅되어 있습니다. GitHub 저장소의 Flask 프로젝트에서 `app.py` 아닌 다른 이름의 파일에서 Flask를 import 하여 어플리케이션을 구성하였다면 다음과 같이 명령어를 변경하여야 합니다.
```shell theme={null}
gunicorn -b 0.0.0.0:5000 [Flask를 import 하여 어플리케이션을 실행하는 파일명]:app
# [예시]
# cloudtype.py 에서 Flask를 import 하여 어플리케이션을 실행
gunicorn -b 0.0.0.0:5000 cloudtype:app
```
## FastAPI
### uvicorn: uvicorn command not found 에러
> Flask의 웹 서버 역할을 하는 uvicorn 패키지가 컨테이너 이미지 빌드 시에 설치되지 않은 경우입니다. 배포 대상 Github 저장소 내의 `requirements.txt` 파일 내부에 uvicorn 패키지가 올바르게 명시되어 있는지 확인해주세요.
### FastAPI 서버가 실행 오류
> Start Command 필드에는 기본적으로 `uvicorn main:app --host=0.0.0.0 --port=8000` 명령어가 세팅되어 있습니다. 혹은 GitHub 저장소의 `main.py` 에서 다른 이름의 변수에 FastAPI 객체를 할당한 경우 다음과 같이 명령어를 변경하여야 합니다.추가로, 클라우드타입에 배포시 개발용으로 사용되는 `--reload` 는 Start Command 에서 제외해주셔야 합니다.
```shell theme={null}
uvicorn main:app --host=0.0.0.0 --port=8000
# [예시]
# main.py에서 myapi=FastAPI()로 객체 할당
uvicorn main:myapi --host=0.0.0.0 --port=8000
```
## 참고
### 공식문서
* [Django Docs](https://docs.djangoproject.com/en/4.2/)
* [Flask Docs](https://flask.palletsprojects.com/en/2.3.x/)
* [FastAPI Docs](https://fastapi.tiangolo.com/ko/)