FastAPI-App online stellen.
Lege requirements.txt, ein Procfile mit $PORT und eine run-zero.yaml an. Das Buildpack installiert die Pakete und startet Uvicorn, Flask läuft genauso mit gunicorn.
Braucht den Tarif Entwickler, kostenlos gibt es nur Websites. Preise · Grenzen vorab prüfen
- FastAPI und Flask getestet
Procfilewie bei Heroku- HTTPS ab dem ersten Deploy
> Deploye den Ordner python-fastapi auf run.zero.
runzero_create_appfertigexample-fastapi
runzero_push_filesfertigein Commit
runzero_deployfertigDienste angelegt
runzero_wait_for_buildfertiglive
live unter https://web-example-fastapi-84f30cf3.run-zero.de
- Live-DemoLäuft auf run.zero(öffnet in neuem Tab)
- Beispiel-CodeMIT, auf GitHub(öffnet in neuem Tab)
- BuildpacksNode, Python, Go, PHP, Java
- Gehostet in DeutschlandHetzner, Nürnberg
In vier Schritten live.
Getestet mit dem Beispiel, das live läuft.
- 01
Abhängigkeiten festhalten
requirements.txtim Wurzelverzeichnis lässt das Buildpack Python erkennen.Pipfileundpyproject.tomlerkennt es laut Doku auch. - 02
Procfile schreiben
Der Prozess
webbekommt die Adresse und muss auf0.0.0.0:$PORTlauschen.Procfile web: uvicorn main:app --host 0.0.0.0 --port $PORT - 03
run-zero.yaml anlegen
Ein Dienst, Port 8080.
run-zero.yaml version: "1"services: web: port: 8080 - 04
Konto anlegen und deployen
Lege ein Konto an, verbinde deinen Agenten mit dem Befehl und melde dich in Claude Code mit
/mcpund Authenticate an.- Dann schreibst du dem Agenten: Deploye dieses Repo auf run.zero.
Ohne Agent
Lege die App im Dashboard an und verbinde dein GitHub-Repo. Jeder Push baut neu.
Claude Code verbinden claude mcp add --transport http \ -s user run-zero \ https://api.run-zero.de/mcp \ --client-id runzero-cli \ --callback-port 53761
Nach 1 bis 3 Minuten läuft die App unter https://web-<app>.run-zero.de. Prüfe eine Route deiner App, im Beispiel /api/health. Ist der Build rot, nennt runzero_get_build_logs den Grund.
Drei Dateien plus Konfiguration.
Genau so liegen sie im Beispiel, das live läuft.
Die App mit / und /api/health, /docs kommt von FastAPI.
# Minimal FastAPI app for run.zero. Uvicorn binds to $PORT, see Procfile.import platformfrom fastapi import FastAPIfrom fastapi.responses import HTMLResponseapp = FastAPI(title="FastAPI on run.zero")@app.get("/", response_class=HTMLResponse)def index() -> str: return """<!doctype html><html lang="en"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>FastAPI on run.zero</title></head><body style="font-family:system-ui,sans-serif;max-width:640px;margin:64px auto;padding:0 24px"><h1>FastAPI on run.zero</h1><p>This Python app was built by a Paketo buildpack and runs under Uvicorn.</p><p><a href="/api/health">/api/health</a> · <a href="/docs">/docs</a></p></body></html>"""@app.get("/api/health")def health() -> dict: return {"status": "ok", "runtime": f"python {platform.python_version()}", "platform": "run.zero"}fastapi und uvicorn mit fester Version.
fastapi==0.115.6uvicorn==0.34.0Dieselbe Zeile, anderer Server.
Nur das Procfile ändert sich.
| Framework | Procfile |
|---|---|
| FastAPI | web: uvicorn main:app --host 0.0.0.0 --port $PORT |
| Flask | web: gunicorn app:app --bind 0.0.0.0:$PORT |
| Django, nicht getestet | web: gunicorn projekt.wsgi --bind 0.0.0.0:$PORT |
Was heute nicht geht.
Damit der erste Build durchläuft.
Braucht den Tarif Entwickler
Free hat keine Apps mit Server und kein Postgres, der Deploy bricht dort ab.
Preise ansehenPython-Version
Die Live-Demo läuft mit der Standardversion des Buildpacks, zum Zeitpunkt des Tests 3.11.
Dateien brauchen ein Volume
Ohne
volumes:überleben SQLite-Dateien und Uploads keinen Neustart. Mit Volume nur ab Tarif Entwickler, getestet haben wir es mit dem PocketBase-Image.Django nicht getestet
FastAPI und Flask laufen live. Für Django zeigen wir nur den Startbefehl.
Was du nicht mehr selbst machst.
Build, HTTPS, Datenbank und Backups laufen auf der Plattform.
Daten bleiben in Deutschland
Server und Backups bei Hetzner in Nürnberg. Mit Auftragsverarbeitungsvertrag.
HTTPS automatisch
Jeder Dienst bekommt eine Adresse unter
run-zero.de, eigene Domains ein Zertifikat von Let’s Encrypt.Postgres als Add-on
Ein Eintrag in
run-zero.yaml,DATABASE_URLkommt als Umgebungsvariable.Kein Lock-in
Dein Code bleibt in deinem Repo, die Datenbank gibt es als Dump zum Download.
Fragen.
Zu Python.
Geht das mit Flask?
Ja. Das Heroku-Beispiel ist eine Flask-App mit gunicorn und Postgres, sie läuft live.
Wie verbinde ich Postgres aus Python?
Hänge das Postgres-Add-on an. psycopg nimmt DATABASE_URL samt sslmode=require ohne Änderung an.
Kann ich einen Worker starten?
Weitere Prozesstypen im Procfile laufen laut Doku ohne eingehende Adresse. Getestet haben wir hier nur den Prozess web.
Ist /docs öffentlich?
Ja, FastAPI liefert /docs mit aus. Schalte es mit docs_url=None ab, wenn du es nicht willst.