# Homelab Automation Dashboard Une application moderne et professionnelle pour la gestion automatisée d'homelab, avec une interface utilisateur élégante et une API REST puissante. ## ✨ Fonctionnalités ### Interface Utilisateur - **Design Moderne** : Interface élégante avec thème sombre et animations fluides - **Tableau de Bord Temps Réel** : Métriques et statistiques en direct - **Gestion des Hôtes** : Ajout, suppression et surveillance des serveurs - **Gestion des Tâches** : Création et suivi des tâches automatisées - **Logs Système** : Journalisation complète avec filtrage - **WebSocket** : Mises à jour en temps réel sans rechargement - **Animations** : Effets visuels professionnels avec Anime.js ### API REST - **Endpoints Complets** : Gestion complète des hôtes, tâches et logs - **Validation Pydantic** : Validation automatique des données - **WebSocket Support** : Communication temps réel - **Authentification API** : Sécurité renforcée avec clés API - **Documentation Interactive** : Swagger UI et ReDoc - **CORS Support** : Compatible avec les applications web modernes ### Intégration Ansible - **Exécution de Playbooks** : Lancer des playbooks Ansible depuis le dashboard - **Inventaire Dynamique** : Lecture automatique de l'inventaire Ansible - **Actions Rapides** : Upgrade, Reboot, Health-check, Backup en un clic - **Groupes Ansible** : Sélection des cibles par groupe (proxmox, lab, prod, etc.) ### Planificateur (Scheduler) - **Planification de Playbooks** : Exécution automatique des playbooks (unique ou récurrente) - **Interface Multi-étapes** : Création intuitive de schedules en 3 étapes - **Vue Liste/Calendrier** : Visualisation des schedules planifiés - **Expression Cron** : Support des expressions cron personnalisées - **Historique d'exécution** : Traçabilité complète de chaque run - **Intégration Dashboard** : Widget des prochaines exécutions ### Notifications Push (ntfy) - **Intégration ntfy** : Notifications push vers serveur ntfy self-hosted ou ntfy.sh - **Non-bloquant** : Les notifications n'impactent jamais les opérations principales - **Templates prédéfinis** : Backup, Bootstrap, Health checks, Tâches - **Configurable** : Activation/désactivation, topics personnalisés, authentification - **API complète** : Endpoints pour tester et envoyer des notifications personnalisées ## 🛠️ Technologies Utilisées ### Frontend - **HTML5 & CSS3** : Structure et styles modernes - **Tailwind CSS** : Framework CSS utilitaire - **Anime.js** : Bibliothèque d'animations - **Font Awesome** : Icônes professionnelles - **Google Fonts (Inter)** : Typographie moderne ### Backend - **FastAPI** : Framework web Python moderne et rapide - **Pydantic** : Validation de données - **WebSockets** : Communication temps réel - **Uvicorn** : Serveur ASGI performant - **APScheduler** : Planification de tâches en arrière-plan - **Croniter** : Parsing d'expressions cron ## 📁 Structure du Projet ``` homelab-automation-api-v2/ ├── app/ │ ├── app_optimized.py # Backend FastAPI avec intégration Ansible │ ├── index.html # Interface principale du dashboard │ ├── main.js # Logique JavaScript (appels API) │ └── requirements.txt # Dépendances Python ├── ansible/ │ ├── ansible.cfg # Configuration Ansible │ ├── .host_status.json # Cache JSON de l'état des hôtes │ ├── inventory/ │ │ └── hosts.yml # Inventaire des hôtes │ ├── group_vars/ │ │ └── homelab.yml # Variables de groupe │ └── playbooks/ │ ├── vm-upgrade.yml # Mise à jour des systèmes │ ├── vm-reboot.yml # Redémarrage des hôtes │ ├── health-check.yml # Vérification de santé │ └── backup-config.yml # Sauvegarde de configuration ├── tasks_logs/ │ ├── .bootstrap_status.json # État du bootstrap Ansible/SSH par hôte │ ├── .schedule_runs.json # Historique des exécutions de schedules │ └── 2025/ │ └── 12/ │ └── *.json # Logs détaillés des tâches/schedules par date ├── test_schedule.json # Exemple de définition de schedule └── README.md # Documentation ``` ### Fichiers JSON requis Les fichiers JSON suivants sont utilisés par l'application pour stocker l'état et l'historique des opérations : - **`ansible/.host_status.json`** - Contient l'état courant des hôtes connus (reachability, dernier health-check, etc.). - Utilisé par l'API et le dashboard pour afficher rapidement le statut des machines sans relancer un scan complet. - **`tasks_logs/.bootstrap_status.json`** - Mémorise l'état du *bootstrap* Ansible/SSH par hôte (succès, échec, dernier message). - Permet au dashboard d'indiquer si un hôte est prêt pour l'exécution de playbooks. - **`tasks_logs/.schedule_runs.json`** - Journalise les exécutions des *schedules* (id du schedule, heure de run, résultat, durée, message d'erreur éventuel). - Sert de source de vérité pour l'historique affiché dans l'interface Planificateur. - **`tasks_logs///*.json`** - Fichiers horodatés contenant les logs détaillés de chaque exécution de tâche/schedule. - Permettent de tracer finement ce qui s'est passé pour chaque run (playbook lancé, cible, sortie Ansible, statut). - **`test_schedule.json`** - Exemple de définition de schedule utilisé pour les tests et la validation de l'API de planification. - Peut servir de modèle pour comprendre la structure JSON attendue lors de la création de nouveaux schedules. ## 🚀 Installation et Lancement ### Prérequis - Python 3.10+ (testé avec Python 3.14) - Ansible (pour l'exécution des playbooks) - Navigateur moderne (Chrome, Firefox, Safari, Edge) ### Installation d'Ansible (optionnel mais recommandé) ```bash # Sur Debian/Ubuntu sudo apt install ansible # Sur Windows (via pip) pip install ansible # Sur macOS brew install ansible ``` ### Installation 1. **Cloner le projet** ```bash git clone cd homelab-automation-api-v2/app ``` 2. **Installer les dépendances Python** ```bash pip install -r requirements.txt ``` 3. **Lancer le serveur backend (recommandé)** ```bash python -m uvicorn app_optimized:app --host 0.0.0.0 --port 8000 --reload ``` Ou directement via le script Python : ```bash python app_optimized.py ``` 4. **Ouvrir le dashboard frontend complet** (interface de l'image 1) Naviguez vers : - `http://localhost:8000/ui` → Dashboard Homelab (frontend HTML/JS) 5. **Accéder à la page API** (interface de l'image 2) Naviguez vers : - `http://localhost:8000` → Page d'accueil API avec liens vers la documentation ## 📖 Utilisation ### Interface Web 1. **Tableau de Bord** : Vue d'ensemble des métriques système 2. **Gestion des Hôtes** : - Ajouter de nouveaux hôtes avec le bouton "Ajouter Host" - Surveiller l'état des hôtes en temps réel - Exécuter des actions (connexion, mise à jour, redémarrage) 3. **Gestion des Tâches** : - Créer des tâches d'automatisation - Suivre la progression en temps réel - Voir les détails et les logs 4. **Logs Système** : Consulter l'historique des événements ### API REST #### Authentification Toutes les requêtes API nécessitent une clé API dans le header `X-API-Key`: ```bash curl -H "X-API-Key: dev-key-12345" http://localhost:8000/api/hosts ``` #### Endpoints Principaux **Hôtes** - `GET /api/hosts` - Liste tous les hôtes - `POST /api/hosts` - Crée un nouvel hôte - `GET /api/hosts/{id}` - Récupère un hôte spécifique - `DELETE /api/hosts/{id}` - Supprime un hôte **Tâches** - `GET /api/tasks` - Liste toutes les tâches - `POST /api/tasks` - Crée une nouvelle tâche - `GET /api/tasks/{id}` - Récupère une tâche spécifique - `DELETE /api/tasks/{id}` - Supprime une tâche **Logs** - `GET /api/logs` - Récupère les logs récents - `POST /api/logs` - Ajoute un nouveau log - `DELETE /api/logs` - Efface tous les logs **Métriques** - `GET /api/metrics` - Métriques système - `GET /api/health/{host}` - Health check d'un hôte **WebSocket** - `WS /ws` - Connexion WebSocket pour les mises à jour temps réel **Ansible** (nouveaux endpoints) - `GET /api/ansible/playbooks` - Liste les playbooks disponibles - `GET /api/ansible/inventory` - Récupère l'inventaire Ansible (hôtes et groupes) - `GET /api/ansible/groups` - Liste les groupes Ansible - `POST /api/ansible/execute` - Exécute un playbook directement - `POST /api/ansible/adhoc` - Exécute une commande ad-hoc sur les hôtes - `POST /api/ansible/bootstrap` - Bootstrap un hôte pour Ansible (crée user, SSH, sudo, Python) - `GET /api/ansible/ssh-config` - Diagnostic de la configuration SSH **Planificateur (Schedules)** - `GET /api/schedules` - Liste tous les schedules - `POST /api/schedules` - Crée un nouveau schedule - `GET /api/schedules/{id}` - Récupère un schedule spécifique - `PUT /api/schedules/{id}` - Met à jour un schedule - `DELETE /api/schedules/{id}` - Supprime un schedule - `POST /api/schedules/{id}/run` - Exécution forcée immédiate - `POST /api/schedules/{id}/pause` - Met en pause un schedule - `POST /api/schedules/{id}/resume` - Reprend un schedule - `GET /api/schedules/{id}/runs` - Historique des exécutions - `GET /api/schedules/stats` - Statistiques globales - `POST /api/schedules/validate-cron` - Valide une expression cron **Notifications (ntfy)** - `GET /api/notifications/config` - Configuration actuelle des notifications - `POST /api/notifications/test` - Envoie une notification de test - `POST /api/notifications/send` - Envoie une notification personnalisée - `POST /api/notifications/toggle` - Active/désactive les notifications #### Exemples d'utilisation Ansible **Lister les playbooks disponibles :** ```bash curl -H "X-API-Key: dev-key-12345" http://localhost:8000/api/ansible/playbooks ``` **Voir l'inventaire Ansible :** ```bash curl -H "X-API-Key: dev-key-12345" http://localhost:8000/api/ansible/inventory ``` **Exécuter un playbook (ex: mise à jour sur le groupe "lab") :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{"playbook": "vm-upgrade.yml", "target": "lab"}' \ http://localhost:8000/api/ansible/execute ``` **Créer une tâche Ansible via l'API tasks :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{"action": "upgrade", "group": "proxmox"}' \ http://localhost:8000/api/tasks ``` **Exécuter une commande ad-hoc :** ```bash # Vérifier l'espace disque sur tous les hôtes curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{"target": "all", "command": "df -h /", "module": "shell"}' \ http://localhost:8000/api/ansible/adhoc # Redémarrer un service avec sudo curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{"target": "web-servers", "command": "systemctl restart nginx", "become": true}' \ http://localhost:8000/api/ansible/adhoc ``` #### Exemples d'utilisation du Planificateur **Créer un schedule quotidien :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{ "name": "Backup quotidien", "playbook": "backup-config.yml", "target": "all", "schedule_type": "recurring", "recurrence": {"type": "daily", "time": "02:00"}, "tags": ["Backup", "Production"] }' \ http://localhost:8000/api/schedules ``` **Créer un schedule hebdomadaire (lundi et vendredi) :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{ "name": "Health check bi-hebdo", "playbook": "health-check.yml", "target": "proxmox", "schedule_type": "recurring", "recurrence": {"type": "weekly", "time": "08:00", "days": [1, 5]} }' \ http://localhost:8000/api/schedules ``` **Créer un schedule avec expression cron :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{ "name": "Maintenance mensuelle", "playbook": "vm-upgrade.yml", "target": "lab", "schedule_type": "recurring", "recurrence": {"type": "custom", "cron_expression": "0 3 1 * *"} }' \ http://localhost:8000/api/schedules ``` **Lancer un schedule immédiatement :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" \ http://localhost:8000/api/schedules/{schedule_id}/run ``` **Voir l'historique des exécutions :** ```bash curl -H "X-API-Key: dev-key-12345" \ http://localhost:8000/api/schedules/{schedule_id}/runs ``` #### Exemples d'utilisation des Notifications **Tester la configuration ntfy :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" \ "http://localhost:8000/api/notifications/test?message=Hello%20from%20Homelab" ``` **Envoyer une notification personnalisée :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" -H "Content-Type: application/json" \ -d '{ "topic": "homelab-alerts", "message": "Serveur redémarré avec succès", "title": "🔄 Reboot terminé", "priority": 3, "tags": ["white_check_mark", "computer"] }' \ http://localhost:8000/api/notifications/send ``` **Désactiver temporairement les notifications :** ```bash curl -X POST -H "X-API-Key: dev-key-12345" \ "http://localhost:8000/api/notifications/toggle?enabled=false" ``` ### Documentation API - **Swagger UI** : `http://localhost:8000/api/docs` - **ReDoc** : `http://localhost:8000/api/redoc` ## 🎨 Personnalisation ### Thèmes L'application supporte les thèmes clair et sombre. Utilisez le bouton en haut à droite pour basculer. ### Couleurs Les couleurs principales peuvent être modifiées dans les variables CSS : ```css :root { --primary-bg: #0a0a0a; --accent-color: #7c3aed; --success-color: #10b981; --error-color: #ef4444; } ``` ### Animations Les animations sont gérées par Anime.js dans `main.js`. Vous pouvez ajuster : - La durée des animations - Les effets de transition - Les comportements au scroll ## 🔧 Configuration ### Variables d'Environnement Créez un fichier `.env` pour configurer l'application : ```env API_KEY=votre-cle-api-secrete SSH_REMOTE_USER=automation LOGS_DIR=/var/log/homelab ANSIBLE_DIR=/etc/ansible ``` ### Base de Données L'application utilise **SQLite** avec **SQLAlchemy 2.x async** pour le stockage persistant des données (hôtes, tâches, schedules, logs). La base est créée automatiquement au démarrage dans `data/homelab.db`. #### Migration depuis les fichiers JSON Si vous migrez depuis une version antérieure utilisant des fichiers JSON : ```bash # 1. Installer les nouvelles dépendances pip install -r app/requirements.txt # 2. Exécuter le script de migration python migrate_json_to_sqlite.py ``` Le script : - Importe les données depuis `ansible/.host_status.json`, `tasks_logs/.bootstrap_status.json`, etc. - Crée des sauvegardes `.bak` des fichiers JSON originaux - Génère un rapport de migration #### Structure de la base de données ``` data/homelab.db ├── hosts # Inventaire des hôtes ├── bootstrap_status # Statut bootstrap SSH par hôte ├── tasks # Historique des tâches exécutées ├── schedules # Planifications récurrentes ├── schedule_runs # Historique des exécutions de schedules └── logs # Logs système ``` #### Migrations Alembic Pour les évolutions de schéma : ```bash # Appliquer les migrations alembic upgrade head # Créer une nouvelle migration alembic revision --autogenerate -m "description" ``` ## 🚀 Déploiement ### Production 1. **Configuration de la base de données** - Par défaut : SQLite dans `data/homelab.db` - Variable d'environnement : `DATABASE_URL=sqlite+aiosqlite:///./data/homelab.db` 2. **Sécurité** - Utilisez une clé API forte - Activez HTTPS - Configurez les pare-feu - Limitez les origines CORS 3. **Performance** - Utilisez un serveur de production (Gunicorn) - Configurez Redis pour le cache - Activez la compression ### Docker Le projet inclut un Dockerfile et docker-compose.yml prêts à l'emploi avec Ansible intégré. #### Démarrage rapide avec Docker Compose ```bash # 1. Copier le fichier d'exemple d'environnement cp .env.example .env # 2. Éditer .env pour configurer vos clés SSH nano .env # 3. Lancer le container docker-compose up -d # 4. Accéder au dashboard # http://localhost:8000/ui ``` #### Configuration des clés SSH Par défaut, docker-compose monte votre répertoire `~/.ssh` en lecture seule. Assurez-vous que : 1. Votre clé privée SSH existe : `~/.ssh/id_rsa` 2. Votre clé publique existe : `~/.ssh/id_rsa.pub` Ou spécifiez un répertoire différent dans `.env` : ```bash SSH_KEY_DIR=/chemin/vers/vos/cles/ssh ``` #### Variables d'environnement | Variable | Description | Défaut | |----------|-------------|--------| | `API_KEY` | Clé API pour l'authentification | `dev-key-12345` | | `SSH_USER` | Utilisateur SSH pour Ansible | `automation` | | `SSH_KEY_DIR` | Répertoire des clés SSH sur l'hôte | `~/.ssh` | | `SSH_KEY_PATH` | Chemin de la clé privée dans le container | `/app/ssh_keys/id_rsa` | | `NTFY_BASE_URL` | URL du serveur ntfy | `http://localhost:8150` | | `NTFY_DEFAULT_TOPIC` | Topic par défaut pour les notifications | `homelab-events` | | `NTFY_ENABLED` | Activer/désactiver les notifications | `true` | | `NTFY_TIMEOUT` | Timeout des requêtes HTTP (secondes) | `5` | | `NTFY_USERNAME` | Nom d'utilisateur (auth Basic) | _(vide)_ | | `NTFY_PASSWORD` | Mot de passe (auth Basic) | _(vide)_ | | `NTFY_TOKEN` | Token Bearer (alternative à Basic) | _(vide)_ | #### Construction manuelle de l'image ```bash # Construire l'image docker build -t homelab-dashboard . ``` ```bash # Exécuter le container docker run -d \ -p 8000:8000 \ -v ~/.ssh:/app/ssh_keys:ro \ -v ./ansible/inventory:/ansible/inventory:ro \ -e API_KEY=votre-cle-api-secrete \ --name homelab-dashboard \ homelab-dashboard ``` ```bash # se connecter au container docker exec -it homelab-dashboard /bin/bash ``` ## 🔧 Bootstrap SSH Le dashboard inclut une fonctionnalité de **Bootstrap** pour préparer automatiquement un hôte à recevoir des commandes Ansible. ### Ce que fait le Bootstrap 1. **Crée l'utilisateur d'automatisation** (par défaut: `automation`) 2. **Configure l'authentification SSH par clé** (copie votre clé publique) 3. **Installe et configure sudo** sans mot de passe pour cet utilisateur 4. **Installe Python3** (requis par Ansible) 5. **Vérifie la connexion SSH** par clé après configuration ### Systèmes supportés - **Debian/Ubuntu** (apt) - **Alpine Linux** (apk) - **FreeBSD** (pkg) ### Utilisation via l'interface 1. Cliquez sur le bouton **Bootstrap** (jaune) sur la carte d'un hôte 2. Entrez le **mot de passe root** de l'hôte distant 3. Optionnel : modifiez le nom de l'utilisateur d'automatisation 4. Cliquez sur **Lancer le Bootstrap** ### Utilisation via l'API ```bash curl -X POST http://localhost:8000/api/ansible/bootstrap \ -H "X-API-Key: dev-key-12345" \ -H "Content-Type: application/json" \ -d '{ "host": "192.168.1.100", "root_password": "votre-mot-de-passe-root", "automation_user": "automation" }' ``` ### Prérequis - **sshpass** doit être installé sur la machine qui exécute le dashboard - L'hôte cible doit accepter les connexions SSH avec mot de passe (pour la configuration initiale) - Le compte root doit être accessible via SSH ```bash # Installation de sshpass # Debian/Ubuntu apt install sshpass # Alpine apk add sshpass # macOS brew install hudochenkov/sshpass/sshpass ``` ## 🔔 Notifications Push (ntfy) L'application intègre un système de notifications push via [ntfy](https://ntfy.sh/), un service de notifications open-source. ### Configuration 1. **Serveur ntfy** : Vous pouvez utiliser : - Le service public : `https://ntfy.sh` - Votre propre instance self-hosted (recommandé pour la vie privée) 2. **Variables d'environnement** : Ajoutez dans votre `.env` : ```env NTFY_BASE_URL=http://raspi.8gb.home:8150 NTFY_DEFAULT_TOPIC=homelab-events NTFY_ENABLED=true ``` 3. **Authentification** (optionnel) : ```env # Auth Basic NTFY_USERNAME=votre-user NTFY_PASSWORD=votre-password # Ou Token Bearer NTFY_TOKEN=tk_votre_token ``` ### Topics utilisés | Topic | Description | |-------|-------------| | `homelab-events` | Notifications générales (topic par défaut) | | `homelab-backup` | Résultats des backups (succès/échec) | | `homelab-bootstrap` | Bootstrap des hôtes | | `homelab-health` | Changements d'état des hôtes (up/down) | | `homelab-schedules` | Exécutions des schedules planifiés | ### Événements notifiés automatiquement - **Tâches Ansible** : Succès ou échec de l'exécution - **Bootstrap** : Début, succès ou échec du bootstrap d'un hôte - **Schedules** : Résultat des exécutions planifiées - **Health checks** : Changement d'état d'un hôte (online → offline ou inverse) ### Recevoir les notifications 1. **Application mobile** : Installez l'app ntfy ([Android](https://play.google.com/store/apps/details?id=io.heckel.ntfy), [iOS](https://apps.apple.com/app/ntfy/id1625396347)) 2. **Abonnez-vous** aux topics souhaités (ex: `homelab-events`) 3. **Web** : Accédez à `http://votre-serveur-ntfy/homelab-events` dans un navigateur ### Désactiver les notifications - **Temporairement via API** : ```bash curl -X POST -H "X-API-Key: dev-key-12345" \ "http://localhost:8000/api/notifications/toggle?enabled=false" ``` - **Définitivement** : Mettez `NTFY_ENABLED=false` dans `.env` ## 🤝 Contribution Les contributions sont les bienvenues ! Veuillez : 1. Fork le projet 2. Créer une branche pour votre fonctionnalité 3. Commit vos changements 4. Push vers la branche 5. Ouvrir une Pull Request ## 📄 Licence Ce projet est sous licence MIT. Voir le fichier LICENSE pour plus de détails. ## 🆘 Support Pour toute question ou problème : 1. Consultez la documentation 2. Vérifiez les logs du serveur 3. Ouvrez une issue sur GitHub 4. Contactez l'équipe de développement --- **Développé avec ❤️ pour la communauté homelab**