身為LINE Bot的服務提供者,為了每天能持續的提供使用者有價值的資訊,想必會想尋找一個24小時不間斷的環境來運行LINE Bot,而雲端平台就會是最佳的解決方案,不但擁有多樣的資源,也能夠依據使用量彈性擴充。
所以,本文延續[Python+LINE Bot教學]提升使用者體驗的按鈕樣板訊息(Buttons template message)實用技巧文章,將利用Django框架開發完成的LINE Bot部署到Heroku雲端平台,讓全世界的使用者都能夠存取您的LINE Bot服務,其中的部署重點包含:
- 安裝Git
- 安裝gunicorn
- 安裝Heroku CLI
- LINE Bot專案設定
- LINE Bot部署至Heroku
- LINE Bot Webhook URL設定
一、安裝Git
Git是一個版本控制系統(Version Control System),除了可以協助開發人員進行程式碼的版本控制外,在部署時也能夠將程式碼推送(Push)到Heroku雲端平台的Git Repository。
二、安裝gunicorn
將LINE Bot部署到Heroku雲端平台時,在HTTP請求(Request)的處理上,就需要使用WSGI(Web Server Gateway Interface)介面,來負責網頁伺服器(Heroku雲端平台)與網頁應用程式(LINE Bot)之間的溝通,而Python的gunicorn伺服器就是扮演這樣的角色,如下圖:
gunicorn伺服器可以使用pip(套件管理工具)來進行安裝即可,如下:
$ pip install gunicorn
Python的pip(套件管理工具)詳細觀念可以參考有效管理Python套件(Package)的工具及概念文章。
三、安裝Heroku CLI
Heroku是一個平台即服務(PaaS)的雲端平台,支援多種程式語言,開發人員能夠直接利用Git快速部署應用程式,並且提供CLI(Command-Line Interface),可以透過指令來進行操作,提升部署的效率。
前往Heroku Dev Center,在開始安裝前,需先進行註冊的動作,依照指示即可完成,如下圖:
依據作業系統進行安裝即可。完成後,利用Visual Studio Code開啟LINE Bot專案,在Terminal視窗中,透過以下的Heroku CLI指令進行登入:
$ heroku login
接著利用以下的指令建立一個應用程式:
$ heroku create foodielinebot
執行結果
四、LINE Bot專案設定
延續[Python+LINE Bot教學]提升使用者體驗的按鈕樣板訊息(Buttons template message)實用技巧文章,目前LINE Bot專案的架構如下圖:
接下來,有幾個地方要進行設定:
- 建立Procfile檔案
用來告訴Heroku雲端平台,利用gunicorn伺服器,執行Django專案中的wsgi(web server gateway interface)檔案,來進行溝通。
在專案最外層新增一個Procfile檔案,並且輸入以下的範例設定,特別注意,在新增Procfile檔案時,不需要輸入副檔名。
web: gunicorn mylinebot.wsgi
目前LINE Bot專案的架構如下圖:
在部署的過程中,用來告訴Heroku雲端平台有哪些套件需要進行安裝,可以透過以下的指令來產生:
$ pip freeze > requirements.txt
開啟requirements.txt檔案,就可以看到包含了專案中所有的相依性套件,如下圖:
- 建立STATIC資料夾
由於Django為網頁框架,而網頁通常都會有靜態檔案,像是Javascript、CSS及Image(圖片)檔等,所以Heroku雲端平台會讀取專案中的static資料夾,如果沒有建立的話,在部署時會發生錯誤,所以,建立完成後如下圖:
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
範例中的意思為目前專案根目錄(BASE_DIR)下的static資料夾,請注意其中的STATIC_ROOT及BASE_DIR為關鍵字,不能拼錯。
- 設定ALLOWED_HOSTS
開啟settings.py檔案,在ALLOWED_HOSTS的地方,加入Heroku雲端平台所產生的應用程式網址,來允許這個網址的請求(Request),如下範例:
ALLOWED_HOSTS = [
'foodielinebot.herokuapp.com'
]
五、LINE Bot部署至Heroku
以上的Django專案設定完成後,接下來就可以進行部署的動作。首先,利用以下的指令建立本地端的Git Repository,如下範例:
$ git init
如果LINE Bot專案在開發的過程中已經有使用Git進行版本控制的話,這個步驟可以省略。
本地端的Git Repository建立完成後,利用以下四個指令,將LINE Bot專案的程式碼推送(Push)到Heroku雲端平台:
$ git add . #加入所有變更的程式碼檔案到本地端Git Repository
$ git commit -m "your_message" #儲存到硬碟中
$ heroku git:remote -a foodielinebot #將Heroku雲端平台的Git Repository切換到LINE Bot的應用程式
$ git push heroku master #推送到Heroku雲端平台的LINE Bot應用程式Git Repository
首先,將LINE Bot的專案程式碼加入到本地端的Git Repository,接著Commit儲存到硬碟中,其中可以自訂這個版本的說明文字(your_message),最後,要將程式碼推送(Push)到Heroku雲端平台前,需利用Heroku CLI將Heroku雲端平台上的Git Repository切換到剛剛所建立的LINE Bot應用程式後,才能把儲存在硬碟中的程式碼推送(Push)上去。
每當程式碼有修改,要部署到Heroku雲端平台時,這四個指令都需要執行。
六、LINE Bot Webhook URL設定
部署完成,前往LINE Developers,選擇「使用LINE帳號登入」後,點擊FoodLinebot,在Messaging API頁籤中,Webhook URL的地方,填入Heroku雲端平台賦予的HTTPS網址,來連接LINE Bot應用程式,如下圖:
執行結果
七、小結
在[Python+LINE Bot教學]6步驟快速上手LINE Bot機器人文章所分享的ngrok工具,必須要本地端執行LINE Bot,使用者才能夠進行存取,而透過本文所分享的教學,將LINE Bot部署到Heroku雲端平台後,就可以24小時不間斷的服務使用者了,趕快來依照本文的步驟,部署您的LINE Bot應用程式吧。
有想要看的教學內容嗎?歡迎利用以下的Google表單讓我知道,將有機會成為教學文章,分享給大家😊
- Python學習資源整理
- [Python+LINE Bot教學]6步驟快速上手LINE Bot機器人
- [Python+LINE Bot教學]建構具網頁爬蟲功能的LINE Bot機器人
- [Python+LINE Bot教學]提升使用者體驗的按鈕樣板訊息(Buttons template message)實用技巧
- [Python+LINE Bot+PostgreSQL教學]一篇搞懂LINE Bot讀取資料庫的方法
- [Python爬蟲教學]Python網頁爬蟲結合LINE Notify打造自動化訊息通知服務
- [Django教學1]3步驟快速安裝Django網站框架
- [Django教學2]建立Django應用程式(APP)
- [Django教學3]Django Migration(資料遷移)的重要觀念
請問GIT是做什麼用的呢?
回覆刪除文章中寫到最後送上雲端是從本地端Git Repository送出,那請問送出後還在自己的電腦裡嗎?
另外我打開https://git.heroku.com/foodielinebot.git網址,顯示Method Not Allowed,是什麼原因打不開呢?
不好意思問題有點多,因為對git完全不熟,或許您也可以考慮寫文章教學一下~
因為https://git.heroku.com/foodielinebot.git是Heroku雲端平台的Git網址,是用來存放應用程式(foodlinebot)的程式碼,並不是一般網站的網址,貼到瀏覽器來執行的,這邊提供兩個Git的教學,建議您可以先參考:
刪除1. https://github.com/doggy8088/Learn-Git-in-30-days/blob/master/zh-tw/README.md
2.https://backlog.com/git-tutorial/tw/intro/intro1_1.html
希望以上有幫助到您 :)
您好,我有成功推上去heroku`,但網頁卻顯示application error,查了log是at=err code=H10 desc="App crashed"
回覆刪除用heroku run python manage.py runserver去查是importerror:couldn't import django 這是遇到甚麼問題呢
您好,在部署前是否有利用以下的指令將專案中所有的相依性套件打包成requirements.txt檔案呢?從錯誤訊息看起來Heroku好像沒有安裝Django框架。
刪除heroku create foodielinebot 只會顯示already taken 並沒有網址跑出來
回覆刪除您好,already taken的意思就是foodlinebot這個名字已經被使用了,取別的名稱就可以囉 :)
刪除M大您好,
回覆刪除我在產生requirements.txt檔案時,使用您的語法,
會發生許多套件存放於不存在的路徑 之問題
ERROR: Could not install packages due to an EnvironmentError: [Errno 2] No such file or directory:......
後來我改成使用
pip list --format=freeze > requirements.txt
卻會遇到很大量的版本不相容問題
ERROR: Could not find a version that satisfies the requirement....
想要請問有沒有能解決上述問題且更簡潔的方式??
請問大大是否有遇過ngrok正常但部署到heroku build後卻無法通過line的Webhook url verification呢?
回覆刪除我都會遇到503的問題
您好 不好意思
回覆刪除我遇到問題是用ngrok可成功正常運作
但部署到heroku(heroku官網也顯示push完成)
line端卻無回應
想要請問一下可能是哪個環節出錯
您好 我在 git push heroku master 這步卡了好多天,會顯示以下錯誤
回覆刪除"![remote rejected] master -> master (pre-receive hook declined)
error: failed to push some refs to 'http://git.heroku........../.git' "
上面 building source的部分顯示:
remote: -----> Building on the Heroku-20 stack
remote: -----> Determining which buildpack to use for this app
remote: ! No default language could be detected for this app.
remote: HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.
由於他寫 No default language could be detected for this app
所以我也嘗試過 heroku buildpacks:set heroku/python
加了這句後的錯誤如下:
-----> Building on the Heroku-20 stack
-----> Using buildpack: heroku/python
-----> App not compatible with buildpack: https://buildpack-registry.s3.amazonaws.com/buildpacks/heroku/python.tgz
More info: https://devcenter.heroku.com/articles/buildpacks#detection-failure
! Push failed
請問 buildpacks 的部分該怎麼設定呢?? 謝謝