Deploy Django apps with gunicorn
Doable auto-detects Django via `requirements.txt` and `manage.py`. We run gunicorn against your WSGI app, run `collectstatic` at build time, and let you attach a Postgres addon in a single command.
Typical first deploy: 45–90 seconds (static collection takes time)
We don't reinvent how Django is deployed. gunicorn against `config.wsgi:application` (or your configured WSGI_APPLICATION). Static files served by nginx sidecar or via whitenoise, both work.
Type /deploy in your editor, the AI bundles the repo, builds a Docker image on our worker, and hands back the URL in chat. No tab-switching to a dashboard.
Paste a public GitHub URL at doable.do/try and get a live preview in 30 seconds. No signup. Expires in 8h unless you claim it.
A $6 Hetzner box runs unlimited projects via `doable server add`. Same deploy UX; the only thing we don't run is our Cloud infra.
doable deploy # from your Django project
Detected via `django` in requirements.txt + `manage.py` at root. WSGI module auto-detected from Django settings.
Or say “deploy this” in Claude Code.
Add a release command to your project or run `python manage.py migrate` via `doable run` (post-deploy hook). Many teams put migration in the Dockerfile's CMD prefix.
`doable addon attach --native postgres` provisions a Postgres container alongside the app and injects `DATABASE_URL`. Point Django's DATABASES setting at `dj_database_url.parse(os.environ["DATABASE_URL"])`.
Set via `doable env set ALLOWED_HOSTS your-app.doable.do,yourdomain.com` (comma-separated). Parse it in settings.py: `ALLOWED_HOSTS = os.getenv('ALLOWED_HOSTS', '').split(',')`.
No credit card. Live URL in ~30 seconds.