7 12 月

紀錄一下第一次學習Flask並Deploy到Heroku遇到的坑

IT人生

0  comments

真的要感謝現在Google搜尋能力的強大, 還有網路上這麼多人願意分享自己遇坑的解決方式. 這篇記錄一下deploy第一支Flask程式到Heroku時遇到的坑, 不過目前還未確認其中的一個步驟是不是必要, 或許下次在其他他電腦重新deploy新程式的時候再看看吧

緣起

會走到要碰Flask是有段過程的. 最初是在網路上找可以執行python程式的地方, 不用在本機一直開著電腦才能執行. 最一開始的想法是在Synology Nas上開一台虛擬機, 跑Linux OS, 反正NAS本來就是一直開著, 多執行一台虛擬機也不是甚麼問題, 要安裝新的package就簡單pip install.

但是虛擬機一開, 至少2G的RAM要耗掉, 結果只是用來cron run簡單的程式實在有點不甘心. 於是就進而看看docker化的OS, 但是docker化的OS要再安裝package也麻煩, 然後又找到docker化的python執行環境, 可以先把程式要用的package先裝妥, 然後再deploy到NAS裡. 這樣的方式對於已經完成開發的環境是比較方便, 反正就是本機的開發環境, 有用到的package包一包, 丟進去NAS跑, 以後也不會太常變動.

不過因為自己的程式還在開發中, python script會常常改動, 我個人又是偏好在實際執行的環境去看程式執行的結果, 所以本來想說直接script傳到NAS去執行, 但是查一查, NAS要安裝package挺麻煩, 而且一直在NAS用SSH, 倒還不如就乾脆跑虛擬機.

所以就一直在這些方案中輪迴, 後來又多了一個可以接收webhook來啟動某支python程式的需求, 所以才確定了要用Flask, 在加上網路上很多教學文都是Flask部署到Heroku這個有免費方案的PAAS, 那就這麼定了, 初期開發時就先這樣用著吧. 等到程式定案下來了, 再來包成docker image放去NAS上跑.

這些年遇到的坑

話說使用新服務最初始設定一定要踩坑, 雖然會覺得很阿雜, 明明就是要測試短短的一段程式碼, 但是寫程式的時間反而比debug環境還要短很多. 這個經驗在老爹學生時期就常常遇到, 當時的Linux Destribution還沒有現在這麼先進, 一個指定就可以解決絕大部分library dependency的問題, 所以看錯誤訊息一個一個除錯的這個基本功跟耐心倒是有的. 再加上現在很多的錯誤訊息, 網路上一google就會有前人的解決方案, 所以其實也是可以輕鬆的解決.

我是跟著這篇 https://ithelp.ithome.com.tw/articles/10217350 來實作第一支Flask程式的, 程式部分都沒問題, 問題都主要出現在部署到Heroku的時候

檔案名稱的問題

部署到Heroku主要有幾個檔案, Proc主要有幾個檔案, Procfile, requirements.txt, runtime.txt, 還有主要的python程式

  1. 第一個坑: requirements.txt的requirement是複數, 要加S, 這個在push到Heroku的時候就有跳錯誤訊息
  2. 第二個坑: Procfile的P要大寫, 這個在Push的時候也有出現錯誤訊息, 但是最後還是跳出deploy成功, 所以就沒去特別在意

第二個坑其實是一連串的問題. Push 完之後, 去Open App, 就跳出了錯誤, 檢查log檔錯誤訊息是: at=error code=H14 desc=”No web processes running”, 在Stackoverflow上面的解法有提到Procfile首字大寫的問題, 所以首要先解決大寫字母的問題

很簡單嘛, 檔名大寫改小寫重新commit就好了, 不是嗎?

但是事情不是如新手想的這麼簡單, 這樣commmit之後, Heroku還是不認得我改成大寫P的檔案, 還是把它當作小寫p的檔案在處理. 於是又在另外一篇看到說把 .git刪掉, 重新 git init, 然後重新強迫push給Heroku. 這樣處理完後, 在Heroku在部署的時候, 確實沒有再發生Procfile的P大小寫的錯誤訊息

很開心地再去Open App, 結果還是一樣的錯誤訊息. 網路上繼續爬, 原來的那篇還有提到是dyno的web service沒有啟動, 要在本機的CLI裡下這個指令: heroku ps:scale web=1, 但是很不幸的在CLI裡出現的是: Couldn’t find that process type (web)

Gunicorn本機未安裝的問題

一個錯誤接著一個錯誤, 就像學英文的時候假掰查英英字典一樣, 看一個英文解釋會有更多個看不懂的英文生字XD. 在原始那篇Stackoverflow上原作者有提到他自己發現自己的兩個低級錯誤(你的低級為我來說好高級啊~), 除了檔名大小寫問題外, 另外一個就是gunicorn沒有設定venv, 這個對老爹來說又是另外一個生字了, 那就硬著頭皮繼續Google下去吧. 後來爬到了Heroku官網的說明文件, Deploying Python Applications with Gunicorn, 照著操作在本機安裝了Gunicorn.

但是還是失敗了!

Windows更名大小寫的問題

在Stackoverflow上也有網友提到說Windows改大小寫, 其實並不是真的改了大小寫, 只是顯示的不同. 這個說法, 在deploy時沒有再出現錯誤訊息, 就被我無視了. 但是該做的都做了 heroku ps:scale web=1 還是繼續出現 Couldn’t find that process type (web)

反覆檢查所有的檔案大小寫, Procfile裡面的寫法, 都沒有任何問題. 不甘心, 繼續的Google下去. 於是在 Stackoverflow 又發現了這篇, 裡面有提到了重新Commit Procfile, 這不是這麼新鮮事, 新鮮的是他說重新在資料中新增一個Procfile, 命名就是直接大小寫符合, 然後再重新Commit跟push.

這時候我閃過了之前網友提的windows命名大小寫的問題, 想說既然是新方法那就試試吧

終於, 解決了!

Push完後, 順利的在 Heroku的overview的部分, 看到了 gunicorn的web服務啟動了

結論

這次踩的這些坑, 或許在多年以後來看, 也會覺得是低級錯誤, 或是很有可能直接在push的時候就在Heroku CLI中被提醒跟解決了. 這次整個解決流程下來, 唯一不能確定的是在本機安裝gunicorn的這個步驟是不是也有協助了解決web服務沒有啟動的這個問題. 所以如果有人跟我一樣, 一開始就是檔案大小寫的問題, 或許可以直接試試最後一步的解法

About the author 

Jason Huang

從事留學遊學策略規劃工作多年的教育觀察者, 對學習永遠抱持熱忱,

You may also like

安裝 Mattermost 後使用Mysql 5.7 搜尋中文搜尋不到的解決方法

MySQL won’t start – error: su: warning: cannot change directory to /nonexistent: No such file or directory

Docker中配置MySQL的錯誤訊息

Leave a Reply

{"email":"Email address invalid","url":"Website address invalid","required":"Required field missing"}

Subscribe to our newsletter now!