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

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

지난 포스팅에서는 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일

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

답글 달기