Opérations courantes
Les commandes du quotidien. Sauf mention contraire, les commandes Ansible se lancent depuis timemanager-devops/ansible/ sur ton ordinateur.
Déployer
Fusionner dans main. Jenkins voit le changement dans les deux minutes et déploie tout seul. Rien d'autre à faire. Voir D'un commit à la prod.
Se connecter aux machines
ssh eliashounnou@34.140.149.187 # tm-prod
ssh eliashounnou@34.156.3.169 # tm-toolingVoir l'état de l'application
Sur tm-prod :
cd /opt/timemanager/app
docker compose ps # les trois services et leur état
docker compose logs -f back # les journaux de l'API, en direct
docker compose logs --tail 100 front
docker logs -f timemanager-traefik # les journaux de Traefik (une ligne par requête)Ou depuis ton poste, sans te connecter, avec une commande Ansible ponctuelle (depuis timemanager-devops/ansible/) :
ansible prod -b --ask-vault-pass -a "docker logs --tail 50 timemanager-back"Vérifier de l'extérieur :
curl -I https://time.jostud.com
curl -I https://api.time.jostud.com/api/auth/me # 401 attendu : l'API répondRedémarrer un service
cd /opt/timemanager/app
docker compose restart backPour recréer le conteneur (après un changement de .env par exemple) :
docker compose up -d --force-recreate backRedéployer à la main
Depuis Jenkins : ouvrir le pipeline backend ou le pipeline frontend, puis Build Now. Le pipeline complet est relancé sur le dernier commit de main.
Ou directement sur tm-prod, pour reprendre la dernière image publiée :
cd /opt/timemanager/app
docker compose pull back
docker compose up -d backRevenir à une version précédente
La production fait tourner :latest. Chaque build publie aussi l'image avec le SHA de son commit. Pour revenir en arrière, on remet une ancienne image sous l'étiquette latest sur GHCR, puis on redéploie :
docker pull ghcr.io/saliehsab/timemanager-api:<ancien-sha>
docker tag ghcr.io/saliehsab/timemanager-api:<ancien-sha> ghcr.io/saliehsab/timemanager-api:latest
docker push ghcr.io/saliehsab/timemanager-api:latestLe push demande un jeton avec le droit d'écriture sur GHCR (celui de Jenkins, pas le jeton en lecture seule de tm-prod). Ensuite, sur tm-prod :
cd /opt/timemanager/app
docker compose pull back
docker compose up -d backLes SHA disponibles sont dans l'historique des builds Jenkins, ou dans git log :
git log --oneline -- timemanager-apiLes migrations ne reviennent pas en arrière
Si la version récente a modifié la base (une migration), revenir à l'ancienne image ne défait pas cette migration. Vérifier avec l'équipe backend avant un retour arrière.
Le prochain build écrase le retour arrière
Le prochain commit dans main republiera latest. Pour un retour durable, il faut un git revert dans main.
La base de données
Ouvrir une console PostgreSQL :
docker exec -it timemanager-db psql -U timemanager timemanagerFaire une sauvegarde :
docker exec timemanager-db pg_dump -U timemanager timemanager > backup-$(date +%F).sqlLa restaurer :
docker exec -i timemanager-db psql -U timemanager timemanager < backup-2026-10-13.sqlModifier l'infrastructure
| Je veux... | Je modifie | Puis je lance |
|---|---|---|
| Ajouter ou changer une route | traefik/dynamic/*.yml | ansible-playbook playbook.yml --tags traefik --ask-vault-pass |
| Changer le compose de prod | app/docker-compose.yml | ansible-playbook playbook.yml --tags app --ask-vault-pass |
| Ajouter une variable à l'API | roles/app/tasks/main.yml + app/docker-compose.yml | --tags app |
| Changer un secret | ansible-vault edit group_vars/prod.yml | --tags app |
| Ajouter un plugin Jenkins | jenkins/Plugins/plugins.txt | --tags jenkins |
| Ajouter un job | jenkins/job_dsl.groovy | --tags jenkins |
| Modifier un pipeline | jenkins/pipelines/*.groovy | rien : merger dans main suffit |
| Ouvrir un port | roles/ufw/tasks/main.yml | --tags ufw |
Toujours vérifier avant :
ansible-playbook playbook.yml --tags app --check --diff --ask-vault-passLe disque
Les builds remplissent vite le disque de tm-tooling. Une tâche cron le nettoie chaque nuit à 4 h (images et cache de plus de 72 h). Pour le faire tout de suite :
df -h
docker system df
docker image prune -af --filter until=72h
docker builder prune -af --filter until=72hSur tm-prod, chaque déploiement nettoie déjà les images inutilisées (docker image prune -af).
Les certificats
Rien à faire : Traefik les renouvelle. Pour vérifier une date d'expiration :
echo | openssl s_client -connect api.time.jostud.com:443 -servername api.time.jostud.com 2>/dev/null | openssl x509 -noout -datesAccéder à Jenkins
Par ci.time.jostud.com, ou par un tunnel SSH :
ssh -N -L 8080:10.132.0.3:8080 eliashounnou@34.156.3.169puis http://localhost:8080. Voir Jenkins.
Arrêter les VM pour économiser
gcloud compute instances stop tm-prod tm-tooling --zone=europe-west1-b
gcloud compute instances start tm-prod tm-tooling --zone=europe-west1-bLes IP statiques ne changent pas, et tous les conteneurs redémarrent tout seuls. Voir Coûts.