프레임워크별 배포

Phoenix

Phoenix를 관리형 Elixir 릴리스로 배포하고 정적 파일을 CDN에서 제공합니다.

나이트로쉽은 mix.exs의 :phoenix 의존성으로 Phoenix를 감지합니다. 관리형 프리셋은 Elixir 릴리스를 빌드하고 Phoenix HTTP 엔드포인트를 컴퓨트에서 실행하며, priv/static의 정적 파일을 CDN에 게시합니다.

배포하기

CLI 설치

curl -fsSL https://nitroship.co/install.sh | bash
ntro login

이미 설치했다면 다음 단계로 넘어가세요. 설치 옵션, PATH 설정 및 업데이트는 CLI 설치에서 확인하세요.

컴퓨트 리전은 기본값이 없으므로 꼭 정하세요. 배포 루트에서 Phoenix를 직접 선택합니다.

nitroship.json
{
  "build": {"framework": "phoenix"},
  "compute": {"regions": ["kr-icn"]}
}
ntro apps create my-phoenix-app
ntro deploy . --prod

이 프리셋은 호스팅 빌더에서만 빌드할 수 있습니다. 배포 명령에 --local이 있다면 빼세요. 배포 후 CLI가 보여 준 주소에서 동적 페이지와 정적 파일을 각각 열어 보세요.

빌드와 릴리스

Elixir와 Erlang/OTP 버전은 .tool-versions에 선언하세요. erlang 항목이 있으면 Elixir 버전의 -otp-N 접미사보다 우선하며, 둘 다 없으면 안정 OTP 기본 버전을 사용합니다. 생성된 빌드는 선언한 버전과 가장 가까운 지원 툴체인·베이스 버전을 고정해서 쓰고, 선언이 없으면 안정 버전을 기본으로 씁니다. mix.exs와 mix.lock을 커밋하세요.

빌드는 의존성 다운로드와 앱 컴파일을 수행하고, assets.deploy 별칭이 정의되어 있으면 mix assets.deploy를 실행한 뒤 mix release --path /opt/release로 릴리스를 만듭니다. 최종 이미지는 Mix 개발 서버 대신 릴리스를 실행합니다. 생성된 런타임은 PHX_SERVER=true를 활성화하고 모든 IPv4 인터페이스의 $PORT에서 엔드포인트가 요청을 받도록 구성합니다. 기본 포트는 3000입니다.

DB와 엔드포인트처럼 실행 시 결정할 설정은 config/runtime.exs에 두세요. 엔드포인트 자동 감지는 일반적인 lib/*/endpoint.ex의 Phoenix.Endpoint 모듈을 기준으로 합니다. 엄브렐라 프로젝트, 별도 엔드포인트·릴리스 구조, 추가 OS 의존성이 필요하면 직접 만든 Dockerfile을 사용하는 편이 좋습니다.

정적 파일

빌드는 priv/static의 파일을 /nitroship/static에 모읍니다. 빌더는 릴리스를 시작하기 전에 해당 디렉터리를 자동으로 CDN에 추출합니다. priv/static/assets/app.js는 /assets/app.js로 제공됩니다. Phoenix 페이지와 API는 계속 컴퓨트에서 실행됩니다.

추출 대상에는 공개 정적 파일만 넣으세요. Elixir 소스나 비밀 값은 제외해야 합니다. priv/static이 없거나 공개 파일이 없다면 CDN 정적 출력도 없습니다. 사용자 업로드 파일은 릴리스 결과물이 아닙니다.

환경 변수와 데이터베이스

프로덕션 설정에 필요한 값은 환경 변수로 등록하세요.

  • Phoenix 엔드포인트의 SECRET_KEY_BASE.
  • Ecto를 사용하고 해당 변수를 읽는 앱의 DATABASE_URL. 데이터베이스는 외부 서비스를 사용하세요.
  • 실행 설정에서 공개 URL을 만드는 데 사용하는 PHX_HOST. localhost가 아닌 배포 도메인이나 커스텀 도메인을 적습니다.
  • 생성된 런타임은 PHX_SERVER=true를 활성화합니다. 엔드포인트 설정도 이 값과 호환되게 유지하세요.

이미지 안의 DB 파일에 영구 데이터를 저장하지 마세요. 빌드 단계에서도 설정을 읽는다면 필요한 빌드용 값을 런타임 값과 별도로 제공하세요.

런타임 제한

생성된 이미지는 루트 권한 없이 실행됩니다. 인스턴스 파일시스템은 임시 공간이며 릴리스의 임시 파일, 캐시, 크래시 덤프는 /tmp 아래에 씁니다. 업로드는 priv/static이나 릴리스 디렉터리가 아니라 S3 같은 오브젝트 스토리지에 저장하세요.

나이트로쉽은 마이그레이션, 큐 워커, 스케줄러를 자동으로 실행하지 않습니다. 프로젝트의 릴리스 마이그레이션 작업은 CI나 내 컴퓨터에서 외부 DB를 대상으로 실행하세요. 관리형 시작 명령은 mix ecto.migrate를 실행하지 않습니다. 별도로 필요한 큐 워커나 스케줄러도 자동으로 구성되지 않습니다. 정기 HTTP 작업은 Cron 작업을 사용하고 워커 실행은 별도로 구성하세요.

프레임워크 선택과 직접 만든 Dockerfile

build.framework: "phoenix"는 Phoenix를 직접 선택하며 자동으로 찾은 Dockerfile보다 우선합니다. build.dockerfile과는 함께 쓸 수 없습니다.

프레임워크를 직접 지정하지 않았을 때의 감지 순서는 빌드 방식 선택에 있습니다. 별도 릴리스, 네이티브 시스템 라이브러리, 다른 프로세스·정적 파일 구조가 필요하면 build.framework를 빼고 직접 만든 Dockerfile을 쓰세요.

이 페이지에서