Files
Audio-Classifier/DEPLOYMENT.md
Benoit 04603cd5e9 Fix localhost en prod
Résumé des modifications
J'ai implémenté une configuration runtime pour le frontend qui permet de changer l'URL de l'API sans rebuilder l'image Docker. Voici ce qui a été fait :
📝 Fichiers modifiés :
frontend/Dockerfile - Ajout du script de génération de config au démarrage
frontend/lib/api.ts - Lecture de la config depuis window.__RUNTIME_CONFIG__
frontend/app/layout.tsx - Chargement du script config.js
docker-compose.yml - Utilisation de la variable d'environnement
.env.example - Documentation de la variable
DEPLOYMENT.md - Documentation de la configuration runtime
📄 Fichiers créés :
frontend/generate-config.sh - Script de génération de config
frontend/public/config.js - Fichier de config (placeholder)
frontend/README.md - Documentation du frontend
🚀 Pour résoudre votre problème en production :
Sur votre serveur, modifiez le fichier .env :

# URL publique de l'API (utilisée par le navigateur)
NEXT_PUBLIC_API_URL=https://audioclassifier.benoitsz.com:8001

# CORS doit accepter les requêtes du frontend
CORS_ORIGINS=https://audioclassifier.benoitsz.com,https://audioclassifier.benoitsz.com:3000
Ensuite :

# Pull les dernières modifications
git pull

# Rebuild l'image frontend (une seule fois)
# Soit via Gitea Actions en poussant sur main
# Soit manuellement :
# docker build -t git.benoitsz.com/benoit/audio-classifier-frontend:dev -f frontend/Dockerfile .
# docker push git.benoitsz.com/benoit/audio-classifier-frontend:dev

# Redémarrer les containers
docker-compose down
docker-compose up -d
 Avantages :
 Aucun rebuild nécessaire après le premier déploiement
 Configuration flexible via variables d'environnement
 Compatible avec tous les environnements (dev, staging, prod)
 Testé et fonctionnel localement
Le frontend générera automatiquement le bon fichier de configuration au démarrage du container avec l'URL de votre serveur !
2025-12-23 15:33:52 +01:00

332 lines
7.0 KiB
Markdown

# 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 https://git.benoitsz.com/benoit/Audio-Classifier.git
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 ! 🎉
**Note** : Les images Docker sont automatiquement téléchargées depuis git.benoitsz.com. Aucun build nécessaire !
### 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
# URL publique de l'API (IMPORTANT pour le frontend)
# Cette URL est utilisée par le navigateur pour accéder à l'API
# Remplacer par votre domaine ou IP publique + port 8001
NEXT_PUBLIC_API_URL=https://votre-serveur.com:8001
# Domaine public pour CORS (doit inclure l'URL du frontend)
CORS_ORIGINS=https://votre-domaine.com,https://votre-domaine.com:3000
# Credentials BDD (sécurisés !)
POSTGRES_PASSWORD=motdepasse_fort_aleatoire
```
**Important :** Le frontend utilise maintenant une configuration **runtime**, ce qui signifie que vous pouvez changer `NEXT_PUBLIC_API_URL` dans le fichier `.env` et redémarrer les containers sans avoir à rebuilder les images.
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 ! 🚀
```