Framework Fráncfort, Alemania

Despliega Django en Nodion

Nodion reconoce Django por manage.py y por Django entre tus dependencias. El buildpack de Python las instala, ejecuta collectstatic y arranca Gunicorn sobre el módulo WSGI de tu proyecto. Con una línea release: en un Procfile, las migraciones se ejecutan antes de que cada nueva versión entre en producción, y tanto la app como su base de datos PostgreSQL se ejecutan en Fráncfort.

Desplegar en Nodion ›

desde 1 EUR / mes

Hasta 15 € de crédito de bienvenida al registrarte

Detectado por
manage.py y Django entre tus dependencias
Arranque
gunicorn <proyecto>.wsgi, 3 workers
Python
de 3.10 a 3.15, por defecto 3.13
Región
EU Central (Fráncfort)

Despliega Django paso a paso

  1. Añade Gunicorn, WhiteNoise y un driver de base de datos Nodion arranca Gunicorn, pero no lo instala, así que tiene que estar en tus dependencias. Gunicorn no sirve archivos estáticos; de eso se encarga WhiteNoise con lo que escribe collectstatic. Fija la versión de Python en .python-version, porque un rango como requires-python = ">=3.10" elige la versión más reciente. requirements.txt
    Django>=5.2
    gunicorn
    whitenoise
    dj-database-url
    psycopg[binary]
  2. Lee la configuración del entorno collectstatic se ejecuta durante la build, donde solo existen las variables marcadas con Build, así que la configuración tiene que poder importarse sin los secretos de runtime. Django solo comprueba SECRET_KEY cuando se usa. Añade WhiteNoise justo después de SecurityMiddleware. settings.py
    import os
    import dj_database_url
    
    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 = [f"https://{h}" for h in ALLOWED_HOSTS if h]
    
    DATABASES = {"default": dj_database_url.config(conn_max_age=600)}
    
    STATIC_ROOT = BASE_DIR / "staticfiles"
    # MIDDLEWARE: "whitenoise.middleware.WhiteNoiseMiddleware"
    # right after "django.middleware.security.SecurityMiddleware"
  3. Responde al health check antes de comprobar el host El health check de Nodion llama a cada instancia por su dirección interna, que no está en ALLOWED_HOSTS, así que Django respondería con un 400 y la release nunca entraría en producción. Pon un middleware sencillo en primer lugar en MIDDLEWARE y configura /healthz como ruta del health check en los ajustes de la app. health.py
    from django.http import HttpResponse
    
    
    class HealthCheckMiddleware:
        def __init__(self, get_response):
            self.get_response = get_response
    
        def __call__(self, request):
            if request.path == "/healthz":
                return HttpResponse("ok")
            return self.get_response(request)
  4. Ejecuta las migraciones en cada despliegue Una línea release: en un Procfile se ejecuta una vez por build, después de la build y antes de que arranque la nueva versión. Si falla, el despliegue se detiene y la versión en ejecución sigue activa. Procfile
    release: python manage.py migrate --noinput
  5. Crea la app y la base de datos Crea una aplicación desde tu repositorio en la región EU Central, después una base de datos PostgreSQL en la misma región, y vincúlala en la pestaña Environment: la app recibe DATABASE_URL en el siguiente despliegue. Define DJANGO_SECRET_KEY como secreto y DJANGO_ALLOWED_HOSTS con el hostname de tu app y tus propios dominios, y haz push.

A tener en cuenta

  • Celery y otros workersAñade al Procfile worker: celery -A myproject worker junto con una línea web: gunicorn myproject.wsgi --bind 0.0.0.0:$PORT explícita; sin una línea web:, la primera entrada del Procfile que no sea release: pasa a ser el comando por defecto. Después, en la pestaña Processes, añade un proceso llamado worker sin puerto. Valkey en la misma región te da REDIS_URL como broker.
  • ASGIEl comando de inicio por defecto usa WSGI. Para Channels o vistas asíncronas, define tu propia línea web:, por ejemplo con workers de Uvicorn, y haz que escuche en 0.0.0.0:$PORT.
  • Archivos de dependenciasrequirements.txt, poetry.lock y Pipfile.lock se instalan tal cual. Un Pipfile sin su lockfile no instala nada.

Lo que Nodion gestiona por ti

  • Despliegues sin downtime Haz push a tu rama y Nodion construye una nueva release. El tráfico pasa a las nuevas instancias cuando superan el health check; si una release falla, la que está en marcha sigue activa. En cambio, las apps con un volumen local se reinician porque el disco pertenece a una sola instancia.
  • Bases de datos junto a la app PostgreSQL, pgvector, MySQL, Valkey y ClickHouse gestionados en la misma región. Al vincular una base de datos, sus datos de conexión llegan como DATABASE_URL, REDIS_URL o CLICKHOUSE_URL.
  • Previews por pull request Activa las previews: cada pull request de tu repositorio tendrá su propia app, con URL y bases de datos nuevas y vacías. Puedes crearla automáticamente o a mano. Se omiten las pull requests de forks y bots.
  • Workers, cron jobs y escalado Ejecuta workers como procesos adicionales de la misma app, programa tareas en la pestaña Cron y escala cada proceso hasta 16 instancias.
  • Paso de release Con buildpacks, una línea release: del Procfile se ejecuta con cada nueva build. Las apps con Dockerfile, así como los redeploys o rollbacks a una imagen anterior, usan un comando de release definido en la propia app, que además tiene prioridad sobre la línea del Procfile. En los sitios estáticos, el paso de release se ejecuta en una imagen que solo contiene los archivos generados por la build.
  • Logs y métricas Logs de build, release y runtime, además de métricas de CPU, memoria, disco y red de cada instancia, en el dashboard.
  • Dominios y HTTPS Un nombre de host predeterminado con HTTPS desde el primer despliegue; tus propios dominios reciben certificados automáticamente.

Para seguir leyendo

Django en Nodion: preguntas y respuestas

¿Nodion ejecuta las migraciones de Django por mí?

Solo si se lo pides: añade release: python manage.py migrate --noinput a un Procfile. Se ejecuta una vez por build, antes de que arranque la nueva versión, y un fallo detiene el despliegue.

¿Por qué mi despliegue de Django nunca llega a estar listo?

Normalmente el health check recibe un 400 por ALLOWED_HOSTS o un 404 en /. Responde a una ruta como /healthz en un middleware situado antes de la comprobación del host y configúrala como ruta del health check de la app.

¿Puedo usar Poetry en lugar de requirements.txt?

Sí. Con un poetry.lock, Nodion instala Poetry y ejecuta poetry install --only main. Pipenv funciona con un Pipfile.lock.

¿Dónde se ejecuta mi app de Django?

En la región EU Central, en Fráncfort (Alemania). La build, el registry, la app y sus bases de datos, volúmenes, buckets, logs y métricas permanecen en esa región. La API y el plano de control de Nodion están alojados en Alemania. Nodion GmbH tiene su sede en Stuttgart.

¿Puedo usar Django conforme al RGPD?

Nodion te ofrece las bases para ello: Nodion GmbH tiene su sede en Stuttgart (Alemania); en la región de Fráncfort, la app, sus bases de datos y sus volúmenes se ejecutan en Alemania. Puedes formalizar electrónicamente el DPA (contrato de encargo del tratamiento, art. 28 del RGPD) en el dashboard. Que tu uso cumpla el RGPD también depende de cómo configures y uses la app.

¿Cuánto cuesta ejecutar Django en Nodion?

Una instancia de app cuesta desde 1 EUR al mes. La configuración del recuadro de costes cuesta 3.50 EUR al mes: App 2 EUR, PostgreSQL 1.50 EUR. Los precios no incluyen IVA y la facturación es por segundo. Puedes elegir tamaños mayores o más instancias cuando lo necesites.

¿Puedo usar mi propio dominio para mi app de Django?

Sí. Cada app recibe un nombre de host predeterminado con HTTPS. Añade tu propio dominio en la pestaña Domains de la app; el certificado TLS se emite y se renueva automáticamente.

Dale a tu agente un cloud.

Hasta 15 € de crédito al registrarte.

Continuar con GitHub

o con tu email

Mantente al día.

Novedades del producto, sin spam. Puedes darte de baja cuando quieras.