---
# System prepended metadata

title: Heroku 部署 SOP
tags: [' deploy', backend]

---

---
tags: backend, deploy
---
# Heroku 部署 SOP
步驟僅供參考，因為我其實沒有照著這步驟跑過 QQ，都是事後才整理的，不過要做的事情大概就這些，基本上應該不會錯？
1. 註冊 Heroku 帳號，並且填好信用卡資訊：[傳送門](https://signup.heroku.com/)
2. 建立一個新的資料夾，把寫好的作業複製一份到裡面，然後新建 .gitignore，與 package.json

![](https://i.imgur.com/M3DhwmE.jpg)

.gitignore：
```
/node_modules
npm-debug.log
.DS_Store
/*.env
```

package.json，我直接搬 mtr04 的 package.json 會出錯，所以重新寫一份：
```json=
{
  "name": "herukodraw-example",
  "version": "1.0.0",
  "description": "This example is so cool.",
  "main": "index.js",
  "scripts": {
    // 要執行 db:migrate 才會建起資料庫
    "db:migrate": "npx sequelize-cli db:migrate",
    // push 上 Heroku 時會執行 npm run start, 
    // 所以要寫好這個指令, 建立 DB 與 執行 index.js
    "start": "npm run db:migrate && node index.js", 
    "test": "echo \"Error: no test specified\" && exit 1"
  },
  "keywords": [
    "example",
    "heroku"
  ],
  "author": "jane-doe",
  "license": "MIT",
  "dependencies": {
    // 確認好自己用了哪些模組
    "bcrypt": "^5.0.0",
    "body-parser": "^1.19.0",
    "connect-flash": "^0.1.1",
    "ejs": "^3.1.5",
    "express": "^4.17.1",
    "express-session": "^1.17.1",
    "jquery": "^3.5.1",
    "mysql": "^2.18.1",
    "mysql2": "^2.2.5",
    "sequelize": "^6.3.5",
    "sequelize-cli": "^6.2.0"
  },
  "devDependencies": {
    "sequelize-cli": "^6.2.0"
  },
  // 寫給 Heroku 的伺服器看, 他才知道要用什麼執行環境
  "engines": {
    "node": "10.x"
  }
}

```
3.改寫 index.js 的 PORT
```javascript=
const express = require('express');
const bodyParser = require('body-parser');
const session = require('express-session');
const flash = require('connect-flash');

const prizeController = require('./controllers/prizeController')
const adminController = require('./controllers/adminController')

const app = express();
// 要設定 port 讀取環境變數
const port = process.env.PORT || 3000;
// 以下省略
```

4. 進入 Heroku 官網建立 APP，取好名字就按 Create app：[傳送門](https://dashboard.heroku.com/new-app)
![](https://i.imgur.com/Op9ZcSh.jpg)

5. 進入 app 管理頁面，點 Resources 標籤，搜尋 ClearDB，按 Submit Order Form(需要填好信用卡付款資訊，不然不給用)
![](https://i.imgur.com/Z8Gt2ff.jpg)
6. 安裝好 Heroku CLI，需要重開機：[傳送門](https://devcenter.heroku.com/articles/heroku-cli)
7. 開啟 Terminal 輸入 heroku login
![](https://i.imgur.com/y2BzIh4.jpg)
11. 輸入 heroku create，這邊會順便設定好 Heroku 遠端 git
8. 輸入 heroku addons:create cleardb:ignite 建立起資料庫
![](https://i.imgur.com/DeC2Kag.jpg)
3. 改寫 config.json，這裡要在 production 加一個 use_env_variable，他的值會對應到你的資料庫，像我不小心建了兩個資料庫，所以會是 CLEARDB_RED_URL：
```json=
{
  "development": {
    "username": "root",
    "password": null,
    "database": "pool",
    "host": "localhost",
    "dialect": "mysql"
  },
  "test": {
    "username": "root",
    "password": null,
    "database": "database_test",
    "host": "127.0.0.1",
    "dialect": "mysql"
  },
  "production": {
    "username": "root",
    "password": null,
    "database": "database_production",
    "host": "127.0.0.1",
    "dialect": "mysql",
    "use_env_variable": "CLEARDB_RED_URL"
  }
}
```
我有兩個資料庫 Heroku 管理頁面的 Setting 可以看到
![](https://i.imgur.com/UTcAb7h.jpg)

10. 在本機完成 commit

12. 輸入 git push heroku master，將檔案送到 Heroku，成功的話就可以看到網址
![](https://i.imgur.com/JDo0B2D.jpg)

## Debug
可以在 Terminal 輸入 heroku logs --tail 來看出了什麼錯
例如，沒改好 PORT，出現錯誤的 PORT 訊息：
![](https://i.imgur.com/8C5RUie.jpg)

## 參考資料
[Deploying Node.js Apps on Heroku](https://devcenter.heroku.com/articles/deploying-nodejs)
[ClearDB MySQL](https://devcenter.heroku.com/articles/cleardb)
[BE201 部署：Heroku](https://lidemy.com/courses/390625/lectures/24510403)

