Pourquoi self-héberger Django sur un VPS ?
Les plateformes managées pour Django facturent à l'usage et masquent la couche serveur, ce qui complique l'optimisation des migrations, des tâches Celery et des fichiers médias volumineux. Sur un VPS, vous maîtrisez la stack complète : Gunicorn comme serveur WSGI, Nginx en frontal, PostgreSQL pour les données et Redis pour le cache et les files de tâches. Vous décidez de la version de Python, du nombre de workers, de la stratégie de collecte des fichiers statiques et du tuning de la base. Pour une application Django en production qui dépasse le prototype, cette transparence est décisive : vous pouvez profiler une requête lente, ajuster les paramètres de PostgreSQL et déployer une nouvelle version sans surcoût caché.
Bénéfices concrets d'un Django auto-hébergé
- Contrôle total de PostgreSQL : index, VACUUM, connexions persistantes et sauvegardes pg_dump planifiées.
- Tâches asynchrones avec Celery et Redis sans facturation par exécution de worker.
- Coût fixe et prévisible, peu importe le trafic ou le volume de fichiers médias servis.
- Données et logs sous votre juridiction, utile pour la conformité et l'audit.
- Liberté de version Python et de dépendances système (GDAL, WeasyPrint, Pillow) sans contraintes de buildpack.
- Déploiements reproductibles via Docker et possibilité de cloner l'environnement à l'identique.
Prérequis matériels et logiciels
Pour une application Django avec PostgreSQL et Redis, prévoyez au minimum 2 vCPU et 2 Go de RAM ; visez 4 Go si vous ajoutez Celery et un cache Redis chargé. L'OS recommandé est Ubuntu 22.04 ou 24.04 LTS. Installez Docker et Docker Compose pour isoler les services, ou Python 3.11+ et systemd pour une installation native. Un nom de domaine pointé en A vers l'IP du VPS est nécessaire pour le certificat TLS. Comptez 20 Go de disque pour l'application, la base et les fichiers médias d'un projet de taille moyenne.
Déployer Django étape par étape
Préparer le VPS et le projet
Connectez-vous en SSH, créez un utilisateur non-root dédié et installez Docker. Clonez votre dépôt et créez un fichier .env contenant SECRET_KEY, DATABASE_URL, ALLOWED_HOSTS=votredomaine.ma et DEBUG=False.
Conteneuriser avec Gunicorn
Écrivez un Dockerfile basé sur python:3.11-slim, installez les dépendances depuis requirements.txt, puis lancez l'application avec gunicorn projet.wsgi:application --bind 0.0.0.0:8000 --workers 3. Définissez un service web, un service db (PostgreSQL) et un service redis dans docker-compose.yml.
Appliquer migrations et fichiers statiques
Lancez docker compose run --rm web python manage.py migrate puis python manage.py collectstatic --noinput. Montez un volume pour /app/staticfiles et /app/media afin que Nginx puisse les servir directement.
Configurer Nginx en reverse proxy
Créez un bloc serveur qui transmet le trafic vers http://web:8000 via proxy_pass, et qui sert /static/ et /media/ depuis les volumes. Ajoutez les en-têtes X-Forwarded-Proto et Host pour que Django détecte correctement le HTTPS.
Activer le HTTPS avec Let's Encrypt
Utilisez Certbot ou un conteneur nginx-proxy avec acme-companion pour obtenir et renouveler automatiquement le certificat de votredomaine.ma. Forcez la redirection HTTP vers HTTPS et activez HSTS dans Django via SECURE_HSTS_SECONDS.
Démarrer et superviser
Lancez docker compose up -d, vérifiez les logs avec docker compose logs -f web et créez le superutilisateur avec python manage.py createsuperuser. Planifiez un cron pour les sauvegardes pg_dump et le redémarrage propre des workers Celery.
Activez le pooler de connexions PgBouncer entre Django et PostgreSQL : avec plusieurs workers Gunicorn et des tâches Celery, vous épuisez vite le max_connections de Postgres. PgBouncer en mode transaction multiplie le nombre de requêtes servies sans toucher au tuning de la base, et stabilise la latence sous charge.