Some checks failed
Deploy to Production / Build and Deploy (push) Has been cancelled
265 lines
10 KiB
Bash
265 lines
10 KiB
Bash
#!/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
|
||
source "${ENV_FILE}"
|
||
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 "$@"
|