[Flask] - 最小配置部署紀錄 fly.io

[Flask] - Setup & Deploy on fly.io


此篇完整 source code 放在 Github Repo - flyio-flask-mini-setup 供參考!

最近在尋找類似 Heroku 可以快速 Setup & Deploy 的服務, 發現 fly.io, 於是就用 flask app 來嘗試部署一下。 此篇做個紀錄用,沒有部署 DB,快速弄一下,之後補個 Flask + Postgres 部署。 接下來會大概紀錄兩種部署方式但其實幾乎是一樣:

    1. Python App: 使用 fly.io 本身幫我們處理好的 image,直接部署。
    1. Docker App: 自己寫 Dockerfile 來部署一下。

零. < Fly.io Free 方案 >

Free 方案可以免費部署 2 個 App。

- VM size: `shared-cpu-1x`
- Memory: 256 mb

一. < 部署之前要先 Install flyctl >

在操作 fly.io 的過程,都依靠 flyctl 這個 command line tool 來處理,所以這邊要先 Install

以 MacOS 為例:

  • 方法1. Brew:
1
brew install flyctl
  • 方法2. Script:
1
curl -L https://fly.io/install.sh | sh

官網: Install

二. < 接著去官網註冊一個會員 >

在部署前要先 Login

1
flyctl auth login

依照提示很簡單的 Login 進去

登入成功如圖:

三. < (第一種) Python App 部署紀錄 >

使用 fly.io 本身幫我們處理好的 image,直接部署。

Type on fly.io: Python App
Python: 3.10.7 (fly.io default)

Step:

1. 需要 Flask, 和 gunicorn (Python WSGI server) 部署用

requirements.txt 內容

1
2
Flask==2.2.2
gunicorn==20.1.0

2. 需要一個 manage.py run 我們的 App 和 一個 templates/index.html 簡單的 html

manage.py 內容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
from flask import Flask, render_template

app = Flask(__name__)


@app.route('/')
def home():
    return render_template('index.html')


if __name__ == "__main__":
    app.run(debug=True, host='0.0.0.0')

templates/index.html 內容

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<!DOCTYPE html>

<html lang="en">

<head>
    <meta charset="UTF-8">
    <title>Flask Docker</title>
</head>

<body>
    <h1>Hi, Flask App run in container with gunicorn on fly.io</h1>
    <h2>This is a type 'Python App' on fly.io</h2>
    <h3>Using python 3.10.7</h3>
</body>

</html>

3. 建個 venv

1
2
3
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt

4. 在 Local Run 一下 Flask App, 看可不可以運行

1
python manage.py

訪問 127.0.0.1:5000

Screenshot

Okay!

5. 開始部署

flyctl launch

會問一些簡單的問題:

  1. App name: flask-python-app
  2. Region: Japan
  3. Setup postgres db ?: No

Screenshot

fly.io 的 dashboard, 可以看到順利 Launch 一個 App 了,但這個時候還不能訪問,因為 App 還沒 Deploy, 這裡比較像是註冊。

Screenshot

可以發現這邊的 URL https://flask-python-app.fly.dev/ 還無法訪問

Screenshot

6. 同時發現多了兩個檔案 Procfilefly.toml

Procfile 是描述 gunicorn 的啟動方式,可以自己改 command

這邊我們要把 server 改成 manage,因為我們的 python 檔為 manage.py

1
2
# Modify this Procfile to fit your needs
web: gunicorn server:app

改成:

1
2
# Modify this Procfile to fit your needs
web: gunicorn manage:app

fly.toml 是 config 檔,這邊都不用動,用 default 就行,詳細可以再看 Docs

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
app = "flask-python-app"
kill_signal = "SIGINT"
kill_timeout = 5
processes = []

[build]
builder = "paketobuildpacks/builder:base"

[env]
PORT = "8080"

[experimental]
allowed_public_ports = []
auto_rollback = true

[[services]]
http_checks = []
internal_port = 8080
processes = ["app"]
protocol = "tcp"
script_checks = []
[services.concurrency]
hard_limit = 25
soft_limit = 20
type = "connections"

[[services.ports]]
force_https = true
handlers = ["http"]
port = 80

[[services.ports]]
handlers = ["tls", "http"]
port = 443

[[services.tcp_checks]]
grace_period = "1s"
interval = "15s"
restart_limit = 0
timeout = "2s"

7. 目前整個資料夾結構

8. 接著 Deploy

1
flyctl deploy

沒問題的話就可以訪問 https:// + 自己設定的 app name + .fly.dev

https://flask-python-app.fly.dev

四. < (第二種) Docker App 部署紀錄>

Step:

1. 自己寫 Dockerfile 來部署一下 Flask App

與第一種完全一樣的步驟,只是增加 Dockerfile,刪掉 Procfile

Dockerfile

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
# start by pulling the python image
FROM python:3.9-alpine

# copy the requirements file into the image
COPY ./requirements.txt /app/requirements.txt

# copy every content from the local file to the image
COPY . /app

# switch working directory
WORKDIR /app

# install the dependencies and packages in the requirements file
RUN pip install -r requirements.txt

EXPOSE 8080
# run
CMD ["gunicorn", "--bind", ":8080", "--workers", "2", "manage:app"]

2. 資料夾結構

3. flyctl launch + flyctl deploy

flyctl launch
flyctl deploy

4. 成功的話

Screenshot

5. 訪問

訪問: https://flask-python-app-docker.fly.dev

Done!

此篇完整 source code 放在 Github Repo - flyio-flask-mini-setup 供參考!

- The End -