Some checks failed
Tests / Backend Tests (Python) (3.10) (push) Has been cancelled
Tests / Backend Tests (Python) (3.11) (push) Has been cancelled
Tests / Backend Tests (Python) (3.12) (push) Has been cancelled
Tests / Frontend Tests (JS) (push) Has been cancelled
Tests / Integration Tests (push) Has been cancelled
Tests / All Tests Passed (push) Has been cancelled
337 lines
10 KiB
Markdown
337 lines
10 KiB
Markdown
# Docker Management - Documentation
|
|
|
|
## Vue d'ensemble
|
|
|
|
La fonctionnalité de gestion Docker permet de surveiller et gérer les containers Docker sur plusieurs hosts de votre homelab. Elle s'intègre harmonieusement avec l'architecture existante du Homelab Dashboard.
|
|
|
|
## Fonctionnalités
|
|
|
|
### Surveillance multi-hosts
|
|
- Collecte automatique des informations Docker via SSH
|
|
- Vue d'ensemble de tous les hosts Docker-enabled
|
|
- Statistiques globales (containers, images, volumes, alertes)
|
|
|
|
### Gestion des containers
|
|
- **Start/Stop/Restart** : Actions de base sur les containers
|
|
- **Logs** : Visualisation des logs en temps réel
|
|
- **Inspect** : Informations détaillées JSON
|
|
- **Redeploy** : Pull de l'image et recréation (support docker-compose)
|
|
|
|
### Alerting proactif
|
|
- Détection automatique des containers down
|
|
- Notifications ntfy lors d'alertes
|
|
- Système d'acquittement des alertes
|
|
- Labels pour configurer la surveillance
|
|
|
|
## Architecture
|
|
|
|
### Backend
|
|
|
|
```
|
|
app/
|
|
├── models/
|
|
│ ├── docker_container.py # Modèle SQLAlchemy containers
|
|
│ ├── docker_image.py # Modèle SQLAlchemy images
|
|
│ ├── docker_volume.py # Modèle SQLAlchemy volumes
|
|
│ └── docker_alert.py # Modèle SQLAlchemy alertes
|
|
├── crud/
|
|
│ ├── docker_container.py # CRUD operations containers
|
|
│ ├── docker_image.py # CRUD operations images
|
|
│ ├── docker_volume.py # CRUD operations volumes
|
|
│ └── docker_alert.py # CRUD operations alertes
|
|
├── schemas/
|
|
│ └── docker.py # Schémas Pydantic
|
|
├── services/
|
|
│ ├── docker_service.py # Service de collecte SSH
|
|
│ ├── docker_actions.py # Actions sur containers
|
|
│ └── docker_alerts.py # Gestion des alertes
|
|
└── routes/
|
|
└── docker.py # API endpoints
|
|
```
|
|
|
|
### Frontend
|
|
|
|
```
|
|
app/
|
|
├── index.html # Section Docker (page-docker)
|
|
└── docker_section.js # Logique JavaScript
|
|
```
|
|
|
|
## API Endpoints
|
|
|
|
### Hosts Docker
|
|
|
|
| Endpoint | Méthode | Description |
|
|
|----------|---------|-------------|
|
|
| `/api/docker/hosts` | GET | Liste tous les hosts avec infos Docker |
|
|
| `/api/docker/hosts/{host_id}/enable` | POST | Active/désactive surveillance Docker |
|
|
| `/api/docker/hosts/{host_id}/collect` | POST | Force une collecte immédiate |
|
|
| `/api/docker/collect-all` | POST | Collecte sur tous les hosts enabled |
|
|
|
|
### Containers
|
|
|
|
| Endpoint | Méthode | Description |
|
|
|----------|---------|-------------|
|
|
| `/api/docker/hosts/{host_id}/containers` | GET | Liste containers d'un host |
|
|
| `/api/docker/containers/{host_id}/{container_id}/start` | POST | Démarre un container |
|
|
| `/api/docker/containers/{host_id}/{container_id}/stop` | POST | Arrête un container |
|
|
| `/api/docker/containers/{host_id}/{container_id}/restart` | POST | Redémarre un container |
|
|
| `/api/docker/containers/{host_id}/{container_id}/remove` | POST | Supprime un container (admin) |
|
|
| `/api/docker/containers/{host_id}/{container_id}/redeploy` | POST | Redéploie un container |
|
|
| `/api/docker/containers/{host_id}/{container_id}/logs` | GET | Récupère les logs |
|
|
| `/api/docker/containers/{host_id}/{container_id}/inspect` | GET | Informations détaillées |
|
|
|
|
### Images & Volumes
|
|
|
|
| Endpoint | Méthode | Description |
|
|
|----------|---------|-------------|
|
|
| `/api/docker/hosts/{host_id}/images` | GET | Liste images d'un host |
|
|
| `/api/docker/hosts/{host_id}/volumes` | GET | Liste volumes d'un host |
|
|
|
|
### Alertes
|
|
|
|
| Endpoint | Méthode | Description |
|
|
|----------|---------|-------------|
|
|
| `/api/docker/alerts` | GET | Liste les alertes Docker |
|
|
| `/api/docker/alerts/{alert_id}/acknowledge` | POST | Acquitte une alerte |
|
|
| `/api/docker/alerts/{alert_id}/close` | POST | Ferme une alerte |
|
|
|
|
### Statistiques
|
|
|
|
| Endpoint | Méthode | Description |
|
|
|----------|---------|-------------|
|
|
| `/api/docker/stats` | GET | Statistiques globales Docker |
|
|
|
|
## Configuration
|
|
|
|
### Activer Docker sur un host
|
|
|
|
1. **Via l'API** :
|
|
```bash
|
|
curl -X POST -H "Authorization: Bearer $TOKEN" \
|
|
http://localhost:8000/api/docker/hosts/{host_id}/enable \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"enabled": true}'
|
|
```
|
|
|
|
2. **Via l'interface** : Section Docker > Cliquez sur le bouton play/pause sur un host
|
|
|
|
### Labelliser les containers pour l'alerting
|
|
|
|
Ajoutez ces labels à vos containers pour activer la surveillance :
|
|
|
|
```yaml
|
|
# docker-compose.yml
|
|
services:
|
|
nginx:
|
|
image: nginx:latest
|
|
labels:
|
|
homelab.monitor: "true" # Active la surveillance
|
|
homelab.desired: "running" # État attendu (running/stopped)
|
|
```
|
|
|
|
Les containers avec `homelab.monitor: "true"` seront surveillés. Si leur état ne correspond pas à `homelab.desired`, une alerte sera créée.
|
|
|
|
### Jobs planifiés
|
|
|
|
Deux jobs APScheduler sont configurés automatiquement au démarrage :
|
|
|
|
1. **docker_collect** (toutes les 60 secondes) : Collecte les infos Docker de tous les hosts enabled
|
|
2. **docker_alerts** (toutes les 30 secondes) : Vérifie l'état des containers et génère des alertes
|
|
|
|
## Collecte via SSH
|
|
|
|
La collecte Docker utilise SSH pour exécuter des commandes Docker sur les hosts distants. Le système réutilise la configuration SSH existante (user `automation`, clés SSH).
|
|
|
|
### Commandes exécutées
|
|
|
|
```bash
|
|
# Version Docker
|
|
docker version --format '{{.Server.Version}}'
|
|
|
|
# Containers
|
|
docker ps -a --format '{{json .}}' --no-trunc
|
|
|
|
# Images
|
|
docker images --format '{{json .}}'
|
|
|
|
# Volumes
|
|
docker volume ls --format '{{json .}}'
|
|
```
|
|
|
|
### Timeouts
|
|
|
|
- **Connect timeout** : 5 secondes
|
|
- **Exec timeout** : 15 secondes (30 secondes pour les actions)
|
|
|
|
## Base de données
|
|
|
|
### Migration Alembic
|
|
|
|
```bash
|
|
# Appliquer la migration
|
|
alembic upgrade head
|
|
```
|
|
|
|
La migration `0011_add_docker_management_tables.py` crée :
|
|
- Extension de la table `hosts` avec colonnes Docker
|
|
- Table `docker_containers`
|
|
- Table `docker_images`
|
|
- Table `docker_volumes`
|
|
- Table `docker_alerts`
|
|
|
|
### Schéma des tables
|
|
|
|
```sql
|
|
-- Extension hosts
|
|
ALTER TABLE hosts ADD COLUMN docker_enabled BOOLEAN DEFAULT FALSE;
|
|
ALTER TABLE hosts ADD COLUMN docker_version TEXT;
|
|
ALTER TABLE hosts ADD COLUMN docker_status TEXT; -- online/offline/error
|
|
ALTER TABLE hosts ADD COLUMN docker_last_collect_at TIMESTAMP;
|
|
|
|
-- Containers
|
|
CREATE TABLE docker_containers (
|
|
id INTEGER PRIMARY KEY,
|
|
host_id TEXT REFERENCES hosts(id) ON DELETE CASCADE,
|
|
container_id TEXT NOT NULL,
|
|
name TEXT NOT NULL,
|
|
image TEXT,
|
|
state TEXT, -- running/exited/paused/created/dead
|
|
status TEXT, -- "Up 2 hours", etc.
|
|
health TEXT, -- healthy/unhealthy/starting/none
|
|
created_at TIMESTAMP,
|
|
ports JSON,
|
|
labels JSON,
|
|
compose_project TEXT, -- com.docker.compose.project
|
|
last_update_at TIMESTAMP
|
|
);
|
|
|
|
-- Alertes
|
|
CREATE TABLE docker_alerts (
|
|
id INTEGER PRIMARY KEY,
|
|
host_id TEXT REFERENCES hosts(id) ON DELETE CASCADE,
|
|
container_name TEXT NOT NULL,
|
|
severity TEXT, -- warning/error/critical
|
|
state TEXT, -- open/closed/acknowledged
|
|
message TEXT,
|
|
opened_at TIMESTAMP,
|
|
closed_at TIMESTAMP,
|
|
acknowledged_at TIMESTAMP,
|
|
acknowledged_by TEXT,
|
|
last_notified_at TIMESTAMP
|
|
);
|
|
```
|
|
|
|
## Interface utilisateur
|
|
|
|
### Section Docker
|
|
|
|
- **Statistiques** : Cards avec nombre de hosts, containers, images, alertes
|
|
- **Actions** : Bouton "Collecter Tout", accès aux alertes Docker
|
|
- **Recherche** : Filtre les hosts par nom ou IP
|
|
- **Grille hosts** : Cards cliquables pour chaque host Docker
|
|
|
|
### Modal détails host
|
|
|
|
Onglets disponibles :
|
|
- **Containers** : Liste avec actions (start/stop/restart/logs)
|
|
- **Images** : Liste des images avec taille
|
|
- **Volumes** : Liste des volumes
|
|
- **Alertes** : Alertes spécifiques à ce host
|
|
|
|
### Notifications temps réel
|
|
|
|
Via WebSocket, le frontend reçoit :
|
|
- `docker_host_updated` : Mise à jour d'un host
|
|
- `docker_alert_opened` : Nouvelle alerte
|
|
- `docker_alert_closed` : Alerte fermée
|
|
- `docker_alert_acknowledged` : Alerte acquittée
|
|
|
|
## Sécurité
|
|
|
|
- Toutes les routes nécessitent une authentification (JWT ou API Key)
|
|
- L'action `remove` nécessite le rôle `admin`
|
|
- Timeouts stricts pour éviter les blocages SSH
|
|
- Pas d'exécution de commandes arbitraires
|
|
|
|
## Exemples curl
|
|
|
|
### Lister les hosts Docker
|
|
```bash
|
|
curl -H "Authorization: Bearer $TOKEN" \
|
|
http://localhost:8000/api/docker/hosts
|
|
```
|
|
|
|
### Activer Docker sur un host
|
|
```bash
|
|
curl -X POST -H "Authorization: Bearer $TOKEN" \
|
|
http://localhost:8000/api/docker/hosts/host-123/enable \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"enabled": true}'
|
|
```
|
|
|
|
### Forcer une collecte
|
|
```bash
|
|
curl -X POST -H "Authorization: Bearer $TOKEN" \
|
|
http://localhost:8000/api/docker/hosts/host-123/collect
|
|
```
|
|
|
|
### Démarrer un container
|
|
```bash
|
|
curl -X POST -H "Authorization: Bearer $TOKEN" \
|
|
http://localhost:8000/api/docker/containers/host-123/abc456def/start
|
|
```
|
|
|
|
### Voir les logs d'un container
|
|
```bash
|
|
curl -H "Authorization: Bearer $TOKEN" \
|
|
"http://localhost:8000/api/docker/containers/host-123/abc456def/logs?tail=200"
|
|
```
|
|
|
|
### Lister les alertes ouvertes
|
|
```bash
|
|
curl -H "Authorization: Bearer $TOKEN" \
|
|
"http://localhost:8000/api/docker/alerts?state=open"
|
|
```
|
|
|
|
### Acquitter une alerte
|
|
```bash
|
|
curl -X POST -H "Authorization: Bearer $TOKEN" \
|
|
http://localhost:8000/api/docker/alerts/1/acknowledge \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"note": "Investigating the issue"}'
|
|
```
|
|
|
|
## Dépendances
|
|
|
|
### Python
|
|
- `asyncssh` : Connexions SSH asynchrones
|
|
- Dépendances existantes (FastAPI, SQLAlchemy, APScheduler, etc.)
|
|
|
|
### Ajout de asyncssh
|
|
Si asyncssh n'est pas installé :
|
|
```bash
|
|
pip install asyncssh
|
|
```
|
|
|
|
## Dépannage
|
|
|
|
### Erreur "Docker not available"
|
|
- Vérifier que Docker est installé sur le host
|
|
- Vérifier que l'utilisateur `automation` a les droits Docker (`docker` group)
|
|
|
|
### Timeouts SSH
|
|
- Vérifier la connectivité réseau
|
|
- Vérifier les clés SSH
|
|
- Augmenter les timeouts si nécessaire dans `docker_service.py`
|
|
|
|
### Containers non détectés
|
|
- Vérifier que Docker monitoring est activé sur le host
|
|
- Forcer une collecte manuelle
|
|
- Vérifier les logs de l'application
|
|
|
|
### Alertes non envoyées
|
|
- Vérifier que ntfy est configuré et activé
|
|
- Vérifier les labels `homelab.monitor` sur les containers
|
|
- Vérifier les logs pour les erreurs de notification
|