Python
zbpack は requirements.txt、pyproject.toml(Poetry、uv、PDM)、Pipfile のいずれかを持つ Python アプリをビルドします。FastAPI、Django、Flask を検出し、それぞれに本番用のサーバーを選びます。
| フレームワーク | zbpack が使う起動コマンド |
|---|---|
| FastAPI | uvicorn main:app --host 0.0.0.0 --port 8080 |
| Django | gunicorn --bind :8080 <project>.wsgi |
| Flask | gunicorn --bind :8080 main:app |
Python のバージョンはデフォルトで 3.13 です。.python-version、pyproject.toml、または ZBPACK_PYTHON_VERSION で変更できます。別の方法で起動するには、Settings → Build → zbpack options で ZBPACK_START_COMMAND を設定します。
FastAPI
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello from FastAPI"}# requirements.txt
fastapi
uvicorn[standard]zbpack は main.py、app.py、server.py、app/__init__.py のうち最初に見つかったファイルと、その中で FastAPI(...) を代入した変数(上の例では app)を使います。app/main.py のような別の構成なら、起動コマンドを設定してください。
ZBPACK_START_COMMAND=uvicorn app.main:app --host 0.0.0.0 --port 8080Django
プロジェクトには manage.py と、requirements.txt の gunicorn が必要です。
django
gunicorn本番の設定は settings.py で変数から読み込みます。
import os
SECRET_KEY = os.environ.get("DJANGO_SECRET_KEY", "")
DEBUG = os.environ.get("DJANGO_DEBUG") == "1"
ALLOWED_HOSTS = os.environ.get("DJANGO_ALLOWED_HOSTS", "").split(",")
CSRF_TRUSTED_ORIGINS = os.environ.get("DJANGO_CSRF_TRUSTED_ORIGINS", "").split(",")そして Variable タブで設定します。
DJANGO_SECRET_KEY=${PASSWORD}
DJANGO_ALLOWED_HOSTS=${ZENAVO_WEB_DOMAIN}
DJANGO_CSRF_TRUSTED_ORIGINS=${ZENAVO_WEB_URL}(WEB はサービスのポートの名前です。Networking タブに表示される名前を使ってください。)
静的ファイル
settings.py に STATIC_URL と STATIC_ROOT の両方があると、zbpack はビルド中に python manage.py collectstatic --noinput を実行し、gunicorn の前段の nginx でファイルを配信します。settings.py に WhiteNoise のミドルウェアがあれば、WhiteNoise に任せます。
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR / "staticfiles"ビルドにはサービスの変数がひとつもないので、settings.py は変数なしでも読み込める必要があります。上のように DJANGO_SECRET_KEY は os.environ[...] ではなく os.environ.get(...) で読んでください。
マイグレーション
マイグレーションにはデータベースが必要ですが、ビルドからは届かないので、起動時に実行します。
ZBPACK_START_COMMAND=python manage.py migrate --noinput && gunicorn --bind :8080 mysite.wsgiデータベースに接続する
プロジェクトに PostgreSQL を追加し、その接続文字列を使います。たとえば dj-database-url や SQLAlchemy で:
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}import dj_database_url
DATABASES = {"default": dj_database_url.config(conn_max_age=600)}ドライバーもインストールしてください。PostgreSQL なら psycopg[binary]、MySQL と MariaDB なら mysqlclient か PyMySQL です。
よくある問題
| 症状 | 原因 |
|---|---|
起動時に ModuleNotFoundError | パッケージが requirements.txt(または pyproject.toml)にありません。 |
Django が 400 Bad Request を返す | ドメインが ALLOWED_HOSTS にありません。 |
Django のフォームが CSRF verification failed で失敗する | https:// のアドレスが CSRF_TRUSTED_ORIGINS にありません。 |
| FastAPI のデプロイが healthy にならない | アプリのオブジェクトが main:app にありません。ZBPACK_START_COMMAND を設定してください。 |
| 負荷がかかるとワーカーが強制終了される | gunicorn のワーカー数に対してサービスのメモリが足りません。--workers を減らすか、サービスのメモリを増やしてください。 |