API REST performante en Go avec MongoDB et scraper de recettes parallèle pour le restaurant Hótwings
Une solution complète développée pour le restaurant Hótwings afin d'étendre son activité avec un service de livraison. L'API propose une carte étendue de recettes scrapées depuis AllRecipes.com avec un système de scraping parallèle optimisé utilisant des goroutines.
- 🎯 Aperçu du projet
- 🛠️ Technologies utilisées
- ✨ Fonctionnalités
- 🏗️ Architecture
- 🚀 Démarrage rapide
- 📚 Documentation API
- 🔧 Configuration
- 🧪 Tests
- 🐳 Docker
- ⚡ Performance
- 📊 Monitoring
- 🔄 CI/CD
- 🤝 Contribution
- 📄 Licence
Le restaurant Hótwings souhaite développer son activité avec un service de livraison en proposant une carte très étendue de plats et recettes. Pour plaire à tous les goûts, l'API permet de proposer une large variété de recettes scrapées depuis AllRecipes.com.
- ✅ API REST complète avec Fiber framework
- ✅ Base de données MongoDB avec Docker
- ✅ Scraper performant avec goroutines parallèles
- ✅ Tests complets avec couverture de code
- ✅ CI/CD automatisé avec GitHub Actions
- ✅ Containerisation Docker complète
- ✅ Cross-platform binaires pour Linux, Windows, macOS
- Go (Golang) 1.22+ - Langage de programmation principal
- Bash - Scripts d'automatisation et de déploiement
- Fiber v2 (
github.com/gofiber/fiber/v2) - Framework web HTTP rapide et Express-like - Colly (
github.com/gocolly/colly) - Framework de web scraping/scraping - MongoDB Driver (
go.mongodb.org/mongo-driver) - Driver officiel MongoDB pour Go - godotenv (
github.com/joho/godotenv) - Gestion des variables d'environnement depuis.env - testify (
github.com/stretchr/testify) - Framework de tests avec assertions
- MongoDB 7.0 - Base de données NoSQL principale
- Mongo Express - Interface web pour la gestion de MongoDB
- Docker - Containerisation des services
- Docker Compose - Orchestration multi-conteneurs
- Dockerfile - Images personnalisées pour API et scraper
- GitHub Actions - Pipeline CI/CD automatisé
- SSH - Déploiement automatisé sur VPS
- Git - Contrôle de version
- Make - Automatisation des tâches de build et de test
- Go Modules - Gestion des dépendances
- Bash Scripts - Scripts d'automatisation (
build.sh,test_metrics.sh, etc.)
- JSON - Format d'échange de données
- REST API - Architecture API RESTful
- HTTP/HTTPS - Protocoles de communication
- VPS (Virtual Private Server) - Serveur de production
- Linux - Système d'exploitation serveur
- Port 8082 - Port par défaut de l'API
- Port 27017/27018 - Port MongoDB
- Port 8081 - Port Mongo Express
- Goroutines - Concurrence et parallélisme en Go
- Channels - Communication entre goroutines
- Sync (WaitGroups, Mutexes) - Synchronisation des goroutines
- Web Scraping - Collecte automatisée de données web
- Anti-bot Measures - Techniques anti-détection (User-Agent rotation, headers réalistes, délais aléatoires)
- Structured Logging - Système de logs structurés
- Health Checks - Monitoring de l'état des services
- Metrics - Collecte de métriques de performance
- CORS - Cross-Origin Resource Sharing
- Recovery - Gestion des panics
- Logger - Middleware de logging HTTP
- Environment Variables - Configuration via variables d'environnement
- Health Endpoints (
/health,/version,/metrics) - Structured Logs - Logs JSON structurés
- Performance Metrics - Métriques de performance en temps réel
- Lister les recettes - Récupération de toutes les recettes avec pagination
- Détail d'une recette - Informations complètes : ingrédients, instructions, image
- Recherche avancée - Par nom de recette ou ingrédient
- Import JSON - Importation de recettes depuis fichier JSON
- Scraper automatique - Récupération automatique depuis AllRecipes.com
- Gestion des erreurs - Système robuste de gestion d'erreurs
- Health checks - Endpoints de santé de l'application
- Métriques - Monitoring en temps réel
- Logs structurés - Système de logging avancé
- Swagger - Documentation API interactive
graph TB
subgraph "Client Layer"
WEB[Web Client]
API_CLIENT[API Client]
end
subgraph "API Layer"
FIBER[Fiber Server<br/>Port 8080]
MIDDLEWARE[CORS, Logging, Recovery]
ROUTES[Recipe Routes]
end
subgraph "Business Layer"
CONTROLLERS[Controllers]
MODELS[Data Models]
RESPONSES[API Responses]
end
subgraph "Data Layer"
MONGODB[(MongoDB<br/>Port 27017)]
SCRAPER_DATA[JSON Files]
end
subgraph "Scraper Layer"
SCRAPER[Go Scraper<br/>Colly Framework]
WORKERS[Goroutines<br/>Parallel Processing]
ALLRECIPES[AllRecipes.com]
end
subgraph "Infrastructure"
DOCKER[Docker Compose]
MONGO_EXPRESS[Mongo Express<br/>Port 8081]
LOGS[Structured Logs]
end
WEB --> FIBER
API_CLIENT --> FIBER
FIBER --> MIDDLEWARE
MIDDLEWARE --> ROUTES
ROUTES --> CONTROLLERS
CONTROLLERS --> MODELS
MODELS --> MONGODB
CONTROLLERS --> RESPONSES
SCRAPER --> WORKERS
WORKERS --> ALLRECIPES
SCRAPER --> SCRAPER_DATA
SCRAPER_DATA --> CONTROLLERS
MONGODB --> MONGO_EXPRESS
FIBER --> LOGS
DOCKER --> FIBER
DOCKER --> MONGODB
DOCKER --> SCRAPER
go_api_mongo_scrapper/
├── 📁 api-server/ # Serveur API principal
├── 📁 controllers/ # Contrôleurs API
├── 📁 database/ # Configuration MongoDB
├── 📁 docs/ # Documentation complète
├── 📁 logger/ # Système de logging
├── 📁 middleware/ # Middlewares Fiber
├── 📁 models/ # Modèles de données
├── 📁 responses/ # Réponses API standardisées
├── 📁 routes/ # Définition des routes
├── 📁 scraper/ # Module de scraping
│ ├── scraper.go # Code principal du scraper
│ ├── scraper_test.go # Tests unitaires
│ └── README_TESTS.md # Documentation des tests
├── 📁 scripts/ # Scripts de build et déploiement
├── 📄 docker-compose.yml # Configuration Docker
├── 📄 dockerfile # Image Docker API
├── 📄 Makefile # Commandes de développement
└── 📄 main.go # Point d'entrée de l'API
- Go 1.22+
- Docker & Docker Compose
- Make (optionnel mais recommandé)
- Git
# 1. Cloner le repository
git clone https://github.com/le-veilleur/go_api_mongo_scrapper.git
cd go_api_mongo_scrapper
# 2. Démarrer l'infrastructure
docker-compose up -d
# 3. Lancer l'API
go run main.go# Vérifier que l'API fonctionne
curl http://localhost:8080/health
# Vérifier les informations de version
curl http://localhost:8080/version
# Accéder à l'interface MongoDB
# http://localhost:8081 (admin/admin123)| Méthode | Endpoint | Description |
|---|---|---|
GET |
/health |
État de santé de l'API |
GET |
/version |
Informations de version |
GET |
/metrics |
Métriques de l'application |
GET |
/recipes |
Liste des recettes |
POST |
/recipes |
Créer une recette |
GET |
/recipes/:id |
Récupérer une recette |
PUT |
/recipes/:id |
Modifier une recette |
DELETE |
/recipes/:id |
Supprimer une recette |
curl -X GET "http://localhost:8080/recipes" \
-H "Content-Type: application/json"Réponse :
{
"success": true,
"data": [
{
"id": "507f1f77bcf86cd799439011",
"name": "Chocolate Chip Cookies",
"image": "https://example.com/cookies.jpg",
"ingredients": [
{
"quantity": "2",
"unit": "cups",
"name": "flour"
}
],
"instructions": [
{
"step": 1,
"description": "Preheat oven to 375°F"
}
],
"created_at": "2024-01-15T10:30:00Z"
}
],
"pagination": {
"page": 1,
"limit": 10,
"total": 150
}
}curl -X POST "http://localhost:8080/recipes" \
-H "Content-Type: application/json" \
-d '{
"name": "Pasta Carbonara",
"image": "https://example.com/carbonara.jpg",
"ingredients": [
{
"quantity": "500",
"unit": "g",
"name": "pasta"
}
],
"instructions": [
{
"step": 1,
"description": "Boil water and cook pasta"
}
]
}'# Recherche par nom
curl -X GET "http://localhost:8080/recipes?search=pasta"
# Recherche par ingrédient
curl -X GET "http://localhost:8080/recipes?ingredient=tomato"curl http://localhost:8080/healthRéponse :
{
"status": "ok",
"timestamp": "2024-01-15T10:30:00Z",
"build": {
"version": "1.0.0",
"git_commit": "abc1234",
"build_time": "2024-01-15T10:00:00Z",
"go_version": "go1.22.0",
"os": "linux",
"arch": "amd64"
},
"database": "connected"
}| Variable | Description | Valeur par défaut |
|---|---|---|
PORT |
Port du serveur API | 8080 |
MONGODB_URI |
URI de connexion MongoDB | mongodb://admin:password123@localhost:27017/recipes?authSource=admin |
DB_NAME |
Nom de la base de données | recipes |
LOG_LEVEL |
Niveau de logging | info |
ENV |
Environnement | development |
Le fichier docker-compose.yml configure :
- MongoDB : Base de données principale
- API Server : Serveur Go avec Fiber
- Mongo Express : Interface web MongoDB (optionnel)
- Scraper : Service de scraping (optionnel)
| Variable | Description | Valeur par défaut |
|---|---|---|
SCRAPER_MAX_WORKERS |
Nombre de workers parallèles | 12 (adaptatif) |
SCRAPER_TIMEOUT |
Timeout des requêtes | 30s |
SCRAPER_BASE_URL |
URL de base à scraper | https://www.allrecipes.com |
SCRAPER_MAX_PAGES |
Nombre maximum de pages | 5 |
SCRAPER_MAX_RECIPES_PER_PAGE |
Recettes par page | 20 |
# Tests unitaires
make test
# Tests avec race detection
make test-verbose
# Rapport de couverture HTML
make test-coverage
# Benchmarks de performance
make benchmarkLe projet maintient une couverture de tests de 22.6% avec :
- ✅ 12 tests unitaires complets
- ✅ 2 benchmarks de performance
- ✅ Tests de concurrence avec race detection
- ✅ Tests de validation des modèles
- ✅ Tests d'intégration API
# Générer le rapport HTML
make test-coverage
# Ouvrir le rapport
open scraper/coverage.html# Dernière version
docker pull ghcr.io/maxime-louis14/go_api_mongo_scrapper:latest
# Version spécifique
docker pull ghcr.io/maxime-louis14/go_api_mongo_scrapper:v1.0.0# Démarrer l'application complète
docker-compose up -d
# Démarrer avec le scraper
docker-compose --profile scraper up -d
# Démarrer avec MongoDB Express
docker-compose --profile tools up -d
# Voir les logs
docker-compose logs -f
# Arrêter les services
docker-compose down# Build de l'API
make docker-build-api
# Build du scraper
make docker-build-scraper
# Build complet
make docker-build- Parallélisme : 12 workers adaptatifs (6 cœurs × 2)
- Vitesse : 650 recettes en 21.4 secondes (~30 recettes/seconde)
- Mémoire : Optimisé avec channels et sync.Pool
- Robustesse : Gestion d'erreurs et timeouts configurables
- Framework : Fiber (Express-like pour Go)
- Base de données : MongoDB avec indexation optimisée
- Middleware : CORS, logging, compression, recovery
- Performance : ~10k req/s en conditions optimales
- Latence : < 50ms pour les requêtes simples
# Exécuter les benchmarks
make benchmarkRésultats réels (dernière exécution) :
📊 STATISTIQUES DÉTAILLÉES DU SCRAPER
⏱️ Durée totale: 21.46s
🚀 Requêtes par seconde: 30.29
📝 Recettes par seconde: 29.83
🌐 Total requêtes: 650
📝 Recettes trouvées: 640
✅ Taux de succès: 100.0%
💻 Workers: 12 (6 cœurs × 2 ratio adaptatif)
Benchmarks de code :
BenchmarkScraper-8 100 12345678 ns/op 4567890 B/op 12345 allocs/op
BenchmarkAPI-8 1000 1234567 ns/op 123456 B/op 1234 allocs/op
- Health check :
/health- État de l'application - Version :
/version- Informations de build - Métriques :
/metrics- Métriques détaillées JSON
Le système de logging inclut :
- Niveaux : DEBUG, INFO, WARN, ERROR
- Format : JSON structuré
- Rotation : Logs rotatifs automatiques
- Métriques : Temps de réponse, erreurs, throughput
# Vérifier l'état de l'application
make health-check
# Vérifier les informations de version
make version-check
# Voir les logs en temps réel
make logsLe projet utilise 3 workflows principaux :
- Déclencheurs : Push/PR sur
mainetdevelop - Tests : Tests unitaires avec race detection
- Code Quality : Formatage, linting, analyse statique
- Security : Scan de sécurité avec Gosec
- Build : Compilation cross-platform
- Staging : Déploiement automatique sur push vers
main - Production : Déploiement sur tags
v* - Rollback : Rollback automatique en cas d'échec
- Binaires : Multi-plateformes (Linux, Windows, macOS)
- Docker : Images multi-architecture
- Assets : Changelog automatique et assets GitHub
# Pipeline CI local
make ci
# Pipeline CI complet avec couverture
make ci-full
# Créer une release
make release VERSION=v1.0.0- Fork le projet
- Créer une branche feature (
git checkout -b feature/AmazingFeature) - Développer et tester (
make test && make ci) - Commit les changements (
git commit -m 'Add some AmazingFeature') - Push vers la branche (
git push origin feature/AmazingFeature) - Ouvrir une Pull Request
- Formatage :
gofmtobligatoire - Linting :
golangci-lintsans erreurs - Tests : Couverture minimale de 80%
- Documentation : Commentaires Go standard
- Commits : Messages en français
# Installation des dépendances
make deps
# Formatage du code
make fmt
# Analyse statique
make vet
# Linting
make lint
# Tests complets
make test-coverage
# Nettoyage
make cleanCe projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails.
- Issues : GitHub Issues
- Discussions : GitHub Discussions
- Documentation : docs/
- Authentification JWT - Système d'authentification sécurisé
- Rate limiting - Protection contre les abus
- Cache Redis - Amélioration des performances
- Métriques Prometheus - Monitoring avancé
- Dashboard Grafana - Interface de monitoring
- Tests E2E - Tests d'intégration complets
- Déploiement Kubernetes - Orchestration container
- API GraphQL - Alternative à REST
- Microservices - Architecture distribuée
- Event Sourcing - Historique des événements
- Machine Learning - Recommandations intelligentes
- Multi-tenant - Support multi-restaurants
Projet développé dans le cadre de la formation NWS (Next Web School)
Ce projet répond aux consignes spécifiques du restaurant Hótwings pour développer son activité de livraison avec une API permettant de proposer une carte étendue de recettes scrapées depuis AllRecipes.com.
✅ API REST complète avec endpoints CRUD
✅ Base de données MongoDB (NoSQL)
✅ Scraper performant avec goroutines parallèles
✅ Swagger intégré pour la documentation
✅ Import JSON des données scrapées
✅ Tests complets avec couverture de code
✅ Docker pour la containerisation
✅ CI/CD automatisé avec GitHub Actions
Développé avec ❤️ par Maxime Louis