homelab_automation/documentation/DOCKER_MANAGEMENT.md
Bruno Charest 68a9b0f390
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
Remove Node.js cache files containing npm vulnerability data for vitest and vite packages
2025-12-15 20:36:06 -05:00

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