Remove SSH multiplexing to eliminate connection errors

**Motivations:**
- SSH multiplexing (ControlMaster) was causing connection reset errors
- Complex socket management was creating more problems than it solved
- Script makes sequential SSH calls, so multiplexing not necessary
- Simpler is better - remove unnecessary complexity

**Root causes:**
- ControlMaster multiplexing was added to avoid MaxStartups errors
- But it caused connection reset, socket invalidation, and cleanup issues
- Root cause: unnecessary complexity that created more problems than it solved
- Sequential SSH calls don't need multiplexing anyway

**Correctifs:**
- Removed all ControlMaster/ControlPath configuration
- Removed cleanup_dead_ssh() function
- Removed cleanup_ssh() trap
- Removed SSH_CONTROL_DIR and SSH_CONTROL_PATH variables
- Simplified ssh_exec() to basic SSH call without multiplexing
- Kept only ConnectTimeout for basic connection management

**Evolutions:**
- Much simpler code without socket management complexity
- No more connection reset errors from multiplexing
- No more socket cleanup issues
- Each SSH call is independent and reliable

**Pages affectées:**
- deploy.sh: Removed all ControlMaster multiplexing code, simplified to basic SSH
This commit is contained in:
Nicolas Cantu 2026-01-06 14:47:46 +01:00
parent 03d0c6e4bc
commit b22259ff2f

View File

@ -8,50 +8,11 @@ DOMAIN="zapwall.fr"
APP_DIR="/var/www/${DOMAIN}"
GIT_REPO="https://git.4nkweb.com/4nk/story-research-zapwall.git"
# Configuration SSH pour connexion persistante (évite MaxStartups)
# Utiliser un chemin temporaire sans espaces pour ControlPath
SSH_CONTROL_DIR="/tmp/ssh_control_$$"
mkdir -p "${SSH_CONTROL_DIR}"
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 et du répertoire parent
# Supprimer le répertoire entier garantit que le socket est vraiment supprimé
rm -rf "${SSH_CONTROL_DIR}" 2>/dev/null || true
# Recréer le répertoire pour les prochaines connexions
mkdir -p "${SSH_CONTROL_DIR}" 2>/dev/null || true
}
# Fonction pour exécuter une commande SSH avec connexion persistante
# Fonction pour exécuter une commande SSH
ssh_exec() {
# 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=300 \
-o ConnectTimeout=10 \
${SERVER} "$@" 2>&1
ssh -o ConnectTimeout=10 ${SERVER} "$@" 2>&1
}
# Nettoyer les connexions SSH persistantes et le répertoire temporaire à la fin
cleanup_ssh() {
cleanup_dead_ssh
rm -rf "${SSH_CONTROL_DIR}" 2>/dev/null || true
}
trap cleanup_ssh EXIT
# Vérifier qu'un message de commit est fourni
if [ -z "$1" ]; then
echo "Erreur: Un message de commit est requis"