Blog entry

Deploy on render

6 Apr 2026

Written by

  • Giovanni D'Amico

This guide assumes you just finished the Wagtail tutorial, your .gitignore is set up, and you have not done anything related to deployment yet. It covers everything from first install to a live site, including Cloudinary for media storage.

Your current project structure

mysite/
โ”œโ”€โ”€ .venv/
โ”œโ”€โ”€ mysite/
โ”‚   โ”œโ”€โ”€ base/
โ”‚   โ”œโ”€โ”€ blog/
โ”‚   โ”œโ”€โ”€ home/
โ”‚   โ”œโ”€โ”€ media/
โ”‚   โ”œโ”€โ”€ mysite/
โ”‚   โ”‚   โ”œโ”€โ”€ settings/
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ base.py          โ† shared settings (INSTALLED_APPS, etc.)
โ”‚   โ”‚   โ”‚   โ”œโ”€โ”€ dev.py           โ† local dev (SQLite, DEBUG=True, SECRET_KEY)
โ”‚   โ”‚   โ”‚   โ””โ”€โ”€ production.py    โ† production (we'll edit this)
โ”‚   โ”‚   โ”œโ”€โ”€ static/
โ”‚   โ”‚   โ”œโ”€โ”€ templates/
โ”‚   โ”‚   โ”œโ”€โ”€ __init__.py
โ”‚   โ”‚   โ”œโ”€โ”€ urls.py
โ”‚   โ”‚   โ””โ”€โ”€ wsgi.py
โ”‚   โ”œโ”€โ”€ portfolio/
โ”‚   โ”œโ”€โ”€ search/
โ”‚   โ”œโ”€โ”€ .dockerignore
โ”‚   โ”œโ”€โ”€ .gitignore
โ”‚   โ”œโ”€โ”€ db.sqlite3
โ”‚   โ”œโ”€โ”€ Dockerfile
โ”‚   โ”œโ”€โ”€ manage.py
โ”‚   โ”œโ”€โ”€ requirements.txt
โ”‚   โ””โ”€โ”€ README.md

Why Cloudinary?

Render's web services have an ephemeral filesystem โ€” any files written to disk (like uploaded images) are lost on every deploy or restart. So if you upload images through Wagtail's admin, they'd disappear next time Render rebuilds your app.

Cloudinary solves this by storing your media files (images, documents) on their cloud servers instead of on Render's disk. Your images are served via Cloudinary's CDN, which is also faster for your visitors.

The good news: you don't need to change any of your models, templates, or blocks. Your ForeignKey('wagtailimages.Image', ...), ImageBlock(), FieldPanel('image'), and {% image %} template tags all stay exactly the same. Cloudinary works at the storage layer โ€” it just changes where the file bytes get saved.

Tags

Return to blog