Template Ansible pour automatiser le déploiement et la maintenance d'applications web basées sur Django (backend) et Vue 3 (ou Nuxt) en front-end.
🎯 Objectif principal : Adapter ce template pour déployer votre propre projet en quelques étapes simples.
- Prérequis
- Stack technique
- 🚀 Adaptation pour un nouveau projet
- Déploiement
- Commandes de maintenance
- Architecture des rôles
- Configuration avancée
- Dépannage
- Ansible 2.9+ installé
- Git avec accès aux repositories du projet
- Clé du vault Ansible (
vault.key
) pour accéder aux variables chiffrées
- Ubuntu/Debian (testé sur Ubuntu 18.04+)
- Python 3 avec pip
- Accès SSH avec privilèges sudo
- Git installé
- Accès Internet pour télécharger les dépendances
- Port SSH (par défaut 22, configurable)
- Port HTTP (80) et HTTPS (443) pour le web
- Ports applicatifs configurables pour backend et frontend
- Frontend : Vue 3 (ou Nuxt) + Nginx
- Backend : Django + gunicorn + supervisord
- Base de données : PostgreSQL ou SQLite
- Serveur web : Nginx
- Mailgun : envoi d'emails transactionnels
- Service S3 : stockage des sauvegardes de base de données
- Rollbar : monitoring et tracking des erreurs en production
- Let's Encrypt : certificats SSL automatiques
Copier le contenu de ce dépôt dans un dossier "deploy" dans votre projet.
# Cloner le template
git clone <votre-repo>
cd deploy-template
# Installer pre-commit (recommandé)
pip install pre-commit
pre-commit install
# Récupérer la clé du vault et la placer à la racine
cp /chemin/vers/vault.key .
Éditer group_vars/all/vars.yml
:
organization_slug: votre-org
base_project_slug: mon-projet
main_user: mon-projet
main_user_uid: 10042 # Unique par projet sur le serveur
django_project_name: mon_projet_back
# Dans le cas d'un un mono-repo (is_mono_repo: true), le back-end et le front-end sont configurés pour utiliser le même dépôt.
backend_repo: [email protected]:votre-org/mon-projet-fullstack.git
frontend_repo: [email protected]:votre-org/mon-projet-fullstack.git
# Pour des repos séparés (is_mono_repo: false), le backend et le frontend sont configurés pour utiliser des dépôts différents.
# backend_repo: [email protected]:votre-org/mon-projet-backend.git
# frontend_repo: [email protected]:votre-org/mon-projet-frontend.git
Éditer group_vars/all/cross_env_vars.yml
pour définir :
- Ports SSH personnalisés
- Domaines publics
- Configuration réseau
Modifier le fichier hosts
:
[prod]
votre-serveur.com:22 ansible_user=ubuntu
# Générer une nouvelle clé de vault
bash generate_vault_key_on_first_install.sh
# Éditer les variables secrètes
ansible-vault edit group_vars/all/cross_env_vault.yml
Configurer dans le vault les variables suivantes :
# Django
django_secret_key: "votre-clé-secrète-django-très-longue"
# Base de données (si PostgreSQL)
database_password: "mot-de-passe-sécurisé"
# Mailgun (optionnel)
mailgun_api_key: "key-xxxxxxxxxxxxx"
mailgun_domain: "mg.votre-domaine.com"
# Sauvegarde S3 (optionnel)
backup_s3_access_key: "AKIAIOSFODNN7EXAMPLE"
backup_s3_secret_key: "wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY"
backup_s3_bucket: "mon-projet-backups"
backup_s3_region: "eu-west-3"
# Rollbar (optionnel)
rollbar_access_token: "xxxxxxxxxxxxxxxxxxxxxxxxx"
# Contact
contact_email: "[email protected]"
Modifier frontend_mode
dans vars.yml
:
static
: génération statique (JAMstack)SSR
: rendu côté serveur
Changer database_provider
:
sqlite
: pour les petits projetspostgresql
: pour la production
Adapter les URLs de dépôts dans vars.yml
selon votre structure :
- Mono-repo :
is_mono_repo: true
- Repos séparés :
is_mono_repo: false
Lorsque is_mono_repo
est activé, le template adapte automatiquement sa logique de déploiement :
- Repository unique : Le même dépôt contient le backend et le frontend
- Branches partagées : Utilisation de la même branche pour backend et frontend
- Chemins relatifs : Les chemins de build sont adaptés pour pointer vers les sous-dossiers appropriés
Pour ajouter un environnement de préproduction :
# Créer le dossier de variables
mkdir group_vars/preprod
cp group_vars/prod/vars.yml group_vars/preprod/
# Ajouter dans hosts
[preprod]
preprod.mon-projet.com:22 ansible_user=ubuntu
Notes : les commandes ont un ordre logique qu'il est recommandé de suivre pour éviter les erreurs.
# Déploiement du backend
ansible-playbook backend.yml
# Déploiement du frontend
ansible-playbook frontend.yml
# Ou les deux en séquence
ansible-playbook backend.yml && ansible-playbook frontend.yml
# Mise à jour du backend uniquement
ansible-playbook backend.yml
# Mise à jour du frontend uniquement
ansible-playbook frontend.yml
# Forcer la mise à jour des dépendances
ansible-playbook backend.yml -e force_update=1
Notes : toutes les commandes ci-dessous peuvent aussi être exécutées sur le serveur.
# Vérifier le statut des services
ansible prod -m shell -a "supervisorctl status"
# Consulter les logs
ansible prod -m shell -a "tail -f /var/log/supervisor/backend-*.log"
# Script de contrôle backend (remplacez les variables par vos valeurs)
# Sauvegarde manuelle
ansible prod -m shell -a "sudo /org/projet/projet-ctl backup"
# Migration Django
ansible prod -m shell -a "sudo /org/projet/projet-ctl migrate"
# Shell Django interactif
ansible prod -m shell -a "sudo /org/projet/projet-ctl shell"
# Collecte des fichiers statiques
ansible prod -m shell -a "sudo /org/projet/projet-ctl collectstatic --noinput"
# Création d'un superutilisateur
ansible prod -m shell -a "sudo /org/projet/projet-ctl createsuperuser"
# Redémarrer tous les services
ansible prod -m shell -a "supervisorctl restart all"
# Redémarrer nginx
ansible prod -m shell -a "systemctl restart nginx"
# Redémarrer uniquement le backend
ansible prod -m shell -a "supervisorctl restart backend-*"
# Redémarrer uniquement le frontend (mode SSR)
ansible prod -m shell -a "supervisorctl restart frontend-*"
- Backend : Modifier
roles/backend/templates/settings.ini.j2
pour Django - Frontend : Adapter
roles/frontend/tasks/main.yml
pour d'autres frameworks - Nginx : Personnaliser
roles/frontend/templates/nginx.conf.j2
- Configuration nginx sécurisée : Protection contre les attaques communes
- Gestion des permissions utilisateurs : Utilisateur dédié par projet
- Variables sensibles chiffrées : Ansible Vault pour tous les secrets
- Support SSL/TLS : Configuration prête pour Let's Encrypt
- Logs centralisés :
/var/log/votre-org/votre-projet/
backend.log
: Logs de l'application Djangofrontend.log
: Logs frontend (mode SSR uniquement)nginx-access.log
etnginx-error.log
: Logs du serveur web
- Supervision : supervisord pour le monitoring des processus
- Rotation automatique : Configuration logrotate pour éviter la saturation disque
- Rollbar : Tracking des erreurs en production (si configuré)
# Logs en temps réel
ansible prod -m shell -a "tail -f /var/log/votre-org/votre-projet/backend.log"
# Logs nginx
ansible prod -m shell -a "tail -f /var/log/nginx/access.log"
# Statut des services
ansible prod -m shell -a "supervisorctl status"
- Packages système : Python 3, nginx, supervisord, PostgreSQL (si utilisé)
- Utilisateur système : Création d'un utilisateur dédié avec UID personnalisé
- Base de données : Configuration PostgreSQL ou SQLite selon
database_provider
- Application Django :
- Environnement virtuel Python
- Installation des dépendances via requirements.txt
- Configuration Django via
settings.ini
- Migrations automatiques
- Collecte des fichiers statiques
- Processus : Configuration supervisord pour gunicorn
- Utilitaires : Script de contrôle
{project}-ctl
pour la gestion - Sauvegardes : Tâche cron quotidienne vers S3
- Node.js : Installation via NVM (version depuis
.nvmrc
) - Code source : Clonage du repository frontend
- Dépendances : Installation via npm/yarn
- Build :
- Mode static : Génération statique vers dossier nginx
- Mode SSR : Build pour rendu côté serveur + supervisord
- Configuration nginx : Proxy, SSL, gestion des erreurs
- Variables d'environnement : Fichier
.env
pour la configuration
Service ne démarre pas
# Vérifier les logs supervisord
ansible prod -m shell -a "tail -f /var/log/supervisor/supervisord.log"
# Redémarrer supervisord
ansible prod -m shell -a "systemctl restart supervisor"
Problème de permissions
# Vérifier les permissions des dossiers
ansible prod -m shell -a "ls -la /votre-org/votre-projet/"
# Corriger les permissions si nécessaire
ansible-playbook backend.yml --tags permissions
Erreur de base de données
# Vérifier la connexion PostgreSQL
ansible prod -m shell -a "sudo -u postgres psql -l"
# Tester la migration
ansible prod -m shell -a "sudo /votre-org/votre-projet/projet-ctl migrate --dry-run"
Support : Pour toute question, consulter la documentation Ansible ou contacter l'équipe de TelesCoop.