지난 포스팅에서는 Vapor를 이용하여 서버를 구성하는 방법을 살펴보았습니다. 이번에는 Heroku를 이용해 구성한 서버를 배포하는 방법에 대해 알아보겠습니다.
Heroku는 유명한 올인원 호스팅 솔루션 중 하나입니다. 페이지 링크
서비스 이용을 위해서는 먼저 가입하셔야 합니다. 이 곳에서 하실 수 있습니다.
아래 명령어를 터미널에 입력하시면 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 init
명령을 통해 프로젝트를 Git 저장소로 등록해두어야 합니다. 또한 Heroku는 기본적으로 master branch를 배포하므로 브랜치에 push하기 이전에 모든 변경 사항들이 master branch에 잘 반영되었는지 확인하는 것이 좋습니다.git init
을 통해 처음 git을 초기화한 상태라면 git branch
명령을 하여도 branch가 없을 것입니다. 이럴 경우 commit을 하면 branch 목록을 보실 수 있습니다. git checkout master
명령을 통해 브랜치를 이동합니다.git status --porcelain
명령을 통해 커밋하지 않은 변경사항이 있으면 추가적으로 커밋을 남깁니다.아래 명령을 통해 앱과 heroku를 연결합니다. 앱 이름은 Heroku에서 만드신 이름으로 바꾸어주세요.
heroku git:remote -a your-apps-name-here
Heroku에게 Vapor를 다루는 방법을 알려줄 수 있도록 아래 명령을 통해 buildpack을 세팅합니다.
heroku buildpacks:set vapor/vapor
추가한 Buildpack은 .swift-version
파일을 가지고 있을 것입니다. 아래 명령을 통해 이 파일에 현재 사용 중인 Swift의 버전을 입력해 줍니다. 사용 중인 Swift의 버전은 swift --version
명령을 통해 확인하실 수 있습니다.
echo "5.4.2" > .swift-version
Heroku는 앱을 실행하는 방법을 알기 위해 Procfile을 사용합니다. 이는 아래와 같은 명령으로 만들 수 있습니다.
echo "web: Run serve --env production" \
"--hostname 0.0.0.0 --port \$PORT" > Procfile
여기까지의 변경 사항을 커밋합니다.
아래 명령을 통해 Heroku에 배포합니다. 시간이 조금 걸릴 수 있지만 정상입니다.
git push heroku master
push에서 에러가 발생한다면 package.swift
가 위치한 곳에서 git init
, heroku login
과정부터 다시 진행하여 git push heroku master
를 수행해봅니다.
https://app-name.herokuapp.com
를 브라우저 주소창에 입력하여 접근할 수 있습니다.
변경 사항이 발생하면 master branch에 커밋 후 heroku에 push하면 재배포됩니다.
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
에러 발생시 팁은 꿀팁이네요!! 아리가토-