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 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 # Fonction pour exécuter une commande SSH avec connexion persistante
ssh_exec() { ssh_exec() {
# Toujours vérifier et nettoyer le socket avant chaque commande # Laisser SSH gérer ControlMaster automatiquement
# pour éviter les sockets morts qui causent "ControlSocket already exists, disabling multiplexing" # ControlMaster=auto va :
# Le socket peut devenir invalide pendant l'exécution d'une commande précédente, # - Créer une nouvelle connexion maître si le socket n'existe pas
# donc on vérifie systématiquement avant chaque nouvelle commande # - Réutiliser la connexion existante si le socket est valide
if [ -S "${SSH_CONTROL_PATH}" ]; then # - Détecter si le socket est invalide et créer une nouvelle connexion (mais laisse le socket mort)
if ! check_ssh_connection; then # Pour éviter l'accumulation de sockets morts, on nettoie le répertoire au début de chaque déploiement
# Connexion morte, nettoyer avant d'exécuter # et on laisse SSH gérer le reste automatiquement
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
ssh -o ControlMaster=auto \ ssh -o ControlMaster=auto \
-o ControlPath="${SSH_CONTROL_PATH}" \ -o ControlPath="${SSH_CONTROL_PATH}" \
-o ControlPersist=60 \ -o ControlPersist=300 \
-o ConnectTimeout=10 \ -o ConnectTimeout=10 \
-o ServerAliveInterval=15 \
-o ServerAliveCountMax=2 \
-o TCPKeepAlive=yes \
-o Compression=no \
${SERVER} "$@" 2>&1 ${SERVER} "$@" 2>&1
} }