Language Frankfurt, Germany
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.
requirements.txt, Pipfile or pyproject.tomlapp.py / main.py or Procfilepoetry.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. .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 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. 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 DATABASE_URL, exist only at runtime. From then on, every push builds a new release. 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.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.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.DATABASE_URL, REDIS_URL or CLICKHOUSE_URL. 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. 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.
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.
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.
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.
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.
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.
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.
Earn up to 15 € in credit when signing up.
or with email
Product news, no spam. Unsubscribe anytime.
Successfully subscribed.