Reduce SSH connection attempts and improve socket cleanup

**Motivations:**
- Too many SSH connection attempts were being made during deployment
- ControlMaster socket cleanup was not aggressive enough
- Multiple SSH calls at step 5 created excessive connection attempts

**Root causes:**
- ControlMaster socket could remain but be invalid, causing SSH to disable multiplexing
- Each ssh_exec had up to 3 retries, and step 5 made 4-5 ssh_exec calls
- Socket cleanup was not forceful enough to remove invalid sockets
- Complex retry logic at step 5 created unnecessary SSH calls

**Correctifs:**
- Improved cleanup_dead_ssh() to forcefully remove socket and wait for proper closure
- Reduced max retries in ssh_exec from 3 to 2
- Simplified step 5 logic to reduce SSH calls from 4-5 to 2 (one check, one init if needed)
- Combined Git initialization commands into single SSH call to reduce connections
- Added sleep after socket cleanup to ensure proper closure

**Evolutions:**
- More efficient SSH connection management
- Reduced deployment time by minimizing connection attempts

**Pages affectées:**
- deploy.sh: Improved cleanup_dead_ssh(), reduced retries, simplified step 5 logic
This commit is contained in:
Nicolas Cantu 2026-01-06 14:31:04 +01:00
parent 20032c00ae
commit 7cbb57f8c9

View File

@ -16,8 +16,16 @@ SSH_CONTROL_PATH="${SSH_CONTROL_DIR}/debian_92.243.27.35_22"
# Fonction pour nettoyer une connexion SSH morte
cleanup_dead_ssh() {
# Essayer de fermer proprement la connexion si elle existe
if [ -S "${SSH_CONTROL_PATH}" ]; then
ssh -O exit -o ControlPath="${SSH_CONTROL_PATH}" ${SERVER} 2>/dev/null || true
# Attendre un peu pour que la fermeture se termine
sleep 0.5
fi
# Forcer la suppression du socket même s'il existe encore
rm -f "${SSH_CONTROL_PATH}" 2>/dev/null || true
# Nettoyer aussi le répertoire parent s'il est vide
rmdir "${SSH_CONTROL_DIR}" 2>/dev/null || true
}
# Fonction pour vérifier si la connexion SSH maître est valide
@ -27,11 +35,11 @@ check_ssh_connection() {
# Fonction pour exécuter une commande SSH avec connexion persistante et gestion d'erreurs robuste
ssh_exec() {
local max_retries=3
local max_retries=2
local retry_count=0
while [ $retry_count -lt $max_retries ]; do
# Vérifier si la connexion maître existe et est valide
# Nettoyer le socket s'il existe mais est invalide
if [ -S "${SSH_CONTROL_PATH}" ]; then
if ! check_ssh_connection; then
# Connexion morte, nettoyer avant de réessayer
@ -40,6 +48,7 @@ ssh_exec() {
fi
# Exécuter la commande SSH
# Si le socket existe mais est invalide, SSH avec ControlMaster=auto le détectera et créera une nouvelle connexion
if ssh -o ControlMaster=auto \
-o ControlPath="${SSH_CONTROL_PATH}" \
-o ControlPersist=300 \
@ -146,27 +155,11 @@ echo ""
echo "5. Vérification du dépôt Git sur le serveur..."
if ssh_exec "cd ${APP_DIR} && git status >/dev/null 2>&1" >/dev/null 2>&1; then
echo " ✓ Dépôt Git détecté"
else
SSH_EXIT_CODE=$?
# Vérifier si c'est une erreur de connexion SSH ou si Git n'est pas initialisé
if [ $SSH_EXIT_CODE -ne 0 ]; then
echo " ⚠ Erreur de connexion SSH ou dépôt Git non initialisé"
echo " Tentative de nettoyage et nouvelle connexion..."
cleanup_dead_ssh
sleep 2
# Réessayer une fois après nettoyage
if ssh_exec "cd ${APP_DIR} && git status >/dev/null 2>&1" >/dev/null 2>&1; then
echo " ✓ Dépôt Git détecté après réessai"
else
echo " ⚠ Dépôt Git non initialisé, initialisation..."
ssh_exec "cd ${APP_DIR} && git init && git remote add origin ${GIT_REPO} 2>/dev/null || git remote set-url origin ${GIT_REPO}"
ssh_exec "cd ${APP_DIR} && git checkout -b ${BRANCH} 2>/dev/null || true"
fi
else
echo " ⚠ Dépôt Git non initialisé, initialisation..."
ssh_exec "cd ${APP_DIR} && git init && git remote add origin ${GIT_REPO} 2>/dev/null || git remote set-url origin ${GIT_REPO}"
ssh_exec "cd ${APP_DIR} && git checkout -b ${BRANCH} 2>/dev/null || true"
fi
# Initialiser le dépôt Git en une seule commande pour réduire les appels SSH
ssh_exec "cd ${APP_DIR} && (git init 2>/dev/null || true) && (git remote add origin ${GIT_REPO} 2>/dev/null || git remote set-url origin ${GIT_REPO}) && (git checkout -b ${BRANCH} 2>/dev/null || true)"
echo " ✓ Dépôt Git initialisé"
fi
# Récupérer les dernières modifications