- Implement UpdateService for image version checking and atomic updates - Add DockerComposeManager for centralized docker-compose management - Create 12 docker-compose references in /home/innotex/Docker - Add 13 new API endpoints (6 for images, 7 for compose management) - Add comprehensive documentation and examples
475 lines
11 KiB
Markdown
475 lines
11 KiB
Markdown
# Docker Image Update System - InnotexBoard
|
|
|
|
## đ Vue d'ensemble
|
|
|
|
Le systÚme de mise à jour Docker d'InnotexBoard est **inspiré de TrueNAS Scale** et fournit:
|
|
- â
Vérification automatique des mises à jour d'images
|
|
- â
Téléchargement (pull) des nouvelles images
|
|
- â
Mise Ă jour in-place des conteneurs
|
|
- â
Nettoyage automatique des images orphelines
|
|
- â
Gestion centralisée des docker-compose
|
|
|
|
## đïž Architecture
|
|
|
|
```
|
|
InnotexBoard
|
|
âââ Backend API (FastAPI)
|
|
â âââ update_service.py # Service de mise Ă jour des images
|
|
â âââ compose_manager.py # Manager des docker-compose
|
|
â âââ endpoints/docker.py # API endpoints pour Docker
|
|
â âââ endpoints/compose.py # API endpoints pour Docker Compose
|
|
â
|
|
âââ Frontend (Vue.js)
|
|
â âââ Components
|
|
â âââ ImageUpdates.vue # Gestion des mises Ă jour
|
|
â âââ ComposeManager.vue # Gestion des docker-compose
|
|
â
|
|
âââ Docker References
|
|
âââ /home/innotex/Docker/
|
|
âââ docker-compose.*.yml
|
|
âââ README.md
|
|
```
|
|
|
|
## đ Workflow de Mise Ă Jour (InspirĂ© de TrueNAS Scale)
|
|
|
|
### 1. Détection des Mises à Jour
|
|
```
|
|
Client â GET /api/v1/docker/images/check-all-updates
|
|
â Check Docker Registry V2 API
|
|
â Compare versions (sĂ©mantique)
|
|
â Return list of available updates
|
|
```
|
|
|
|
### 2. Téléchargement des Images
|
|
```
|
|
Client â POST /api/v1/docker/images/pull
|
|
â docker pull {image}:{tag}
|
|
â Store locally
|
|
```
|
|
|
|
### 3. Mise Ă Jour Atomique du Conteneur
|
|
```
|
|
Client â POST /api/v1/docker/containers/{id}/update-image
|
|
â
|
|
1. Stop container
|
|
2. Pull new image
|
|
3. Remove old container
|
|
4. Create new container with new image
|
|
5. Start new container
|
|
â
|
|
Rollback-safe (old image retained until prune)
|
|
```
|
|
|
|
### 4. Nettoyage
|
|
```
|
|
Client â POST /api/v1/docker/images/prune
|
|
â Remove dangling images
|
|
â Free up disk space
|
|
```
|
|
|
|
## đĄ API Endpoints
|
|
|
|
### Images Management
|
|
|
|
#### Lister toutes les images locales
|
|
```http
|
|
GET /api/v1/docker/images
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"images": [
|
|
{
|
|
"image": "portainer/portainer-ce",
|
|
"tag": "latest",
|
|
"image_id": "abc123",
|
|
"created": "2024-01-16T10:30:00Z",
|
|
"size": "123.45 MB",
|
|
"containers_using": ["portainer"]
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
#### Vérifier les mises à jour d'une image
|
|
```http
|
|
GET /api/v1/docker/images/check-update/{image_name}
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"image": "portainer/portainer-ce:latest",
|
|
"current_tag": "latest",
|
|
"latest_tag": "2.19.3",
|
|
"has_update": true,
|
|
"registry": "docker.io"
|
|
}
|
|
```
|
|
|
|
#### Vérifier toutes les mises à jour
|
|
```http
|
|
GET /api/v1/docker/images/check-all-updates
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"total_containers": 5,
|
|
"containers_with_updates": 2,
|
|
"updates": [
|
|
{
|
|
"container": "portainer",
|
|
"update": {
|
|
"image": "portainer/portainer-ce:latest",
|
|
"current_tag": "latest",
|
|
"latest_tag": "2.19.3",
|
|
"has_update": true,
|
|
"registry": "docker.io"
|
|
}
|
|
}
|
|
]
|
|
}
|
|
```
|
|
|
|
#### Télécharger une image (Pull)
|
|
```http
|
|
POST /api/v1/docker/images/pull
|
|
Authorization: Bearer {token}
|
|
Content-Type: application/json
|
|
|
|
Body:
|
|
{
|
|
"image": "portainer/portainer-ce",
|
|
"tag": "latest"
|
|
}
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"message": "Image portainer/portainer-ce:latest téléchargée avec succÚs"
|
|
}
|
|
```
|
|
|
|
#### Mettre Ă jour l'image d'un conteneur
|
|
```http
|
|
POST /api/v1/docker/containers/{container_id}/update-image
|
|
Authorization: Bearer {token}
|
|
Content-Type: application/json
|
|
|
|
Body:
|
|
{
|
|
"new_image": "portainer/portainer-ce",
|
|
"new_tag": "latest"
|
|
}
|
|
|
|
Response 200:
|
|
{
|
|
"success": true,
|
|
"message": "Conteneur portainer mis Ă jour avec succĂšs",
|
|
"old_image": "portainer/portainer-ce:2.19.0",
|
|
"new_image": "portainer/portainer-ce:latest"
|
|
}
|
|
```
|
|
|
|
#### Nettoyer les images inutilisées
|
|
```http
|
|
POST /api/v1/docker/images/prune
|
|
Authorization: Bearer {token}
|
|
|
|
Query Parameters:
|
|
- dangling_only: boolean (default: true)
|
|
|
|
Response 200:
|
|
{
|
|
"success": true,
|
|
"deleted_images": 5,
|
|
"space_freed_mb": "234.56",
|
|
"details": [...]
|
|
}
|
|
```
|
|
|
|
### Docker Compose Management
|
|
|
|
#### Lister tous les docker-compose disponibles
|
|
```http
|
|
GET /api/v1/docker/compose/list
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
[
|
|
{
|
|
"name": "portainer",
|
|
"file": "docker-compose.portainer.yml",
|
|
"path": "/home/innotex/Docker/docker-compose.portainer.yml",
|
|
"exists": true
|
|
},
|
|
...
|
|
]
|
|
```
|
|
|
|
#### Vérifier l'état d'un docker-compose
|
|
```http
|
|
GET /api/v1/docker/compose/{compose_name}/status
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"file": "docker-compose.portainer.yml",
|
|
"containers": [
|
|
{
|
|
"ID": "abc123",
|
|
"Name": "portainer",
|
|
"State": "running",
|
|
"Status": "Up 2 hours"
|
|
}
|
|
],
|
|
"count": 1
|
|
}
|
|
```
|
|
|
|
#### Démarrer un docker-compose
|
|
```http
|
|
POST /api/v1/docker/compose/{compose_name}/start
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"message": "Services démarrés pour docker-compose.portainer.yml"
|
|
}
|
|
```
|
|
|
|
#### ArrĂȘter un docker-compose
|
|
```http
|
|
POST /api/v1/docker/compose/{compose_name}/stop
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"message": "Services arrĂȘtĂ©s pour docker-compose.portainer.yml"
|
|
}
|
|
```
|
|
|
|
#### ArrĂȘter et supprimer (down)
|
|
```http
|
|
POST /api/v1/docker/compose/{compose_name}/down
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"message": "Services arrĂȘtĂ©s et supprimĂ©s pour docker-compose.portainer.yml"
|
|
}
|
|
```
|
|
|
|
#### Redémarrer un docker-compose
|
|
```http
|
|
POST /api/v1/docker/compose/{compose_name}/restart
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"message": "Services redémarrés pour docker-compose.portainer.yml"
|
|
}
|
|
```
|
|
|
|
#### Télécharger les images (Pull) d'un docker-compose
|
|
```http
|
|
POST /api/v1/docker/compose/{compose_name}/pull
|
|
Authorization: Bearer {token}
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"message": "Images téléchargées pour docker-compose.portainer.yml"
|
|
}
|
|
```
|
|
|
|
#### Récupérer les logs
|
|
```http
|
|
GET /api/v1/docker/compose/{compose_name}/logs
|
|
Authorization: Bearer {token}
|
|
|
|
Query Parameters:
|
|
- tail: integer (default: 100)
|
|
|
|
Response 200:
|
|
{
|
|
"status": "success",
|
|
"file": "docker-compose.portainer.yml",
|
|
"logs": "..."
|
|
}
|
|
```
|
|
|
|
## đ Structure des Fichiers
|
|
|
|
### Backend
|
|
```
|
|
backend/app/services/
|
|
âââ update_service.py # Service de mise Ă jour des images
|
|
âââ compose_manager.py # Manager des docker-compose
|
|
âââ docker_service.py # Service Docker existant
|
|
|
|
backend/app/api/endpoints/
|
|
âââ docker.py # Endpoints Docker (mis Ă jour)
|
|
âââ compose.py # Endpoints Docker Compose (nouveau)
|
|
```
|
|
|
|
### Frontend (à implémenter)
|
|
```
|
|
frontend/src/
|
|
âââ views/
|
|
â âââ ImagesView.vue # Gestion des images
|
|
â âââ UpdatesView.vue # Gestion des mises Ă jour
|
|
â
|
|
âââ components/
|
|
âââ ImageList.vue
|
|
âââ UpdateChecker.vue
|
|
âââ ComposeManager.vue
|
|
âââ ComposeLogs.vue
|
|
```
|
|
|
|
## đł Docker Compose References
|
|
|
|
### Localisation
|
|
`/home/innotex/Docker/`
|
|
|
|
### Applications Disponibles
|
|
- **portainer** - Gestion Docker UI
|
|
- **sonarr** - Gestionnaire de séries TV
|
|
- **radarr** - Gestionnaire de films
|
|
- **qbittorrent** - Client torrent
|
|
- **jellyfin** - Serveur média open-source
|
|
- **plex** - Serveur média premium
|
|
- **nextcloud** - Cloud self-hosted
|
|
- **nginx** - Serveur web / proxy
|
|
- **pihole** - DNS ad-blocker
|
|
- **homeassistant** - Domotique
|
|
- **watchtower** - Mise Ă jour automatique
|
|
- **monitoring** - Prometheus + Grafana
|
|
|
|
## đ Labels personnalisĂ©s (TrueNAS Scale Style)
|
|
|
|
```yaml
|
|
labels:
|
|
# Identifiant unique
|
|
com.innotexboard.app: "app-name"
|
|
|
|
# Catégorie fonctionnelle
|
|
com.innotexboard.category: "Media|Network|Cloud|Management|..."
|
|
|
|
# Description lisible
|
|
com.innotexboard.description: "Description"
|
|
|
|
# Version actuelle
|
|
com.innotexboard.version: "version"
|
|
|
|
# Activer/désactiver les mises à jour auto
|
|
com.innotexboard.update-enabled: "true"
|
|
|
|
# URL d'accĂšs
|
|
com.innotexboard.url: "http://localhost:port"
|
|
```
|
|
|
|
## đ Utilisation Rapide
|
|
|
|
### Via cURL
|
|
|
|
```bash
|
|
# Vérifier les mises à jour disponibles
|
|
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
|
http://localhost:8000/api/v1/docker/images/check-all-updates
|
|
|
|
# Lancer un service
|
|
curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
|
|
http://localhost:8000/api/v1/docker/compose/portainer/start
|
|
|
|
# Vérifier le statut
|
|
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
|
http://localhost:8000/api/v1/docker/compose/portainer/status
|
|
|
|
# Récupérer les logs
|
|
curl -H "Authorization: Bearer YOUR_TOKEN" \
|
|
http://localhost:8000/api/v1/docker/compose/portainer/logs?tail=50
|
|
|
|
# Mettre Ă jour une image
|
|
curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"new_image":"portainer/portainer-ce","new_tag":"latest"}' \
|
|
http://localhost:8000/api/v1/docker/containers/{container_id}/update-image
|
|
|
|
# Nettoyer les images orphelines
|
|
curl -X POST -H "Authorization: Bearer YOUR_TOKEN" \
|
|
http://localhost:8000/api/v1/docker/images/prune
|
|
```
|
|
|
|
## đ Checklist de DĂ©ploiement
|
|
|
|
- [ ] Backend: Services `update_service.py` et `compose_manager.py` créés
|
|
- [ ] Backend: Endpoints Docker mis Ă jour
|
|
- [ ] Backend: Endpoints Compose créés
|
|
- [ ] Backend: Routes mises Ă jour
|
|
- [ ] Docker: `/home/innotex/Docker` créé avec 11 docker-compose de référence
|
|
- [ ] Docker: Labels de versioning ajoutés
|
|
- [ ] Frontend: UI pour images (à implémenter)
|
|
- [ ] Frontend: UI pour mises à jour (à implémenter)
|
|
- [ ] Frontend: UI pour docker-compose (à implémenter)
|
|
- [ ] Documentation: README créé
|
|
- [ ] Tests: API testée
|
|
|
|
## đ Troubleshooting
|
|
|
|
### "Docker n'est pas accessible"
|
|
```bash
|
|
# Vérifier que Docker est accessible
|
|
docker ps
|
|
|
|
# Vérifier les permissions du socket
|
|
ls -la /var/run/docker.sock
|
|
|
|
# Ajouter l'utilisateur au groupe docker
|
|
sudo usermod -aG docker $USER
|
|
```
|
|
|
|
### "Timeout lors de la mise Ă jour"
|
|
```bash
|
|
# Les timeouts peuvent survenir sur les connexions lentes
|
|
# Augmenter le timeout dans update_service.py
|
|
# ou tirer directement l'image:
|
|
docker pull portainer/portainer-ce:latest
|
|
```
|
|
|
|
### "Erreur: Impossible de supprimer le conteneur"
|
|
```bash
|
|
# Le conteneur est peut-ĂȘtre verrouillĂ©
|
|
# Forcer avec:
|
|
docker rm -f container_name
|
|
```
|
|
|
|
## đ Ressources
|
|
|
|
- [Docker Registry V2 API](https://docs.docker.com/registry/spec/api/)
|
|
- [Docker Compose CLI](https://docs.docker.com/compose/reference/)
|
|
- [TrueNAS Scale Documentation](https://www.truenas.com/docs/scale/)
|
|
- [Portainer Docs](https://docs.portainer.io/)
|
|
|
|
## đ Notes d'ImplĂ©mentation
|
|
|
|
### Points Forts
|
|
â
Architecture similaire Ă TrueNAS Scale
|
|
â
Support du versionning sémantique
|
|
â
API centralisée pour Docker et docker-compose
|
|
â
Gestion des labels pour identification
|
|
â
Nettoyage automatique des images
|
|
|
|
### Améliorations Futures
|
|
đ Interface web complĂšte (frontend)
|
|
đ Support des webhooks Docker
|
|
đ Notifications de mise Ă jour
|
|
đ Historique des mises Ă jour
|
|
đ Rollback automatique en cas d'erreur
|
|
đ Mise Ă jour programmĂ©e (cron)
|
|
đ Support des registries privĂ©s
|