Vapor + heroku
직접 서버 개발을 주도해보고 싶어서 Vapor를 학습하고 heroku를 통해 배포해 보았습니다.
서버 개발 경험이 전무해서 문서를 읽고, 이해하고 만드는데 시간이 많이 걸려서 다음번에 더 손쉽게 하기 위해서 기록해 두려고 합니다.
개발환경
- Xcode 13.4.1
1. Vapor 설치하기
터미널에 아래의 코드를 입력
brew install vapor
2. Vapor 프로젝트 생성
터미널에 순서대로 입력.
// 1. 터미널에 vapor 프로젝트 생성
vapor new { 프로젝트 이름 } // ex. vapor new vaportest
// 2. y, 1, y 순서로 입력
// 3. 생성된 파일 내부로 이동
cd { 프로젝트 이름 }
// 4. vapor Xcode 열기
vapor xcode
// 5. 엑스코드 연 후 빌드 후 실행
// 6. 실행이 된 후 크롬 창에 localhost:8080
6번 과정 이후, 브라우저에 결과가 표시되면 성공
3. 가장 중요한 것은 대시보드!
대시보드에서 Reource - Add-ons섹션에서 postgres 선택 후 Heroku Postgres를 선택하고 Hobby Dev - Free 플랜을 선택하고 완료하면 된다.
다시 로컬로 돌아와서 터미널에
4. Heroku CLI 설치
brew install heroku/brew/heroku
5. heroku login
heroku login
정상적으로 로그인 되는지 확인하려면,
heroku auth:whoami
6. git
대시보드에 설정한 앱 이름을 넣어준다.
여기서 git이라고 하면은 heroku가 git을 이용한다는 거지, 내가 깃헙에 git을 굳이 안올려도 돼.
그러니까 heroku용 깃과 코드를 위한 나의 git이 따로 있다고 생각하면 된다.
heroku git:remote { 대시보드에 지정한 heroku 앱 이름 }
7. 빌드팩 설정
heroku buildpacks:set vapor/vapor
8. .swift-version 생성 및 Profile 생성
echo "5.2.4" > .swift-version
echo "web: Run serve --env production" \
"--hostname 0.0.0.0 --port \$PORT" > Procfile
9. PostgreSQL 설정
앱이 데이터베이스에 접근할 수 있도록 설정한다.
heroku config
만약 설정이 정상적으로 되었다면, 명령어를 입력했을 때
=== { 대시보드에 등록한 앱 이름 } Config VarsDATABASE_URL: postgres:// { ... }
위 처럼 나타난다.
만약 제대로 나타나지 않는다면 3번 과정을 수행하지 않았는지 확인이 필요하다.
10. configure.swift 파일에 다음의 코드를 추가합니다.
import Fluent
import FluentPostgresDriver
import Leaf
import Vapor
// configures your application
public func configure(_ app: Application) throws {
// uncomment to serve files from /Public folder
app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory))
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 {
// ...
}
app.databases.use(.postgres(
hostname: Environment.get("DATABASE_HOST") ?? "localhost",
port: Environment.get("DATABASE_PORT").flatMap(Int.init(_:)) ?? PostgresConfiguration.ianaPortNumber,
username: Environment.get("DATABASE_USERNAME") ?? "vapor_username",
password: Environment.get("DATABASE_PASSWORD") ?? "vapor_password",
database: Environment.get("DATABASE_NAME") ?? "vapor_database"
), as: .psql)
app.migrations.add(CreateTodo())
app.views.use(.leaf)
// register routes
try routes(app)
}
위 코드처럼 작성합니다.
마지막으로 배포!
heroku는 기본적으로 master 브랜치에 배포
git push heroku master
이 과정에서 약간의 시간일 걸림
이후 코드가 변경되었다면
git add *
git commit -m "커밋 메시지"
git push heroku master
커밋하고 푸시하면 된다.
다음에 포스트 맨으로
https://{대시보드 앱 이름}.herokuapp.com/...
🚨 이슈
heroku ps:scale web=1 입력시, Couldn't find that process type, Heroku가 나타났을 때 사용
아래처럼 해도 되었으나, 저의 경우에는 heroku 대시보드에서 데이터베이스를 제대로 설정하지 않아서 나타나는 문제였습니다.
heroku config를 했을 때 아무것도 나타
https://www.appsloveworld.com/django/100/149/couldnt-find-that-process-type-web-error-on-heroku
(참고)
https://yagom.net/courses/start-vapor/lessons/vapor-app-%eb%b0%b0%ed%8f%ac%ed%95%98%ea%b8%b0/
https://hururuek-chapchap.tistory.com/128?category=933474