GitOps Auto-Update
KoproGo se met à jour automatiquement depuis GitHub grâce à un service systemd.
🔄 Fonctionnement
Vue d’ensemble
Le système GitOps vérifie toutes les 3 minutes s’il y a de nouveaux commits sur la branche main. Si oui, il met à jour automatiquement l’application.
┌─────────────────────────────────────────────────┐
│ Service systemd (continu) │
│ │
│ ┌──────────────────────────────────────────┐ │
│ │ Toutes les 3 minutes: │ │
│ │ │ │
│ │ 1. git fetch origin │ │
│ │ 2. Compare HEAD local vs remote │ │
│ │ 3. Si différent → Update │ │
│ │ 4. Pull images Docker │ │
│ │ 5. docker compose up -d --pull always │ │
│ │ 6. Health check HTTPS │ │
│ │ 7. Fix permissions .git/ │ │
│ │ 8. Rollback si health check échoue │ │
│ └──────────────────────────────────────────┘ │
└─────────────────────────────────────────────────┘
📝 Composants GitOps
1. Service systemd
Fichier : /etc/systemd/system/koprogo-gitops.service
[Unit]
Description=KoproGo GitOps Auto-Update
After=network.target docker.service
[Service]
Type=simple
User=root
WorkingDirectory=/home/koprogo/koprogo
ExecStart=/home/koprogo/koprogo/deploy/production/gitops-deploy.sh monitor
Restart=always
RestartSec=180
[Install]
WantedBy=multi-user.target
Caractéristiques :
Type :
simple(processus continu)User :
root(nécessaire pour docker et chown)Restart : Automatique si crash
RestartSec : 180 secondes (3 minutes entre chaque vérification)
2. Script GitOps
Fichier : /home/koprogo/koprogo/deploy/production/gitops-deploy.sh
Modes d’exécution :
# Mode monitor (utilisé par systemd)
./gitops-deploy.sh monitor
# Mode deploy manuel (force une mise à jour immédiate)
./gitops-deploy.sh deploy
3. Workflow de Mise à Jour
Étape 1 : Détection de changements
cd /home/koprogo/koprogo
git fetch origin main
LOCAL=$(git rev-parse HEAD)
REMOTE=$(git rev-parse origin/main)
if [ "$LOCAL" != "$REMOTE" ]; then
echo "📦 Nouveau commit détecté: $REMOTE"
# Continuer vers update
fi
Étape 2 : Pull du code
git pull origin main
if [ $? -ne 0 ]; then
echo "❌ Erreur git pull"
exit 1
fi
Étape 3 : Pull des images Docker
cd deploy/production
docker compose pull
# Pull depuis GitHub Container Registry:
# - ghcr.io/gilmry/koprogo-backend:latest
# - ghcr.io/gilmry/koprogo-frontend:latest
Étape 4 : Rebuild et redémarrage
docker compose up -d --pull always
# Flags:
# -d : Détaché (background)
# --pull always : Force pull des images avant up
Étape 5 : Health Check
HEALTH_URL="https://api.${DOMAIN}/api/v1/health"
for i in {1..10}; do
RESPONSE=$(curl -s -o /dev/null -w "%{http_code}" -k "$HEALTH_URL")
if [ "$RESPONSE" = "200" ]; then
echo "✅ Health check réussi"
break
fi
sleep 10
done
if [ "$RESPONSE" != "200" ]; then
echo "❌ Health check échoué après 10 tentatives"
# Rollback
git reset --hard HEAD^
docker compose up -d --force-recreate
exit 1
fi
Pourquoi ``-k`` (insecure SSL) ?
Pendant les premières secondes après déploiement, le certificat Let’s Encrypt peut ne pas être encore généré
Le health check valide quand même que l’API répond
Le certificat sera généré par Traefik dans les minutes suivantes
Étape 6 : Fix permissions Git
chown -R koprogo:koprogo /home/koprogo/koprogo/.git
# Évite les erreurs:
# error: cannot open .git/FETCH_HEAD: Permission denied
# error: cannot open .git/index: Permission denied
Étape 7 : Rollback automatique
Si le health check échoue :
echo "🔄 Rollback vers version précédente..."
# Revenir au commit précédent
git reset --hard HEAD^
# Forcer recréation containers avec ancienne version
docker compose up -d --force-recreate
# Re-check health
# Si toujours échec, alerter (TODO: notification Discord/Slack)
🎛️ Gestion du Service
Commandes systemd
# Status du service
sudo systemctl status koprogo-gitops.service
# Démarrer
sudo systemctl start koprogo-gitops.service
# Arrêter
sudo systemctl stop koprogo-gitops.service
# Redémarrer
sudo systemctl restart koprogo-gitops.service
# Activer au démarrage (déjà fait par Ansible)
sudo systemctl enable koprogo-gitops.service
# Désactiver au démarrage
sudo systemctl disable koprogo-gitops.service
Voir les logs
# Logs en temps réel
sudo journalctl -u koprogo-gitops.service -f
# Logs depuis aujourd'hui
sudo journalctl -u koprogo-gitops.service --since today
# Dernières 100 lignes
sudo journalctl -u koprogo-gitops.service -n 100
# Filtrer par mot-clé
sudo journalctl -u koprogo-gitops.service | grep "Health check"
sudo journalctl -u koprogo-gitops.service | grep "Nouveau commit"
🚀 Forcer une Mise à Jour Manuelle
Si vous ne voulez pas attendre les 3 minutes :
# Sur le VPS
ssh ubuntu@VPS_IP
# Exécuter deploy manuel
sudo /home/koprogo/koprogo/deploy/production/gitops-deploy.sh deploy
🔒 Sécurité GitOps
Permissions fichiers
# Script GitOps
-rwxr-xr-x 1 koprogo koprogo gitops-deploy.sh
# Repository Git
drwxr-xr-x 8 koprogo koprogo .git/
# Service systemd
-rw-r--r-- 1 root root koprogo-gitops.service
Accès GitHub
Le service utilise HTTPS public :
git remote -v
# origin https://github.com/gilmry/koprogo.git (fetch)
# origin https://github.com/gilmry/koprogo.git (push)
Pas de clé SSH requise pour git pull (repository public).
Pour push (dev uniquement) : Clé SSH configurée pour l’utilisateur koprogo.
📊 Monitoring GitOps
Vérifier dernière mise à jour
# Sur le VPS
cd /home/koprogo/koprogo
# Dernier commit local
git log -1 --oneline
# Dernier commit remote
git fetch origin
git log origin/main -1 --oneline
Vérifier fréquence de vérification
# Voir les derniers checks
sudo journalctl -u koprogo-gitops.service --since "10 minutes ago" | grep "Checking for updates"
# Devrait montrer des checks toutes les 3 minutes
Statistiques
# Nombre de mises à jour aujourd'hui
sudo journalctl -u koprogo-gitops.service --since today | grep "Nouveau commit détecté" | wc -l
# Uptime du service
systemctl status koprogo-gitops.service | grep "Active:"
🔧 Configuration Avancée
Changer la fréquence de vérification
Par défaut : 3 minutes (RestartSec=180)
Pour modifier :
# Éditer le service
sudo nano /etc/systemd/system/koprogo-gitops.service
# Changer RestartSec=180 vers autre valeur (en secondes)
# Exemples:
# RestartSec=60 → 1 minute
# RestartSec=300 → 5 minutes
# RestartSec=600 → 10 minutes
# Recharger systemd
sudo systemctl daemon-reload
# Redémarrer service
sudo systemctl restart koprogo-gitops.service
Ajouter notifications
Modifier le script gitops-deploy.sh pour envoyer notifications Discord/Slack :
# Après health check réussi
if [ "$RESPONSE" = "200" ]; then
# Notifier Discord
curl -X POST "$DISCORD_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{\"content\":\"✅ KoproGo mis à jour vers $NEW_COMMIT\"}"
fi
# En cas d'échec
if [ "$RESPONSE" != "200" ]; then
curl -X POST "$DISCORD_WEBHOOK_URL" \
-H "Content-Type: application/json" \
-d "{\"content\":\"❌ Échec mise à jour KoproGo, rollback effectué\"}"
fi
Changer de branche
Par défaut : branche main
Pour suivre une autre branche (ex: staging) :
# Éditer script
sudo nano /home/koprogo/koprogo/deploy/production/gitops-deploy.sh
# Remplacer toutes les occurrences de "main" par "staging"
# Ligne: git fetch origin main → git fetch origin staging
# Ligne: git pull origin main → git pull origin staging
# etc.
# Redémarrer service
sudo systemctl restart koprogo-gitops.service
❌ Désactiver GitOps
Si vous voulez gérer les mises à jour manuellement :
# Arrêter le service
sudo systemctl stop koprogo-gitops.service
# Désactiver au démarrage
sudo systemctl disable koprogo-gitops.service
# Vérifier qu'il est bien arrêté
sudo systemctl status koprogo-gitops.service
# Devrait afficher: Active: inactive (dead)
Vous devrez ensuite mettre à jour manuellement :
cd /home/koprogo/koprogo
git pull origin main
cd deploy/production
docker compose pull
docker compose up -d
🐛 Debugging GitOps
Le service ne démarre pas
# Vérifier les erreurs
sudo systemctl status koprogo-gitops.service
sudo journalctl -u koprogo-gitops.service -n 50
# Vérifier que le script existe et est exécutable
ls -la /home/koprogo/koprogo/deploy/production/gitops-deploy.sh
# Tester le script manuellement
sudo /home/koprogo/koprogo/deploy/production/gitops-deploy.sh monitor
Le service tourne mais ne met pas à jour
# Vérifier les logs pour erreurs
sudo journalctl -u koprogo-gitops.service -f
# Erreurs possibles:
# - "Permission denied" sur .git/ → Fix: chown -R koprogo:koprogo .git/
# - "docker compose: command not found" → Réinstaller Docker Compose
# - "Health check échoué" → Vérifier manuellement: curl https://api.domain.com/api/v1/health
Les mises à jour sont trop fréquentes
Si vous poussez beaucoup de commits en dev et que GitOps update trop souvent :
Option 1 : Augmenter RestartSec (voir Configuration Avancée)
Option 2 : Désactiver temporairement GitOps pendant le dev
Option 3 : Utiliser une branche séparée (ex: production) et merger seulement quand prêt
📚 Ressources
Script GitOps :
deploy/production/gitops-deploy.shService systemd :
/etc/systemd/system/koprogo-gitops.serviceLogs :
journalctl -u koprogo-gitops.service
🔗 Prochaine Étape
Problème de déploiement ? Consulter **Troubleshooting**
Dernière mise à jour : Octobre 2025
KoproGo ASBL 🚀