#!/usr/bin/env bash # deploy.sh — synchronise le portail PHP vers portail.alpinux.org # # Usage : # ./deploy.sh # aperçu + confirmation # ./deploy.sh -y # pousse sans confirmation # ./deploy.sh -n # dry-run seulement set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" ENV_FILE="$SCRIPT_DIR/../.env" RED='\033[0;31m'; YELLOW='\033[1;33m'; GREEN='\033[0;32m' CYAN='\033[0;36m'; BOLD='\033[1m'; RESET='\033[0m' if [ ! -f "$ENV_FILE" ]; then echo -e "${RED}Erreur : fichier .env introuvable.${RESET}" echo "Copier .env.example en .env et renseigner les valeurs." exit 1 fi # shellcheck source=/dev/null source "$ENV_FILE" LOCAL_DIR="$SCRIPT_DIR/../web" REMOTE_HOST="${PORTAIL_HOST:-alpinux.org}" REMOTE_PATH="${PORTAIL_PATH:-/var/www/clients/client1/web16/web}" if [ -n "${PORTAIL_USER:-}" ]; then REMOTE="${PORTAIL_USER}@${REMOTE_HOST}:${REMOTE_PATH}/" else REMOTE="${REMOTE_HOST}:${REMOTE_PATH}/" fi DRY_RUN=false; AUTO_YES=false for arg in "$@"; do case "$arg" in -n|--dry-run) DRY_RUN=true ;; -y|--yes) AUTO_YES=true ;; esac done EXCLUDES=( --exclude='.git/' --exclude='.env' --exclude='*.log' # Fichiers gérés par ISPConfig — ne pas toucher --exclude='error/' --exclude='stats/' --exclude='standard_index.html' ) echo -e "${BOLD}Analyse des changements…${RESET}" echo -e " Source : ${CYAN}$LOCAL_DIR/${RESET}" echo -e " Cible : ${CYAN}$REMOTE${RESET}" echo "" DIFF=$(rsync -rlcz --dry-run --itemize-changes --delete \ --rsync-path="sudo rsync" \ "${EXCLUDES[@]}" \ "$LOCAL_DIR/" "$REMOTE" 2>&1) NEW=0; CHANGED=0; DELETED=0 while IFS= read -r line; do item="${line:0:11}"; file="${line:12}" [ -z "$file" ] && continue if [[ "$item" == *"deleting"* ]]; then echo -e " ${RED}supprimé ${RESET}$file"; DELETED=$((DELETED+1)) elif [[ "$item" =~ ^\