Nouveau : Datasets open source gratuits disponibles !Decouvrir →
🐍
Intermediaire 20 min Django

Deployer Django sur DigitalOcean

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.

Besoin d'aide sur Django ?

Besoin d'aide sur un projet technique ? Decrivez-le pour des conseils personnalises.

Recevoir des conseils

Questions frequentes

Quelle est la première étape pour déployer Django sur DigitalOcean?
La première étape consiste à créer un compte sur DigitalOcean et à mettre en place une nouvelle instance droplet avec le système d'exploitation Ubuntu.
Comment configurer la base de données pour mon projet Django sur DigitalOcean?
Pour configurer la base de données, vous pouvez utiliser PostgreSQL qui est facilement intégrable avec Django. Assurez-vous d'avoir installé les packages nécessaires et de configurer la chaîne de connexion dans votre fichier settings.py.
Quelle commande utiliserais-je pour déployer mes modifications sur DigitalOcean après avoir fait des changements dans mon projet?
Après chaque modification, utilisez les commandes git add . et git commit -m "votre message" pour sauvegarder vos modifications. Ensuite, entrez git push origin master pour pousser vos modifications vers votre dépôt sur DigitalOcean.

Pages liees

Chaque semaine, le meilleur de la tech francaise

Tendances, salaires, outils et opportunites — directement dans votre boite mail.

Gratuit. Desabonnement en un clic. Pas de spam.