# Dockerisation du projet Audio Classifier ## 🐳 Architecture Docker Le projet est entièrement dockerisé avec deux configurations distinctes : 1. **Production** (`docker-compose.yml`) - Version optimisée pour le déploiement 2. **Développement** (`docker-compose.dev.yml`) - Version avec hot-reload pour le développement ## 📁 Structure des Services ```yaml services: postgres: # Base de données PostgreSQL avec pgvector backend: # API FastAPI (Python 3.11) frontend: # Interface Next.js (Node.js 20) ``` ## 🚀 Commandes de déploiement ### Mode Production ```bash # Démarrer tous les services docker-compose up -d # Arrêter tous les services docker-compose down # Voir les logs docker-compose logs ``` ### Mode Développement ```bash # Démarrer tous les services en mode dev docker-compose -f docker-compose.dev.yml up -d # Arrêter tous les services docker-compose -f docker-compose.dev.yml down # Voir les logs docker-compose -f docker-compose.dev.yml logs ``` ## 🏗 Construction des images ### Backend (Production) - **Base** : `python:3.9-slim` (pour compatibilité Essentia) - **Dépendances système** : ffmpeg, libsndfile, etc. - **Dépendances Python** : Toutes les dépendances du fichier `requirements.txt` - **Optimisation** : Multi-stage build pour réduire la taille ### Backend (Développement) - **Base** : `python:3.11-slim` - **Dépendances** : Version minimale sans Essentia - **Hot-reload** : Montage du code source pour développement ### Frontend (Production) - **Base** : `node:20-alpine` - **Build** : Application Next.js compilée - **Optimisation** : Image légère Alpine Linux ### Frontend (Développement) - **Base** : `node:20-alpine` - **Hot-reload** : Montage du code source - **Dépendances** : Installation des modules Node ## ⚙️ Configuration des environnements ### Variables d'environnement Les variables sont définies dans les fichiers `.env` et peuvent être surchargées : **Base de données :** - `POSTGRES_USER` - Utilisateur PostgreSQL - `POSTGRES_PASSWORD` - Mot de passe PostgreSQL - `POSTGRES_DB` - Nom de la base de données - `DATABASE_URL` - URL de connexion complète **Backend :** - `CORS_ORIGINS` - Origines autorisées pour CORS - `ANALYSIS_USE_CLAP` - Activation des embeddings CLAP - `ANALYSIS_NUM_WORKERS` - Nombre de workers d'analyse - `ESSENTIA_MODELS_PATH` - Chemin vers les modèles Essentia **Frontend :** - `NEXT_PUBLIC_API_URL` - URL de l'API backend ### Volumes Docker **Base de données :** - `postgres_data` - Persistance des données PostgreSQL **Backend :** - `${AUDIO_LIBRARY_PATH}:/audio:ro` - Montage de la bibliothèque audio (lecture seule) - `./backend/models:/app/models` - Montage des modèles Essentia **Frontend :** - `./frontend:/app` (dev) - Montage du code source - `/app/node_modules` (dev) - Persistance des modules Node ## 🔄 Flux de développement 1. **Développement backend :** - Modifier le code dans `backend/src/` - Hot-reload automatique avec `docker-compose.dev.yml` 2. **Développement frontend :** - Modifier le code dans `frontend/` - Hot-reload automatique avec Next.js 3. **Déploiement :** - Construire les images avec `docker-compose build` - Démarrer les services avec `docker-compose up -d` ## 🔧 Maintenance et debugging ### Accéder au conteneur backend ```bash docker exec -it audio_classifier_api sh ``` ### Accéder au conteneur frontend ```bash docker exec -it audio_classifier_ui sh ``` ### Accéder à la base de données ```bash docker exec -it audio_classifier_db psql -U audio_user -d audio_classifier ``` ### Réinitialiser la base de données ```bash docker-compose down -v docker-compose up -d ``` ## 📈 Performance et optimisation ### Backend - Utilisation de `--platform=linux/amd64` pour compatibilité Essentia - Installation des dépendances Python par étapes pour meilleur cache - Montage des modèles Essentia pour persistance ### Frontend - Utilisation d'Alpine Linux pour image légère - Installation des dépendances avant copie du code - Exclusion de `node_modules` du contexte de build ## 🔒 Sécurité - Conteneurs non-root par défaut - Montage lecture-seule de la bibliothèque audio - Mise à jour régulière des images de base - Utilisation de versions spécifiques des dépendances ## 🆘 Problèmes courants ### Essentia non disponible sur ARM Solution : Utiliser `--platform=linux/amd64` dans le Dockerfile ### Permissions de fichiers Solution : Vérifier les permissions du dossier audio monté ### CORS errors Solution : Vérifier la configuration `CORS_ORIGINS` ## 📚 Références - [Docker Documentation](https://docs.docker.com/) - [Docker Compose Documentation](https://docs.docker.com/compose/) - [PostgreSQL avec pgvector](https://github.com/pgvector/pgvector) - [Next.js Dockerisation](https://nextjs.org/docs/deployment)