#!/bin/bash # ============================================================================== # Wordly.art - NAS Setup via SSH/rsync # ============================================================================== # Configure l'accès SSH sans mot de passe au NAS Synology. # Remplace l'approche CIFS/SMB par rsync sur SSH : # - Pas de montage à gérer, pas de fstab # - Path exact /volume1/backups/wordly utilisable directement # - SSH chiffré, robuste aux redémarrages NAS # # Usage: # sudo bash scripts/setup-nas.sh # # Prérequis côté NAS Synology (voir DISASTER_RECOVERY.md section 1) : # 1. Compte 'wordly-backup' créé dans DSM → Utilisateurs et groupes # 2. Accès R/W sur le dossier 'backups' # 3. SSH activé dans DSM → Terminal et SNMP # 4. Dossier /volume1/backups/wordly créé et chown wordly-backup # ============================================================================== set -euo pipefail SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" PROJECT_ROOT="$(cd "${SCRIPT_DIR}/.." && pwd)" RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' log() { echo -e "[NAS-Setup] $1"; } log_success() { echo -e "[NAS-Setup] ${GREEN}✅ $1${NC}"; } log_warning() { echo -e "[NAS-Setup] ${YELLOW}⚠️ $1${NC}"; } log_error() { echo -e "[NAS-Setup] ${RED}❌ $1${NC}"; } log_info() { echo -e "[NAS-Setup] ${BLUE}ℹ️ $1${NC}"; } # ============================================================================== # 1. ROOT CHECK # ============================================================================== if [ "$EUID" -ne 0 ]; then log_error "Ce script doit être exécuté en root : sudo bash $0" exit 1 fi # ============================================================================== # 2. CHARGER LE .env # ============================================================================== ENV_FILE="${PROJECT_ROOT}/.env" if [ -f "${ENV_FILE}" ]; then set -a set +u source "${ENV_FILE}" set -u set +a fi NAS_HOST="${NAS_HOST:-192.168.1.146}" NAS_USER="${NAS_USER:-wordly-backup}" NAS_PATH="${NAS_PATH:-/volume1/backups/wordly}" NAS_SSH_PORT="${NAS_SSH_PORT:-22}" NAS_SSH_KEY="${NAS_SSH_KEY:-/root/.ssh/wordly_nas_key}" # ============================================================================== # 3. VÉRIFIER QUE SSH EST DISPO SUR LE NAS # ============================================================================== check_nas_reachable() { log "Vérification de la connectivité SSH vers ${NAS_HOST}:${NAS_SSH_PORT}..." if ! nc -z -w5 "${NAS_HOST}" "${NAS_SSH_PORT}" 2>/dev/null; then log_error "Impossible de joindre ${NAS_HOST} sur le port ${NAS_SSH_PORT}." log_error "Vérifiez que SSH est activé dans DSM → Panneau de configuration → Terminal et SNMP." exit 1 fi log_success "NAS ${NAS_HOST}:${NAS_SSH_PORT} est joignable" } # ============================================================================== # 4. GÉNÉRER LA CLÉ SSH DÉDIÉE (si elle n'existe pas) # ============================================================================== generate_ssh_key() { if [ -f "${NAS_SSH_KEY}" ]; then log_info "Clé SSH déjà existante : ${NAS_SSH_KEY}" log_info "Si vous voulez la regénérer : rm ${NAS_SSH_KEY} ${NAS_SSH_KEY}.pub" else log "Génération de la clé SSH dédiée aux backups NAS..." ssh-keygen -t ed25519 \ -C "wordly-backup@$(hostname)-$(date +%Y%m%d)" \ -f "${NAS_SSH_KEY}" \ -N "" chmod 600 "${NAS_SSH_KEY}" log_success "Clé SSH générée : ${NAS_SSH_KEY}" fi log_info "Clé publique à autoriser sur le NAS :" cat "${NAS_SSH_KEY}.pub" } # ============================================================================== # 5. COPIER LA CLÉ PUBLIQUE SUR LE NAS # ============================================================================== install_ssh_key() { log "Copie de la clé publique sur le NAS ${NAS_USER}@${NAS_HOST}..." log_warning "Le mot de passe du compte '${NAS_USER}' sur le NAS vous sera demandé UNE SEULE FOIS." echo "" if ssh-copy-id \ -i "${NAS_SSH_KEY}.pub" \ -p "${NAS_SSH_PORT}" \ -o StrictHostKeyChecking=accept-new \ "${NAS_USER}@${NAS_HOST}"; then log_success "Clé publique installée sur le NAS — plus de mot de passe requis" else log_error "Échec de ssh-copy-id. Avez-vous bien créé le compte '${NAS_USER}' sur le Synology ?" log_error "Vérifiez aussi que SSH est activé dans DSM." exit 1 fi } # ============================================================================== # 6. TESTER LA CONNEXION SANS MOT DE PASSE # ============================================================================== test_ssh_connection() { log "Test de la connexion SSH sans mot de passe..." local result if result=$(ssh \ -i "${NAS_SSH_KEY}" \ -p "${NAS_SSH_PORT}" \ -o StrictHostKeyChecking=accept-new \ -o ConnectTimeout=10 \ -o BatchMode=yes \ "${NAS_USER}@${NAS_HOST}" \ "echo OK" 2>/dev/null); then if [ "${result}" = "OK" ]; then log_success "Connexion SSH sans mot de passe : OK" else log_error "Connexion établie mais réponse inattendue : ${result}" exit 1 fi else log_error "Connexion SSH sans mot de passe ÉCHOUÉE." log_error "Vérifiez que la clé a bien été copiée avec ssh-copy-id." exit 1 fi } # ============================================================================== # 7. CRÉER LA STRUCTURE DE DOSSIERS SUR LE NAS # ============================================================================== create_nas_directories() { log "Création de la structure de dossiers sur le NAS : ${NAS_PATH}..." ssh \ -i "${NAS_SSH_KEY}" \ -p "${NAS_SSH_PORT}" \ -o BatchMode=yes \ "${NAS_USER}@${NAS_HOST}" \ "mkdir -p ${NAS_PATH}/snapshots ${NAS_PATH}/scripts && echo OK" log_success "Structure créée sur le NAS :" log_success " ${NAS_PATH}/snapshots/ → archives DR" log_success " ${NAS_PATH}/scripts/ → scripts de restauration" } # ============================================================================== # 8. TESTER L'ÉCRITURE SUR LE NAS # ============================================================================== test_nas_write() { log "Test d'écriture sur le NAS..." local test_file="${NAS_PATH}/.write_test_$$" if ssh \ -i "${NAS_SSH_KEY}" \ -p "${NAS_SSH_PORT}" \ -o BatchMode=yes \ "${NAS_USER}@${NAS_HOST}" \ "touch ${test_file} && rm -f ${test_file} && echo OK" | grep -q "OK"; then log_success "Écriture sur le NAS : OK" else log_error "Le NAS est accessible mais pas accessible en écriture !" log_error "Vérifiez les permissions du dossier '${NAS_PATH}' pour l'utilisateur '${NAS_USER}'." exit 1 fi } # ============================================================================== # 9. CRÉER LE FICHIER DE CONFIG SSH (~/.ssh/config) # ============================================================================== configure_ssh_config() { local ssh_config="/root/.ssh/config" local host_entry=" # Wordly.art — NAS Synology Backup Host wordly-nas HostName ${NAS_HOST} User ${NAS_USER} Port ${NAS_SSH_PORT} IdentityFile ${NAS_SSH_KEY} StrictHostKeyChecking accept-new ConnectTimeout 10 ServerAliveInterval 30 BatchMode yes" if grep -q "wordly-nas" "${ssh_config}" 2>/dev/null; then log_warning "Entrée 'wordly-nas' déjà dans ${ssh_config} — ignorée." else mkdir -p /root/.ssh chmod 700 /root/.ssh echo "${host_entry}" >> "${ssh_config}" chmod 600 "${ssh_config}" log_success "Config SSH ajoutée : ${ssh_config}" log_info "Vous pouvez maintenant utiliser : ssh wordly-nas" fi } # ============================================================================== # 10. COPIER LES SCRIPTS SUR LE NAS (disponibles depuis n'importe quel serveur) # ============================================================================== sync_scripts_to_nas() { log "Synchronisation des scripts sur le NAS (pour restauration depuis .98)..." if rsync -az \ -e "ssh -i ${NAS_SSH_KEY} -p ${NAS_SSH_PORT} -o BatchMode=yes" \ --exclude="__pycache__" \ --exclude="*.pyc" \ "${SCRIPT_DIR}/" \ "${NAS_USER}@${NAS_HOST}:${NAS_PATH}/scripts/"; then log_success "Scripts synchronisés sur le NAS : ${NAS_PATH}/scripts/" else log_warning "rsync a échoué — vérifiez que rsync est installé sur le NAS Synology." log_warning "Essayez : Synology Package Center → installer 'Rsync Server'" fi } # ============================================================================== # 11. MAIN # ============================================================================== main() { echo "" echo "=================================================================" echo " Wordly.art — Setup NAS via SSH/rsync" echo " NAS : ${NAS_USER}@${NAS_HOST}:${NAS_SSH_PORT}" echo " Path : ${NAS_PATH}" echo " Clé : ${NAS_SSH_KEY}" echo "=================================================================" echo "" check_nas_reachable generate_ssh_key install_ssh_key test_ssh_connection create_nas_directories test_nas_write configure_ssh_config sync_scripts_to_nas echo "" log_success "=================================================================" log_success "Setup NAS COMPLET" log_success "" log_success " ✅ Clé SSH : ${NAS_SSH_KEY}" log_success " ✅ Connexion sans mot de passe : wordly-nas" log_success " ✅ Dossiers créés sur le NAS" log_success " ✅ Scripts disponibles pour DR depuis n'importe quel serveur" log_success "" log_success " Test rapide : ssh wordly-nas 'ls ${NAS_PATH}/'" log_success " Étape suivante : bash scripts/backup-to-nas.sh --full" log_success "=================================================================" echo "" } main "$@"