教學Python

部署 Python 專案

Zeabur 支援眾多類型的 Python 專案,包含但不限於這些:

如果你的原始碼底下有 app.py, main.py 等 entrypoint,Zeabur 也會自動啟動。

NPM 支援

如果你的專案根目錄有 package.json,Zeabur 會自動幫您安裝 Node.js 和 NPM;如果你的 package.jsonbuild script,Zeabur 會自動幫你執行 npm install && npm run build 編譯產物。

如果需要更改編譯的命令(如改執行 npm run build:dist),請參閱〈自訂編譯與啟動命令〉。

自訂 Entrypoint

Zeabur 預設會辨識 main.pyapp.pymanage.pyserver.pyapp/__init__.py 這些 Entrypoint,但如果你的 Entrypoint 不在上面列出的清單中,可以設定環境變數

ZBPACK_PYTHON_ENTRY=your-entrypoint.py

或者是在 zbpack.json 中加入以下設定:

{
    "python": {
        "entry": "your-entrypoint.py"
    }
}

這樣 Zeabur 就會以 your-entrypoint.py 作為 Python 的執行檔案。

如果你想部署 WSGI/ASGI 應用程式(比如 Django、Flask、FastAPI),且 entrypoint 是在 __init__.py 裡面,則必須寫出完整路徑(包含 __init__.py 在內):

# server/__init__.py
 
app = Flask(__name__)
ZBPACK_PYTHON_ENTRY=server/__init__.py

如果你的 entrypoint 在 __main__.py,亦需要寫出完整路徑:

# server/__main__.py
 
print("Hello!")
ZBPACK_PYTHON_ENTRY=server/__main__.py

自訂編譯和啟動命令

Zeabur 允許你使用環境變數或設定檔自訂 Python 的編譯和啟動命令。

「編譯命令」適合用在需要下載或編譯自訂產物(如 CSS、JavaScript 等等),或者是配置設定檔的情境。舉例來說,你想往 /etc 資料夾寫入設定檔,你可以設定環境變數

ZBPACK_BUILD_COMMAND=echo 'your-configuration' > /etc/somewhere

或者是在 zbpack.json 中加入以下設定:

{
    "build_command": "echo 'your-configuration' > /etc/somewhere"
}

你亦可以在這裡執行 npm 的命令。注意 Zeabur 只會在 專案根目錄package.json 的情況下安裝 Node.js 和 NPM,如果你的專案沒有 package.json,則不會有 npm 命令可用:

{
    "build_command": "npm install && npm run build:dist"
}

「啟動命令」則適合用在啟動 Python 應用程式時執行的情境,如在原有的命令基礎上加上 python3 migrate.py 來建立資料庫的 tables。舉例來說,你可以設定環境變數

ZBPACK_START_COMMAND="python3 migrate.py && _startup"

或者是在 zbpack.json 中加入以下設定:

{
    "start_command": "python3 migrate.py && _startup"
}

其中 _startup 是 Zeabur 原本的啟動命令(可以在 zbpack 查閱)。如果你有自訂 start_command_startup 必須在你的啟動命令中執行,否則不會啟動 Python 應用程式。

build_commandstart_command 均會使用 POSIX 相容的 shell 執行,所以你可以使用 && 串接多個命令,或者使用 ; 分隔多個命令。

網頁爬取

Playwright 支援

如果你的依賴清單(requirements.txtPipfilepyproject.toml⋯⋯)有宣告 playwright,Zeabur 會自動幫您準備好執行 Playwright 必要的環境。

注意 Playwright 應以 Headless 模式執行,通常預設就是如此。

Selenium 支援

如果你的依賴清單(requirements.txtPipfilepyproject.toml⋯⋯)有宣告 seleniumbaseselenium,Zeabur 會自動幫您準備好執行 Selenium 必要的環境。

注意 Selenium 應以 Headless 模式執行

Serverless

Zeabur 支援將 Python 部署成 serverless 專案。不過目前需要 opt-in。 請參考 啟用 Serverless 頁面啟用 serverless 支援。

設定 Python 的版本

Zeabur 預設使用 Python 3.10 作為執行環境,不過 Zeabur 會根據你專案設定的 Python 版本選擇執行環境,你也可以根據需要自訂執行環境。

在專案指定 Python 版本

「在專案指定 Python 版本」是比較通用的做法,在每個環境都能使用。

如果是 Pipenv請在 Pipfile 中指定 Python 版本

[requires]
python_version = "3.8"   # 在這裡指定 Python 版本

如果是 Poetry請在 pyproject.toml 中指定 Python 版本

[tool.poetry.dependencies]
python = "^3.8"  # 在這裡指定 Python 版本

如果是 PDM請在 pyproject.toml 中指定 requires-python

[project]
requires-python = ">= 3.8"  # 在這裡指定 Python 版本

如果是 Rye,則使用 rye pin 命令設定 Python 版本

rye pin 3.8  # 在這裡指定 Python 版本

在 Zeabur 指定 Python 版本

如果你使用的是傳統的 requirements.txt,或你需要在 Zeabur 覆蓋專案指定的 Python 版本,你可以在 zbpack.json 中指定 Python 版本。

{
    "python": {
        "version": "3.8"
    }
}

或者是使用 ZBPACK_PYTHON_VERSION 環境變數指定 Python 版本:

ZBPACK_PYTHON_VERSION=3.8

指定 Streamlit 執行檔案

如果你有安裝 streamlit 依賴,且檔名是 app.pymain.pystreamlit_app.py,Zeabur 預設會以 Streamlit 模式啟動你的應用程式。

不過假如檔名不是上面這三個,你可以在 zbpack.json 中指定檔名。比如你的 Streamlit 應用程式的檔名是 myapp.py

{
    "streamlit": {
        "entry": "myapp.py"
    }
}

這樣 Zeabur 就會以 Streamlit 模式啟動你的 myapp.py。你也可以使用環境變數 ZBPACK_STREAMLIT_ENTRY 指定檔名:

ZBPACK_STREAMLIT_ENTRY=myapp.py

自訂套件管理器

Zeabur 支援多種 Python 套件管理器:

Zeabur 會根據專案結構選擇最適合的套件管理器。如果你沒提交套件管理的 lockfile,且不能從專案結構明顯猜出這個專案使用的套件管理器,則 Zeabur 會選擇不安裝任何套件。此時,你可以選擇在 zbpack.json 中指定套件管理器:

{
    "python": {
        "package_manager": "pipenv"
    }
}

或者是使用環境變數 ZBPACK_PYTHON_PACKAGE_MANAGER 指定套件管理器:

ZBPACK_PYTHON_PACKAGE_MANAGER=pipenv

值可以是 pip, pipenv, poetry, pdm, rye, uv 其中一個。