請啟用JavaScript來查看內容

Heroku 的替代方案? Fly.io 平台 — Python Flask 實際範例

    前言

    上禮拜著名的佈署平台神器 Heroku 公告說將在 11 月 28 日停止免費方案,之後不付錢不給用了 QAQ,包括旗下的 Heroku Dynos、Heroku Postgres、Heroku Data for Redis 等服務的免費版本。
    (平臺即服務Heroku將在今年終止免費服務 | iThome)

    Heroku 公告
    Heroku 公告

    所以看到有網友推薦 Fly.io,那我就來試用看看並記錄過程吧,也順便給需要的網友參考~

    * 以下流程及範例程式參考官方文檔

    Fly.io 官網
    Fly.io 官網

    費用

    既然要使用,那當然要先了解一下此平台的收費機制,免費版提供:

    • 最多 3 個 shared-cpu-1x 256MB VM (虛擬機)
    • 3GB 持久卷(volume)存儲
    • 160GB 出站數據傳輸量

    * 迷之音:奇怪?我記得上禮拜看的時候,他應該還有限制每月的小時數,不知道是我記錯了,還是他們想透過更多免費額度來吸引 Heroku 那邊來的使用者。


    部署步驟

    準備專案

    我們直接下載官方在GitHub提供的範例範例專案下來,我將資料夾改名(fly_flask)方便我自己區分。

    主要會需要以下四個檔案(剩下的非必要):

    fly_flask
    ├─ templates
    │  └─ hello.html
    ├─ hellofly.py
    ├─ Procfile
    └─ requirements.txt
    

    首先 hellofly.py 是我們 flask 主要的入口 (這個簡單的範例也只有這支XD)。

    而當你網址輸入根目錄(/)或後面隨便帶字串(/<name>),它會進到 hello 這個函式,並渲染 hello.html 這個網頁(檔案位於 templates > hello.html)。


    我們先在本機實際運行這個應用程式看看。
    (非必要的步驟,但可以先確保整個專案是可以運作的)

    首先要安裝相關套件,在此資料夾打開命令提示字元 CMD,
    我還有搭配 pipenv 虛擬環境&套件管理工具,所以指令有些不同:

    創建一個虛擬環境
    pipenv --python 3

    安裝 requirements.txt 裡面列出來的套件
    pipenv install

    Python虛擬環境建置&安裝套件
    Python虛擬環境建置&安裝套件

    其實主要就是 Flask 與 gunicorn 兩個套件。
    gunicorn 是用來在正式環境運行 Flask 之用,它是個 WSGI(Web Server Gateway Interface) HTTP Server,因為 Flask 內建的只適合開發測試用,看看再下一張執行它跳出的紅字就在提醒你了。

    查看已安裝套件
    查看已安裝套件
    執行 Flask
    執行 Flask

    試著在瀏覽器的網址列輸入
    http://127.0.0.1:5000

    http://127.0.0.1:5000/<隨便你打>

    在瀏覽器確認執行結果
    在瀏覽器確認執行結果

    OK,看來很正常,沒問題。

    來源:Meme 梗圖倉庫
    來源:Meme 梗圖倉庫

    專案設定

    來到重要的一步,要先設置一些文件,告訴 Fly 我們的應用程式開如何運行及相關設定。


    當然,第一步還要要到 Fly.io 網站註冊一組帳號,完成後會看到這個畫面。

    Fly.io 登入後頁面
    Fly.io 登入後頁面

    接下來,依照你的作業系統安裝 flyctl,這個工具就跟 Heroku 裡的 Heroku CLI 是同樣的概念。

    以 Windows 為例,在 Powershell 內輸入 iwr https://fly.io/install.ps1 -useb | iex 來安裝 flyctl。

    Windows 安裝 flyctl
    Windows 安裝 flyctl

    每個應用程式(APP)都需要一個 fly.toml 檔案來告訴 Fly 系統如何部署它。

    可以使用 flyctl launch 指令來自動生成。
    (如果你剛剛才安裝 flyctl,那命令提示字元 CMD 可能要重開它才會生效)

    flyctl 登入
    flyctl 登入

    啊,第一次要先登入,輸入 flyctl auth login 來自動打開網頁登入。
    登入完成後再次輸入 flyctl launch


    喔喔喔~它會自動辨識我們使用 Python 創建應用程式,但我們已經有範例的 Procfile 檔案,這邊輸入 N 跳過即可。

    輸入名稱後(名稱只能包含數字、小寫字母和破折號),接下來它會讓你選擇看要架在哪個地區的伺服器上。

    flyctl launch
    flyctl launch

    這是官網展示的伺服器分布,看來離我們最近的就是東京或香港了。

    Fly 伺服器分布城市
    Fly 伺服器分布城市

    然後我們這個專案不需要資料庫。
    完成~

    flyctl launch
    flyctl launch

    它就會自動產生 fly.toml 檔案,內容我們沒有特別需求就不用去改它。


    另外,說明一下 Procfile 檔案用途,它是說明如何啟動我們的應用程式:

    web: gunicorn hellofly:app
    

    前面說過,我們使用 gunicorn 這個 WSGI HTTP Server 來運行,後面的 hellofly 就是我們 Flask 的進入點 hellofly.py 的檔名。


    專案佈署

    接下來就是重頭戲 — 要將我們的應用程式佈署到 Fly.io 平台了。


    在命令提示字元 CMD 輸入指令:
    flyctl deploy

    等它跑一連串的東西……
    有興趣也可以觀察它做了哪些步驟。

    結束後,輸入指令來看看應用程式部屬的狀態:
    flyctl status

    flyctl deploy 完成後執行 flyctl status
    flyctl deploy 完成後執行 flyctl status

    在 Hostname 那行顯示了我這個應用程式的網址(fly-flask.fly.dev),或者輸入 flyctl open 也可自動從瀏覽器中打開。

    來看看部屬是否有成功吧
    來看看部屬是否有成功吧

    如果要查看 IP 可以使用:flyctl ips list

    查看 IP (flyctl ips list)
    查看 IP (flyctl ips list)

    Dashboard 頁面

    在 Fly.io 平台後台有 Dashboard 頁面,可以依據每個 App 去看更詳細的資訊、統計、設定等等。

    Dashboard 頁面
    Dashboard 頁面

    其他程式語言

    除了上述 Python 範例外,官方文件 還提供更多不同程式語言的文章,目前看到的有 Crystal、Deno、Elixir、Go、Node、Laravel、Rails、Redwood、Remix、NuxtJS、NextJS、Ruby、靜態網站。

    甚至也可以使用 Dockerfile 部署在 Docker,所以照理來講它應該可以運行大部分的程式。


    結語

    實際操作過一遍後,也會發現其實也蠻容易的。

    如果你想像 Heroku 一樣,程式碼推送到 GitHub 後自動佈署到 Fly.io,則可以參考這篇官方文章:Continuous Deployment with Fly and GitHub Actions

    之後如果有資料要儲存,可以起個 PostgresMySQLEdgeDB 資料庫(DB),這幾個官方都有寫詳細的文件說明。


    題外話
    Fly.io 並不是使用 Docker 去運行 container 容器,而是使用 Firecracker micro-VMs 開源的虛擬化技術,說是 Docker 的隔離性還不太夠,這方面我就不太了解,有興趣的網友可以閱讀官方說明:Docker Without Docker




    參考:
    Fly.io 官方網站
    Fly.io 官方文件
    Fly.io 官方教學影片—Tutorial: Deploy a non-web Python application to Fly.io


    珍惜今天,珍惜現在,誰知道明天和意外,哪一個先來。

    —— 《螢火蟲之墓》


    🔻 如果覺得喜歡,歡迎在下方獎勵我 5 個讚~
    分享

    Jia
    作者
    Jia
    軟體工程師