# 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