Skip to content

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 ​

bash
ssh eliashounnou@34.140.149.187   # tm-prod
ssh eliashounnou@34.156.3.169     # tm-tooling

Voir l'état de l'application ​

Sur tm-prod :

bash
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/) :

bash
ansible prod -b --ask-vault-pass -a "docker logs --tail 50 timemanager-back"

Vérifier de l'extérieur :

bash
curl -I https://time.jostud.com
curl -I https://api.time.jostud.com/api/auth/me    # 401 attendu : l'API répond

Redémarrer un service ​

bash
cd /opt/timemanager/app
docker compose restart back

Pour recréer le conteneur (après un changement de .env par exemple) :

bash
docker compose up -d --force-recreate back

Redé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 :

bash
cd /opt/timemanager/app
docker compose pull back
docker compose up -d back

Revenir à 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 :

bash
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:latest

Le 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 :

bash
cd /opt/timemanager/app
docker compose pull back
docker compose up -d back

Les SHA disponibles sont dans l'historique des builds Jenkins, ou dans git log :

bash
git log --oneline -- timemanager-api

Les 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 :

bash
docker exec -it timemanager-db psql -U timemanager timemanager

Faire une sauvegarde :

bash
docker exec timemanager-db pg_dump -U timemanager timemanager > backup-$(date +%F).sql

La restaurer :

bash
docker exec -i timemanager-db psql -U timemanager timemanager < backup-2026-10-13.sql

Modifier l'infrastructure ​

Je veux...Je modifiePuis je lance
Ajouter ou changer une routetraefik/dynamic/*.ymlansible-playbook playbook.yml --tags traefik --ask-vault-pass
Changer le compose de prodapp/docker-compose.ymlansible-playbook playbook.yml --tags app --ask-vault-pass
Ajouter une variable à l'APIroles/app/tasks/main.yml + app/docker-compose.yml--tags app
Changer un secretansible-vault edit group_vars/prod.yml--tags app
Ajouter un plugin Jenkinsjenkins/Plugins/plugins.txt--tags jenkins
Ajouter un jobjenkins/job_dsl.groovy--tags jenkins
Modifier un pipelinejenkins/pipelines/*.groovyrien : merger dans main suffit
Ouvrir un portroles/ufw/tasks/main.yml--tags ufw

Toujours vérifier avant :

bash
ansible-playbook playbook.yml --tags app --check --diff --ask-vault-pass

Le 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 :

bash
df -h
docker system df
docker image prune -af --filter until=72h
docker builder prune -af --filter until=72h

Sur 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 :

bash
echo | openssl s_client -connect api.time.jostud.com:443 -servername api.time.jostud.com 2>/dev/null | openssl x509 -noout -dates

Accéder à Jenkins ​

Par ci.time.jostud.com, ou par un tunnel SSH :

bash
ssh -N -L 8080:10.132.0.3:8080 eliashounnou@34.156.3.169

puis http://localhost:8080. Voir Jenkins.

Arrêter les VM pour économiser ​

bash
gcloud compute instances stop tm-prod tm-tooling --zone=europe-west1-b
gcloud compute instances start tm-prod tm-tooling --zone=europe-west1-b

Les IP statiques ne changent pas, et tous les conteneurs redémarrent tout seuls. Voir Coûts.