Heroku
는 사용자(주로개발자)에게 application
을 위한 cloud platform
을 제공해준다. 그래서 application
을 쉽게 배포하고 관리할 수 있게 해줌.
개인적으로 heroku를 사용하는 가장 궁극의 목적은 무료로 플랫폼을 제공해주고 배포만하면
도메인
과https
까지 한번에 사용가능해서 테스트용으로 사용하기에 적당하다고 판단해서이다.
후기로써 적자면...솔직히 처음 시도하는 입장에서 도전이 그리 쉬운편은 아니었지만 구글링을 통해 많은 레퍼런스를 찾을 수 있으므로 한번 성공해보면 재미있을 수 있음.
로컬개발환경
프론트는 간단히 pug를 사용함.
🏅 목적
passport
를 이용한 sns 로그인들을 테스트해보기 위해서. 페이스북
같은 경우 Oauth용 앱을 라이브로 사용하기 위해서는 https
를 요구해서 겸사겸사 heroku
배포도 한번도전함.
전부 완료한 후 찾게 된 것이긴 하지만(뒷북..) node.js로 Heroku를 사용하는 방법을 자세히 설명한 문서가 있다. 구글링을 통해 찾지 못한 문제는 이곳에서 한번 찾아보는것도 좋을 것 같다.
우분투 설치 위주로 진행할 예정이다 다른 환경에서의 다운로드 및 인스톨 방법은 링크참조하자.
우분투 16+ 버전에서는 아래 명령어로 설치가능하다.
sudo snap install --classic heroku
설치가 완료되면 저렇게 heroku
명령어가 사용가능하다. 명령어 메뉴얼은 -h
옵션으로 확인 가능하다.
이후 아래와 같이 터미널에 로그인 명령어를 친다
heroku login
웹페이지가 뜨고 로그인을 진행하면 터미널에 본인의 메일로 로그인이 된 것을 확인할 수있다.
깃을 생성했다면 아래와 같이 앱이름으로 heroku app을 생성해주면 된다.
heroku create 앱이름
이렇게 앱을 생성하면 자동으로 heroku
의 remote가 heroku
로 생성이 됨을 아래명령어로 확인 가능하다.
git remote -v
일단 heroku app을 배포하는데 있어 모든 준비를 마친 소스패키지의 경우엔 바로 아래 명령어를 치면 된다.
git push heroku master
그럼 배포가 종료되고 터미널에 앱의 url
로 접속하면 끝이다.
하지만 본인은 많은 시행착오가 있었.....🚣🚣♀️
내가 겪은 경우도 있고 검색했을때 나온것들도 추가로 작성함.
✅ node 엔진 고정하기
//package.json
{
"name": "패키지명",
"version": "1.0.0",
"description": "",
"main": "index.js",
...
"engines": {
"node": ">=10.0.0",
"npm": ">=6.0.0"
}
}
engine
고정 같은 경우는 heroku
배포시 미리 설정해 놓아서 내 경우에 해당하진 않았지만 검색해보니 설정을 fix안 한경우 문제가 발생하는 경우도 있다고 해서 참고로 적음.
✅ preinstall
로 pm2
를 global
미리 설치하기
//package.json
{
"name": "패키지명",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"dev": "nodemon app.js",
"preinstall": "npm install pm2 -g",
"start": "NODE_ENV=production pm2-runtime app.js -i 0"
},
...
"engines": {
"node": ">=10.0.0",
"npm": ">=6.0.0"
}
}
pm2
로 인한 배포 문제는 생각해보지 못했었다. pm2
로 인한 배포 실패시 개인적으로heroku
가 알려준 에러메세지를 이해하지 못했다.
단지 로컬로 production
으로 실행했을 때 nodemon
의 경우는 문제가 없었기에 pm2
로 인한 문제란걸 깨닫고 알아차렸다.
하지만 생각해보면 간단하다. 너무 로컬에서 테스트를 쉽게 했기에 잊고 있었는데 pm2
를 로컬에서 실행할 때는 global
로 설치해서 사용하거나 npx
붙여서 쓰거나 scripts
로 사용했었는데...
그래서 package.json
에 preinstall
을 추가하고 start
에는 pm2
가 아닌 pm2-runtime
으로 실행했다.
ℹ️ pm2-runtime
은 docker container
사용시에 고안된 명령어인데 도커를 사용하지 않아도 동작하는데 문제는 없었다. pm2
도 사용하는데 문제는 없을것이라 생각한다.
✅ heroku
에 로그인한 상태에서 아래명령어를 통해 .env
설정 올린다.
// heroku env설정 올리는 플러그인 설치
heroku plugins:install heroku-config
// .env 설정 올리기
heroku config:push
// .env 설정 올린것 확인하기
heroku config
.env
파일은 절대 git에 올릴 수 없는 파일이기 때문에 설정내용을 등록해둬야한다.
그래야 process.env.xx
등의 변수를 읽을 수 있기 때문이다.
heroku
뿐만아니라 netlify
나 genkins
를 통한 배포에도 같은 과정은 필요하다. heroku
config 정보는 본인 heroku 사이트를 통해서도 확인가능하다.
대시보드 > 본인 앱 > settings > Config Vars > CLEARDB_DATABASE_URL
✅ heroku
의 빌드실패시 직접 터미널에 접근해서 nodemon
으로 운영빌드를 진행해서 원인을 파악해보자.
heroku run bash
개인적으로 heroku
는 처음 사용해봤던 도구이기 때문에 빌드실패시 내가 설정을 잘못해서 난 에러인지 아니면 다른문제가 있던 것인지 파악하기 어려웠고 에러메세지도 그리 친절하지 않았다. 그래서 직접 터미널로 접근해서 원인을 발견해서 고치곤 했음. 이때는 pm2
를 사용하지 않았고 nodemon
을 통해서 바로 메세지를 확인해서 진행했다.
✅ heroku
는 배포시 url을 https
로 설정해주고 port
는 443으로 해준다.
app.listen(process.env.PORT, () => {
console.log(`server on ${process.env.PORT}`)
})
따라서 process.env.PORT
라는 변수를 이용해 .env
파일에 따로 작성해 포트번호를 사용하자. 개인적으로 로컬테스트시 3065라는 포트를 사용해서 나의 process.env.PORT
는 3065였지만 heroku
가 실행시 포트를 443으로 바꿔주기 때문에 따로 scripts
에 포트를 443으로 해줄 필요는 없다.
예) 따로 포트지정없이 아래와 같은 운영배포 스크립트를 사용함
"start": "NODE_ENV=production pm2-runtime app.js -i 0"
✅ 로컬시 mysql을 pc에 설치했던 것처럼 운영기를 위한 DB를 설치할 필요가 있다.
✅ 설치하기
//clearDB 설치하기
heroku addons:create cleardb:ignite
addon 설치는 위와같이 터미널로도 가능하고 사이트를 통하 GUI로도 가능하다.
clear DB를 설치하기 위해서는 신용카드 등록이 필요하다. 터미널이나 사이트상에 해당 경로를 알려주니 그쪽에서 카드등록을 마친다.
무료버전
을 사용하니 과금은 걱정안해도 될 것 같다.
✅ 6-2-1. connection 정보확인하기(포트번호는 그대로 3306이다.)
heroku config | grep CLEARDB_DATABASE_URL
DB CONNECTION
정보는 heroku config에 등록되어 아래에 처럼 확인가능하다. 물론 heroku 사이트의 내 앱 설정에서도 확인가능하다.
위에 명령어를 치면 DATABASE_URL이 나오는데 아래와 같이 확인가능하다.
mysql://USER:PASSWORD@HOST/DATABASE?reconnect=true
✅ 6-2-2. 운영 db connection 정보 .env에 추가하기
//.env
process.env.DB_PROD_USER=USER
process.env.DB_PROD_PASSWORD=PASSWORD
process.env.DB_PROD_HOST=HOST
process.env.DB_PROD_DATABASE=DATABASE
.env 파일에 운영환경을 위한 값을 위와 같이 넣어주고
// .env 설정 올리기
heroku config:push
// .env 설정 올린것 확인하기
heroku config
heroku 설정을 다시 push 해준다.
✅ 6-2-3. 연결이 잘 되는지는 workbench나 터미널을 통해 확인해본다.
mysql --user=USER --host=HOST --password=PASSWORD
히로쿠문서에 대해 잘 읽어보지 않아서 원인은 잘 모르겠지만
secure: true
를 설정했을 때 쿠키를 읽지 못하는 경우가 있다. 이때는 secure: true
와 proxy: true
를 같이 적용하면 될것이다.
{secret: process.env.SECRET,
resave: false,
saveUninitialized: true,
proxy: true,
cookie: {
secure: true,
httpOnly: true
},
ℹ️ https://bezkoder.com/deploy-node-js-app-heroku-cleardb-mysql/
ℹ️ https://velog.io/@anrun/Heroku-MySQL-Heroku-ClearDB-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0
ℹ️ https://devcenter.heroku.com/articles/troubleshooting-node-deploys