Fonctionnalités principales : 1. Marchés hybrides - Onglet Mercurial - Ajout onglet Mercurial avec style distinct (vert, gras, blanc) - Affichage des produits mercuriaux pour marchés hybrides - Filtrage automatique des produits "Hors Marché 999" - Documentation Phase 2 avec CAS 1 et CAS 2 de marchés hybrides - Règles métier pour validation différenciée (devis 100% mercurial vs mixte) 2. Corrections bugs - Fix flag chkChange sur onglet "Sélection Produits" (callback asynchrone) - Plus d'alerte intempestive après sauvegarde des produits 3. Outils de déploiement - Nouveau script deploy-file.sh pour déploiement unitaire (DEV/PROD) - Amélioration deploy-cleo.sh 4. Gestion multi-contacts (v2.0.3) - Contrôleur AJAX cjxcontacts.php - Script migration clients_contacts - Documentation complète 5. Documentation - Mise à jour TODO.md avec Phase 2 marchés hybrides - Mise à jour README.md v2.0.3 - Ajout RULES.md - Ajout migration_clients_contacts.sql 6. Nettoyage - Suppression fichiers obsolètes (conf_new.php, conf_old.php, uof_linet_20250911.sql) 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
315 lines
9.7 KiB
Bash
Executable File
315 lines
9.7 KiB
Bash
Executable File
#!/bin/bash
|
|
|
|
# Script de déploiement optimisé de Cleo
|
|
# Version: 2.1 - Supporte déploiement DEV et PROD
|
|
# Usage: ./deploy-cleo.sh [pra]
|
|
# Sans argument : Déploie depuis local vers IN3/dva-front (DEV)
|
|
# Avec 'pra' : Déploie depuis IN3/dva-front vers IN4/pra-front (PROD)
|
|
|
|
cd /home/pierre/dev/cleo
|
|
|
|
# Détecter le mode de déploiement
|
|
DEPLOY_MODE=${1:-dev}
|
|
|
|
if [ "$DEPLOY_MODE" = "pra" ]; then
|
|
# Configuration PROD : IN3/dva-front → IN4/pra-front
|
|
SOURCE_HOST=11.1.2.1
|
|
SOURCE_SSH_USER=root
|
|
SOURCE_SSH_PORT=22
|
|
SOURCE_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi
|
|
SOURCE_CT_PROJECT=default
|
|
SOURCE_CT_NAME=dva-front
|
|
SOURCE_DEPLOY_DIR=/var/www/cleo
|
|
|
|
TARGET_HOST=11.1.2.14
|
|
TARGET_SSH_USER=root
|
|
TARGET_SSH_PORT=22
|
|
TARGET_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi
|
|
TARGET_CT_PROJECT=default
|
|
TARGET_CT_NAME=pra-front
|
|
TARGET_DEPLOY_DIR=/var/www/cleo
|
|
|
|
APP_NAME=cleo
|
|
SKIP_ENV=true
|
|
else
|
|
# Configuration DEV : local → IN3/dva-front
|
|
HOST_SSH_HOST=195.154.80.116
|
|
HOST_SSH_USER=root
|
|
HOST_SSH_PORT=22
|
|
HOST_SSH_KEY=/home/pierre/.ssh/id_rsa_mbpi
|
|
|
|
CT_PROJECT_NAME=default
|
|
CT_NAME=dva-front
|
|
CT_IP=13.23.33.42
|
|
DEPLOY_DIR=/var/www
|
|
APP_NAME=cleo
|
|
SKIP_ENV=false
|
|
fi
|
|
|
|
# Propriétaire et groupe pour les fichiers et dossiers de destination
|
|
OWNER=nobody
|
|
GROUP=nginx
|
|
|
|
# Couleurs pour l'affichage
|
|
RED='\033[0;31m'
|
|
GREEN='\033[0;32m'
|
|
YELLOW='\033[1;33m'
|
|
NC='\033[0m' # No Color
|
|
|
|
# Définir les options SSH
|
|
SSH_OPTS="-p $HOST_SSH_PORT"
|
|
if [ ! -z "$HOST_SSH_KEY" ]; then
|
|
SSH_OPTS="$SSH_OPTS -i $HOST_SSH_KEY"
|
|
fi
|
|
|
|
# Afficher les paramètres
|
|
echo -e "${GREEN}=== Déploiement optimisé CLEO ===${NC}"
|
|
if [ "$DEPLOY_MODE" = "pra" ]; then
|
|
echo "Mode: PRODUCTION (DEV → PROD)"
|
|
echo "Source: $SOURCE_CT_NAME ($SOURCE_DEPLOY_DIR)"
|
|
echo "Destination: $TARGET_CT_NAME ($TARGET_DEPLOY_DIR)"
|
|
echo "Note: Le fichier .env ne sera PAS écrasé"
|
|
else
|
|
echo "Mode: DÉVELOPPEMENT (Local → DEV)"
|
|
echo "Serveur hôte: $HOST_SSH_USER@$HOST_SSH_HOST:$HOST_SSH_PORT"
|
|
echo "Conteneur: $CT_NAME"
|
|
echo "Déploiement: $DEPLOY_DIR/$APP_NAME"
|
|
fi
|
|
echo "=================================="
|
|
|
|
if [ "$DEPLOY_MODE" = "pra" ]; then
|
|
# ===== MODE PROD: Déploiement IN3/dva-front → IN4/pra-front =====
|
|
|
|
echo -e "${YELLOW}1. Création de l'archive depuis IN3/dva-front...${NC}"
|
|
|
|
# Définir les options SSH pour source et target
|
|
SOURCE_SSH_OPTS="-p $SOURCE_SSH_PORT -i $SOURCE_SSH_KEY"
|
|
TARGET_SSH_OPTS="-p $TARGET_SSH_PORT -i $TARGET_SSH_KEY"
|
|
|
|
# Définir les options SCP (port avec -P majuscule)
|
|
SOURCE_SCP_OPTS="-P $SOURCE_SSH_PORT -i $SOURCE_SSH_KEY"
|
|
TARGET_SCP_OPTS="-P $TARGET_SSH_PORT -i $TARGET_SSH_KEY"
|
|
|
|
# Script sur IN3 pour créer l'archive
|
|
SOURCE_SCRIPT="
|
|
set -e
|
|
incus project switch $SOURCE_CT_PROJECT
|
|
echo 'Création de l archive depuis dva-front...'
|
|
incus exec $SOURCE_CT_NAME -- sh -c '
|
|
cd $SOURCE_DEPLOY_DIR && \
|
|
tar -czf /tmp/cleo-prod.tar.gz \
|
|
--exclude=\".git\" \
|
|
--exclude=\"log/*.log\" \
|
|
--exclude=\"pub/files/upload/*\" \
|
|
--exclude=\"docs\" \
|
|
--exclude=\"migration\" \
|
|
--exclude=\".claude\" \
|
|
--exclude=\".vscode\" \
|
|
--exclude=\"vendor\" \
|
|
--exclude=\"backup_*\" \
|
|
--exclude=\"*.tar.gz\" \
|
|
--exclude=\".env\" \
|
|
--exclude=\".env.swp\" \
|
|
.
|
|
'
|
|
incus file pull $SOURCE_CT_NAME/tmp/cleo-prod.tar.gz /tmp/
|
|
incus exec $SOURCE_CT_NAME -- rm -f /tmp/cleo-prod.tar.gz
|
|
"
|
|
|
|
ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "$SOURCE_SCRIPT"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}Erreur lors de la création de l'archive${NC}"
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✓ Archive créée sur IN3${NC}"
|
|
|
|
# Transférer l'archive de IN3 vers IN4
|
|
echo -e "${YELLOW}2. Transfert de l'archive IN3 → IN4...${NC}"
|
|
scp $SOURCE_SCP_OPTS $SOURCE_SSH_USER@$SOURCE_HOST:/tmp/cleo-prod.tar.gz /tmp/
|
|
scp $TARGET_SCP_OPTS /tmp/cleo-prod.tar.gz $TARGET_SSH_USER@$TARGET_HOST:/tmp/
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}Erreur lors du transfert de l'archive${NC}"
|
|
rm -f /tmp/cleo-prod.tar.gz
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✓ Archive transférée vers IN4${NC}"
|
|
|
|
# Déployer sur IN4/pra-front
|
|
echo -e "${YELLOW}3. Déploiement dans IN4/pra-front...${NC}"
|
|
|
|
TARGET_SCRIPT="
|
|
set -e
|
|
incus project switch $TARGET_CT_PROJECT
|
|
echo 'Transfert de l archive dans pra-front...'
|
|
incus file push /tmp/cleo-prod.tar.gz $TARGET_CT_NAME/tmp/
|
|
|
|
echo 'Déploiement dans pra-front (backup .env)...'
|
|
incus exec $TARGET_CT_NAME -- sh -c '
|
|
cp $TARGET_DEPLOY_DIR/.env /tmp/.env.backup && \
|
|
cd $TARGET_DEPLOY_DIR && \
|
|
tar -xzf /tmp/cleo-prod.tar.gz && \
|
|
mv /tmp/.env.backup $TARGET_DEPLOY_DIR/.env && \
|
|
rm -f /tmp/cleo-prod.tar.gz
|
|
'
|
|
|
|
echo 'Configuration des permissions...'
|
|
incus exec $TARGET_CT_NAME -- sh -c '
|
|
chown -R $OWNER:$GROUP $TARGET_DEPLOY_DIR && \
|
|
find $TARGET_DEPLOY_DIR -type d -exec chmod 755 {} \; && \
|
|
find $TARGET_DEPLOY_DIR -type f -exec chmod 644 {} \; && \
|
|
mkdir -p $TARGET_DEPLOY_DIR/log && \
|
|
chmod 775 $TARGET_DEPLOY_DIR/log && \
|
|
touch $TARGET_DEPLOY_DIR/log/\$(date +%m%d).log && \
|
|
chmod 664 $TARGET_DEPLOY_DIR/log/\$(date +%m%d).log && \
|
|
chown $OWNER:$GROUP $TARGET_DEPLOY_DIR/log/*.log && \
|
|
chmod 640 $TARGET_DEPLOY_DIR/.env && \
|
|
if [ -d $TARGET_DEPLOY_DIR/pub/files/upload ]; then
|
|
chmod 775 $TARGET_DEPLOY_DIR/pub/files/upload && \
|
|
chown $OWNER:$GROUP $TARGET_DEPLOY_DIR/pub/files/upload
|
|
fi
|
|
'
|
|
|
|
rm -f /tmp/cleo-prod.tar.gz
|
|
echo 'Déploiement PROD terminé!'
|
|
"
|
|
|
|
ssh $TARGET_SSH_OPTS $TARGET_SSH_USER@$TARGET_HOST "$TARGET_SCRIPT"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}Erreur lors du déploiement PROD${NC}"
|
|
rm -f /tmp/cleo-prod.tar.gz
|
|
ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "rm -f /tmp/cleo-prod.tar.gz"
|
|
exit 1
|
|
fi
|
|
|
|
# Nettoyer les archives locales et distantes
|
|
echo -e "${YELLOW}4. Nettoyage...${NC}"
|
|
rm -f /tmp/cleo-prod.tar.gz
|
|
ssh $SOURCE_SSH_OPTS $SOURCE_SSH_USER@$SOURCE_HOST "rm -f /tmp/cleo-prod.tar.gz"
|
|
echo -e "${GREEN}✓ Nettoyage terminé${NC}"
|
|
|
|
else
|
|
# ===== MODE DEV: Déploiement local → IN3/dva-front =====
|
|
|
|
# 1. Créer l'archive tar.gz localement
|
|
echo -e "${YELLOW}1. Création de l'archive...${NC}"
|
|
tar -czf /tmp/cleo.tar.gz \
|
|
--exclude='.git' \
|
|
--exclude='log/*.log' \
|
|
--exclude='pub/files/upload/*' \
|
|
--exclude='docs' \
|
|
--exclude='migration' \
|
|
--exclude='.claude' \
|
|
--exclude='.vscode' \
|
|
--exclude='vendor' \
|
|
--exclude='backup_*' \
|
|
--exclude='*.tar.gz' \
|
|
--exclude='.env' \
|
|
--exclude='.env.swp' \
|
|
.
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}Erreur lors de la création de l'archive${NC}"
|
|
exit 1
|
|
fi
|
|
|
|
ARCHIVE_SIZE=$(du -h /tmp/cleo.tar.gz | cut -f1)
|
|
echo -e "${GREEN}✓ Archive créée: /tmp/cleo.tar.gz ($ARCHIVE_SIZE)${NC}"
|
|
|
|
# 2. Copier l'archive vers IN3
|
|
echo -e "${YELLOW}2. Transfert de l'archive vers IN3...${NC}"
|
|
scp -P $HOST_SSH_PORT -i $HOST_SSH_KEY /tmp/cleo.tar.gz $HOST_SSH_USER@$HOST_SSH_HOST:/tmp/
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}Erreur lors du transfert de l'archive${NC}"
|
|
rm -f /tmp/cleo.tar.gz
|
|
exit 1
|
|
fi
|
|
echo -e "${GREEN}✓ Archive transférée sur IN3${NC}"
|
|
|
|
# 3. Nettoyer l'ancien répertoire /tmp/cleo sur IN3 s'il existe
|
|
echo -e "${YELLOW}3. Nettoyage des anciens fichiers temporaires sur IN3...${NC}"
|
|
ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "rm -rf /tmp/cleo 2>/dev/null || true"
|
|
echo -e "${GREEN}✓ Nettoyage effectué${NC}"
|
|
|
|
# 4. Transférer et extraire dans le conteneur
|
|
echo -e "${YELLOW}4. Déploiement dans le conteneur $CT_NAME...${NC}"
|
|
|
|
# Script à exécuter sur IN3
|
|
REMOTE_SCRIPT="
|
|
set -e
|
|
|
|
# Sélectionner le projet Incus
|
|
incus project switch $CT_PROJECT_NAME
|
|
|
|
# Transférer l'archive dans le conteneur
|
|
echo 'Transfert de l archive dans le conteneur...'
|
|
incus file push /tmp/cleo.tar.gz $CT_NAME/tmp/
|
|
|
|
# Créer le répertoire de destination et extraire
|
|
echo 'Extraction de l archive...'
|
|
incus exec $CT_NAME -- sh -c '
|
|
mkdir -p $DEPLOY_DIR/$APP_NAME && \
|
|
cd $DEPLOY_DIR/$APP_NAME && \
|
|
tar -xzf /tmp/cleo.tar.gz && \
|
|
rm -f /tmp/cleo.tar.gz
|
|
'
|
|
|
|
# Configurer les permissions
|
|
echo 'Configuration des permissions...'
|
|
incus exec $CT_NAME -- sh -c '
|
|
chown -R $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME && \
|
|
find $DEPLOY_DIR/$APP_NAME -type d -exec chmod 755 {} \; && \
|
|
find $DEPLOY_DIR/$APP_NAME -type f -exec chmod 644 {} \; && \
|
|
mkdir -p $DEPLOY_DIR/$APP_NAME/log && \
|
|
chmod 775 $DEPLOY_DIR/$APP_NAME/log && \
|
|
touch $DEPLOY_DIR/$APP_NAME/log/\$(date +%m%d).log && \
|
|
chmod 664 $DEPLOY_DIR/$APP_NAME/log/\$(date +%m%d).log && \
|
|
chown $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME/log/*.log && \
|
|
chmod 640 $DEPLOY_DIR/$APP_NAME/.env && \
|
|
rm -f $DEPLOY_DIR/$APP_NAME/.env.swp && \
|
|
if [ -d $DEPLOY_DIR/$APP_NAME/pub/files/upload ]; then
|
|
chmod 775 $DEPLOY_DIR/$APP_NAME/pub/files/upload && \
|
|
chown $OWNER:$GROUP $DEPLOY_DIR/$APP_NAME/pub/files/upload
|
|
fi
|
|
'
|
|
|
|
# Nettoyer l'archive sur IN3
|
|
rm -f /tmp/cleo.tar.gz
|
|
|
|
echo 'Déploiement terminé avec succès!'
|
|
"
|
|
|
|
# Exécuter le script sur IN3
|
|
ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "$REMOTE_SCRIPT"
|
|
|
|
if [ $? -ne 0 ]; then
|
|
echo -e "${RED}Erreur lors du déploiement${NC}"
|
|
# Nettoyer l'archive locale et distante
|
|
rm -f /tmp/cleo.tar.gz
|
|
ssh $SSH_OPTS $HOST_SSH_USER@$HOST_SSH_HOST "rm -f /tmp/cleo.tar.gz 2>/dev/null || true"
|
|
exit 1
|
|
fi
|
|
|
|
# 5. Nettoyer l'archive locale
|
|
echo -e "${YELLOW}5. Nettoyage local...${NC}"
|
|
rm -f /tmp/cleo.tar.gz
|
|
echo -e "${GREEN}✓ Archive locale supprimée${NC}"
|
|
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${GREEN}===================================================${NC}"
|
|
echo -e "${GREEN} Déploiement terminé avec succès ! ${NC}"
|
|
echo -e "${GREEN}===================================================${NC}"
|
|
if [ "$DEPLOY_MODE" = "pra" ]; then
|
|
echo "Site: https://cleo.unikoffice.com"
|
|
echo "Environnement: PRODUCTION (pra-front)"
|
|
else
|
|
echo "Site: http://dcleo.unikoffice.com"
|
|
echo "Environnement: DÉVELOPPEMENT (dva-front)"
|
|
echo "Chemin: $DEPLOY_DIR/$APP_NAME sur $CT_NAME"
|
|
fi
|
|
echo "" |