본문으로 바로가기 본문 바로가기
WIKI 기술 지식 베이스

Fly Launch 개요 (Fly Launch overview)

원문 보기 위키 갱신

Fly Launch가 어떻게 Fly App을 배포하고 관리하는 수고를 덜어주는지 설명하는 가이드예요. fly launch로 새 앱을 만들고 fly deploy로 배포하는 흐름, 빌드 구성, 플랫폼 리소스 프로비저닝, 그리고 커스텀 런치 예시까지 다뤄요.

출처: 문서

본문

Fly Launch는 Fly App을 배포하고 관리하는 많은 수고를 덜어주는 기능 묶음이에요. 자주 사용하게 될 두 명령은 fly launch와 fly deploy예요.

새 Fly App을 만드는 일반적인 방법은 프로젝트를 작성한 다음 fly launch를 실행하는 거예요. fly launch 명령은 코드 작성과 Fly.io 배포 사이의 가능한 한 많은 부분을 자동화해서, 좋은 기본값으로 실행되는 앱을 만들어 줘요.

fly launch 명령은 프로젝트에 따라 여러 작업을 수행해요:

  • Fly.io 조직에 새 앱을 초기화
  • 알려진 프로젝트 유형 감지
  • 좋은 기본값으로 앱 구성
  • 앱 Machines를 만드는 데 사용할 Docker 이미지 빌드
  • Postgres 클러스터, Redis 데이터베이스, IP 주소 같은 리소스 프로비저닝
  • 앱을 처음으로 배포

fly launch에 내장된 언어별 스캐너는 필요에 따라 다양한 작업을 수행해요. 다음 섹션에서는 소스 코드를 작성한 후 Fly Launch를 통해 Fly.io에서 라이브로 전환되기까지 일반적으로 일어나는 일을 설명해요.

새 Fly App 생성 (New Fly App creation)

fly launch가 새 Fly App을 만들면, 앱은 이름, 조직, 선호 배포 리전, 그리고 웹에서 공개적으로 접근 가능해야 하는 간단한 앱에 좋은 기본 구성을 얻게 돼요.

빌드 구성 (Build configuration)

Fly.io에 배포되는 앱은 Docker 이미지로 패키징되어야 Machine으로 만들 수 있어요.

이 이미지는 사전 빌드될 수도 있고, Dockerfile(권장), Buildpack, 또는 Nixpack을 기반으로 배포 과정 중에 빌드될 수도 있어요.

빌드 정보는 fly.toml의 build 섹션에 있어요. fly launch는 가능하면 자동으로 채워 넣어요. 배포 시점에 fly deploy와 함께 플래그를 사용해 빌드 정보를 재정의할 수 있어요.

레퍼런스: Builders and Fly.io

Fly App 구성 (Fly App configuration)

생성 시 앱은 대부분의 기본 웹 앱에서 동작할 기본 구성을 얻게 돼요.

프로젝트의 소스 디렉토리에서 fly.toml 파일을 열어 앱의 구성을 볼 수 있고, fly config show를 실행해 JSON 형식으로도 볼 수 있어요. Postgres 앱은 로컬 fly.toml 파일이 없지만, fly config save -a my-app-name으로 다운로드해 로컬에 저장할 수 있어요.

앱의 fly.toml을 편집한 다음 fly deploy를 실행해 구성을 변경할 수 있어요.

flyctl 언어별 스캐너는 작업의 일부로 앱 구성을 변경해요.

레퍼런스: 앱 구성 (fly.toml)

플랫폼 리소스 프로비저닝 (Platform resource provisioning)

배포 전에 Fly Volume이나 Postgres 데이터베이스를 만들고 구성하거나, 앱 시크릿 설정을 하고 싶을 수 있어요.

일부 flyctl 스캐너는 API를 사용해 이 중 일부 또는 전부를 수행해요.

배포 (Deployment)

fly launch 명령은 기본값을 수락하거나 앱 설정을 조정한 후 앱을 처음으로 배포할 수 있어요. fly launch --no-deploy로 새 앱이 바로 배포되는 것을 막을 수 있어요.

앱을 업데이트하고 싶을 때마다 fly deploy를 실행하면 돼요. fly deploy는 업데이트된 구성으로 앱의 새 릴리스를 만들고, 필요하면 이미지를 빌드해 Fly.io 레지스트리에 저장해요. 앱이 공용 포트에서 수신하고 아직 공용 IP가 없다면 공용 IP 주소가 프로비저닝돼요. 마지막으로 일부 하드웨어가 할당되고 최소 하나의 Machine이 부팅돼요.

fly deploy 옵션을 사용해 환경 변수 추가 같은 앱 구성의 특정 요소를 변경할 수 있어요. 로컬 fly.toml 파일이 있다면 이에 의해 변경되지 않지만, 변경사항을 향후 배포에 유지하고 싶다면 fly config save로 현재 배포된 구성으로 덮어쓸 수 있어요.

초기 CPU와 RAM 스펙은 가장 작은 값이 기본이에요. 일부 프로젝트는 실행에 더 큰 리소스가 필요해요. fly.toml 파일의 vm 섹션에서 기본 Machine 크기와 메모리를 설정할 수 있어요. flyctl로 앱의 Machines를 확장할 수도 있어요.

Launch 결과 (Launch outcomes)

모든 것이 잘 진행되면 프로젝트의 작업 디렉토리에서 fly launch를 실행할 때 여러 가지 중 하나가 일어나요. 어떤 경우든 배포 전에 앱의 기본값을 조정할 수 있는 옵션이 있어요:

  1. --image 플래그를 사용했다면, 앱이 기존 Docker 이미지를 사용하도록 구성돼요.
  2. --dockerfile 플래그를 사용했다면, 앱이 지정된 Dockerfile로 이미지를 빌드하도록 구성돼요.
  3. 그렇지 않으면, flyctl이 로컬 작업 디렉토리를 스캔해요.
    1. 전체 서비스 런처가 있는 종류의 프로젝트를 감지하면 자동으로 앱을 구성해요.
    2. flyctl에 전체 앱을 구성할 수 있는 런처는 없지만 Dockerfile을 찾았다면, 그 Dockerfile로 빌드해 배포할 것을 제안해요.
  4. 위 중 아무것도 일어나지 않으면, flyctl이 이름과 조직으로 새 앱을 등록하고 작업할 기본 fly.toml을 내려줘요. 추가 구성 없이는 배포가 일어날 수 없어요.

이 모든 경우에 fly launch는 최종 앱 구성을 작업 디렉토리의 fly.toml로 내려받아요. fly deploy는 각 새 배포에서 앱 구성을 설정하기 위해 fly.toml을 찾을 거예요.

앱을 만든 후에는 fly.toml과 flyctl 명령을 통해 앱을 변경하고 추가 리소스를 프로비저닝할 수 있어요.

스캐너가 하는 다른 일들 (More things the scanners do)

fly launch에 통합된 언어 또는 프레임워크별 스캐너는 다음과 같은 멋진 일도 할 수 있어요:

  • 작업 디렉토리에 파일(예: Dockerfile, 구성 파일)을 내려받아요. 기존 로컬 파일은 확인 후에만 덮어써요.
  • 로컬 개발 환경에서 프로젝트를 배포용으로 준비하는 명령을 실행해요.
  • Dockerfile에 명령을 추가해요.
  • 릴리스 명령을 설정해요.
  • 빌드 인자를 설정해요.
  • 추가 정보나 지침이 담긴 메시지를 사용자에게 출력해요.

기존 구성 가져오기에 "예"라고 대답하면 어떻게 되나요?

Fly Launch는 기본 구성 대신 그 fly.toml에 지정된 구성을 사용해요. 하지만 스캐너는 계속 진행되며 이 가져온 설정을 덮어쓸 수도 있어요.

Fly Launch 커스터마이징 (Customizing Fly Launch)

fly launch를 프로젝트에 더 잘 맞게 커스터마이징할 수 있어요. 다음 예시가 어떻게 동작하는지 보여줘요.

커스텀 런치를 만드는 방법에 대한 자세한 내용은 Custom launch를 참고하고 fly launch와 함께 사용할 수 있는 모든 옵션을 확인하세요.

커스텀 런치의 예시 (An example of a custom launch)

로컬 개발 서버로 작성하고 테스트한 Flask 앱을 실행하는 예시예요:

```bash cmd fly launch ```
Scanning source code
Detected a Python app
Using the following build configuration:
	Builder: paketobuildpacks/builder:base
Creating app in /Users/chris/FlyTests/hello-gunicorn-flask
We're about to launch your Python app on Fly.io. Here's what you're getting:

Organization: MyOrg                  (fly launch defaults to the personal org)
Name:         hello-gunicorn-flask   (derived from your directory name)
Region:       Secaucus, NJ (US)      (this is the fastest region for you)
App Machines: shared-cpu-1x, 1GB RAM (most apps need about 1GB of RAM)
Postgres:     <none>                 (not requested)
Redis:        <none>                 (not requested)

? Do you want to tweak these settings before proceeding? (y/N)

빌드팩보다 Dockerfile 기반 배포를 사용하기로 결정해요. 더 빠른 배포와 더 많은 제어를 위해서요. 런치를 중지하려고 ctrl-C를 눌러요.

편리하게도 이 앱과 함께 동작하는 Dockerfile이 이미 있어요.

작업 디렉토리에 Dockerfile이 있으면 fly launch를 다시 실행할 때, 일반 Python buildpack 런처가 실행되기 전에 Dockerfile 런처가 대신 처리해요.

```bash cmd fly launch ```
An existing fly.toml file was found for app hello-gunicorn-flask
? Would you like to copy its configuration to the new app? No

fly-apps/hello-gunicorn-flask 리포지토리를 로컬 머신에 클론해서 작업 디렉토리에 fly.toml이 있지만, fly launch가 주는 구성을 사용하고 싶어서 그 질문에 No라고 대답해요.

Scanning source code
Detected a Dockerfile app
Creating app in /Users/chris/FlyTests/hello-gunicorn-flask
We're about to launch your app on Fly.io. Here's what you're getting:

Organization: MyOrg                  (fly launch defaults to the personal org)
Name:         hello-gunicorn-flask   (derived from your directory name)
Region:       Secaucus, NJ (US)      (this is the fastest region for you)
App Machines: shared-cpu-1x, 1GB RAM (most apps need about 1GB of RAM)
Postgres:     <none>                 (not requested)
Redis:        <none>                 (not requested)

? Do you want to tweak these settings before proceeding? (y/N)

Dockerfile 스캐너가 대신 처리하는 모습이에요. y를 입력해 스캐너가 소스 코드에서 찾아낸 다른 설정을 살펴볼게요. Fly Launch 웹 페이지가 열리고 원하면 앱 이름이나 리전 같은 기본 설정을 변경할 수 있어요:

  • 리전은 Fly Launch가 첫 배포 시 앱의 Machines를 만들 리전이에요. 이 리전은 fly.toml 파일의 primary_region이에요. primary 지역은 flyctl이 새 프로세스 그룹의 Machines를 추가하는 곳이기도 해요. 우선 Secaucus, NJ (ewr) 리전을 유지할게요.

  • 다음으로 서비스 포트를 확인해요. 이 포트는 fly.toml 파일의 [[http_service]] 섹션에 있는 internal_port예요. 내 Flask 앱은 더 일반적인 포트 8080(fly.toml 기본값)이 아니라 4999 포트에서 수신해요. 그래서 내 Dockerfile에는 다음 줄이 들어 있어요:

    EXPOSE 4999
    

    Fly.io는 Dockerfile의 EXPOSE 문을 직접 신경 쓰지 않아요. 우리는 실제로 컨테이너를 실행하지 않고, 프록시를 통한 서비스가 Dockerfile이 아니라 fly.toml에서 구성되기 때문이에요. 하지만 fly launch 스캐너는 EXPOSE가 있으면 이를 잡아내서 그에 맞게 채워 넣어요. Fly Launch 웹 페이지를 통해 포트가 4999로 설정된 것을 확인해요.

  • 나머지는 모두 좋아 보여서 Confirm Settings를 클릭해요.

터미널로 돌아와서 앱이 생성되고 이미지가 빌드되는 것을 출력에서 볼 수 있어요 (간결하게 편집됨):

Waiting for launch data... Done
Created app 'hello-gunicorn-flask' in organization 'personal'
Admin URL: https://fly.io/apps/hello-gunicorn-flask
Hostname: hello-gunicorn-flask.fly.dev
Wrote config file fly.toml
Validating /Users/chris/FlyTests/hello-gunicorn-flask/fly.toml

Platform: machines
✓ Configuration is valid
==> Building image
Remote builder fly-builder-long-glitter-7257 ready
==> Building image with Docker

...

--> Pushing image done
image: registry.fly.io/hello-gunicorn-flask:deployment-01HGEDDH0R7T762T90B45GZRWP
image size: 141 MB

Watch your deployment at https://fly.io/apps/hello-gunicorn-flask/monitoring

Provisioning ips for hello-gunicorn-flask
  Dedicated ipv6: 2a09:5789:1::4e:b68c
  Shared ipv4: 66.333.124.86
  Add a dedicated ipv4 with: fly ips allocate-v4

HTTP 서비스가 구성되어 있고 공용 IP 주소가 없었기 때문에, Fly Launch가 배포 시 IP를 프로비저닝했어요.

This deployment will:
 * create 2 "app" machines

No machines in group app, launching a new machine
Creating a second machine to increase service availability
Finished launching new machines
-------
NOTE: The machines for [app] have services with 'auto_stop_machines = true' that will be stopped when idling

-------

Visit your newly deployed app at https://hello-gunicorn-flask.fly.dev/

첫 배포가 끝났어요!

프로세스 그룹을 명시적으로 구성하지 않았기 때문에, 앱은 기본 app 프로세스에 두 대의 Machine을 할당받아요. fly status로 Machine을 볼 수 있어요:

```bash cmd fly status ```
App
  Name     = hello-gunicorn-flask
  Owner    = personal
  Hostname = hello-gunicorn-flask.fly.dev
  Image    = hello-gunicorn-flask:deployment-01HGEDDH0R7T762T90B45GZRWP
  Platform = machines

Machines
PROCESS	ID            	VERSION	REGION	STATE  	ROLE	CHECKS	LAST UPDATED
app    	918543b477de83	1      	ewr   	stopped	    	      	2023-11-29T21:17:19Z
app    	e28697ce6d3986	1      	ewr   	stopped	    	      	2023-11-29T20:55:33Z
**참고:** 두 Machine 모두 중지(stopped) 상태예요. 몇 분 동안 유휴 상태였고 기본적으로 [autostop/autostart 기능](/launch/autostop-autostart)을 활성화하기 때문이에요.

세계 곳곳의 사용자에게 더 가까이 가고 싶다면 다른 리전에 Machines를 추가해 확장할 수 있어요.

새 웹 앱이 실제로 동작하는지 확인하려면 브라우저에서 출력에 제공된 URL을 방문해요 (제 경우에는 hello-gunicorn-flask.fly.dev예요).

더 알아보기 (Learn more)