- Ajout Prometheus et Grafana au docker-compose.yml - Métriques automatiques pour le backend FastAPI - Configuration de production avec docker-compose.prod.yml - Guide de déploiement manuel pour serveur Linux - Variables d'environnement sécurisées - Documentation complète de déploiement
13 KiB
Expernet - Système de Réservation de Salles
Système complet de réservation de salles pour le centre de formation Expernet, développé avec FastAPI (Backend), Next.js (Frontend) et PostgreSQL (Base de données), orchestré avec Docker Compose.
Stack Technique
- Backend: FastAPI (Python) avec AsyncPG
- Frontend: Next.js 14 + TypeScript + Tailwind CSS
- Base de données: PostgreSQL 16
- Containerisation: Docker & Docker Compose
- Tests: Pytest avec GitHub Actions CI/CD
- Versioning: Git tags avec releases GitHub
Fonctionnalités
Gestion des Salles
- 5 salles pré-configurées (Atlas, Horizon, Innovation, Connect, Digital)
- Affichage des capacités et équipements
- Interface intuitive de sélection
Réservations
- Formulaire de réservation complet
- Champ email optionnel
- Sélection de date et horaires
- Vérification en temps réel de la disponibilité
- Détection automatique des conflits d'horaires
- Bouton désactivé si créneau occupé
- Validation des créneaux disponibles
- Annulation de réservations
Planning Visuel
- Grille de planning par jour (8h-22h)
- Vue d'ensemble de toutes les salles
- Code couleur : ✅ Disponible / ❌ Réservé
- Nom de l'utilisateur affiché sur les créneaux réservés
- Navigation par date
- Liste détaillée des réservations du jour
Suivi
- Vue d'ensemble de toutes les réservations
- Filtrage par salle et par date
- Historique complet
Démarrage Rapide
Prérequis
- Docker et Docker Compose installés sur votre machine
- Ports 3000, 8000 et 5432 disponibles
Installation et lancement
- Cloner le projet (si applicable)
git clone <votre-repo>
cd dockezr
- Lancer tous les services avec Docker Compose
docker-compose up -d
ou utilisez le script Windows :
scripts/start.bat
Cette commande va :
- Créer le réseau Docker
dockezr_network - Démarrer PostgreSQL sur le port 5432
- Créer automatiquement les tables et les 5 salles par défaut
- Démarrer le backend FastAPI sur le port 8000
- Démarrer le frontend Next.js sur le port 3000
- Accéder à l'application
- Frontend (Interface de réservation): http://localhost:3000
- Backend API: http://localhost:8000
- Documentation API (Swagger): http://localhost:8000/docs
- Documentation API (ReDoc): http://localhost:8000/redoc
- Prometheus (Monitoring): http://localhost:9090
- Grafana (Tableaux de bord): http://localhost:3001 (admin/admin123)
📁 Structure du Projet
dockezr/
├── backend/ # API FastAPI
│ ├── main.py # Point d'entrée de l'API
│ ├── requirements.txt # Dépendances Python
│ └── Dockerfile # Configuration Docker
│
├── frontend/ # Application Next.js
│ ├── app/ # Pages et composants Next.js 14
│ │ ├── layout.tsx
│ │ ├── page.tsx
│ │ └── globals.css
│ ├── package.json # Dépendances Node.js
│ ├── tsconfig.json # Configuration TypeScript
│ ├── tailwind.config.ts # Configuration Tailwind
│ └── Dockerfile # Configuration Docker
│
├── monitoring/ # Configuration monitoring
│ ├── prometheus.yml # Configuration Prometheus
│ └── grafana/ # Configuration Grafana
│ ├── provisioning/ # Datasources et dashboards
│ └── dashboards/ # Tableaux de bord
│
├── docker-compose.yml # Orchestration des services
├── .dockerignore # Fichiers ignorés par Docker
├── .gitignore # Fichiers ignorés par Git
└── README.md # Ce fichier
🔧 Commandes Utiles
Démarrer les services
docker-compose up -d
Arrêter les services
docker-compose down
ou utilisez le script Windows :
scripts/stop.bat
Voir les logs
# Tous les services
docker-compose logs -f
# Service spécifique
docker-compose logs -f backend
docker-compose logs -f frontend
docker-compose logs -f db
docker-compose logs -f prometheus
docker-compose logs -f grafana
Reconstruire les images
docker-compose up -d --build
Arrêter et supprimer les volumes (⚠️ supprime les données)
docker-compose down -v
Accéder à un conteneur
# Backend
docker exec -it dockezr_backend sh
# Frontend
docker exec -it dockezr_frontend sh
# Base de données
docker exec -it dockezr_db psql -U user -d dockezr
🏛️ Salles Pré-configurées
Le système est livré avec 5 salles de formation :
| Salle | Capacité | Équipements |
|---|---|---|
| Salle Atlas | 30 personnes | Vidéoprojecteur, Tableau blanc, WiFi |
| Salle Horizon | 15 personnes | Écran TV, Tableau blanc, WiFi |
| Salle Innovation | 50 personnes | Vidéoprojecteur, Sono, WiFi, Climatisation |
| Salle Connect | 8 personnes | Écran TV, Visioconférence, WiFi |
| Salle Digital | 20 personnes | 20 postes informatiques, Vidéoprojecteur, WiFi |
🌐 API Endpoints
Routes des Salles
GET /rooms- Liste toutes les sallesGET /rooms/{room_id}- Récupère une salle spécifiquePOST /rooms- Crée une nouvelle salleDELETE /rooms/{room_id}- Supprime une salle
Routes des Réservations
GET /reservations- Liste toutes les réservationsGET /reservations/room/{room_id}- Réservations d'une salle spécifiqueGET /reservations/date/{date}- Réservations pour une date donnéePOST /reservations- Crée une nouvelle réservationDELETE /reservations/{reservation_id}- Annule une réservation
Validation automatique
L'API vérifie automatiquement :
- ✅ La disponibilité de la salle
- ✅ Les conflits d'horaires
- ✅ La cohérence des horaires (début < fin)
- ✅ L'existence de la salle
Documentation interactive
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
🗄️ Base de Données
Configuration
- Host: localhost (ou
dbdepuis les conteneurs) - Port: 5432
- Utilisateur: user
- Mot de passe: password
- Base de données: dockezr
Structure des tables
Table rooms
- id (SERIAL PRIMARY KEY)
- name (VARCHAR UNIQUE)
- capacity (INTEGER)
- equipment (TEXT)
- description (TEXT)
Table reservations
- id (SERIAL PRIMARY KEY)
- room_id (INTEGER FOREIGN KEY)
- user_name (VARCHAR)
- user_email (VARCHAR)
- reservation_date (DATE)
- start_time (TIME)
- end_time (TIME)
- purpose (TEXT)
- created_at (TIMESTAMP)
Connexion à PostgreSQL
docker exec -it dockezr_db psql -U user -d dockezr
🎨 Frontend
L'interface utilise :
- Next.js 14 avec App Router
- TypeScript pour le typage statique
- Tailwind CSS pour le styling moderne et responsive
- Axios pour les requêtes HTTP vers l'API
Fonctionnalités de l'interface
Onglet Planning (par défaut)
- 📊 Grille de planning visuelle (8h-22h)
- 🎨 Code couleur : vert (disponible) / rouge (réservé)
- 📅 Sélecteur de date
- 👤 Affichage du nom de l'utilisateur sur les créneaux
- 📋 Liste détaillée des réservations du jour sélectionné
- 🖱️ Info-bulle au survol des créneaux réservés
Onglet Réservation
- Liste visuelle des salles disponibles avec détails
- Sélection interactive de salle
- Formulaire de réservation complet
- Email optionnel (pas obligatoire)
- ⚡ Vérification en temps réel de la disponibilité
- ✅/❌ Indicateur visuel de disponibilité du créneau
- 🔒 Bouton désactivé automatiquement si créneau occupé
Onglet Mes Réservations
- Affichage de toutes les réservations
- Informations détaillées (salle, date, horaire, objet)
- Possibilité d'annuler une réservation
🔄 Développement
Mode développement avec hot-reload
Les deux services (backend et frontend) sont configurés en mode développement avec rechargement automatique :
- Backend: Uvicorn avec
--reload - Frontend: Next.js avec
npm run dev
Les modifications de code sont automatiquement détectées et appliquées.
Variables d'environnement
Backend
DATABASE_URL: URL de connexion PostgreSQL
Frontend
NEXT_PUBLIC_API_URL: URL de l'API backend
🐛 Dépannage
Les conteneurs ne démarrent pas
# Vérifier les logs
docker-compose logs
# Reconstruire les images
docker-compose up -d --build
La base de données n'est pas prête
Le backend attend que PostgreSQL soit complètement démarré grâce au healthcheck.
Erreurs de connexion à l'API
Vérifiez que :
- Le backend est démarré :
docker-compose ps - L'URL de l'API est correcte dans le frontend
- Le réseau Docker fonctionne :
docker network ls
📝 Personnalisation
Ajouter de nouvelles salles
Via l'API :
curl -X POST http://localhost:8000/rooms \
-H "Content-Type: application/json" \
-d '{
"name": "Salle Formation",
"capacity": 25,
"equipment": "Vidéoprojecteur, WiFi",
"description": "Salle de formation polyvalente"
}'
Ou directement dans la base de données :
INSERT INTO rooms (name, capacity, equipment, description)
VALUES ('Ma Salle', 40, 'Équipements', 'Description');
Modifier les ports
Éditez le fichier docker-compose.yml et changez les mappings de ports :
ports:
- "VOTRE_PORT:PORT_INTERNE"
Ajouter des dépendances
Backend (Python):
- Ajoutez la dépendance dans
backend/requirements.txt - Reconstruisez :
docker-compose up -d --build backend
Frontend (Node.js):
- Ajoutez la dépendance dans
frontend/package.json - Reconstruisez :
docker-compose up -d --build frontend
🎯 Cas d'Usage
Ce système est idéal pour :
- ✅ Centres de formation
- ✅ Espaces de coworking
- ✅ Entreprises avec salles de réunion
- ✅ Universités et écoles
- ✅ Bibliothèques avec salles d'étude
Tests et Qualité
Tests automatisés
- Tests API : Validation des endpoints avec Pytest
- Tests de connectivité : Simulation d'erreurs pour validation
- CI/CD : GitHub Actions avec tests automatiques
- Couverture : Tests de performance et de régression
Exécution des tests
# Tests complets
scripts/test.bat
# Tests de simulation d'erreur
scripts/test-connectivity.bat
🚀 Déploiement en Production
Déploiement sur Serveur Linux
Le projet est configuré pour un déploiement manuel sur serveur Linux avec Docker Compose.
1. Préparation du serveur
# Sur votre serveur Linux
sudo apt update
sudo apt install docker.io docker-compose git curl -y
sudo systemctl start docker
sudo systemctl enable docker
2. Cloner et configurer le projet
# Cloner le repository
git clone https://github.com/votre-username/dockezr.git
cd dockezr
# Copier la configuration de production
cp env.prod.example .env.prod
# Modifier les variables d'environnement
nano .env.prod
3. Déploiement
# Démarrer les services de production
docker-compose -f docker-compose.prod.yml up -d
# Vérifier l'état des services
docker-compose -f docker-compose.prod.yml ps
# Voir les logs
docker-compose -f docker-compose.prod.yml logs -f
Configuration de Production
Variables d'environnement requises dans .env.prod :
# Base de données
POSTGRES_USER=user
POSTGRES_PASSWORD=your-secure-password
POSTGRES_DB=dockezr
DB_PORT=5432
# Services Ports
BACKEND_PORT=8001
FRONTEND_PORT=3000
PROMETHEUS_PORT=9090
GRAFANA_PORT=3001
# Frontend Configuration
NEXT_PUBLIC_API_URL=http://your-domain.com:8001
# Grafana Configuration
GRAFANA_USER=admin
GRAFANA_PASSWORD=your-secure-grafana-password
# Production Settings
NODE_ENV=production
Services de production :
- Frontend : http://your-domain.com:3000
- Backend API : http://your-domain.com:8001
- Prometheus : http://your-domain.com:9090
- Grafana : http://your-domain.com:3001
Sécurité en Production
- Changez tous les mots de passe par défaut
- Configurez HTTPS/SSL avec un reverse proxy
- Utilisez des secrets Docker pour les mots de passe
- Activez l'authentification utilisateur
- Configurez les sauvegardes de la base de données
- Limitez l'accès aux ports de monitoring
Sécurité
⚠️ Important pour la production :
- Changez les identifiants PostgreSQL par défaut
- Utilisez des secrets Docker pour les mots de passe
- Activez l'authentification utilisateur
- Configurez CORS correctement
- Utilisez HTTPS
Versions et Releases
- Version actuelle : v1.0.0
- Changelog : Voir CHANGELOG.md
- Releases : GitHub Releases
- Tags Git : Gestion des versions avec Git tags
Licence
Ce projet est développé pour Expernet - Centre de Formation.
Système de réservation Expernet - Simplifions la gestion des salles !