[Vapor/Swift] Heroku를 이용하여 Vapor 서버 배포하기

Ryan (Geonhee) Son·2021년 6월 29일

지난 포스팅에서는 Vapor를 이용하여 서버를 구성하는 방법을 살펴보았습니다. 이번에는 Heroku를 이용해 구성한 서버를 배포하는 방법에 대해 알아보겠습니다.

Heroku

Heroku는 유명한 올인원 호스팅 솔루션 중 하나입니다. 페이지 링크

배포 절차

가입

서비스 이용을 위해서는 먼저 가입하셔야 합니다. 이 곳에서 하실 수 있습니다.

Homebrew를 이용하여 CLI 설치

아래 명령어를 터미널에 입력하시면 Heroku CLI를 설치하실 수 있습니다.

brew install heroku/brew/heroku

로그인

CLI 설치 후에 아래 명령어를 통해 로그인합니다.
heroku login

아래와 같은 메시지가 출력되면 q 이외의 키를 입력을 통해 브라우저를 띄우고 로그인 버튼을 클릭합니다.
heroku: Press any key to open up the browser to login or q to exit:

아래 명령을 통해 정상적으로 로그인 되었는지 확인하실 수 있습니다.
heroku auth:whoami

앱 만들기

브라우저의 Create new app 버튼을 클릭하여 새로운 앱을 만듭니다.

앱의 이름을 기입 후 다음 페이지로 넘어갑니다.

Git 작업

  • Heroku는 앱 배포 시 Git을 사용하므로 git init 명령을 통해 프로젝트를 Git 저장소로 등록해두어야 합니다. 또한 Heroku는 기본적으로 master branch를 배포하므로 브랜치에 push하기 이전에 모든 변경 사항들이 master branch에 잘 반영되었는지 확인하는 것이 좋습니다.
  • git init을 통해 처음 git을 초기화한 상태라면 git branch 명령을 하여도 branch가 없을 것입니다. 이럴 경우 commit을 하면 branch 목록을 보실 수 있습니다.
  • master branch에 위치하고 있지 않으면 git checkout master 명령을 통해 브랜치를 이동합니다.
  • git status --porcelain 명령을 통해 커밋하지 않은 변경사항이 있으면 추가적으로 커밋을 남깁니다.

Heroku에 연결하기

아래 명령을 통해 앱과 heroku를 연결합니다. 앱 이름은 Heroku에서 만드신 이름으로 바꾸어주세요.
heroku git:remote -a your-apps-name-here

Buildpack 세팅

Heroku에게 Vapor를 다루는 방법을 알려줄 수 있도록 아래 명령을 통해 buildpack을 세팅합니다.
heroku buildpacks:set vapor/vapor

Swift version file

추가한 Buildpack은 .swift-version 파일을 가지고 있을 것입니다. 아래 명령을 통해 이 파일에 현재 사용 중인 Swift의 버전을 입력해 줍니다. 사용 중인 Swift의 버전은 swift --version 명령을 통해 확인하실 수 있습니다.
echo "5.4.2" > .swift-version

Proc file

Heroku는 앱을 실행하는 방법을 알기 위해 Procfile을 사용합니다. 이는 아래와 같은 명령으로 만들 수 있습니다.

echo "web: Run serve --env production" \
  "--hostname 0.0.0.0 --port \$PORT" > Procfile

여기까지의 변경 사항을 커밋합니다.

Heroku에 배포하기

아래 명령을 통해 Heroku에 배포합니다. 시간이 조금 걸릴 수 있지만 정상입니다.
git push heroku master

에러 발생 시 팁

push에서 에러가 발생한다면 package.swift가 위치한 곳에서 git init, heroku login 과정부터 다시 진행하여 git push heroku master를 수행해봅니다.

접속

https://app-name.herokuapp.com를 브라우저 주소창에 입력하여 접근할 수 있습니다.

Continued Deployment (CD)

변경 사항이 발생하면 master branch에 커밋 후 heroku에 push하면 재배포됩니다.

Postgres

PostgresSQL 데이터베이스 추가

Heroku 웹 페이지의 dashboard에서 Configure Add-ons를 클릭합니다.

검색창에서 Heroku Postgres를 찾아 클릭합니다.

이어 나타나는 창에서 목적에 따른 plan을 선택합니다. 저는 Hobby Dev- Free를 선택하고 다음으로 넘어가겠습니다.

데이터베이스 구성

앱이 위치한 곳에서 터미널에 heroku config 명령어를 입력합니다.

이어 터미널에 출력되는 DATABASE_URL은 출력된 postgres 데이터베이스를 나타냅니다. Vapor 공식문서에서는 Heroku가 URL을 변경할 수도 있기 때문에 정적 URL을 절대로 하드 코딩하지 말라고 소개하고 있습니다. 대신 아래와 같이 데이터베이스를 구성하면 됩니다.

if let databaseURL = Environment.get("DATABASE_URL") {
    app.databases.use(try .postgres(
        url: databaseURL
    ), as: .psql)
} else {
    // ...
}

Heroku Postgres의 standard plan을 사용한다면 unverified TLS가 필요합니다.

if let databaseURL = Environment.get("DATABASE_URL"), var postgresConfig = PostgresConfiguration(url: databaseURL) {
    postgresConfig.tlsConfiguration = .forClient(certificateVerification: .none)
    app.databases.use(.postgres(
        configuration: postgresConfig
    ), as: .psql)
} else {
    // ...
}

데이터베이스를 구성하고 커밋해주세요.

데이터베이스 마이그레이션

용어가 생소할 수 있지만 향후 포스팅에서 자세히 다룰 내용이니 아직 이해하시지 못해도 괜찮습니다.
마이그레이션은 아래 명령을 통해 할 수 있습니다.
heroku run Run -- migrate --env production

데이터베이스 되돌리기

데이터베이스를 되돌리려면 아래 명령을 입력하세요.
heroku run Run -- migrate --revert --all --yes --env production

revert 작업에 실패하면 아래 명령어를 입력해보세요.
heroku run Run -- migrate --revert

참고자료

  1. Vapor Docs
profile
합리적인 해법 찾기를 좋아합니다.

1개의 댓글

comment-user-thumbnail
2021년 7월 23일

에러 발생시 팁은 꿀팁이네요!! 아리가토-

답글 달기