Files

360 lines
14 KiB
Makefile

# Makefile
.PHONY: help dev prod build logs shell clean migrate test lint format
# Variables
COMPOSE_FILE_DEV := docker-compose.yml
COMPOSE_FILE_PROD := docker-compose.prod.yml
DOCKER_COMPOSE_DEV := docker compose -f $(COMPOSE_FILE_DEV)
DOCKER_COMPOSE_PROD := docker compose -f $(COMPOSE_FILE_PROD)
BACKEND_CONTAINER_DEV := eiro-backend
BACKEND_CONTAINER_PROD := eiro-backend-prod
FRONTEND_CONTAINER_DEV := eiro-frontend
FRONTEND_CONTAINER_PROD := eiro-frontend-prod
POSTGRES_CONTAINER_DEV := eiro-postgres
POSTGRES_CONTAINER_PROD := eiro-postgres-prod
# Colors
CYAN := \033[0;36m
GREEN := \033[0;32m
YELLOW := \033[0;33m
RED := \033[0;31m
NC := \033[0m # No Color
## ============ HELP ============
help:
@echo "$(CYAN)╔════════════════════════════════════════════════════════════╗$(NC)"
@echo "$(CYAN)║ Eiro - Make Commands ║$(NC)"
@echo "$(CYAN)╚════════════════════════════════════════════════════════════╝$(NC)"
@echo ""
@echo "$(GREEN)GENERAL$(NC)"
@echo " $(YELLOW)make help$(NC) - Affiche cette aide"
@echo ""
@echo "$(GREEN)🚀 DEVELOPMENT$(NC)"
@echo " $(YELLOW)make dev-up$(NC) - Démarrer l'env dev"
@echo " $(YELLOW)make dev-down$(NC) - Arrêter l'env dev"
@echo " $(YELLOW)make dev-restart$(NC) - Restart l'env dev"
@echo " $(YELLOW)make dev-build$(NC) - Build l'env dev"
@echo " $(YELLOW)make dev-logs$(NC) - Afficher les logs dev"
@echo " $(YELLOW)make dev-logs-backend$(NC) - Logs du backend seulement"
@echo " $(YELLOW)make dev-logs-frontend$(NC) - Logs du frontend seulement"
@echo " $(YELLOW)make dev-shell-backend$(NC) - Shell Django dans le backend"
@echo " $(YELLOW)make dev-shell-frontend$(NC) - Shell du frontend"
@echo ""
@echo "$(GREEN)🏗️ MIGRATION & DB (Dev)$(NC)"
@echo " $(YELLOW)make dev-migrate$(NC) - Exécuter les migrations"
@echo " $(YELLOW)make dev-makemigrations$(NC) - Créer les migrations"
@echo " $(YELLOW)make dev-createsuperuser$(NC) - Créer un superuser"
@echo " $(YELLOW)make dev-fresh-db$(NC) - Réinitialiser la BD (destructif)"
@echo " $(YELLOW)make dev-dumpdata$(NC) - Faire un dump des données"
@echo " $(YELLOW)make dev-loaddata$(NC) - Charger les données"
@echo " $(YELLOW)make dev-db-backup$(NC) - Backup BD de dev"
@echo ""
@echo "$(GREEN)🧪 TESTING & QUALITY (Dev)$(NC)"
@echo " $(YELLOW)make dev-test$(NC) - Lancer les tests"
@echo " $(YELLOW)make dev-test-backend$(NC) - Tests du backend seulement"
@echo " $(YELLOW)make dev-test-frontend$(NC) - Tests du frontend seulement"
@echo " $(YELLOW)make dev-coverage$(NC) - Coverage report"
@echo " $(YELLOW)make dev-lint$(NC) - Linter le code (pylint, eslint)"
@echo " $(YELLOW)make dev-format$(NC) - Formater le code (black, prettier)"
# @echo ""
# @echo "$(GREEN)🔒 PRODUCTION$(NC)"
# @echo " $(YELLOW)make prod-build$(NC) - Construire les images prod"
# @echo " $(YELLOW)make prod-up$(NC) - Démarrer l'env prod"
# @echo " $(YELLOW)make prod-down$(NC) - Arrêter l'env prod"
# @echo " $(YELLOW)make prod-logs$(NC) - Afficher les logs prod"
# @echo " $(YELLOW)make prod-migrate$(NC) - Migrations en production"
# @echo " $(YELLOW)make prod-backup$(NC) - Backup la BD prod"
# @echo " $(YELLOW)make prod-restore$(NC) - Restore depuis un backup"
@echo ""
@echo "$(GREEN)🐳 DOCKER$(NC)"
@echo " $(YELLOW)make docker-clean$(NC) - Nettoyer images/volumes/containers inutilisés"
@echo " $(YELLOW)make docker-prune$(NC) - Prune agressif (attention!)"
# @echo ""
# @echo "$(GREEN)📦 BUILD$(NC)"
# @echo " $(YELLOW)make build-backend$(NC) - Builder le backend"
# @echo " $(YELLOW)make build-frontend$(NC) - Builder le frontend"
# @echo " $(YELLOW)make build-all$(NC) - Builder tout"
# @echo ""
# @echo "$(GREEN)🚀 DEPLOYMENT$(NC)"
# @echo " $(YELLOW)make deploy-staging$(NC) - Déployer en staging"
# @echo " $(YELLOW)make deploy-prod$(NC) - Déployer en production"
# @echo " $(YELLOW)make deploy-rollback$(NC) - Rollback version précédente"
@echo ""
## ============ DEVELOPMENT ============
dev-up:
@echo "$(GREEN)▶ Démarrage de l'environnement de développement...$(NC)"
$(DOCKER_COMPOSE_DEV) up -d
@echo "$(GREEN)✓ Environnement démarré$(NC)"
@echo " Backend: http://localhost:8000"
@echo " Frontend: http://localhost:3000"
@echo " API: http://localhost:8000/api/v1/"
@echo " Admin: http://localhost:8000/admin"
dev-down:
@echo "$(GREEN)▶ Arrêt de l'environnement de développement...$(NC)"
$(DOCKER_COMPOSE_DEV) down
@echo "$(GREEN)✓ Environnement arrêté$(NC)"
dev-restart:
$(DOCKER_COMPOSE_DEV) down && $(DOCKER_COMPOSE_DEV) up --build
@echo "$(GREEN)✓ Environnement redémarré$(NC)"
dev-build:
$(DOCKER_COMPOSE_DEV) up --build -d
@echo "$(GREEN)✓ Environnement buildé$(NC)"
dev-logs:
$(DOCKER_COMPOSE_DEV) logs -f
dev-logs-backend:
$(DOCKER_COMPOSE_DEV) logs -f $(BACKEND_CONTAINER_DEV)
dev-logs-frontend:
$(DOCKER_COMPOSE_DEV) logs -f $(FRONTEND_CONTAINER_DEV)
dev-logs-postgres:
$(DOCKER_COMPOSE_DEV) logs -f $(POSTGRES_CONTAINER_DEV)
dev-shell-backend:
@echo "$(CYAN)Ouverture d'un shell Django...$(NC)"
$(DOCKER_COMPOSE_DEV) exec $(BACKEND_CONTAINER_DEV) python manage.py shell
dev-shell-frontend:
@echo "$(CYAN)Ouverture d'un shell dans le frontend...$(NC)"
$(DOCKER_COMPOSE_DEV) exec $(FRONTEND_CONTAINER_DEV) sh
dev-bash-backend:
$(DOCKER_COMPOSE_DEV) exec $(BACKEND_CONTAINER_DEV) bash
dev-bash-frontend:
$(DOCKER_COMPOSE_DEV) exec $(FRONTEND_CONTAINER_DEV) bash
## ============ DATABASE & MIGRATIONS (DEV) ============
dev-migrate:
@echo "$(GREEN)▶ Exécution des migrations...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py migrate
@echo "$(GREEN)✓ Migrations complétées$(NC)"
dev-makemigrations:
@echo "$(GREEN)▶ Création des migrations...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py makemigrations
@echo "$(GREEN)✓ Migrations créées$(NC)"
dev-createsuperuser:
@echo "$(GREEN)▶ Création d'un superuser...$(NC)"
$(DOCKER_COMPOSE_DEV) exec $(BACKEND_CONTAINER_DEV) python manage.py createsuperuser
dev-fresh-db:
@echo "$(RED)⚠ ATTENTION: Cela va SUPPRIMER toute la BD!$(NC)"
@read -p "Êtes-vous sûr? (y/N) " -n 1 -r; \
echo; \
if [[ $$REPLY =~ ^[Yy]$$ ]]; then \
echo "$(GREEN)▶ Suppression et recréation de la BD...$(NC)"; \
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py flush --noinput; \
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py migrate; \
echo "$(GREEN)✓ BD réinitialisée$(NC)"; \
else \
echo "$(YELLOW)Annulé$(NC)"; \
fi
dev-dumpdata:
@echo "$(GREEN)▶ Création du dump...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py dumpdata database/initial_data.json
@echo "$(GREEN)✓ Dump créé$(NC)"
dev-loaddata:
@echo "$(GREEN)▶ Chargement des données initiales...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py loaddata database/initial_data.json
@echo "$(GREEN)✓ BD chargée$(NC)"
dev-db-backup:
@echo "$(GREEN)▶ Backup de la BD de dev...$(NC)"
@mkdir -p ./backups
$(DOCKER_COMPOSE_DEV) exec -T $(POSTGRES_CONTAINER_DEV) pg_dump -U eiro eiro > ./backups/dev-backup-$$(date +%Y%m%d-%H%M%S).sql
@echo "$(GREEN)✓ Backup créé$(NC)"
## ============ TESTING & QUALITY (DEV) ============
dev-test:
@echo "$(GREEN)▶ Lancement des tests...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py test --verbosity=2
$(DOCKER_COMPOSE_DEV) exec -T $(FRONTEND_CONTAINER_DEV) npm test
@echo "$(GREEN)✓ Tests complétés$(NC)"
dev-test-backend:
@echo "$(GREEN)▶ Tests du backend...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) python manage.py test --verbosity=2
@echo "$(GREEN)✓ Tests du backend complétés$(NC)"
dev-test-frontend:
@echo "$(GREEN)▶ Tests du frontend...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(FRONTEND_CONTAINER_DEV) npm test
@echo "$(GREEN)✓ Tests du frontend complétés$(NC)"
dev-coverage:
@echo "$(GREEN)▶ Calcul du coverage...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) coverage run --source='.' manage.py test
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) coverage report
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) coverage html
@echo "$(GREEN)✓ Rapport coverage généré (htmlcov/index.html)$(NC)"
dev-lint:
@echo "$(GREEN)▶ Linting du code...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) pylint backend/
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) flake8 backend/
$(DOCKER_COMPOSE_DEV) exec -T $(FRONTEND_CONTAINER_DEV) npm run lint
@echo "$(GREEN)✓ Linting complété$(NC)"
dev-format:
@echo "$(GREEN)▶ Formatage du code...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) black .
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) isort .
$(DOCKER_COMPOSE_DEV) exec -T $(FRONTEND_CONTAINER_DEV) npm run format
@echo "$(GREEN)✓ Formatage complété$(NC)"
dev-mypy:
@echo "$(GREEN)▶ Type checking avec mypy...$(NC)"
$(DOCKER_COMPOSE_DEV) exec -T $(BACKEND_CONTAINER_DEV) mypy .
@echo "$(GREEN)✓ Type checking complété$(NC)"
## ============ PRODUCTION ============
prod-build:
@echo "$(GREEN)▶ Construction des images production...$(NC)"
docker-compose -f $(COMPOSE_FILE_PROD) build --no-cache
@echo "$(GREEN)✓ Images construites$(NC)"
prod-up:
@echo "$(GREEN)▶ Démarrage de la production...$(NC)"
docker-compose -f $(COMPOSE_FILE_PROD) up -d
@echo "$(GREEN)✓ Production démarrée$(NC)"
@echo " App: https://$$(grep APP_DOMAIN .env.prod | cut -d'=' -f2)"
prod-down:
@echo "$(GREEN)▶ Arrêt de la production...$(NC)"
docker-compose -f $(COMPOSE_FILE_PROD) down
@echo "$(GREEN)✓ Production arrêtée$(NC)"
prod-restart: prod-down prod-up
@echo "$(GREEN)✓ Production redémarrée$(NC)"
prod-logs:
docker-compose -f $(COMPOSE_FILE_PROD) logs -f --tail=100
prod-logs-backend:
docker-compose -f $(COMPOSE_FILE_PROD) logs -f $(BACKEND_CONTAINER_PROD)
prod-logs-traefik:
docker-compose -f $(COMPOSE_FILE_PROD) logs -f traefik
prod-migrate:
@echo "$(GREEN)▶ Migrations en production...$(NC)"
docker-compose -f $(COMPOSE_FILE_PROD) exec -T $(BACKEND_CONTAINER_PROD) python manage.py migrate
@echo "$(GREEN)✓ Migrations complétées$(NC)"
prod-backup:
@echo "$(GREEN)▶ Backup de la BD production...$(NC)"
@mkdir -p ./backups
docker-compose -f $(COMPOSE_FILE_PROD) exec -T $(POSTGRES_CONTAINER_PROD) pg_dump -U $$(grep DB_USER .env.prod | cut -d'=' -f2) $$(grep DB_NAME .env.prod | cut -d'=' -f2) > ./backups/prod-backup-$$(date +%Y%m%d-%H%M%S).sql
@echo "$(GREEN)✓ Backup créé: ./backups/prod-backup-*.sql$(NC)"
prod-restore:
@echo "$(YELLOW)Fichiers de backup disponibles:$(NC)"
@ls -lh ./backups/prod-backup-*.sql 2>/dev/null || echo " Aucun backup trouvé"
@read -p "Entrer le chemin du fichier (ou laisser vide pour annuler): " backup_file; \
if [ -n "$$backup_file" ] && [ -f "$$backup_file" ]; then \
echo "$(RED)⚠ ATTENTION: Cela va RESTAURER une ancienne BD!$(NC)"; \
read -p "Êtes-vous sûr? (y/N) " -n 1 -r; \
echo; \
if [[ $$REPLY =~ ^[Yy]$$ ]]; then \
echo "$(GREEN)▶ Restore en cours...$(NC)"; \
docker-compose -f $(COMPOSE_FILE_PROD) exec -T $(POSTGRES_CONTAINER_PROD) psql -U $$(grep DB_USER .env.prod | cut -d'=' -f2) $$(grep DB_NAME .env.prod | cut -d'=' -f2) < $$backup_file; \
echo "$(GREEN)✓ Restore complété$(NC)"; \
else \
echo "$(YELLOW)Annulé$(NC)"; \
fi; \
else \
echo "$(YELLOW)Fichier invalide ou annulé$(NC)"; \
fi
prod-shell-backend:
docker-compose -f $(COMPOSE_FILE_PROD) exec $(BACKEND_CONTAINER_PROD) bash
## ============ BUILD ============
build-backend:
@echo "$(GREEN)▶ Construction du backend...$(NC)"
docker build -t eiro-backend:latest -f backend.Dockerfile ./backend
@echo "$(GREEN)✓ Backend construit$(NC)"
build-frontend:
@echo "$(GREEN)▶ Construction du frontend...$(NC)"
docker build -t eiro-frontend:latest -f frontend.Dockerfile ./frontend
@echo "$(GREEN)✓ Frontend construit$(NC)"
build-all: build-backend build-frontend
@echo "$(GREEN)✓ Tous les services construits$(NC)"
## ============ DOCKER CLEANUP ============
docker-clean:
@echo "$(GREEN)▶ Nettoyage Docker...$(NC)"
docker system prune -f
@echo "$(GREEN)✓ Nettoyage complété$(NC)"
docker-clean-volumes:
@echo "$(RED)⚠ Attention: Cela va supprimer les volumes!$(NC)"
@read -p "Êtes-vous sûr? (y/N) " -r REPLY; \
echo; \
if [ "$$REPLY" = "Y" ] || [ "$$REPLY" = "y" ]; then \
docker system prune -f --volumes; \
echo "$(GREEN)✓ Volumes supprimés$(NC)"; \
else \
echo "$(YELLOW)Annulé$(NC)"; \
fi
docker-prune:
@echo "$(RED)⚠ Prune AGRESSIF - Cela va supprimer beaucoup de choses!$(NC)"
@read -p "Êtes-vous sûr? (y/N) " -r REPLY; \
echo; \
if [ "$$REPLY" = "Y" ] || [ "$$REPLY" = "y" ]; then \
docker system prune -a -f --volumes; \
echo "$(GREEN)✓ Prune complété$(NC)"; \
else \
echo "$(YELLOW)Annulé$(NC)"; \
fi
## ============ UTILS ============
status:
@echo "$(CYAN)╔════════════════════════════════════════════════════════════╗$(NC)"
@echo "$(CYAN)║ Eiro - Status Services ║$(NC)"
@echo "$(CYAN)╚════════════════════════════════════════════════════════════╝$(NC)"
@echo ""
@echo "$(GREEN)Development:$(NC)"
@$(DOCKER_COMPOSE_DEV) ps
@echo ""
version:
@echo "Eiro v1.0.0"
@echo "Docker: $$(docker --version)"
@echo "Docker Compose: $$(docker-compose --version)"
## ============ SHORTCUTS ============
up: dev-up
down: dev-down
restart: dev-restart
build: dev-build
logs: dev-logs
test: dev-test
migrate: dev-migrate
fresh: dev-fresh-db
lint: dev-lint
format: dev-format
shell: dev-shell-backend