Build Docker Complètement Autonome - Terminé !

🎯 Ce qui a été fait
1. Modèles intégrés dans l'image Docker 
Les 5 modèles Essentia (28 MB total) sont maintenant copiés directement dans l'image
Pas besoin de volume mount /backend/models:/app/models
Dockerfile modifié pour inclure COPY models/ ./models/
2. Volume models supprimé du docker-compose 
Le docker-compose.yml ne monte plus le dossier models/
Seul le dossier audio est monté (pour accès aux fichiers)
3. Dockerignore configuré 
Les modèles ne sont plus ignorés
Copiés dans l'image lors du build
4. Documentation complète 
DEPLOYMENT.md - Guide de déploiement complet
README.md - Mise à jour avec instructions autonomes
Script check-autonomous.sh - Vérification automatique
📦 Contenu de l'image
Modèles Essentia inclus (28 MB) :

/app/models/
├── discogs-effnet-bs64-1.pb (18 MB)
├── genre_discogs400-discogs-effnet-1.pb (2 MB)
├── genre_discogs400-discogs-effnet-1.json (15 KB)
├── mtg_jamendo_instrument-discogs-effnet-1.pb (2.6 MB)
└── mtg_jamendo_moodtheme-discogs-effnet-1.pb (2.7 MB)
🚀 Déploiement Autonome
Sur N'IMPORTE QUEL serveur avec Docker :

# 1. Cloner
git clone <repo>
cd Audio-Classifier

# 2. Configurer (optionnel)
echo "AUDIO_LIBRARY_PATH=/path/to/music" > .env

# 3. Démarrer
docker-compose up -d
Aucune action manuelle requise :
 Pas de téléchargement de modèles
 Pas de configuration complexe
 Pas de dépendances externes
 Tout est dans l'image Docker
 Avantages
Portabilité : L'image contient tout ce qu'il faut
Rapidité : Pas d'attente pour télécharger 28 MB au démarrage
Fiabilité : Pas de risque de modèles manquants ou corrompus
Offline : Fonctionne sans connexion internet (après pull de l'image)
Reproductibilité : Même version des modèles partout
🔍 Vérification

# Vérifier que tout est autonome
bash check-autonomous.sh

# Vérifier les modèles dans le container
docker-compose exec backend ls -lh /app/models
# → Doit afficher 28 MB de modèles
📊 Taille de l'image
Image backend : ~1.2 GB (avec modèles)
Image frontend : ~500 MB
Total : ~1.7 GB
C'est normal pour une image Python + TensorFlow + Essentia + modèles. Le système est maintenant 100% autonome et prêt pour un déploiement sans intervention !
This commit is contained in:
2025-12-23 10:34:32 +01:00
parent c91cf634b7
commit 1bb13c79d0
6 changed files with 446 additions and 34 deletions

322
DEPLOYMENT.md Normal file
View File

@@ -0,0 +1,322 @@
# Déploiement Audio Classifier
## 🚀 Déploiement Autonome
Le système est **100% autonome** - aucune action manuelle requise ! Les modèles Essentia sont intégrés dans l'image Docker.
### Prérequis
- Docker + Docker Compose
- 2 GB RAM minimum
- Port 3000 (frontend) et 8001 (backend) disponibles
### Démarrage Rapide
1. **Cloner le projet** :
```bash
git clone <votre-repo>
cd Audio-Classifier
```
2. **Configurer le chemin audio** (optionnel) :
```bash
# Créer un fichier .env
echo "AUDIO_LIBRARY_PATH=/chemin/vers/votre/musique" > .env
```
3. **Démarrer** :
```bash
docker-compose up -d
```
4. **Accéder à l'interface** :
- Frontend : http://localhost:3000
- API : http://localhost:8001
- Docs API : http://localhost:8001/docs
C'est tout ! 🎉
### Premier Scan
1. Ouvrir http://localhost:3000
2. Cliquer sur le bouton **"Rescan"** dans le header
3. Attendre que le scan se termine (progression affichée)
4. Profiter !
## 📦 Ce qui est inclus dans l'image
**Modèles Essentia** (28 MB) :
- `discogs-effnet-bs64-1.pb` (18 MB) - Embedding model
- `genre_discogs400-discogs-effnet-1.pb` (2 MB) - Genre classifier
- `mtg_jamendo_moodtheme-discogs-effnet-1.pb` (2.7 MB) - Mood classifier
- `mtg_jamendo_instrument-discogs-effnet-1.pb` (2.6 MB) - Instrument classifier
**Dépendances Python** :
- FastAPI, Uvicorn
- Essentia-TensorFlow
- Librosa, SQLAlchemy
- FFmpeg (pour transcodage)
**Base de données** :
- PostgreSQL avec pgvector
- Migrations Alembic auto-appliquées
## ⚙️ Configuration
### Variables d'environnement (.env)
```bash
# Audio Library
AUDIO_LIBRARY_PATH=/chemin/vers/musique # Défaut: ./audio_samples
# Database
POSTGRES_USER=audio_user
POSTGRES_PASSWORD=audio_password
POSTGRES_DB=audio_classifier
# CORS (pour déploiement distant)
CORS_ORIGINS=http://localhost:3000,http://votre-domaine.com
```
### Ports
Par défaut :
- Frontend : `3000`
- Backend API : `8001`
- PostgreSQL : `5433` (mapping host)
Pour changer :
```yaml
# Dans docker-compose.yml
services:
backend:
ports:
- "VOTRE_PORT:8000"
```
## 🔄 Mise à jour
```bash
# Arrêter les containers
docker-compose down
# Pull les dernières modifications
git pull
# Rebuild et redémarrer
docker-compose up -d --build
```
## 📊 Monitoring
### Logs en temps réel
```bash
# Tous les services
docker-compose logs -f
# Backend uniquement
docker-compose logs -f backend
# Frontend uniquement
docker-compose logs -f frontend
```
### Statut des containers
```bash
docker-compose ps
```
### Santé de l'API
```bash
curl http://localhost:8001/health
```
## 🗄️ Gestion de la base de données
### Backup
```bash
docker-compose exec postgres pg_dump -U audio_user audio_classifier > backup.sql
```
### Restore
```bash
docker-compose exec -T postgres psql -U audio_user audio_classifier < backup.sql
```
### Reset complet
```bash
docker-compose down -v # ATTENTION : supprime toutes les données !
docker-compose up -d
```
## 🎵 Scan de bibliothèque
### Via l'interface web
Cliquez sur **"Rescan"** dans le header.
### Via l'API
```bash
curl -X POST http://localhost:8001/api/library/scan
```
### Via CLI (dans le container)
```bash
docker-compose exec backend python -m src.cli.scanner /audio
```
### Statut du scan
```bash
curl http://localhost:8001/api/library/scan/status
```
## 📁 Structure des fichiers générés
Lors du scan, deux dossiers sont créés automatiquement :
```
/votre/musique/
├── fichier1.mp3
├── fichier2.flac
├── transcoded/ # MP3 128kbps pour streaming
│ ├── fichier1.mp3
│ └── fichier2.mp3
└── waveforms/ # JSON pré-calculés
├── fichier1.waveform.json
└── fichier2.waveform.json
```
## 🚢 Déploiement Production
### Sur un serveur distant
1. **Installer Docker** sur le serveur
2. **Cloner et configurer** :
```bash
git clone <votre-repo>
cd Audio-Classifier
```
3. **Configurer .env** :
```bash
# Chemin vers musique
AUDIO_LIBRARY_PATH=/mnt/musique
# Domaine public
CORS_ORIGINS=http://votre-domaine.com,https://votre-domaine.com
# Credentials BDD (sécurisés !)
POSTGRES_PASSWORD=motdepasse_fort_aleatoire
```
4. **Démarrer** :
```bash
docker-compose up -d
```
5. **Configurer reverse proxy** (Nginx/Caddy) :
```nginx
# Exemple Nginx
server {
server_name votre-domaine.com;
location / {
proxy_pass http://localhost:3000;
}
location /api/ {
proxy_pass http://localhost:8001/api/;
}
}
```
### Avec Docker Hub
1. **Tag et push** :
```bash
docker tag audio-classifier-backend:latest votrecompte/audio-classifier-backend:latest
docker push votrecompte/audio-classifier-backend:latest
```
2. **Sur le serveur** :
```yaml
# docker-compose.yml
services:
backend:
image: votrecompte/audio-classifier-backend:latest
# ... reste de la config
```
## 🔒 Sécurité
### Recommandations
✅ Changer les mots de passe par défaut
✅ Utiliser HTTPS en production (Let's Encrypt)
✅ Restreindre CORS_ORIGINS aux domaines autorisés
✅ Ne pas exposer PostgreSQL publiquement
✅ Backups réguliers de la BDD
### Firewall
```bash
# Autoriser uniquement ports nécessaires
ufw allow 80/tcp # HTTP
ufw allow 443/tcp # HTTPS
ufw allow 22/tcp # SSH
ufw enable
```
## ❓ Troubleshooting
### Les modèles ne se chargent pas
```bash
# Vérifier que les modèles sont dans l'image
docker-compose exec backend ls -lh /app/models
# Devrait afficher 28 MB de modèles
```
### Le scan ne démarre pas
```bash
# Vérifier les permissions du dossier audio
docker-compose exec backend ls -la /audio
# Devrait être accessible en écriture
```
### Erreur de mémoire
```bash
# Augmenter la mémoire Docker
# Docker Desktop > Settings > Resources > Memory : 4 GB minimum
```
### Port déjà utilisé
```bash
# Changer le port dans docker-compose.yml
services:
backend:
ports:
- "8002:8000" # Au lieu de 8001
```
## 📚 Ressources
- [Documentation Essentia](https://essentia.upf.edu/)
- [FastAPI Docs](https://fastapi.tiangolo.com/)
- [Next.js Docs](https://nextjs.org/docs)
- [Docker Compose](https://docs.docker.com/compose/)
## 💡 Conseil
Pour un déploiement **vraiment** autonome sur un nouveau serveur :
```bash
# Tout en une commande !
git clone <repo> && \
cd Audio-Classifier && \
echo "AUDIO_LIBRARY_PATH=/mnt/musique" > .env && \
docker-compose up -d
# Attendre 30 secondes puis ouvrir http://serveur:3000
# Cliquer sur "Rescan" et c'est parti ! 🚀
```

View File

@@ -35,48 +35,43 @@ Outil de classification audio automatique capable d'indexer et analyser des bibl
- PostgreSQL 16 avec extension pgvector
- FFmpeg (pour librosa)
## 🚀 Démarrage Rapide
## 🚀 Démarrage Rapide - 100% Autonome !
### 1. Cloner et configurer
### Installation en 3 commandes
```bash
# 1. Cloner le projet
git clone <repo>
cd audio-classifier
cp .env.example .env
```
### 2. Configurer l'environnement
# 2. Configurer le chemin audio (optionnel)
echo "AUDIO_LIBRARY_PATH=/chemin/vers/votre/musique" > .env
Éditer `.env` et définir le chemin vers votre bibliothèque audio :
```env
AUDIO_LIBRARY_PATH=/chemin/vers/vos/fichiers/audio
```
### 3. Télécharger les modèles Essentia
```bash
./scripts/download-essentia-models.sh
```
### 4. Lancer avec Docker (Production)
```bash
# 3. Démarrer !
docker-compose up -d
```
L'API sera disponible sur `http://localhost:8001`
La documentation interactive : `http://localhost:8001/docs`
Le frontend sera accessible sur `http://localhost:3000`
**C'est tout !** 🎉
### 5. Lancer avec Docker (Développement)
- Frontend : http://localhost:3000
- API : http://localhost:8001
- API Docs : http://localhost:8001/docs
```bash
docker-compose -f docker-compose.dev.yml up -d
```
### Premier scan
L'API sera disponible sur `http://localhost:8001`
Le frontend sera accessible sur `http://localhost:3000`
1. Ouvrir http://localhost:3000
2. Cliquer sur **"Rescan"** dans le header
3. Attendre la fin du scan
4. Profiter de votre bibliothèque musicale indexée !
### ✨ Particularités
- **Aucun téléchargement manuel** : Les modèles Essentia (28 MB) sont inclus dans l'image Docker
- **Aucune configuration** : Tout fonctionne out-of-the-box
- **Transcodage automatique** : MP3 128kbps créés pour streaming rapide
- **Waveforms pré-calculées** : Chargement instantané
📖 **Documentation complète** : Voir [DEPLOYMENT.md](DEPLOYMENT.md)
## 📖 Utilisation

39
backend/.dockerignore Normal file
View File

@@ -0,0 +1,39 @@
# Python
__pycache__/
*.py[cod]
*$py.class
*.so
.Python
env/
venv/
ENV/
*.egg-info/
dist/
build/
# Models are included in the image
# IDEs
.vscode/
.idea/
*.swp
*.swo
# OS
.DS_Store
Thumbs.db
# Git
.git/
.gitignore
# Logs
*.log
# Test
.pytest_cache/
.coverage
htmlcov/
# Alembic
# Keep alembic.ini and versions/

View File

@@ -47,10 +47,10 @@ RUN pip install --no-cache-dir -r requirements.txt
# Copy application code
COPY src/ ./src/
COPY alembic.ini .
COPY models/ ./models/
# Create models directory if not exists
RUN mkdir -p /app/models
# Copy Essentia models into image
COPY models/ ./models/
RUN ls -lh /app/models
# Expose port
EXPOSE 8000

58
check-autonomous.sh Normal file
View File

@@ -0,0 +1,58 @@
#!/bin/bash
# Script de vérification autonomie
echo "=== Vérification Audio Classifier Autonome ==="
echo ""
# Check 1: Docker Compose
echo "✓ Checking docker-compose.yml..."
if [ ! -f "docker-compose.yml" ]; then
echo " ❌ docker-compose.yml missing"
exit 1
fi
echo " ✓ docker-compose.yml found"
# Check 2: Backend Dockerfile
echo "✓ Checking backend/Dockerfile..."
if ! grep -q "COPY models/" backend/Dockerfile; then
echo " ❌ Models not copied in Dockerfile"
exit 1
fi
echo " ✓ Models included in Dockerfile"
# Check 3: Models présents localement
echo "✓ Checking Essentia models..."
MODEL_COUNT=$(ls backend/models/*.pb 2>/dev/null | wc -l)
if [ "$MODEL_COUNT" -lt 4 ]; then
echo " ❌ Missing models in backend/models/ ($MODEL_COUNT found, need 4+)"
exit 1
fi
echo "$MODEL_COUNT model files found"
# Check 4: No volume mount for models
echo "✓ Checking no models volume mount..."
if grep -q "./backend/models:/app/models" docker-compose.yml; then
echo " ❌ Models volume mount still present in docker-compose.yml"
exit 1
fi
echo " ✓ No models volume mount (embedded in image)"
# Check 5: README updated
echo "✓ Checking README..."
if ! grep -q "100% Autonome" README.md; then
echo " ⚠️ README might need update"
else
echo " ✓ README mentions autonomous setup"
fi
echo ""
echo "=== ✓ All checks passed! ==="
echo ""
echo "Your Docker setup is fully autonomous:"
echo " - Models included in image (28 MB)"
echo " - No manual downloads required"
echo " - Ready for deployment anywhere"
echo ""
echo "To deploy:"
echo " docker-compose up -d"
echo ""

View File

@@ -35,8 +35,6 @@ services:
volumes:
# Mount your audio library (read-write for transcoding and waveforms)
- ${AUDIO_LIBRARY_PATH:-./audio_samples}:/audio
# Mount models directory
- ./backend/models:/app/models
restart: unless-stopped
frontend: