- Inscription sans redirection HelloAsso (acte volontaire séparé) - Génération automatique d'identifiant AlpID (prenom.code mnémotechnique) - Profil en tuiles : identité, compte, mot de passe, OTP, adhésion, adresse, connexions - Double authentification : activation/suppression OTP via Keycloak - Page d'accueil contextuelle (bienvenue si connecté, CTA adhésion si non adhérent) - Historique des connexions avec statistiques et graphiques Chart.js - Géocodage Nominatim + lien OpenStreetMap pour l'adresse - HelloAsso : checkout intent, validation paiement, mise à jour Dolibarr Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
105 lines
3 KiB
Bash
Executable file
105 lines
3 KiB
Bash
Executable file
#!/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" =~ ^\<f\+{6,} ]]; then echo -e " ${GREEN}nouveau ${RESET}$file"; NEW=$((NEW+1))
|
|
elif [[ "$item" =~ ^\<f ]]; then echo -e " ${YELLOW}modifié ${RESET}$file"; CHANGED=$((CHANGED+1))
|
|
fi
|
|
done <<< "$DIFF"
|
|
|
|
TOTAL=$((NEW+CHANGED+DELETED))
|
|
if [ "$TOTAL" -eq 0 ]; then
|
|
echo -e "${GREEN}Tout est à jour.${RESET}"; exit 0
|
|
fi
|
|
|
|
echo ""
|
|
echo -e " ${GREEN}+$NEW nouveau(x)${RESET} ${YELLOW}~$CHANGED modifié(s)${RESET} ${RED}-$DELETED supprimé(s)${RESET}"
|
|
echo ""
|
|
|
|
if $DRY_RUN; then echo -e "${CYAN}Mode dry-run — aucune modification.${RESET}"; exit 0; fi
|
|
|
|
if ! $AUTO_YES; then
|
|
read -rp "Pousser vers $REMOTE_HOST ? [o/N] " confirm
|
|
[[ "$confirm" =~ ^[oOyY]$ ]] || { echo "Annulé."; exit 0; }
|
|
fi
|
|
|
|
DELETE_FLAG=()
|
|
if [ "$DELETED" -gt 0 ]; then
|
|
echo -e "${RED}${BOLD}$DELETED fichier(s) seront supprimés du serveur.${RESET}"
|
|
read -rp "Confirmer les suppressions ? [o/N] " confirm_del
|
|
[[ "$confirm_del" =~ ^[oOyY]$ ]] && DELETE_FLAG=(--delete)
|
|
fi
|
|
|
|
echo ""
|
|
echo -e "${BOLD}Synchronisation…${RESET}"
|
|
rsync -rlcz --human-readable --progress \
|
|
--rsync-path="sudo rsync" \
|
|
"${DELETE_FLAG[@]}" \
|
|
"${EXCLUDES[@]}" \
|
|
"$LOCAL_DIR/" "$REMOTE"
|
|
|
|
echo ""
|
|
echo -e "${GREEN}✓ Déploiement terminé.${RESET}"
|