Language Frankfurt, Germany

Deploy Python on Nodion

Nodion builds every repository with a requirements.txt, Pipfile or pyproject.toml with its Python buildpack. It installs your dependencies, starts Django, FastAPI and Flask with a production server and runs everything else from app.py, main.py or your Procfile. The app runs in Frankfurt.

Deploy to Nodion ›

from 1 EUR / month

Up to 15 € credit when signing up

Detected by
requirements.txt, Pipfile or pyproject.toml
Start
Django, FastAPI or Flask default, else app.py / main.py or Procfile
Python
3.10 to 3.15, default 3.13
Region
EU Central (Frankfurt)

Deploy Python step by step

  1. Commit one dependency file Nodion picks the installer by the first file it finds: poetry.lock (Poetry), Pipfile.lock (Pipenv), requirements.txt (pip), then a pyproject.toml on its own, installed with pip install . (or Poetry if it has a [tool.poetry] section). A uv.lock is ignored, and a Pipfile without its lock file installs nothing.
  2. Pin the Python version Nodion reads .python-version, then runtime.txt, then requires-python in pyproject.toml; without any of them you get 3.13. A range such as requires-python = ">=3.10" resolves to the newest published release, currently 3.15, so pin the version you test with. .python-version
    3.13
  3. Know the default start command Nodion checks your dependencies in this order: Django (with manage.py) starts with Gunicorn, FastAPI or Starlette with Uvicorn, Flask with Gunicorn. The server is not added for you, so list it in your dependencies. Without a framework, Nodion runs python app.py or python main.py, and that script has to listen on 0.0.0.0 and the PORT Nodion sets.
  4. Start everything else with a Procfile A web: line replaces the default. Without Django, FastAPI, Flask, app.py or main.py, the Procfile must define a process, web: or worker:; otherwise the build stops with an error that says what is missing. A release: line runs once per build before the new version starts, the place for migrations. Procfile
    web: gunicorn myapp.wsgi --bind 0.0.0.0:$PORT
    release: alembic upgrade head
  5. Create the app and push Create an application from your GitHub, GitLab, Bitbucket or Gitea repository in the region EU Central. Variables your build reads need the Build flag on the Environment tab; all others, and attached databases such as DATABASE_URL, exist only at runtime. From then on, every push builds a new release.

Good to know

  • Workers and other process typesA worker: line does not start anything on its own: add a process with the same name and no port on the Processes tab. Keep an explicit web: line next to it, because without one the first Procfile entry other than release: becomes the default command. A worker-only app such as a bot sets web to 0 instances instead.
  • Detection reads lock files tooNodion looks for Django, FastAPI and Flask in requirements.txt, Pipfile, pyproject.toml, poetry.lock and Pipfile.lock. Lock files also list indirect dependencies, so a library that pulls in FastAPI, such as Gradio, can trigger the FastAPI default. A web: line settles it.
  • uv projectsuv's lock file is not read. Export your locked versions to a requirements.txt, for example with uv export --no-emit-project -o requirements.txt, and commit it; otherwise Nodion installs from pyproject.toml without a lock.

What Nodion runs for you

  • Deploys without downtime Push to your branch and Nodion builds a new release. Traffic switches once the new instances answer their health check; a failed release leaves the running one in place. Apps with a local volume restart instead, because the disk belongs to one instance.
  • Databases next to the app Managed PostgreSQL, pgvector, MySQL, Valkey and ClickHouse in the same region. Attached databases arrive as DATABASE_URL, REDIS_URL or CLICKHOUSE_URL.
  • Previews per pull request Turn on previews and pull requests from your repository get their own app with its own URL and fresh, empty databases, created automatically or by hand. Forks and bot pull requests are skipped.
  • Workers, cron jobs and scaling Run workers as extra processes of the same app, schedule jobs on the Cron tab, and scale every process to up to 16 instances.
  • Release step With buildpacks, a Procfile release: line runs with every new build. Dockerfile apps, and redeploys or rollbacks to an earlier image, use a release command set on the app itself, which also takes precedence over the Procfile line. On static sites a release step runs in an image that holds only the built files.
  • Logs and metrics Build, release and runtime logs plus CPU, memory, disk and network metrics for every instance in the dashboard.
  • Domains and HTTPS A default hostname with HTTPS from the first deploy; your own domains get certificates automatically.

Further reading

Python on Nodion: questions and answers

Which Python versions does Nodion support?

3.10 to 3.15, with 3.13 as the default. Pin one in .python-version and you get the newest patch release of that version. Versions past their end of life fail the build with a clear message.

What if my repository has no app.py or main.py?

Then, without Django, FastAPI or Flask, your Procfile says what runs: a web: line for a server or a worker: line for a background process. Without one, the build fails with an error that tells you what to add.

Can I deploy a Python script that is not a web app?

Yes. Put it in a Procfile as worker: python job.py, add a process named worker without a port on the Processes tab and set web to 0 instances. For scripts that run on a schedule, use the Cron tab instead.

Where does my Python app run?

In the EU Central region in Frankfurt, Germany. Build, registry, the app and its databases, volumes, buckets, logs and metrics stay in that region, and Nodion's API and control plane are hosted in Germany. Nodion GmbH is based in Stuttgart.

Can I use Python in line with the GDPR?

Nodion provides the basis for it: Nodion GmbH is based in Stuttgart, Germany, in the Frankfurt region the app, its databases and volumes run in Germany, and you conclude the data processing agreement (DPA) under Art. 28 GDPR electronically in the dashboard. Whether your setup complies also depends on how you configure and use the app.

How much does it cost to run Python on Nodion?

An app instance starts at 1 EUR per month. The setup in the cost box costs 2 EUR per month: App 2 EUR. Prices are net and billed per second, and you pick bigger sizes or more instances whenever you need them.

Can I use my own domain for my Python app?

Yes. Every app gets a default hostname with HTTPS. Add your own domain on the app's Domains tab; the TLS certificate is issued and renewed automatically.

Give your agent a cloud.

Earn up to 15 € in credit when signing up.

Continue with GitHub

or with email

Stay in the loop.

Product news, no spam. Unsubscribe anytime.