# 雲端技術相關: Heroku ## 目的: 在Heroku運行自己的專案 * 比起Amazon Web Services (AWS), Google Cloud Platform (GCP)等主流服務雖然較不突出,但有以下優點 * 好上手 * 有完全免費的方案 (AWS雖然也有,但超過某個流量會收取費用,需時時注意Dashboard的變化) ### 前提 / 事前準備 1. 先有一個Heroku account 2. 有一個可在本機正常運行的後台服務 ### 步驟 * 進入Heroku主頁 * ![](https://i.imgur.com/AR9XGSb.png) * 創建APP * 在頁面右邊,找到New,選擇Create New App,進入以下頁面 * ![new app](https://imgur.com/3psoY0G.jpg) * 目前只有美國、歐洲兩區域可選 * 請衡量自身能力後選擇適合自己的收費方案(有免費的) * 需指定你的程式語言 * 須注意所運行的stack版本是否支援自己的程式語言版本 * heroku 18支援python 3.7.4 * heroku 20支援python 3.9 * 選擇要搭配的服務 * 創建好APP後,可以看到如下頁面,因為尚未建立Add on因此空空如也 * ![app page](https://imgur.com/wATRl5v.png) * 請依個人需要將所需服務加入,我個人所需的為PostgreSQL and Redis * ![pgsql](https://imgur.com/AXvOk2Y.jpg) * ![redis](https://imgur.com/Ehjradu.jpg) * 將自己的本地專案部署到Heroku * `git add .` * `git commit -am "make it better" ` * `git push heroku master` * 定期喚醒自己的app * Heroku免費方案下的APP,當外界沒有進行存取超過一定時間(約一小時~六小時,看時段),會進入休眠狀態 * 網路有許多解決方案,個人認為較適合的方案是直接註冊第三方服務 * [cronjob org](https://cron-job.org/en/members/jobs/) * ![home](https://imgur.com/kiibGht.png) * 在網址輸入自己的app url,可在以下頁面check detail * ![cronjob report](https://imgur.com/DUg4URR.jpg) ## 技術備忘 1. 保存運行中App的log: * 須記得Heroku和以前公司自建Linux雲端不同,以前可以在Linux local and cloud (docker)之間設定Volume同步log,現在Heroku可能要想像成只有cloud,因此沒辦法設定volume * 替代方法: 設定定期執行的script將log資料傳到指定地點(另一個App?) ### 設定檔 1. Procfile * 設定Heroku要替哪一個檔案建立Web服務(暫 * `web: gunicorn hello:app` (檔名為hello) * `web: gunicorn manage:app` (檔名為manage) * 先前設定Procfile時,為了讓參數可區分 run, migrate or test,發現當flask設定要有參數,heroku似乎可不管參數照樣成功執行 2. 設定heroku內的環境變數 * 參考[Stackoverflow](https://stackoverflow.com/questions/40119964/how-to-set-environment-variables-on-heroku-for-nodes-app-and-connect-to-the-post) * `heroku config:set $(cat .env | sed '/^$/d; /#[[:print:]]*$/d')` * `heroku config:set DATABASE_URI=database_uri_here` * UI介面 * setting >>> Config Vars ## 常用指令 (在console輸入) * 查看heroku中的log (會即時更新) * `heroku logs --tail` * 但有時候會卡住,這時要`ctrl + c`退出重進 * 將代碼推送到heroku * `git push heroku master` * 將代碼退回到前一版(避免新版程式出錯時,服務終止) * `heroku rollback` * 查看目前所有的程式deploy紀錄 * `heroku releases` * 查看帳號底下有哪些Apps * `heroku apps` * 進入Apps底下的bash * `heroku ps:exec -a <app_name>` * `heroku run bash -a <app_name>` * 環境變數相關 * check 使用中的heroku環境變數 * `heroku config` * 查看指定環境變數內容 * `heroku config:get GITHUB_USERNAME` * 設定指定環境變數 * `heroku config:set S3_KEY=8N029N81 S3_SECRET=9s83109d3+583493190` * 將.env檔中變數格式替換為 以空格隔開,即可同時設定多個環境變數 * 移除指定環境變數 * `heroku config:unset GITHUB_USERNAME` * 存取redis (Windows) ```script= (venv) PS C:\Porfolios\heroku\traffic_light> C:\AcBel\bin\Redis-x64-5.0.9\ redis-cli -h scat.redistogo.com -p 11212 -a d305a1a47c79c71255f23ef312d8c554 ``` * 注意路徑要完整,否則會報錯: redis-cli : 無法辨識 'redis-cli' 詞彙是否為 Cmdlet、函數、指令檔或可執行程式的名稱... * heroku 本機啟動 * `heroku local web -f Procfile.windows` * 效果基本上就是`python manage.py run` * (根據設定檔) * heroku 遠端關機/開機 * `heroku ps:scale web=0/1` * heroku reset * [參考官方文件](https://devcenter.heroku.com/articles/releases) * releases * 列出目前的發布列表 * rollback * 加上參數,即可快速還原回前面特定的版本號碼 ###### tags: `Cloud` `Heroku` `Backend`