Python
zbpack membangun aplikasi Python yang punya requirements.txt, pyproject.toml (Poetry, uv, PDM), atau Pipfile. zbpack mendeteksi FastAPI, Django, dan Flask, lalu memilih server produksi untuk masing-masing.
| Framework | Perintah start yang dipakai zbpack |
|---|---|
| FastAPI | uvicorn main:app --host 0.0.0.0 --port 8080 |
| Django | gunicorn --bind :8080 <project>.wsgi |
| Flask | gunicorn --bind :8080 main:app |
Versi Python bawaannya 3.13; atur yang lain di .python-version, pyproject.toml, atau dengan ZBPACK_PYTHON_VERSION. Untuk menjalankan aplikasi dengan cara lain, atur ZBPACK_START_COMMAND di Settings → Build → zbpack options.
FastAPI
# main.py
from fastapi import FastAPI
app = FastAPI()
@app.get("/")
def root():
return {"message": "Hello from FastAPI"}# requirements.txt
fastapi
uvicorn[standard]zbpack mengambil yang pertama ada dari main.py, app.py, server.py, dan app/__init__.py, serta variabel yang diberi FastAPI(...) di dalamnya (app di atas). Dengan struktur lain, seperti app/main.py, atur perintah start:
ZBPACK_START_COMMAND=uvicorn app.main:app --host 0.0.0.0 --port 8080Django
Proyek memerlukan manage.py dan gunicorn di requirements.txt:
django
gunicornBaca pengaturan produksi dari variabel di 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(",")lalu atur di tab Variable:
DJANGO_SECRET_KEY=${PASSWORD}
DJANGO_ALLOWED_HOSTS=${ZENAVO_WEB_DOMAIN}
DJANGO_CSRF_TRUSTED_ORIGINS=${ZENAVO_WEB_URL}(WEB adalah nama port layanan; gunakan nama yang tampil di tab Networking-nya.)
File statis
Bila settings.py mengatur STATIC_URL dan STATIC_ROOT sekaligus, zbpack menjalankan python manage.py collectstatic --noinput saat build dan menyajikan file dengan nginx di depan gunicorn, atau menyerahkannya ke WhiteNoise bila middleware-nya ada di settings.py:
STATIC_URL = "static/"
STATIC_ROOT = BASE_DIR / "staticfiles"Build tidak punya variabel layanan apa pun, jadi settings.py harus bisa dimuat tanpanya: baca DJANGO_SECRET_KEY dengan os.environ.get(...) seperti di atas, bukan os.environ[...].
Migrasi
Migrasi memerlukan database, yang tidak bisa dijangkau build, jadi jalankan saat start:
ZBPACK_START_COMMAND=python manage.py migrate --noinput && gunicorn --bind :8080 mysite.wsgiHubungkan database
Tambahkan PostgreSQL ke proyek dan gunakan connection string-nya, misalnya dengan dj-database-url atau SQLAlchemy:
DATABASE_URL=${POSTGRESQL_CONNECTION_STRING}import dj_database_url
DATABASES = {"default": dj_database_url.config(conn_max_age=600)}Pasang juga driver-nya: psycopg[binary] untuk PostgreSQL, mysqlclient atau PyMySQL untuk MySQL dan MariaDB.
Masalah umum
| Gejala | Penyebab |
|---|---|
ModuleNotFoundError saat start | Paketnya tidak ada di requirements.txt (atau pyproject.toml). |
Django menjawab 400 Bad Request | Domain tidak ada di ALLOWED_HOSTS. |
Form Django gagal dengan CSRF verification failed | Alamat https:// tidak ada di CSRF_TRUSTED_ORIGINS. |
| Deployment FastAPI tidak pernah sehat | Objek aplikasi tidak berada di main:app. Atur ZBPACK_START_COMMAND. |
| Worker dihentikan saat beban tinggi | Memori layanan terlalu kecil untuk jumlah worker gunicorn. Kurangi --workers, atau beri layanan lebih banyak memori. |