# 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. [![Release](https://img.shields.io/badge/release-v1.0.0-blue.svg)](https://github.com/SarTron-NorthBlue/dockezr/releases/tag/v1.0.0) [![Tests](https://github.com/SarTron-NorthBlue/dockezr/workflows/Tests%20API%20-%20TP4/badge.svg)](https://github.com/SarTron-NorthBlue/dockezr/actions) [![Docker](https://img.shields.io/badge/docker-compose-blue.svg)](https://docs.docker.com/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 1. **Cloner le projet** (si applicable) ```bash git clone cd dockezr ``` 2. **Lancer tous les services avec Docker Compose** ```bash docker-compose up -d ``` ou utilisez le script Windows : ```bash 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 3. **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 ```bash docker-compose up -d ``` ### Arrêter les services ```bash docker-compose down ``` ou utilisez le script Windows : ```bash scripts/stop.bat ``` ### Voir les logs ```bash # 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 ```bash docker-compose up -d --build ``` ### Arrêter et supprimer les volumes (⚠️ supprime les données) ```bash docker-compose down -v ``` ### Accéder à un conteneur ```bash # 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 salles - `GET /rooms/{room_id}` - Récupère une salle spécifique - `POST /rooms` - Crée une nouvelle salle - `DELETE /rooms/{room_id}` - Supprime une salle ### Routes des Réservations - `GET /reservations` - Liste toutes les réservations - `GET /reservations/room/{room_id}` - Réservations d'une salle spécifique - `GET /reservations/date/{date}` - Réservations pour une date donnée - `POST /reservations` - Crée une nouvelle réservation - `DELETE /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 `db` depuis 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 ```bash 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 ```bash # 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 : ```bash 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 : ```sql 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 : ```yaml ports: - "VOTRE_PORT:PORT_INTERNE" ``` ### Ajouter des dépendances **Backend (Python)**: 1. Ajoutez la dépendance dans `backend/requirements.txt` 2. Reconstruisez : `docker-compose up -d --build backend` **Frontend (Node.js)**: 1. Ajoutez la dépendance dans `frontend/package.json` 2. 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 ```bash # 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** ```bash # 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** ```bash # 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** ```bash # 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` : ```bash # 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 1. **Changez tous les mots de passe par défaut** 2. **Configurez HTTPS/SSL** avec un reverse proxy 3. **Utilisez des secrets Docker** pour les mots de passe 4. **Activez l'authentification** utilisateur 5. **Configurez les sauvegardes** de la base de données 6. **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](CHANGELOG.md) - **Releases** : [GitHub Releases](https://github.com/SarTron-NorthBlue/dockezr/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 !**