# Makefile racine — Fail2banActionBanishment # NB : les lignes de recette Make DOIVENT être indentées par une tabulation # (contrainte de l'outil Make lui-même, seule exception à la règle "4 espaces" # du projet, cf. ROADMAP.md Phase 0). .PHONY: install uninstall status test lint docs docs-serve run worker mqtt master-client master-listen deploy join-token join dump-db install-master install-mariadb install-nginx install-supervisor uninstall-supervisor help EMITTER_DIR := emitter EMITTER_VENV := $(EMITTER_DIR)/.venv EMITTER_PYTHON := $(EMITTER_VENV)/bin/python # Crée le venv de l'émetteur et installe ses dépendances s'il n'existe pas # encore (évite le "pas de virtual env" quand run/worker/test/mqtt sont # lancés sans avoir suivi la procédure manuelle du README). $(EMITTER_VENV)/bin/activate: $(EMITTER_DIR)/requirements.txt python3 -m venv $(EMITTER_VENV) $(EMITTER_PYTHON) -m pip install --quiet --upgrade pip $(EMITTER_PYTHON) -m pip install --quiet -r $(EMITTER_DIR)/requirements.txt touch $(EMITTER_VENV)/bin/activate help: ## Affiche cette aide @grep -E '^[a-zA-Z_-]+:.*## ' $(MAKEFILE_LIST) | sed 's/:.*## /\t/' install: ## Déploie le noeud (paquets, configuration, services) — nécessite root sudo ./install.sh install uninstall: ## Arrête et désactive les services installés (ne supprime pas les fichiers déployés) sudo systemctl disable --now fail2ban.service firewall.service mosquitto.service status: ## Vérifie l'état des services (firewall, fail2ban, mosquitto) sudo ./install.sh status test: $(EMITTER_VENV)/bin/activate ## Vérifie les filtres fail2ban custom + tests Django (émetteur) ./scripts/test-fail2ban-filters.sh $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py test lint: $(EMITTER_VENV)/bin/activate ## Vérifie le typage Python (pyright) et la syntaxe des scripts shell (shellcheck) — nécessite pyright/shellcheck sur le PATH (voir README) $(EMITTER_PYTHON) -m pip install --quiet -r $(EMITTER_DIR)/requirements-dev.txt pyright shellcheck install.sh scripts/*.sh generic/firewall/firewall-launcher.sh docs: $(EMITTER_VENV)/bin/activate ## Génère le site de documentation mkdocs dans site/ (fr/en) — prévisualiser avec 'make docs-serve' $(EMITTER_PYTHON) -m pip install --quiet -r requirements-docs.txt $(EMITTER_PYTHON) -m mkdocs build docs-serve: $(EMITTER_VENV)/bin/activate ## Sert la documentation en local avec rechargement à chaud (http://127.0.0.1:8001/) $(EMITTER_PYTHON) -m pip install --quiet -r requirements-docs.txt $(EMITTER_PYTHON) -m mkdocs serve -a 127.0.0.1:8001 run: $(EMITTER_VENV)/bin/activate ## Lance l'émetteur Django en mode développement (dev server ; MQTT/Celery à lancer à part, voir make mqtt/worker) $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py migrate $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py runserver mqtt: $(EMITTER_VENV)/bin/activate ## Lance l'ingestion MQTT de l'émetteur (manage.py mqtt_listen) $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py mqtt_listen worker: $(EMITTER_VENV)/bin/activate ## Lance le worker Celery (géolocalisation asynchrone des IP bannies) cd $(EMITTER_DIR) && .venv/bin/celery -A config worker -l info master-client: $(EMITTER_VENV)/bin/activate ## Lance le relais vers le broker master (Phase 2.b, mTLS — voir MQTT_MASTER_* dans .env) $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py master_client master-listen: $(EMITTER_VENV)/bin/activate ## Lance l'ingestion côté master (Phase 3, tous les noeuds — cert master-internal) $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py master_listen deploy: install ## Alias de production pour install, sur le VPS cible join-token: $(EMITTER_VENV)/bin/activate ## Émet un jeton d'auto-inscription pour un nouveau noeud (MASTER uniquement) — usage: make join-token NODE= [TTL=] @if [ -z "$(NODE)" ]; then echo "Usage: make join-token NODE= [TTL=]" >&2; exit 1; fi $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py create_join_token $(NODE) $(if $(TTL),--ttl-minutes $(TTL)) join: ## Auto-inscrit CE noeud auprès du master, avec le jeton reçu via 'make join-token' côté master — usage: make join MASTER= NODE= TOKEN= — nécessite root @if [ -z "$(MASTER)" ] || [ -z "$(NODE)" ] || [ -z "$(TOKEN)" ]; then \ echo "Usage: make join MASTER= NODE= TOKEN=" >&2; exit 1; \ fi sudo ./install.sh join --master $(MASTER) --node $(NODE) --token $(TOKEN) dump-db: $(EMITTER_VENV)/bin/activate ## Dump JSON portable de la base (Django dumpdata) en vue d'un portage vers mariadb/postgresql — recharger ensuite avec manage.py loaddata après bascule DB_ENGINE $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py dumpdata --natural-foreign --natural-primary \ -e contenttypes -e auth.permission -e sessions \ -o $(EMITTER_DIR)/db-dump-$$(date +%Y%m%d-%H%M%S).json @echo "Dump créé dans $(EMITTER_DIR)/. Après bascule DB_ENGINE (make install-mariadb, ou" @echo "DB_ENGINE=postgresql dans .env + migrate), recharger avec :" @echo " $(EMITTER_PYTHON) $(EMITTER_DIR)/manage.py loaddata .json" install-master: ## Déploie le broker master (CA privée, ACL, ingestion multi-noeuds) — opt-in, nécessite root sudo ./install.sh install-master install-mariadb: ## Bascule la base de données de SQLite vers MariaDB (base/utilisateur créés) — opt-in, nécessite root, relancer 'make install' ensuite sudo ./install.sh install-mariadb install-nginx: ## Déploie nginx + certificat Let's Encrypt devant le tableau de bord (voir DASHBOARD_DOMAIN dans .env) — nécessite root sudo ./install.sh install-nginx install-supervisor: ## Bascule les services de l'émetteur de systemd vers supervisor (option, VPS) sudo ./install.sh install-supervisor uninstall-supervisor: ## Revient à systemd (arrête supervisor, réactive les services systemd) sudo ./install.sh uninstall-supervisor