Chapitre 5
Déploiement et mises à jour
Déployer une nouvelle version, revenir à la précédente, comprendre les migrations et tenir à jour les composants chaque mois.
Concerne :Équipe technique
Principe#
Le déploiement part toujours du poste de l'équipe technique, qui détient le dépôt Git. Le script deploy/deployer.sh :
- signale les fichiers suivis modifiés mais non commités (ils ne seront pas déployés) ;
- envoie au serveur, par SSH, l'archive du commit courant (
git archive HEAD) : jamais un fichier non commité, jamaisdeploy/.env; - sur le serveur, décompresse le code dans
/opt/read/code.nouveau, y lie/opt/read/.envet écrit le commit dansVERSION; - remplace
/opt/read/codepar la nouvelle version et garde la précédente dans/opt/read/code.ancien; - lance
docker compose up -d --builden arrière-plan, avec le compte rendu dans/opt/read/deploiement.log.
Le serveur n'a besoin d'aucun accès au dépôt Git.
Déployer une nouvelle version#
- Sur le poste, placez-vous sur le commit à déployer (branche
mainà jour, tests réussis). Lancez :
deploy/deployer.sh <alias-ssh>Sous Windows :
SSH=/c/Windows/System32/OpenSSH/ssh.exe deploy/deployer.sh <alias-ssh>.Suivez la construction sur le serveur :
tail -f /opt/read/deploiement.logLes constructions suivantes réutilisent les paquets NuGet déjà téléchargés (cache de construction) : quelques minutes suffisent.
Vérifiez la version et l'état :
cat /opt/read/code/VERSION cd /opt/read/code && docker compose ps -aAttendu :
app« healthy »,migrations« Exited (0) »,dbetcaddy« Up ».- Ouvrez le site, connectez-vous, parcourez quelques pages.
Pendant la construction, l'ancienne version reste en service ; seul le remplacement des conteneurs provoque une coupure de quelques secondes.
Conseil
Faites une sauvegarde juste avant un déploiement qui change le schéma de la base (sudo /opt/read/code/deploy/sauvegarde.sh) : c'est elle qui permettra un retour arrière complet.
Migrations du schéma#
À chaque docker compose up, le service migrations démarre avant l'application :
- il applique les migrations du schéma manquantes, avec le compte propriétaire (
POSTGRES_USER) ; - il crée ou met à jour le rôle de l'application (
POSTGRES_APP_USER) : droits de lecture et d'écriture sur toutes les tables (y compris les nouvelles), mais ni modification ni effacement du journal d'audit, ni écriture dans l'historique des migrations ; - il s'arrête. L'application ne démarre que s'il s'est terminé sans erreur.
L'application ne migre jamais elle-même en production (Base__Migrer=false).
Revenir à la version précédente#
Si la nouvelle version pose problème, sur le serveur :
cd /opt/read && rm -rf code && mv code.ancien code && cd code && docker compose up -d --buildAttention
Une migration déjà appliquée n'est pas défaite par ce retour arrière. Si la version fautive a modifié le schéma, l'ancienne version peut ne plus fonctionner avec la base : restaurez alors la sauvegarde faite avant le déploiement (Restauration).
Un seul niveau de retour arrière est conservé sur le serveur. Pour revenir plus loin, déployez l'ancien commit depuis le poste (git checkout <commit> puis deploy/deployer.sh).
Versions figées#
Pour qu'une construction soit reproductible, toutes les images et outils ont une version exacte :
| Composant | Version | Fichier |
|---|---|---|
| SDK .NET (construction) | mcr.microsoft.com/dotnet/sdk:10.0.401 | Dockerfile |
| ASP.NET (exécution) | mcr.microsoft.com/dotnet/aspnet:10.0.12 | Dockerfile |
| PostgreSQL | postgres:16.15-alpine | deploy/docker-compose.yml, deploy/restaurer.sh |
| Caddy | caddy:2.11.7-alpine | deploy/docker-compose.yml |
| Alpine (outils de sauvegarde) | alpine:3.24 | deploy/sauvegarde.sh, deploy/restaurer.sh, deploy/reinitialiser-demo.sh |
| rclone | rclone/rclone:1.75.1 | deploy/sauvegarde.sh |
| Paquets NuGet | versions exactes | Directory.Packages.props |
Mise à jour mensuelle#
Chaque mois, pour recevoir les correctifs de sécurité :
- Relevez la dernière version de la même branche de chaque image : Docker Hub pour
postgres:16.x-alpine,caddy:2.x-alpine,alpineetrclone/rclone; la listehttps://mcr.microsoft.com/v2/dotnet/aspnet/tags/list(et…/dotnet/sdk/…) pour .NET 10. - Mettez à jour les fichiers du tableau ci-dessus.
- Lancez la suite de tests (
dotnet test, Docker requis), commitez. - Faites une sauvegarde, puis déployez.
- Vérifiez le site, puis lancez une restauration d'essai.
Le système du serveur se met à jour seul (unattended-upgrades). Docker, lui, se met à jour par apt : sudo apt update && sudo apt upgrade lors d'une fenêtre de maintenance, suivi d'une vérification des conteneurs.
Danger
Ne changez jamais la version majeure de PostgreSQL (16) en modifiant seulement l'image : les fichiers du volume pgdata ne sont pas compatibles d'une version majeure à l'autre. Une montée de version se fait par une sauvegarde (pg_dump), une base neuve et une restauration.