---
title: "Deploy Django and PostgreSQL over MCP with while.sh"
url: https://while.sh/en/guides/deploy-django/
author: "Aloïs Oddon, co-founder of Nextmap"
updated: 2026-11-02
---

# Deploy a Django app and its PostgreSQL database from your AI agent, over MCP

Your AI agent knows Django inside out. Connected to while over MCP, it also deploys your app, with its PostgreSQL database backed up every day, in France, with no Dockerfile or server to manage.

## Prerequisites

- A Django app, with a requirements.txt file.
- An AI agent that works in a terminal: Claude Code, Codex, Cursor or Gemini CLI.

## Step 1: Give your agent these instructions

Open your agent in your app's folder, and paste these instructions into it:

```text titre="Instructions"
Connect to while with my account (while.sh/agents), then deploy my app.
```

Without an account, your agent deploys your app as a trial, in one request. To keep it, open the link it gives you and create your account.

With your account, your agent adds while's MCP server itself. If it asks you to, restart it. On the first call to while, a page opens in your browser. In Claude Code, if it doesn't open, type /mcp, choose while, then Authenticate. On that page, choose your app, or "A new app", then click Authorize.

## Step 2: Open your app

Your agent gives you your app's address, for example `https://mon-appli.while.cloud`, over HTTPS.

## What your agent does

It writes while.yaml at the root of your app:

```yaml titre="while.yaml"
apiVersion: while/v1
project: mon-appli
services:
  - name: web
    port: 8000
databases:
  - name: main
```

Then it adds gunicorn and WhiteNoise to requirements.txt, a `/health` route that returns 200, and a Procfile that applies the migrations before each start:

```text titre="Procfile"
web: python manage.py migrate --noinput && python manage.py collectstatic --noinput && gunicorn monsite.wsgi --bind 0.0.0.0:$PORT
```

It sets up settings.py for production, following Django's deployment checklist (source 1): `DEBUG` turned off, the secret key and `ALLOWED_HOSTS` read from the environment, the database read from `DATABASE_URL`, your app's address in `CSRF_TRUSTED_ORIGINS`, and your static files served by WhiteNoise. Your app is installed, your pytest tests run, and then it starts.

## Set up Django behind PgBouncer

> You, to your agent: Check that Django works properly behind PgBouncer.

`DATABASE_URL` goes through PgBouncer in transaction mode. Your agent turns off server-side cursors, as Django recommends (source 2):

```python titre="settings.py"
DATABASES["default"]["DISABLE_SERVER_SIDE_CURSORS"] = True
```

## Run a management command every night

> You, to your agent: Run the clearsessions command every night at 3 am.

Your agent declares a scheduled job that runs `python manage.py clearsessions` at that time, with the same code and the same database. If it fails, your agent is notified.

## Query your database from your agent

> You, to your agent: How many people signed up this week?

Your agent reads your database in SQL through while's MCP server, with your permissions on the data, and it can't write to it.

## Restrict your app to your colleagues

> You, to your agent: Restrict the app to people in the company.

Your agent adds two lines to the service:

```yaml titre="while.yaml"
    access: internal
    email_domains: [acme.com]
```

Once your Google Workspace or Microsoft 365 is linked to while, on the Pro plan, your colleagues open it with their usual account, and your code receives their name and email address, with no sign-in page to write.

## Move to your own domain

> You, to your agent: Put the app on app.acme.com.

Your agent declares the domain, you add the DNS records it gives you, and the HTTPS certificate follows.

## See a new version before you deploy it

> You, to your agent: Show me the new version before you deploy it.

Your agent opens a preview, at its own address, with its own data. You look at it, and then your agent puts it into production.

## Fix a vulnerability in your dependencies

> You, to your agent: Fix the vulnerabilities in our dependencies.

Your app's dependencies are checked against known vulnerabilities at every deployment, then every day. Your agent is warned of a serious vulnerability, and it updates the package involved.

## Go back to the previous version

> You, to your agent: Go back to the previous version.

In the 30 minutes after a deployment, the previous version comes back in a second. After that, it takes a few seconds. Once the previous version is back, your agent reads what broke in while's logs, fixes it and deploys again.

## Next steps

- [Deploy a FastAPI API](/en/guides/deploy-fastapi/)
- [Compare Python API hosting](/en/comparisons/python-api-hosting/)
- [Choose a French PaaS](/en/comparisons/french-paas/)

## Sources

1. [Django, the deployment checklist](https://docs.djangoproject.com/en/5.2/howto/deployment/checklist/), 2026-11-02
2. [Django, server-side cursors behind transaction pooling](https://docs.djangoproject.com/en/5.2/ref/databases/#transaction-pooling-and-server-side-cursors), 2026-11-02

## Questions

### Do I need to write a Dockerfile?

No. Your Django app is detected, installed from requirements.txt and started with gunicorn.

### Are my migrations applied?

Yes, before each start, by the web line of the Procfile. If one fails, the previous version stays online.

### How much does a Django app with its database cost?

With the Free plan, you only pay for resources. An app that uses at most 0.25 vCPU and 0.5 GiB of memory, with an S database and its 1 GiB disk, costs at most €13.75 per month, excl. VAT.

### Can I keep the Django admin?

Yes, with its styling, and restricted to people in your company if you want, who sign in with their usual account.

### Where is my app hosted?

In France, by Nextmap, a French company.
