Pourquoi Deployer Django sur DigitalOcean ?
Le déploiement d'applications Django sur une plateforme cloud comme DigitalOcean offre de nombreux avantages pratiques et économiques. En effet, cela permet aux développeurs de bénéficier d'un environnement scalable et fiable, tout en se concentrant sur le développement et l'innovation plutôt que sur la gestion des infrastructures techniques.
Un cas concret est la création d'une application web pour une petite entreprise qui souhaite offrir un service en ligne à ses clients. En déployant cette application sur DigitalOcean, elle peut facilement s'échelle avec le nombre de demandes entrantes et assurer une haute disponibilité.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :
Connaissances :
- Familiarité avec Python et Django.
- Connaissance de la gestion des bases de données (SQL ou NoSQL).
- Compréhension du déploiement d'applications web.
Outils à installer :
- Un éditeur de code (par exemple, Visual Studio Code).
- Git pour le contrôle de version.
- Docker (facultatif mais recommandé pour une mise en production plus facile).
Concepts fondamentaux
1. Environnement Virtuel
Un environnement virtuel permet de créer un espace isolé pour les dépendances de l'application, évitant les conflits avec d'autres projets.
Code :
## Créer un environnement virtuel
python3 -m venv myenv
## Activer l'environnement virtuel
source myenv/bin/activate # Sur macOS/Linux
myenv\Scripts\activate # Sur Windows
2. Requirements.txt
Ce fichier liste toutes les dépendances nécessaires à l'application.
Code :
Django==3.2
djangorestframework==3.12.4
psycopg2-binary==2.8.6 # Pour PostgreSQL
3. Base de Données sur DigitalOcean
DigitalOcean offre des services comme le Managed Databases pour faciliter la gestion des bases de données.
Schema :
+-----------------+
| Django |
| |
| |
| +-------------+
| | PostgreSQL |
| +-------------+
| |
| |
+-----------------+
4. Gunicorn
Gunicorn est un serveur WSGI ASGI qui permet de servir l'application.
Code :
## Installer Gunicorn
pip install gunicorn
## Lancer le serveur
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
5. Supervisor
Supervisor est un gestionnaire de processus qui permet de monitorer et de redémarrer les services.
Code :
## Installer Supervisor
sudo apt-get install supervisor
## Configurer Supervisor pour Gunicorn
sudo nano /etc/supervisor/conf.d/myproject.conf
[program:myproject]
command=/home/youruser/myenv/bin/gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
directory=/home/youruser/myproject
user=youruser
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/myproject.log
6. Nginx
Nginx est un serveur HTTP qui peut servir directement les fichiers statiques et passer les requêtes WSGI à Gunicorn.
Code :
## Installer Nginx
sudo apt-get install nginx
## Configurer Nginx pour myproject
sudo nano /etc/nginx/sites-available/myproject
server {
listen 80;
server_name yourdomain.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/youruser/myproject;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
}
Mise en pratique : Projet fil rouge
Étape 1 : Création du Projet Django
Code :
## Installer Django
pip install django
## Créer un nouveau projet
django-admin startproject myproject
## Créer une application
python manage.py startapp tasks
Étape 2 : Configuration de l'Application
Code :
## myproject/settings.py
INSTALLED_APPS = [
...
'tasks',
]
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'mydatabase',
'USER': 'myuser',
'PASSWORD': 'mypassword',
'HOST': 'localhost',
'PORT': '',
}
}
Étape 3 : Création d'un Modèle
Code :
## tasks/models.py
from django.db import models
class Task(models.Model):
title = models.CharField(max_length=200)
description = models.TextField()
completed = models.BooleanField(default=False)
def __str__(self):
return self.title
Étape 4 : Migration de la Base de Données
Code :
python manage.py makemigrations
python manage.py migrate
Étape 5 : Création d'une Vue et une URL
Code :
## tasks/views.py
from django.shortcuts import render, redirect
from .models import Task
from .forms import TaskForm
def task_list(request):
tasks = Task.objects.all()
return render(request, 'tasks/task_list.html', {'tasks': tasks})
def task_create(request):
if request.method == 'POST':
form = TaskForm(request.POST)
if form.is_valid():
form.save()
return redirect('task_list')
else:
form = TaskForm()
return render(request, 'tasks/task_form.html', {'form': form})
Code :
## tasks/urls.py
from django.urls import path
from .views import task_list, task_create
urlpatterns = [
path('', task_list, name='task_list'),
path('create/', task_create, name='task_create'),
]
Étape 6 : Configuration des Templates
Code :
<!-- tasks/templates/tasks/task_list.html -->
<!DOCTYPE html>
<html>
<head>
<title>Task Manager</title>
</head>
<body>
<h1>Task List</h1>
<ul>
{% for task in tasks %}
<li>task.title - task.description</li>
{% endfor %}
</ul>
<a href="{% url 'task_create' %}">Add New Task</a>
</body>
</html>
Code :
<!-- tasks/templates/tasks/task_form.html -->
<!DOCTYPE html>
<html>
<head>
<title>Create Task</title>
</head>
<body>
<h1>Create Task</h1>
<form method="post">
{% csrf_token %}
form.as_p
<button type="submit">Save</button>
</form>
</body>
</html>
Étape 7 : Création du Formulaire
Code :
## tasks/forms.py
from django import forms
from .models import Task
class TaskForm(forms.ModelForm):
class Meta:
model = Task
fields = ['title', 'description']
Erreurs fréquentes et debugging
1. Mauvaise Configuration de Nginx
Code incorrect :
## nginx.conf
server {
listen 80;
server_name yourdomain.com;
location /static/ {
root /home/youruser/myproject/static;
}
location / {
proxy_pass http://127.0.0.1:8000;
}
}
Code correct :
## nginx.conf
server {
listen 80;
server_name yourdomain.com;
location = /favicon.ico { access_log off; log_not_found off; }
location /static/ {
root /home/youruser/myproject;
}
location / {
include proxy_params;
proxy_pass http://127.0.0.1:8000;
}
}
2. Erreur de Configuration de Gunicorn
Code incorrect :
## Lancer le serveur avec une commande incorrecte
gunicorn myproject.wsgi:application --bind 0.0.0.0:8001
Code correct :
## Lancer le serveur avec la bonne commande
gunicorn myproject.wsgi:application --bind 0.0.0.0:8000
3. Erreur de Configuration de Supervisor
Code incorrect :
## myproject.conf
[program:myproject]
command=/home/youruser/myenv/bin/gunicorn myproject.wsgi:application --bind 127.0.0.1:8001
directory=/home/youruser/myproject
user=youruser
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/myproject.log
Code correct :
## myproject.conf
[program:myproject]
command=/home/youruser/myenv/bin/gunicorn myproject.wsgi:application --bind 127.0.0.1:8000
directory=/home/youruser/myproject
user=youruser
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/var/log/myproject.log
Pour aller plus loin
1. Utilisation de Docker pour le déploiement
Code :
## Dockerfile
FROM python:3.8-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["gunicorn", "myproject.wsgi:application", "--bind", "0.0.0.0:8000"]
Commande :
docker build -t myproject .
docker run -d --name myproject_container -p 8000:8000 myproject
2. Intégration de Continuous Integration (CI)
Code :
## .github/workflows/ci.yml
name: CI
on: [push]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python 3.8
uses: actions/setup-python@v2
with:
python-version: '3.8'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run migrations
run: python manage.py migrate
- name: Run tests
run: python manage.py test
3. Déploiement sur DigitalOcean
Code :
## Créer une image Docker
docker build -t myproject .
## Connectez-vous à votre compte DigitalOcean avec Docker Machine
docker-machine create --driver digitalocean --digitalocean-access-token YOUR_ACCESS_TOKEN my-droplet
eval $(docker-machine env my-droplet)
## Envoyez l'image sur Docker Hub (facultatif)
docker tag myproject yourusername/myproject
docker push yourusername/myproject
## Déployez l'image sur DigitalOcean
docker-machine ssh my-droplet "docker run -d --name myproject_container -p 80:8000 yourusername/myproject"
Défi pratique
Défi : Implémenter une API RESTful pour votre application de gestion de tâches en utilisant Django REST Framework. Créez des vues pour les opérations CRUD (Create, Read, Update, Delete) sur le modèle Task.
Code :
## tasks/serializers.py
from rest_framework import serializers
from .models import Task
class TaskSerializer(serializers.ModelSerializer):
class Meta:
model = Task
fields = ['id', 'title', 'description', 'completed']
## tasks/views.py
from rest_framework import viewsets
from .models import Task
from .serializers import TaskSerializer
class TaskViewSet(viewsets.ModelViewSet):
queryset = Task.objects.all()
serializer_class = TaskSerializer
Code :
## tasks/urls.py
from django.urls import path, include
from rest_framework.routers import DefaultRouter
from .views import TaskViewSet
router = DefaultRouter()
router.register(r'tasks', TaskViewSet)
urlpatterns = [
path('', include(router.urls)),
]
En suivant ce tutoriel, vous devriez être en mesure de déployer une application Django complète sur DigitalOcean. N'oubliez pas de tester chaque étape pour vous assurer que tout fonctionne correctement avant de passer à l'étape suivante.