feat: Version 3.3.4 - Nouvelle architecture pages, optimisations widgets Flutter et API

- Mise à jour VERSION vers 3.3.4
- Optimisations et révisions architecture API (deploy-api.sh, scripts de migration)
- Ajout documentation Stripe Tap to Pay complète
- Migration vers polices Inter Variable pour Flutter
- Optimisations build Android et nettoyage fichiers temporaires
- Amélioration système de déploiement avec gestion backups
- Ajout scripts CRON et migrations base de données

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
pierre
2025-10-05 20:11:15 +02:00
parent 2786252307
commit 570a1fa1f0
212 changed files with 24275 additions and 11321 deletions

278
bao/bin/_ssh-tunnel.sh Executable file
View File

@@ -0,0 +1,278 @@
#!/usr/bin/env bash
# =============================================================================
# SSH Tunnel Management Helper
# Gère l'ouverture/fermeture des tunnels SSH vers les containers Incus
# =============================================================================
set -euo pipefail
# Répertoire du script
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
BAO_ROOT="$(dirname "$SCRIPT_DIR")"
ENV_FILE="$BAO_ROOT/config/.env"
# Couleurs
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[0;33m'
BLUE='\033[0;34m'
CYAN='\033[0;36m'
NC='\033[0m' # No Color
# Fonctions d'affichage
log_info() {
echo -e "${BLUE}${NC} $*"
}
log_success() {
echo -e "${GREEN}${NC} $*"
}
log_error() {
echo -e "${RED}${NC} $*" >&2
}
log_warning() {
echo -e "${YELLOW}${NC} $*"
}
# Charge une variable depuis .env
get_env_var() {
local key="$1"
grep "^${key}=" "$ENV_FILE" 2>/dev/null | cut -d'=' -f2- | tr -d ' "'
}
# Vérifie si un tunnel SSH est actif
is_tunnel_active() {
local port="$1"
# Vérifier si le port est en écoute
if command -v ss >/dev/null 2>&1; then
ss -tuln | grep -q ":${port} " && return 0
elif command -v netstat >/dev/null 2>&1; then
netstat -tuln | grep -q ":${port} " && return 0
elif command -v lsof >/dev/null 2>&1; then
lsof -i ":${port}" -sTCP:LISTEN >/dev/null 2>&1 && return 0
fi
return 1
}
# Trouve le PID du processus SSH pour un tunnel
get_tunnel_pid() {
local port="$1"
# Chercher le processus SSH qui utilise ce port local
if command -v lsof >/dev/null 2>&1; then
lsof -ti ":${port}" -sTCP:LISTEN 2>/dev/null | head -n1
else
# Fallback avec ps et grep
ps aux | grep "ssh.*:${port}:localhost:3306" | grep -v grep | awk '{print $2}' | head -n1
fi
}
# Ouvre un tunnel SSH
open_tunnel() {
local env="${1^^}" # Convertir en majuscules
local ssh_host=$(get_env_var "${env}_SSH_HOST")
local local_port=$(get_env_var "${env}_SSH_PORT_LOCAL")
local enabled=$(get_env_var "${env}_ENABLED")
if [[ "$enabled" != "true" ]]; then
log_error "Environnement ${env} désactivé dans .env"
return 1
fi
if [[ -z "$ssh_host" || -z "$local_port" ]]; then
log_error "Configuration ${env} incomplète dans .env"
return 1
fi
# Vérifier si le tunnel est déjà actif
if is_tunnel_active "$local_port"; then
log_warning "Tunnel ${env} déjà actif sur le port ${local_port}"
return 0
fi
log_info "Ouverture du tunnel SSH vers ${ssh_host} (port local ${local_port})..."
# Créer le tunnel en arrière-plan
# -N : Ne pas exécuter de commande distante
# -f : Passer en arrière-plan
# -o ExitOnForwardFailure=yes : Quitter si le tunnel échoue
# -o ServerAliveInterval=60 : Garder la connexion active
ssh -N -f \
-L "${local_port}:localhost:3306" \
-o ExitOnForwardFailure=yes \
-o ServerAliveInterval=60 \
-o ServerAliveCountMax=3 \
"$ssh_host" 2>/dev/null
# Attendre que le tunnel soit actif
local max_attempts=10
local attempt=0
while [[ $attempt -lt $max_attempts ]]; do
if is_tunnel_active "$local_port"; then
log_success "Tunnel ${env} actif sur le port ${local_port}"
return 0
fi
sleep 0.5
((attempt++))
done
log_error "Impossible d'ouvrir le tunnel ${env}"
return 1
}
# Ferme un tunnel SSH
close_tunnel() {
local env="${1^^}"
local local_port=$(get_env_var "${env}_SSH_PORT_LOCAL")
if [[ -z "$local_port" ]]; then
log_error "Port local pour ${env} introuvable dans .env"
return 1
fi
if ! is_tunnel_active "$local_port"; then
log_warning "Tunnel ${env} non actif sur le port ${local_port}"
return 0
fi
local pid=$(get_tunnel_pid "$local_port")
if [[ -z "$pid" ]]; then
log_error "Impossible de trouver le PID du tunnel ${env}"
return 1
fi
log_info "Fermeture du tunnel ${env} (PID ${pid})..."
kill "$pid" 2>/dev/null
sleep 0.5
if ! is_tunnel_active "$local_port"; then
log_success "Tunnel ${env} fermé"
return 0
else
log_error "Impossible de fermer le tunnel ${env}"
return 1
fi
}
# Affiche le statut des tunnels
status_tunnels() {
echo -e "\n${CYAN}╔════════════════════════════════════════╗${NC}"
echo -e "${CYAN}║ État des tunnels SSH ║${NC}"
echo -e "${CYAN}╚════════════════════════════════════════╝${NC}\n"
for env in DEV REC PROD; do
local enabled=$(get_env_var "${env}_ENABLED")
local local_port=$(get_env_var "${env}_SSH_PORT_LOCAL")
local ssh_host=$(get_env_var "${env}_SSH_HOST")
if [[ "$enabled" != "true" ]]; then
echo -e " ${env}: ${YELLOW}Désactivé${NC}"
continue
fi
if is_tunnel_active "$local_port"; then
local pid=$(get_tunnel_pid "$local_port")
echo -e " ${env}: ${GREEN}✓ Actif${NC} (port ${local_port}, PID ${pid})"
else
echo -e " ${env}: ${RED}✗ Inactif${NC} (port ${local_port})"
fi
done
echo ""
}
# Ferme tous les tunnels
close_all_tunnels() {
log_info "Fermeture de tous les tunnels..."
for env in DEV REC PROD; do
local enabled=$(get_env_var "${env}_ENABLED")
if [[ "$enabled" == "true" ]]; then
close_tunnel "$env" 2>/dev/null || true
fi
done
log_success "Tous les tunnels ont été fermés"
}
# Usage
usage() {
cat <<EOF
Usage: $(basename "$0") <command> [environment]
Commandes:
open <env> Ouvre un tunnel SSH vers l'environnement
close <env> Ferme le tunnel SSH
status Affiche l'état de tous les tunnels
close-all Ferme tous les tunnels actifs
Environnements: DEV, REC, PROD
Exemples:
$(basename "$0") open dev
$(basename "$0") close rec
$(basename "$0") status
$(basename "$0") close-all
EOF
}
# Main
main() {
if [[ ! -f "$ENV_FILE" ]]; then
log_error "Fichier .env introuvable: $ENV_FILE"
log_info "Copiez config/.env.example vers config/.env"
exit 1
fi
if [[ $# -eq 0 ]]; then
usage
exit 0
fi
local command="$1"
case "$command" in
open)
if [[ $# -lt 2 ]]; then
log_error "Environnement manquant"
usage
exit 1
fi
open_tunnel "$2"
;;
close)
if [[ $# -lt 2 ]]; then
log_error "Environnement manquant"
usage
exit 1
fi
close_tunnel "$2"
;;
status)
status_tunnels
;;
close-all)
close_all_tunnels
;;
*)
log_error "Commande invalide: $command"
usage
exit 1
;;
esac
}
main "$@"