Remove check_ssh_connection that causes connection reset errors

**Motivations:**
- check_ssh_connection() was causing connection reset errors
- Trying to use a potentially dead ControlMaster connection for checking interferes with multiplexing
- SSH ControlMaster=auto can handle invalid sockets automatically

**Root causes:**
- check_ssh_connection() uses ssh with ControlPath to test connection
- If connection is dead, this causes 'Connection reset by peer' errors
- This check interferes with ControlMaster multiplexing
- Root cause: unnecessary pre-check that causes more problems than it solves

**Correctifs:**
- Removed check_ssh_connection() function completely
- Removed pre-execution connection validation from ssh_exec()
- Let SSH ControlMaster=auto handle invalid sockets automatically
- SSH will detect invalid socket and create new connection automatically
- Removed unnecessary keepalive options (not needed if no firewall/NAT issues)
- Simplified to basic ControlMaster configuration

**Evolutions:**
- Simpler code without interference from connection checks
- SSH handles connection management automatically
- No more connection reset errors from check_ssh_connection()

**Pages affectées:**
- deploy.sh: Removed check_ssh_connection() and simplified ssh_exec()
This commit is contained in:
Nicolas Cantu 2026-01-06 14:46:33 +01:00
parent b096efe072
commit 03d0c6e4bc

View File

@ -29,51 +29,19 @@ cleanup_dead_ssh() {
mkdir -p "${SSH_CONTROL_DIR}" 2>/dev/null || true
}
# Fonction pour vérifier si la connexion SSH maître est valide
check_ssh_connection() {
# Vérifier si le socket existe
if [ ! -S "${SSH_CONTROL_PATH}" ]; then
return 1
fi
# Tester la connexion en essayant de l'utiliser avec une commande simple
# Cela détecte si le socket existe mais la connexion est morte
# Utiliser les mêmes options de keepalive pour la cohérence
ssh -o ControlPath="${SSH_CONTROL_PATH}" \
-o ServerAliveInterval=15 \
-o ServerAliveCountMax=2 \
-o TCPKeepAlive=yes \
${SERVER} "true" 2>/dev/null || return 1
return 0
}
# Fonction pour exécuter une commande SSH avec connexion persistante
ssh_exec() {
# Toujours vérifier et nettoyer le socket avant chaque commande
# pour éviter les sockets morts qui causent "ControlSocket already exists, disabling multiplexing"
# Le socket peut devenir invalide pendant l'exécution d'une commande précédente,
# donc on vérifie systématiquement avant chaque nouvelle commande
if [ -S "${SSH_CONTROL_PATH}" ]; then
if ! check_ssh_connection; then
# Connexion morte, nettoyer avant d'exécuter
cleanup_dead_ssh
fi
fi
# Exécuter la commande SSH (une seule tentative, pas de retry)
# Configuration optimisée pour éviter les coupures de connexion :
# - ServerAliveInterval=15 : Keepalives toutes les 15 secondes (au lieu de 60)
# pour éviter que les firewalls/NAT ferment les connexions inactives
# - TCPKeepAlive=yes : Utilise les keepalives TCP au niveau système
# - ServerAliveCountMax=2 : Détecte les connexions mortes plus rapidement
# - ControlPersist=60 : Réduit le temps de persistance pour éviter les sockets morts
# Laisser SSH gérer ControlMaster automatiquement
# ControlMaster=auto va :
# - Créer une nouvelle connexion maître si le socket n'existe pas
# - Réutiliser la connexion existante si le socket est valide
# - Détecter si le socket est invalide et créer une nouvelle connexion (mais laisse le socket mort)
# Pour éviter l'accumulation de sockets morts, on nettoie le répertoire au début de chaque déploiement
# et on laisse SSH gérer le reste automatiquement
ssh -o ControlMaster=auto \
-o ControlPath="${SSH_CONTROL_PATH}" \
-o ControlPersist=60 \
-o ControlPersist=300 \
-o ConnectTimeout=10 \
-o ServerAliveInterval=15 \
-o ServerAliveCountMax=2 \
-o TCPKeepAlive=yes \
-o Compression=no \
${SERVER} "$@" 2>&1
}